/** * This script includes a bundle of videojs plugins designed for hooverhigh * HooverHighVideoPlayer 2 * Copyright oxmc. */ /*! @name videojs-errors @version 6.0.0 @license Apache-2.0 */ ! function(e, o) { "object" == typeof exports && "undefined" != typeof module ? module.exports = o(require("video.js")) : "function" == typeof define && define.amd ? define(["video.js"], o) : (e = "undefined" != typeof globalThis ? globalThis : e || self).videojsErrors = o(e.videojs) }(this, (function(e) { "use strict"; function o(e) { return e && "object" == typeof e && "default" in e ? e : { default: e } } var t = o(e), i = "6.0.0"; const n = t.default.getComponent("Flash"), r = !t.default.browser.IS_IPHONE, s = t.default.registerPlugin || t.default.plugin, d = { header: "", code: "", message: "", timeout: 45e3, backgroundTimeout: 3e5, dismiss: r, errors: { 1: { type: "MEDIA_ERR_ABORTED", headline: "The video download was cancelled" }, 2: { type: "MEDIA_ERR_NETWORK", headline: "The video connection was lost, please confirm you are connected to the internet" }, 3: { type: "MEDIA_ERR_DECODE", headline: "The video is bad or in a format that cannot be played on your browser" }, 4: { type: "MEDIA_ERR_SRC_NOT_SUPPORTED", headline: "This video is either unavailable or not supported in this browser" }, 5: { type: "MEDIA_ERR_ENCRYPTED", headline: "The video you are trying to watch is encrypted and we do not know how to decrypt it" }, unknown: { type: "MEDIA_ERR_UNKNOWN", headline: "An unanticipated problem was encountered, check back soon and try again" }, "-1": { type: "PLAYER_ERR_NO_SRC", headline: "No video has been loaded" }, "-2": { type: "PLAYER_ERR_TIMEOUT", headline: "It looks like you're having playback issues. Reloading the video may help." }, PLAYER_ERR_DOMAIN_RESTRICTED: { headline: "This video is restricted from playing on your current domain" }, PLAYER_ERR_IP_RESTRICTED: { headline: "This video is restricted at your current IP address" }, PLAYER_ERR_GEO_RESTRICTED: { headline: "This video is restricted from playing in your current geographic region" }, FLASHLS_ERR_CROSS_DOMAIN: { headline: "The video could not be loaded: crossdomain access denied." } } }, a = function(e, o) { let r, s, l; const c = [], u = function(e) { o.errors = t.default.mergeOptions(o.errors, e), Object.keys(o.errors).forEach((e => { const t = o.errors[e]; t.type || (t.type = e) })) }; u(); const f = function() { e.error() && -2 === e.error().code && e.error(null), e.clearTimeout(s), e.clearTimeout(r), l && (l = !1, e.removeClass("vjs-waiting")); const t = [1 / 0, -1], i = (e, o) => -1 !== e.indexOf(o); "hidden" === document.visibilityState && (e.muted() || i(t, o.backgroundTimeout)) || "visible" === document.visibilityState && i(t, o.timeout) || (s = e.setTimeout((function() { e.error() || e.paused() || e.ended() || (l = !0, e.addClass("vjs-waiting")) }), 1e3), r = e.setTimeout((function() { e.error() || e.paused() || e.ended() || e.error({ code: -2, type: "PLAYER_ERR_TIMEOUT" }) }), "hidden" === document.visibilityState ? o.backgroundTimeout : o.timeout)) }, h = function() { let o; for (; c.length;) o = c.shift(), e.off(o[0], o[1]); e.clearTimeout(r), e.clearTimeout(s) }, p = function() { let o = 0; h(), f(), function(o, t) { const i = function() { if (!e.error()) { const o = e.$(".vjs-tech"); if (o && "application/x-shockwave-flash" === o.type && !o.vjs_getProperty) return void e.error({ code: -2, type: "PLAYER_ERR_TIMEOUT" }); if (e.paused()) return f(); if (e.ended()) return f() } t.call(this) }; e.on(o, i), c.push([o, i]) }(["timeupdate", "adtimeupdate"], (function() { const t = e.currentTime(); t !== o && (o = t, f()) })), e.off(document, "visibilitychange", p), e.on(document, "visibilitychange", p) }, m = function() { e.currentSrc() || e.error({ code: -1, type: "PLAYER_ERR_NO_SRC" }) }, v = function() { let i = "", r = e.error(); const s = document.createElement("div"); let d = ""; if (!r) return; if (e.off(document, "visibilitychange", p), r = t.default.mergeOptions(r, o.errors[r.code || r.type || 0]), r.message && (i = `
${e.localize("Technical details")}\n :
${e.localize(r.message)}
\n
`), 4 === r.code && n && !n.isSupported()) { i += `${e.localize("If you are using an older browser please try upgrading or installing Flash.")}` } const a = e.getChild("errorDisplay"); s.className = "vjs-errors-dialog"; const l = `
${this.localize("Error Code")}: ${r.type||r.code}
`, c = -2 === r.code; d = `
\n

${this.localize(r.headline)}

\n ${c?"":l}\n ${c?"":i}\n
`; const u = a.closeable(!("dismiss" in r) || r.dismiss); if (c) { d += `
\n \n \n
`, s.innerHTML = d, a.fillWith(s), a.getChild("closeButton").hide(); const o = a.el().querySelector(".vjs-errors-timeout-button-container > button:first-child"), t = a.el().querySelector(".vjs-errors-timeout-button-container > button:last-child"); e.on(o, "click", (function() { const o = e.currentSource(); e.reset(), e.src(o) })), e.on(t, "click", (function() { a.close() })), a.one("modalclose", (() => { e.off(o), e.off(t) })) } else if (u) { d += `
\n \n
`, s.innerHTML = d, a.fillWith(s), a.contentEl().firstChild.appendChild(a.getChild("closeButton").el()); const o = a.el().querySelector(".vjs-errors-ok-button"); e.on(o, "click", (function() { a.close() })) } else s.innerHTML = d, a.fillWith(s); (e.currentWidth() <= 600 || e.currentHeight() <= 250) && a.addClass("vjs-xs"), a.one("modalclose", (() => e.error(null))) }, y = function() { h(), e.removeClass("vjs-errors"), e.off("play", p), e.off(document, "visibilitychange", p), e.off("play", m), e.off("dispose", y), e.off(["aderror", "error"], v) }, R = function(o) { y(), a(e, t.default.mergeOptions(d, o)) }; R.extend = e => u(e), R.getAll = () => t.default.mergeOptions(o.errors), R.timeout = function(t) { if (void 0 === t) return o.timeout; t !== o.timeout && (o.timeout = t, e.paused() || p()) }, R.backgroundTimeout = function(t) { if (void 0 === t) return o.backgroundTimeout; t !== o.backgroundTimeout && (o.backgroundTimeout = t, e.paused() || p()) }, R.disableProgress = () => {}, e.on("play", p), e.on("play", m), e.on("dispose", y), e.on(["aderror", "contenterror", "error"], v), e.ready((() => { e.addClass("vjs-errors") })), e.paused() || p(), R.VERSION = i, e.errors = R }, l = function(e) { a(this, t.default.mergeOptions(d, e)) }; return ["extend", "getAll"].forEach((e => { l[e] = function() { t.default.log.warn(`The errors.${e}() method is not available until the plugin has been initialized!`) } })), l.VERSION = i, s("errors", l), l })); /* videojs-hotkeys v0.2.28 - https://github.com/ctd1500/videojs-hotkeys */ ! function(e, t) { if ("undefined" != typeof window && window.videojs) t(window.videojs); else if ("function" == typeof define && define.amd) define("videojs-hotkeys", ["video.js"], function(e) { return t(e.default || e) }); else if ("undefined" != typeof module && module.exports) { var n = require("video.js"); module.exports = t(n.default || n) } }(0, function(x) { "use strict"; "undefined" != typeof window && (window.videojs_hotkeys = { version: "0.2.28" }); (x.registerPlugin || x.plugin)("hotkeys", function(m) { var f = this, y = f.el(), v = document, e = { volumeStep: .1, seekStep: 5, enableMute: !0, enableVolumeScroll: !0, enableHoverScroll: !1, enableFullscreen: !0, enableNumbers: !0, enableJogStyle: !1, alwaysCaptureHotkeys: !1, captureDocumentHotkeys: !1, documentHotkeysFocusElementFilter: function() { return !1 }, enableModifiersForNumbers: !0, enableInactiveFocus: !0, skipInitialFocus: !1, playPauseKey: function(e) { return 32 === e.which || 179 === e.which }, rewindKey: function(e) { return 37 === e.which || 177 === e.which }, forwardKey: function(e) { return 39 === e.which || 176 === e.which }, volumeUpKey: function(e) { return 38 === e.which }, volumeDownKey: function(e) { return 40 === e.which }, muteKey: function(e) { return 77 === e.which }, fullscreenKey: function(e) { return 70 === e.which }, customKeys: {} }, t = x.mergeOptions || x.util.mergeOptions, d = (m = t(e, m || {})).volumeStep, n = m.seekStep, p = m.enableMute, o = m.enableVolumeScroll, r = m.enableHoverScroll, b = m.enableFullscreen, h = m.enableNumbers, w = m.enableJogStyle, k = m.alwaysCaptureHotkeys, S = m.captureDocumentHotkeys, K = m.documentHotkeysFocusElementFilter, F = m.enableModifiersForNumbers, u = m.enableInactiveFocus, l = m.skipInitialFocus, i = x.VERSION; y.hasAttribute("tabIndex") || y.setAttribute("tabIndex", "-1"), y.style.outline = "none", !k && f.autoplay() || l || f.one("play", function() { y.focus() }), u && f.on("userinactive", function() { var n = function() { clearTimeout(e) }, e = setTimeout(function() { f.off("useractive", n); var e = v.activeElement, t = y.querySelector(".vjs-control-bar"); e && e.parentElement == t && y.focus() }, 10); f.one("useractive", n) }), f.on("play", function() { var e = y.querySelector(".iframeblocker"); e && "" === e.style.display && (e.style.display = "block", e.style.bottom = "39px") }); var c = function(e) { var t, n, o = e.which, r = e.preventDefault.bind(e), u = f.duration(); if (f.controls()) { var l = v.activeElement; if (k || S && K(l) || l == y || l == y.querySelector(".vjs-tech") || l == y.querySelector(".vjs-control-bar") || l == y.querySelector(".iframeblocker")) switch (j(e, f)) { case 1: r(), (k || S) && e.stopPropagation(), f.paused() ? E(f.play()) : f.pause(); break; case 2: t = !f.paused(), r(), t && f.pause(), (n = f.currentTime() - T(e)) <= 0 && (n = 0), f.currentTime(n), t && E(f.play()); break; case 3: t = !f.paused(), r(), t && f.pause(), u <= (n = f.currentTime() + T(e)) && (n = t ? u - .001 : u), f.currentTime(n), t && E(f.play()); break; case 5: r(), w ? (n = f.currentTime() - 1, f.currentTime() <= 1 && (n = 0), f.currentTime(n)) : f.volume(f.volume() - d); break; case 4: r(), w ? (u <= (n = f.currentTime() + 1) && (n = u), f.currentTime(n)) : f.volume(f.volume() + d); break; case 6: p && f.muted(!f.muted()); break; case 7: b && (f.isFullscreen() ? f.exitFullscreen() : f.requestFullscreen()); break; default: if ((47 < o && o < 59 || 95 < o && o < 106) && (F || !(e.metaKey || e.ctrlKey || e.altKey)) && h) { var i = 48; 95 < o && (i = 96); var c = o - i; r(), f.currentTime(f.duration() * c * .1) } for (var a in m.customKeys) { var s = m.customKeys[a]; s && s.key && s.handler && s.key(e) && (r(), s.handler(f, m, e)) } } } }, a = !1, s = y.querySelector(".vjs-volume-menu-button") || y.querySelector(".vjs-volume-panel"); null != s && (s.onmouseover = function() { a = !0 }, s.onmouseout = function() { a = !1 }); var q = function(e) { if (r) var t = 0; else t = v.activeElement; if (f.controls() && (k || t == y || t == y.querySelector(".vjs-tech") || t == y.querySelector(".iframeblocker") || t == y.querySelector(".vjs-control-bar") || a) && o) { e = window.event || e; var n = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail)); e.preventDefault(), 1 == n ? f.volume(f.volume() + d) : -1 == n && f.volume(f.volume() - d) } }, j = function(e, t) { return m.playPauseKey(e, t) ? 1 : m.rewindKey(e, t) ? 2 : m.forwardKey(e, t) ? 3 : m.volumeUpKey(e, t) ? 4 : m.volumeDownKey(e, t) ? 5 : m.muteKey(e, t) ? 6 : m.fullscreenKey(e, t) ? 7 : void 0 }; function T(e) { return "function" == typeof n ? n(e) : n } function E(e) { null != e && "function" == typeof e.then && e.then(null, function(e) {}) } if (S) { var g = function(e) { c(e) }; document.addEventListener("keydown", g), this.dispose = function() { document.removeEventListener("keydown", g) } } else f.on("keydown", c); return f.on("dblclick", function(e) { if (null != i && i <= "7.1.0" && f.controls()) { var t = e.relatedTarget || e.toElement || v.activeElement; t != y && t != y.querySelector(".vjs-tech") && t != y.querySelector(".iframeblocker") || b && (f.isFullscreen() ? f.exitFullscreen() : f.requestFullscreen()) } }), f.on("mousewheel", q), f.on("DOMMouseScroll", q), this }) }); /*! @name videojs-contrib-ads @version 6.9.0 @license Apache-2.0 */ ! function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t(require("video.js"), require("global/window"), require("global/document")) : "function" == typeof define && define.amd ? define(["video.js", "global/window", "global/document"], t) : (e = e || self).videojsContribAds = t(e.videojs, e.window, e.document) }(this, function(e, t, n) { "use strict"; e = e && e.hasOwnProperty("default") ? e.default : e, t = t && t.hasOwnProperty("default") ? t.default : t, n = n && n.hasOwnProperty("default") ? n.default : n; var a = "6.9.0"; var o = function(e, t) { t.isImmediatePropagationStopped = function() { return !0 }, t.cancelBubble = !0, t.isPropagationStopped = function() { return !0 } }, r = function(e, t, n) { o(0, n), e.trigger({ type: t + n.type, originalEvent: n }) }, i = function(e, t) { e.ads.isInAdMode() && (e.ads.isContentResuming() ? e.ads._contentEnding && r(e, "content", t) : r(e, "ad", t)) }, s = function(e, t) { e.ads.isInAdMode() ? e.ads.isContentResuming() ? (o(0, t), e.trigger("resumeended")) : r(e, "ad", t) : e.ads._contentHasEnded || e.ads.stitchedAds() || (r(e, "content", t), e.trigger("readyforpostroll")) }, d = function(e, t) { if (!("loadstart" === t.type && !e.ads._hasThereBeenALoadStartDuringPlayerLife || "loadeddata" === t.type && !e.ads._hasThereBeenALoadedData || "loadedmetadata" === t.type && !e.ads._hasThereBeenALoadedMetaData)) if (e.ads.inAdBreak()) r(e, "ad", t); else { if (e.currentSrc() !== e.ads.contentSrc) return; r(e, "content", t) } }, l = function(e, t) { e.ads.inAdBreak() ? r(e, "ad", t) : e.ads.isContentResuming() && r(e, "content", t) }; function u(e) { "playing" === e.type ? i(this, e) : "ended" === e.type ? s(this, e) : "loadstart" === e.type || "loadeddata" === e.type || "loadedmetadata" === e.type ? d(this, e) : "play" === e.type ? l(this, e) : this.ads.isInAdMode() && (this.ads.isContentResuming() ? r(this, "content", e) : r(this, "ad", e)) } var c = {}, f = function() { ! function(n) { if (e.dom.isInFrame() && "function" != typeof t.__tcfapi) { for (var a, o = t, r = {}; o;) { try { if (o.frames.__tcfapiLocator) { a = o; break } } catch (e) {} if (o === t.top) break; o = o.parent } if (!a) return; t.__tcfapi = function(e, t, n, o) { var i = Math.random() + "", s = { __tcfapiCall: { command: e, parameter: o, version: t, callId: i } }; r[i] = n, a.postMessage(s, "*") }, t.addEventListener("message", function(e) { var t = {}; try { t = "string" == typeof e.data ? JSON.parse(e.data) : e.data } catch (e) {} var n = t.__tcfapiReturn; n && "function" == typeof r[n.callId] && (r[n.callId](n.returnValue, n.success), r[n.callId] = null) }, !1) } }(), "function" == typeof t.__tcfapi && t.__tcfapi("addEventListener", 2, function(e, t) { t && (c = e) }) }, h = function(e, t) { return t ? encodeURIComponent(e) : e }, p = function(e, t, n) { if (e && e[n]) for (var a = e[n], o = Object.keys(a), r = 0; r < o.length; r++) { t["{mediainfo." + n + "." + o[r] + "}"] = a[o[r]] } }; var g = { processMetadataTracks: function(e, t) { for (var n = e.textTracks(), a = function(n) { "metadata" === n.kind && (e.ads.cueTextTracks.setMetadataTrackMode(n), t(e, n)) }, o = 0; o < n.length; o++) a(n[o]); n.addEventListener("addtrack", function(e) { a(e.track) }) }, setMetadataTrackMode: function(e) {}, getSupportedAdCue: function(e, t) { return t }, isSupportedAdCue: function(e, t) { return !0 }, getCueId: function(e, t) { return t.id } }, y = function(e, t) { return void 0 !== t && e.ads.includedCues[t] }, v = function(e, t) { void 0 !== t && "" !== t && (e.ads.includedCues[t] = !0) }; function m() { !1 !== this.ads._shouldBlockPlay && (this.paused() || (this.ads.debug("Playback was canceled by cancelContentPlay"), this.pause()), this.ads._cancelledPlay = !0) } g.processAdTrack = function(t, n, a, o) { t.ads.includedCues = {}; for (var r = 0; r < n.length; r++) { var i = n[r], s = this.getSupportedAdCue(t, i); if (!this.isSupportedAdCue(t, i)) return void e.log.warn("Skipping as this is not a supported ad cue.", i); var d = this.getCueId(t, i), l = i.startTime; if (y(t, d)) return void e.log("Skipping ad already seen with ID " + d); o && o(t, s, d, l), a(t, s, d, l), v(t, d) } }; var A = {}, S = e; A.isMiddlewareMediatorSupported = function() { return !S.browser.IS_IOS && !S.browser.IS_ANDROID && !!(S.use && S.middleware && S.middleware.TERMINATOR) }, A.playMiddleware = function(t) { return { setSource: function(e, t) { t(null, e) }, callPlay: function() { if (t.ads && !0 === t.ads._shouldBlockPlay) return t.ads.debug("Using playMiddleware to block content playback"), t.ads._playBlocked = !0, S.middleware.TERMINATOR }, play: function(n, a) { t.ads && t.ads._playBlocked && n ? (t.ads.debug("Play call to Tech was terminated."), t.trigger("play"), t.addClass("vjs-has-started"), t.ads._playBlocked = !1) : a && a.catch && a.catch(function(n) { "NotAllowedError" !== n.name || e.browser.IS_SAFARI || t.trigger("pause") }) } } }, A.testHook = function(e) { S = e }; var _ = A.playMiddleware, P = A.isMiddlewareMediatorSupported, b = function() { if (e.getPlugin) return Boolean(e.getPlugin("ads")); var t = e.getComponent("Player"); return Boolean(t && t.prototype.ads) }; var k = function() { function e() {} return e.getState = function(t) { if (t) return e.states_ && e.states_[t] ? e.states_[t] : void 0 }, e.registerState = function(t, n) { if ("string" != typeof t || !t) throw new Error('Illegal state name, "' + t + '"; must be a non-empty string.'); return e.states_ || (e.states_ = {}), e.states_[t] = n, n }, e }(), C = function() { function t(e) { this.player = e } t._getName = function() { return "Anonymous State" }; var n = t.prototype; return n.transitionTo = function(e) { var t = this.player; this.cleanup(t); var n = new e(t); t.ads._state = n, t.ads.debug(this.constructor._getName() + " -> " + n.constructor._getName()); for (var a = arguments.length, o = new Array(a > 1 ? a - 1 : 0), r = 1; r < a; r++) o[r - 1] = arguments[r]; n.init.apply(n, [t].concat(o)) }, n.init = function() {}, n.cleanup = function() {}, n.onPlay = function() {}, n.onPlaying = function() {}, n.onEnded = function() {}, n.onAdEnded = function() {}, n.onAdsReady = function() { e.log.warn("Unexpected adsready event") }, n.onAdsError = function() {}, n.onAdsCanceled = function() {}, n.onAdTimeout = function() {}, n.onAdStarted = function() {}, n.onContentChanged = function() {}, n.onContentResumed = function() {}, n.onReadyForPostroll = function() { e.log.warn("Unexpected readyforpostroll event") }, n.onNoPreroll = function() {}, n.onNoPostroll = function() {}, n.startLinearAdMode = function() { e.log.warn("Unexpected startLinearAdMode invocation (State via " + this.constructor._getName() + ")") }, n.endLinearAdMode = function() { e.log.warn("Unexpected endLinearAdMode invocation (State via " + this.constructor._getName() + ")") }, n.skipLinearAdMode = function() { e.log.warn("Unexpected skipLinearAdMode invocation (State via " + this.constructor._getName() + ")") }, n.isAdState = function() { throw new Error("isAdState unimplemented for " + this.constructor._getName()) }, n.isWaitingForAdBreak = function() { return !1 }, n.isContentResuming = function() { return !1 }, n.inAdBreak = function() { return !1 }, n.handleEvent = function(e) { var t = this.player; "play" === e ? this.onPlay(t) : "adsready" === e ? this.onAdsReady(t) : "adserror" === e ? this.onAdsError(t) : "adscanceled" === e ? this.onAdsCanceled(t) : "adtimeout" === e ? this.onAdTimeout(t) : "ads-ad-started" === e ? this.onAdStarted(t) : "contentchanged" === e ? this.onContentChanged(t) : "contentresumed" === e ? this.onContentResumed(t) : "readyforpostroll" === e ? this.onReadyForPostroll(t) : "playing" === e ? this.onPlaying(t) : "ended" === e ? this.onEnded(t) : "nopreroll" === e ? this.onNoPreroll(t) : "nopostroll" === e ? this.onNoPostroll(t) : "adended" === e && this.onAdEnded(t) }, t }(); function T(e, t) { e.prototype = Object.create(t.prototype), e.prototype.constructor = e, e.__proto__ = t } k.registerState("State", C); var w = function(e) { function t(t) { var n; return (n = e.call(this, t) || this).contentResuming = !1, n.waitingForAdBreak = !1, n } T(t, e); var n = t.prototype; return n.isAdState = function() { return !0 }, n.onPlaying = function() { var e = k.getState("ContentPlayback"); this.contentResuming && this.transitionTo(e) }, n.onContentResumed = function() { var e = k.getState("ContentPlayback"); this.contentResuming && this.transitionTo(e) }, n.isWaitingForAdBreak = function() { return this.waitingForAdBreak }, n.isContentResuming = function() { return this.contentResuming }, n.inAdBreak = function() { return !0 === this.player.ads._inLinearAdMode }, t }(C); k.registerState("AdState", w); var R = function(e) { function t() { return e.apply(this, arguments) || this } T(t, e); var n = t.prototype; return n.isAdState = function() { return !1 }, n.onContentChanged = function(e) { var t = k.getState("BeforePreroll"), n = k.getState("Preroll"); e.ads.debug("Received contentchanged event (ContentState)"), e.paused() ? this.transitionTo(t) : (this.transitionTo(n, !1), e.pause(), e.ads._pausedOnContentupdate = !0) }, t }(C); k.registerState("ContentState", R); var L, B = function(t) { function n() { return t.apply(this, arguments) || this } T(n, t), n._getName = function() { return "AdsDone" }; var a = n.prototype; return a.init = function(e) { e.ads._contentHasEnded = !0, e.trigger("ended") }, a.startLinearAdMode = function() { e.log.warn("Unexpected startLinearAdMode invocation (AdsDone)") }, n }(k.getState("ContentState")); k.registerState("AdsDone", B); var M = { start: function(t) { t.ads.debug("Starting ad break"), t.ads._inLinearAdMode = !0, t.trigger("adstart"), t.ads.shouldTakeSnapshots() && (t.ads.snapshot = function(t) { var n; n = e.browser.IS_IOS && t.ads.isLive(t) && t.seekable().length > 0 ? t.currentTime() - t.seekable().end(0) : t.currentTime(); var a = t.$(".vjs-tech"), o = t.textTracks ? t.textTracks() : [], r = [], i = { ended: t.ended(), currentSrc: t.currentSrc(), sources: t.currentSources(), src: t.tech_.src(), currentTime: n, type: t.currentType() }; a && (i.style = a.getAttribute("style")); for (var s = 0; s < o.length; s++) { var d = o[s]; r.push({ track: d, mode: d.mode }), d.mode = "disabled" } return i.suppressedTracks = r, i }(t)), t.ads.shouldPlayContentBehindAd(t) && (t.ads.preAdVolume_ = t.volume(), t.volume(0)), t.addClass("vjs-ad-playing"), t.hasClass("vjs-live") && t.removeClass("vjs-live"), t.ads.removeNativePoster() }, end: function(t, n) { t.ads.debug("Ending ad break"), void 0 === n && (n = function() {}), t.ads.adType = null, t.ads._inLinearAdMode = !1, t.trigger("adend"), t.removeClass("vjs-ad-playing"), t.ads.isLive(t) && t.addClass("vjs-live"), t.ads.shouldTakeSnapshots() ? function(t, n) { var a = t.ads.snapshot; if (void 0 === n && (n = function() {}), !0 === t.ads.disableNextSnapshotRestore) return t.ads.disableNextSnapshotRestore = !1, delete t.ads.snapshot, void n(); var o, r = t.$(".vjs-tech"), i = 20, s = a.suppressedTracks, d = function() { for (var e = 0; e < s.length; e++)(o = s[e]).track.mode = o.mode }, l = function() { var n; if (e.browser.IS_IOS && t.ads.isLive(t)) { if (a.currentTime < 0 && (n = t.seekable().length > 0 ? t.seekable().end(0) + a.currentTime : t.currentTime(), t.currentTime(n)), t.paused()) { var o = t.play(); o && o.catch && o.catch(function(t) { e.log.warn("Play promise rejected in IOS snapshot resume", t) }) } } else if (a.ended) t.currentTime(t.duration()); else { t.currentTime(a.currentTime); var r = t.play(); r && r.catch && r.catch(function(t) { e.log.warn("Play promise rejected in snapshot resume", t) }) } t.ads.shouldRemoveAutoplay_ && (t.autoplay(!1), t.ads.shouldRemoveAutoplay_ = !1) }, u = function n() { if (t.off("contentcanplay", n), L && t.clearTimeout(L), (r = t.el().querySelector(".vjs-tech")).readyState > 1) return l(); if (void 0 === r.seekable) return l(); if (r.seekable.length > 0) return l(); if (i--) t.setTimeout(n, 50); else try { l() } catch (t) { e.log.warn("Failed to resume the content after an advertisement", t) } }; if ("style" in a && r.setAttribute("style", a.style || ""), t.ads.videoElementRecycled()) t.one("resumeended", function() { delete t.ads.snapshot, n() }), t.one("contentloadedmetadata", d), e.browser.IS_IOS && !t.autoplay() && (t.autoplay(!0), t.ads.shouldRemoveAutoplay_ = !0), t.src(a.sources), t.one("contentcanplay", u), L = t.setTimeout(u, 2e3); else { if (d(), !t.ended()) { var c = t.play(); c && c.catch && c.catch(function(t) { e.log.warn("Play promise rejected in snapshot restore", t) }) } delete t.ads.snapshot, n() } }(t, n) : (t.volume(t.ads.preAdVolume_), n()) } }, j = function(t) { function n() { return t.apply(this, arguments) || this } T(n, t), n._getName = function() { return "Preroll" }; var a = n.prototype; return a.init = function(e, t, n) { if (this.waitingForAdBreak = !0, e.addClass("vjs-ad-loading"), n || e.ads.nopreroll_) return this.resumeAfterNoPreroll(e); var a = e.ads.settings.timeout; "number" == typeof e.ads.settings.prerollTimeout && (a = e.ads.settings.prerollTimeout), this._timeout = e.setTimeout(function() { e.trigger("adtimeout") }, a), t ? this.handleAdsReady() : this.adsReady = !1 }, a.onAdsReady = function(t) { t.ads.inAdBreak() ? e.log.warn("Unexpected adsready event (Preroll)") : (t.ads.debug("Received adsready event (Preroll)"), this.handleAdsReady()) }, a.handleAdsReady = function() { this.adsReady = !0, this.readyForPreroll() }, a.afterLoadStart = function(e) { var t = this.player; t.ads._hasThereBeenALoadStartDuringPlayerLife ? e() : (t.ads.debug("Waiting for loadstart..."), t.one("loadstart", function() { t.ads.debug("Received loadstart event"), e() })) }, a.noPreroll = function() { var e = this; this.afterLoadStart(function() { e.player.ads.debug("Skipping prerolls due to nopreroll event (Preroll)"), e.resumeAfterNoPreroll(e.player) }) }, a.readyForPreroll = function() { var e = this.player; this.afterLoadStart(function() { e.ads.debug("Triggered readyforpreroll event (Preroll)"), e.trigger("readyforpreroll") }) }, a.onAdsCanceled = function(e) { var t = this; e.ads.debug("adscanceled (Preroll)"), this.afterLoadStart(function() { t.resumeAfterNoPreroll(e) }) }, a.onAdsError = function(t) { var n = this; e.log("adserror (Preroll)"), this.inAdBreak() ? t.ads.endLinearAdMode() : this.afterLoadStart(function() { n.resumeAfterNoPreroll(t) }) }, a.startLinearAdMode = function() { var t = this.player; !this.adsReady || t.ads.inAdBreak() || this.isContentResuming() ? e.log.warn("Unexpected startLinearAdMode invocation (Preroll)") : (this.clearTimeout(t), t.ads.adType = "preroll", this.waitingForAdBreak = !1, M.start(t), t.ads._shouldBlockPlay = !1) }, a.onAdStarted = function(e) { e.removeClass("vjs-ad-loading") }, a.endLinearAdMode = function() { var e = this.player; this.inAdBreak() && (e.removeClass("vjs-ad-loading"), e.addClass("vjs-ad-content-resuming"), this.contentResuming = !0, M.end(e)) }, a.skipLinearAdMode = function() { var t = this, n = this.player; n.ads.inAdBreak() || this.isContentResuming() ? e.log.warn("Unexpected skipLinearAdMode invocation") : this.afterLoadStart(function() { n.trigger("adskip"), n.ads.debug("skipLinearAdMode (Preroll)"), t.resumeAfterNoPreroll(n) }) }, a.onAdTimeout = function(e) { var t = this; this.afterLoadStart(function() { e.ads.debug("adtimeout (Preroll)"), t.resumeAfterNoPreroll(e) }) }, a.onNoPreroll = function(t) { t.ads.inAdBreak() || this.isContentResuming() ? e.log.warn("Unexpected nopreroll event (Preroll)") : this.noPreroll() }, a.resumeAfterNoPreroll = function(e) { if (this.contentResuming = !0, e.ads._shouldBlockPlay = !1, this.cleanupPartial(e), e.ads._playRequested || e.ads._pausedOnContentupdate) if (e.paused()) { e.ads.debug("resumeAfterNoPreroll: attempting to resume playback (Preroll)"); var t = e.play(); t && t.then && t.then(null, function(e) {}) } else e.ads.debug("resumeAfterNoPreroll: already playing (Preroll)"), e.trigger("play"), e.trigger("playing") }, a.cleanup = function(t) { t.ads._hasThereBeenALoadStartDuringPlayerLife || e.log.warn("Leaving Preroll state before loadstart event can cause issues."), this.cleanupPartial(t) }, a.cleanupPartial = function(e) { e.removeClass("vjs-ad-loading"), e.removeClass("vjs-ad-content-resuming"), this.clearTimeout(e) }, a.clearTimeout = function(e) { e.clearTimeout(this._timeout), this._timeout = null }, n }(k.getState("AdState")); k.registerState("Preroll", j); var I = function(e) { function t() { return e.apply(this, arguments) || this } T(t, e), t._getName = function() { return "BeforePreroll" }; var n = t.prototype; return n.init = function(e) { this.adsReady = !1, this.shouldResumeToContent = !1, e.ads._shouldBlockPlay = !e.ads.settings.allowVjsAutoplay || !e.autoplay() }, n.onAdsReady = function(e) { e.ads.debug("Received adsready event (BeforePreroll)"), this.adsReady = !0 }, n.onPlay = function(e) { var t = k.getState("Preroll"); e.ads.debug("Received play event (BeforePreroll)"), this.transitionTo(t, this.adsReady, this.shouldResumeToContent) }, n.onAdsCanceled = function(e) { e.ads.debug("adscanceled (BeforePreroll)"), this.shouldResumeToContent = !0 }, n.onAdsError = function() { this.player.ads.debug("adserror (BeforePreroll)"), this.shouldResumeToContent = !0 }, n.onNoPreroll = function() { this.player.ads.debug("Skipping prerolls due to nopreroll event (BeforePreroll)"), this.shouldResumeToContent = !0 }, n.skipLinearAdMode = function() { var e = this.player; e.trigger("adskip"), e.ads.debug("skipLinearAdMode (BeforePreroll)"), this.shouldResumeToContent = !0 }, n.onContentChanged = function() { this.init(this.player) }, t }(k.getState("ContentState")); k.registerState("BeforePreroll", I); var N = function(e) { function t() { return e.apply(this, arguments) || this } T(t, e), t._getName = function() { return "Midroll" }; var n = t.prototype; return n.init = function(e) { e.ads.adType = "midroll", M.start(e), e.addClass("vjs-ad-loading") }, n.onAdStarted = function(e) { e.removeClass("vjs-ad-loading") }, n.endLinearAdMode = function() { var e = this.player; this.inAdBreak() && (this.contentResuming = !0, e.addClass("vjs-ad-content-resuming"), e.removeClass("vjs-ad-loading"), M.end(e)) }, n.onAdsError = function(e) { this.inAdBreak() && e.ads.endLinearAdMode() }, n.cleanup = function(e) { e.removeClass("vjs-ad-loading"), e.removeClass("vjs-ad-content-resuming") }, t }(k.getState("AdState")); k.registerState("Midroll", N); var E = function(t) { function n() { return t.apply(this, arguments) || this } T(n, t), n._getName = function() { return "Postroll" }; var a = n.prototype; return a.init = function(e) { if (this.waitingForAdBreak = !0, e.ads._contentEnding = !0, e.ads.nopostroll_) { this.resumeContent(e); var t = k.getState("AdsDone"); this.transitionTo(t) } else { e.addClass("vjs-ad-loading"); var n = e.ads.settings.timeout; "number" == typeof e.ads.settings.postrollTimeout && (n = e.ads.settings.postrollTimeout), this._postrollTimeout = e.setTimeout(function() { e.trigger("adtimeout") }, n) } }, a.startLinearAdMode = function() { var t = this.player; t.ads.inAdBreak() || this.isContentResuming() ? e.log.warn("Unexpected startLinearAdMode invocation (Postroll)") : (t.ads.adType = "postroll", t.clearTimeout(this._postrollTimeout), this.waitingForAdBreak = !1, M.start(t)) }, a.onAdStarted = function(e) { e.removeClass("vjs-ad-loading") }, a.endLinearAdMode = function() { var e = this, t = this.player, n = k.getState("AdsDone"); this.inAdBreak() && (t.removeClass("vjs-ad-loading"), this.resumeContent(t), M.end(t, function() { e.transitionTo(n) })) }, a.skipLinearAdMode = function() { var t = this.player; t.ads.inAdBreak() || this.isContentResuming() ? e.log.warn("Unexpected skipLinearAdMode invocation") : (t.ads.debug("Postroll abort (skipLinearAdMode)"), t.trigger("adskip"), this.abort(t)) }, a.onAdTimeout = function(e) { e.ads.debug("Postroll abort (adtimeout)"), this.abort(e) }, a.onAdsError = function(e) { e.ads.debug("Postroll abort (adserror)"), e.ads.inAdBreak() ? e.ads.endLinearAdMode() : this.abort(e) }, a.onContentChanged = function(e) { if (this.isContentResuming()) { var t = k.getState("BeforePreroll"); this.transitionTo(t) } else if (!this.inAdBreak()) { var n = k.getState("Preroll"); this.transitionTo(n) } }, a.onNoPostroll = function(t) { this.isContentResuming() || this.inAdBreak() ? e.log.warn("Unexpected nopostroll event (Postroll)") : this.abort(t) }, a.resumeContent = function(e) { this.contentResuming = !0, e.addClass("vjs-ad-content-resuming") }, a.abort = function(e) { var t = k.getState("AdsDone"); this.resumeContent(e), e.removeClass("vjs-ad-loading"), this.transitionTo(t) }, a.cleanup = function(e) { e.removeClass("vjs-ad-content-resuming"), e.clearTimeout(this._postrollTimeout), e.ads._contentEnding = !1 }, n }(k.getState("AdState")); k.registerState("Postroll", E); var x = function(e) { function t() { return e.apply(this, arguments) || this } T(t, e), t._getName = function() { return "ContentPlayback" }; var n = t.prototype; return n.init = function(e) { e.ads._shouldBlockPlay = !1 }, n.onAdsReady = function(e) { e.ads.debug("Received adsready event (ContentPlayback)"), e.ads.nopreroll_ || (e.ads.debug("Triggered readyforpreroll event (ContentPlayback)"), e.trigger("readyforpreroll")) }, n.onReadyForPostroll = function(e) { var t = k.getState("Postroll"); e.ads.debug("Received readyforpostroll event"), this.transitionTo(t) }, n.startLinearAdMode = function() { var e = k.getState("Midroll"); this.transitionTo(e) }, t }(k.getState("ContentState")); k.registerState("ContentPlayback", x); var D = function(e) { function t() { return e.apply(this, arguments) || this } T(t, e), t._getName = function() { return "StitchedContentPlayback" }; var n = t.prototype; return n.init = function() { this.player.ads._shouldBlockPlay = !1 }, n.onContentChanged = function() { this.player.ads.debug("Received contentchanged event (" + this.constructor._getName() + ")") }, n.startLinearAdMode = function() { var e = k.getState("StitchedAdRoll"); this.transitionTo(e) }, t }(k.getState("ContentState")); k.registerState("StitchedContentPlayback", D); var O = function(e) { function t() { return e.apply(this, arguments) || this } T(t, e), t._getName = function() { return "StitchedAdRoll" }; var n = t.prototype; return n.init = function() { this.waitingForAdBreak = !1, this.contentResuming = !1, this.player.ads.adType = "stitched", M.start(this.player) }, n.onPlaying = function() {}, n.onContentResumed = function() {}, n.onAdEnded = function() { this.endLinearAdMode(), this.player.trigger("ended") }, n.endLinearAdMode = function() { var e = k.getState("StitchedContentPlayback"); M.end(this.player), this.transitionTo(e) }, t }(k.getState("AdState")); k.registerState("StitchedAdRoll", O); var F = A.isMiddlewareMediatorSupported, U = e.getTech("Html5").Events, V = { timeout: 5e3, prerollTimeout: void 0, postrollTimeout: void 0, debug: !1, stitchedAds: !1, contentIsLive: void 0, liveCuePoints: !0, allowVjsAutoplay: e.options.normalizeAutoplay || !1 }, q = function(o) { var r = this, i = e.mergeOptions(V, o), s = []; U.concat(["firstplay", "loadedalldata"]).forEach(function(e) { -1 === s.indexOf(e) && s.push(e) }), r.on(s, u), F() || function(t, n) { n && e.log("Using cancelContentPlay to block content playback"), t.on("play", m) }(r, i.debug), r.setTimeout(function() { r.ads._hasThereBeenALoadStartDuringPlayerLife || "" === r.src() || e.log.error("videojs-contrib-ads has not seen a loadstart event 5 seconds after being initialized, but a source is present. This indicates that videojs-contrib-ads was initialized too late. It must be initialized immediately after video.js in the same tick. As a result, some ads will not play and some media events will be incorrect. For more information, see http://videojs.github.io/videojs-contrib-ads/integrator/getting-started.html") }, 5e3), r.on("ended", function() { r.hasClass("vjs-has-started") || r.addClass("vjs-has-started") }), r.on("contenttimeupdate", function() { r.removeClass("vjs-waiting") }), r.on(["addurationchange", "adcanplay"], function() { if (!r.ads.settings.stitchedAds && !r.hasStarted() && (!r.ads.snapshot || r.currentSrc() !== r.ads.snapshot.currentSrc) && r.ads.inAdBreak()) { var t = r.play(); t && t.catch && t.catch(function(t) { e.log.warn("Play promise rejected when playing ad", t) }) } }), r.on("nopreroll", function() { r.ads.debug("Received nopreroll event"), r.ads.nopreroll_ = !0 }), r.on("nopostroll", function() { r.ads.debug("Received nopostroll event"), r.ads.nopostroll_ = !0 }), r.on("playing", function() { r.ads._cancelledPlay = !1, r.ads._pausedOnContentupdate = !1 }), r.on("play", function() { r.ads._playRequested = !0 }), r.one("loadstart", function() { r.ads._hasThereBeenALoadStartDuringPlayerLife = !0 }), r.on("loadeddata", function() { r.ads._hasThereBeenALoadedData = !0 }), r.on("loadedmetadata", function() { r.ads._hasThereBeenALoadedMetaData = !0 }), r.ads = function(t) { return { disableNextSnapshotRestore: !1, _contentEnding: !1, _contentHasEnded: !1, _hasThereBeenALoadStartDuringPlayerLife: !1, _hasThereBeenALoadedData: !1, _hasThereBeenALoadedMetaData: !1, _inLinearAdMode: !1, _shouldBlockPlay: !1, _playBlocked: !1, _playRequested: !1, adType: null, VERSION: a, reset: function() { t.ads.disableNextSnapshotRestore = !1, t.ads._contentEnding = !1, t.ads._contentHasEnded = !1, t.ads.snapshot = null, t.ads.adType = null, t.ads._hasThereBeenALoadedData = !1, t.ads._hasThereBeenALoadedMetaData = !1, t.ads._cancelledPlay = !1, t.ads._shouldBlockPlay = !1, t.ads._playBlocked = !1, t.ads.nopreroll_ = !1, t.ads.nopostroll_ = !1, t.ads._playRequested = !1 }, startLinearAdMode: function() { t.ads._state.startLinearAdMode() }, endLinearAdMode: function() { t.ads._state.endLinearAdMode() }, skipLinearAdMode: function() { t.ads._state.skipLinearAdMode() }, stitchedAds: function(t) { return void 0 !== t && (e.log.warn("Using player.ads.stitchedAds() as a setter is deprecated, it should be set as an option upon initialization of contrib-ads."), this.settings.stitchedAds = !!t), this.settings.stitchedAds }, videoElementRecycled: function() { if (t.ads.shouldPlayContentBehindAd(t)) return !1; if (!this.snapshot) throw new Error("You cannot use videoElementRecycled while there is no snapshot."); var e = t.tech_.src() !== this.snapshot.src, n = t.currentSrc() !== this.snapshot.currentSrc; return e || n }, isLive: function(n) { return void 0 === n && (n = t), "boolean" == typeof n.ads.settings.contentIsLive ? n.ads.settings.contentIsLive : n.duration() === 1 / 0 || "8" === e.browser.IOS_VERSION && 0 === n.duration() }, shouldPlayContentBehindAd: function(n) { if (void 0 === n && (n = t), n) return !!n.ads.settings.liveCuePoints && !e.browser.IS_IOS && !e.browser.IS_ANDROID && n.duration() === 1 / 0; throw new Error("shouldPlayContentBehindAd requires a player as a param") }, shouldTakeSnapshots: function(e) { return void 0 === e && (e = t), !this.shouldPlayContentBehindAd(e) && !this.stitchedAds() }, isInAdMode: function() { return this._state.isAdState() }, isWaitingForAdBreak: function() { return this._state.isWaitingForAdBreak() }, isContentResuming: function() { return this._state.isContentResuming() }, isAdPlaying: function() { return this._state.inAdBreak() }, inAdBreak: function() { return this._state.inAdBreak() }, removeNativePoster: function() { var e = t.$(".vjs-tech"); e && e.removeAttribute("poster") }, debug: function() { if (this.settings.debug) { for (var t = arguments.length, n = new Array(t), a = 0; a < t; a++) n[a] = arguments[a]; 1 === n.length && "string" == typeof n[0] ? e.log("ADS: " + n[0]) : e.log.apply(e, ["ADS:"].concat(n)) } } } }(r), r.ads.settings = i, i.stitchedAds = !!i.stitchedAds, i.stitchedAds ? r.ads._state = new(k.getState("StitchedContentPlayback"))(r) : r.ads._state = new(k.getState("BeforePreroll"))(r), r.ads._state.init(r), r.ads.cueTextTracks = g, r.ads.adMacroReplacement = function(a, o, r) { var i = this, s = {}; a = a.replace(/{([^}=]+)=([^}]+)}/g, function(e, t, n) { return s["{" + t + "}"] = n, "{" + t + "}" }), void 0 === o && (o = !1); var d = {}; for (var l in void 0 !== r && (d = r), d["{player.id}"] = this.options_["data-player"] || this.id_, d["{player.height}"] = this.currentHeight(), d["{player.width}"] = this.currentWidth(), d["{mediainfo.id}"] = this.mediainfo ? this.mediainfo.id : "", d["{mediainfo.name}"] = this.mediainfo ? this.mediainfo.name : "", d["{mediainfo.duration}"] = this.mediainfo ? this.mediainfo.duration : "", d["{player.duration}"] = this.duration(), d["{player.pageUrl}"] = e.dom.isInFrame() ? n.referrer : t.location.href, d["{playlistinfo.id}"] = this.playlistinfo ? this.playlistinfo.id : "", d["{playlistinfo.name}"] = this.playlistinfo ? this.playlistinfo.name : "", d["{timestamp}"] = (new Date).getTime(), d["{document.referrer}"] = n.referrer, d["{window.location.href}"] = t.location.href, d["{random}"] = Math.floor(1e12 * Math.random()), ["description", "tags", "reference_id", "ad_keys"].forEach(function(e) { i.mediainfo && i.mediainfo[e] ? d["{mediainfo." + e + "}"] = i.mediainfo[e] : s["{mediainfo." + e + "}"] ? d["{mediainfo." + e + "}"] = s["{mediainfo." + e + "}"] : d["{mediainfo." + e + "}"] = "" }), p(this.mediainfo, d, "custom_fields"), p(this.mediainfo, d, "customFields"), Object.keys(c).forEach(function(e) { d["{tcf." + e + "}"] = c[e] }), d["{tcf.gdprAppliesInt}"] = c.gdprApplies ? 1 : 0, d) a = a.split(l).join(h(d[l], o)); for (var u in a = a.replace(/{pageVariable\.([^}]+)}/g, function(n, a) { for (var r, i = t, d = a.split("."), l = 0; l < d.length; l++) l === d.length - 1 ? r = i[d[l]] : i = i[d[l]]; var u = typeof r; return null === r ? "null" : void 0 === r ? s["{pageVariable." + a + "}"] ? s["{pageVariable." + a + "}"] : (e.log.warn('Page variable "' + a + '" not found'), "") : "string" !== u && "number" !== u && "boolean" !== u ? (e.log.warn('Page variable "' + a + '" is not a supported type'), "") : h(String(r), o) }), s) a = a.replace(u, s[u]); return a }.bind(r), function(e) { e.ads.contentSrc = e.currentSrc(), e.ads._seenInitialLoadstart = !1, e.on("loadstart", function() { if (!e.ads.inAdBreak()) { var t = e.currentSrc(); t !== e.ads.contentSrc && (e.ads._seenInitialLoadstart && e.trigger({ type: "contentchanged" }), e.trigger({ type: "contentupdate", oldValue: e.ads.contentSrc, newValue: t }), e.ads.contentSrc = t), e.ads._seenInitialLoadstart = !0 } }) }(r), r.on("contentchanged", r.ads.reset); var d = function() { var t = r.textTracks(); if (!r.ads.shouldPlayContentBehindAd(r) && r.ads.inAdBreak() && r.tech_.featuresNativeTextTracks && e.browser.IS_IOS && !Array.isArray(r.textTracks())) for (var n = 0; n < t.length; n++) { var a = t[n]; "showing" === a.mode && (a.mode = "disabled") } }; r.ready(function() { r.textTracks().addEventListener("change", d) }), r.on(["play", "playing", "ended", "adsready", "adscanceled", "adskip", "adserror", "adtimeout", "adended", "ads-ad-started", "contentchanged", "dispose", "contentresumed", "readyforpostroll", "nopreroll", "nopostroll"], function(e) { r.ads._state.handleEvent(e.type) }), r.on("dispose", function() { r.ads.reset(), r.textTracks().removeEventListener("change", d) }), f(), r.ads.listenToTcf = f }; return q.VERSION = a, function(t) { !b(e) && ((e.registerPlugin || e.plugin)("ads", t), P() && !e.usingContribAdsMiddleware_ && (e.use("*", _), e.usingContribAdsMiddleware_ = !0, e.log.debug("Play middleware has been registered with videojs"))) }(q), q }); /*! @name @viostream/videojs-overlay @version v2.1.6-f.97-master @license Apache-2.0 */ ! function(t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("video.js")) : "function" == typeof define && define.amd ? define(["video.js"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).videojsOverlay = e(t.videojs) }(this, (function(t) { "use strict"; function e(t) { return t && "object" == typeof t && "default" in t ? t : { default: t } } var n = e(t); function i(t, e, n) { return t(n = { path: e, exports: {}, require: function(t, e) { return function() { throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs") }(null == e && n.path) } }, n.exports), n.exports } var o = i((function(t) { t.exports = function(t) { if (void 0 === t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return t }, t.exports.default = t.exports, t.exports.__esModule = !0 })), r = i((function(t) { function e(n, i) { return t.exports = e = Object.setPrototypeOf || function(t, e) { return t.__proto__ = e, t }, t.exports.default = t.exports, t.exports.__esModule = !0, e(n, i) } t.exports = e, t.exports.default = t.exports, t.exports.__esModule = !0 })), s = i((function(t) { t.exports = function(t, e) { t.prototype = Object.create(e.prototype), t.prototype.constructor = t, r(t, e) }, t.exports.default = t.exports, t.exports.__esModule = !0 })), a = { align: "top-left", class: "", content: "This overlay will show up while the video is playing", debug: !1, showBackground: !0, attachToControlBar: !1, overlays: [{ start: "playing", end: "paused" }] }, h = n.default.getComponent("Component"), d = n.default.dom || n.default, l = n.default.registerPlugin || n.default.plugin, u = function(t) { return "number" == typeof t && t == t }, p = function(t) { return "string" == typeof t && /^\S+$/.test(t) }, c = function(t) { function e(n, i) { var r; return (r = t.call(this, n, i) || this).isVisible = !0, ["start", "end"].forEach((function(t) { var e = r.options_[t]; if (u(e)) r[t + "Event_"] = "timeupdate"; else if (p(e)) r[t + "Event_"] = e; else if ("start" === t) throw new Error('invalid "start" option; expected number or string') })), ["endListener_", "rewindListener_", "startListener_"].forEach((function(t) { r[t] = function(n) { return e.prototype[t].call(o(r), n) } })), "timeupdate" === r.startEvent_ && r.on(n, "timeupdate", r.rewindListener_), r.debug('created, listening to "' + r.startEvent_ + '" for "start" and "' + (r.endEvent_ || "nothing") + '" for "end"'), r.hide(), r } s(e, t); var i = e.prototype; return i.createEl = function() { var t = this.options_, e = t.content, n = t.showBackground ? "vjs-overlay-background" : "vjs-overlay-no-background", i = d.createEl("div", { className: "\n vjs-overlay\n vjs-overlay-" + t.align + "\n " + t.class + "\n " + n + "\n vjs-hidden\n " }); return "string" == typeof e ? i.innerHTML = e : e instanceof window.DocumentFragment ? i.appendChild(e) : d.appendContent(i, e), i }, i.debug = function() { if (this.options_.debug) { for (var t = n.default.log, e = t, i = arguments.length, o = new Array(i), r = 0; r < i; r++) o[r] = arguments[r]; t.hasOwnProperty(o[0]) && "function" == typeof t[o[0]] && (e = t[o.shift()]), e.apply(void 0, ["overlay#" + this.id() + ": "].concat(o)) } }, i.hide = function() { if (!1 !== this.isVisible) return t.prototype.hide.call(this), this.isVisible = !1, this.debug("hidden"), this.debug('bound `startListener_` to "' + this.startEvent_ + '"'), u(this.options_.end) && (this.player().paused() || this.player().trigger("hide-overlay", { id: this.options_.cta_id, align: this.options_.align })), this.endEvent_ && (this.debug('unbound `endListener_` from "' + this.endEvent_ + '"'), this.off(this.player(), this.endEvent_, this.endListener_)), this.on(this.player(), this.startEvent_, this.startListener_), this }, i.shouldHide_ = function(t, e) { var n = this.options_.end; return u(n) ? t >= n : n === e }, i.show = function() { return t.prototype.show.call(this), this.isVisible = !0, this.off(this.player(), this.startEvent_, this.startListener_), this.debug("shown"), this.debug('unbound `startListener_` from "' + this.startEvent_ + '"'), u(this.options_.start) && (this.player().paused() && 0 !== this.options_.start || this.player().trigger("show-overlay", { id: this.options_.cta_id, align: this.options_.align })), this.endEvent_ && (this.debug('bound `endListener_` to "' + this.endEvent_ + '"'), this.on(this.player(), this.endEvent_, this.endListener_)), this }, i.shouldShow_ = function(t, e) { var n = this.options_.start, i = this.options_.end; return u(n) ? u(i) ? t >= n && t < i : this.hasShownSinceSeek_ ? Math.floor(t) === n : (this.hasShownSinceSeek_ = !0, t >= n) : n === e }, i.startListener_ = function(t) { var e = this.player().currentTime(); this.shouldShow_(e, t.type) && this.show() }, i.endListener_ = function(t) { var e = this.player().currentTime(); this.shouldHide_(e, t.type) && this.hide() }, i.rewindListener_ = function(t) { var e = this.player().currentTime(), n = this.previousTime_, i = this.options_.start, o = this.options_.end; e < n && (this.debug("rewind detected"), u(o) && !this.shouldShow_(e) ? (this.debug("hiding; " + o + " is an integer and overlay should not show at this time"), this.hasShownSinceSeek_ = !1, this.hide()) : p(o) && e < i && (this.debug("hiding; show point (" + i + ") is before now (" + e + ") and end point (" + o + ") is an event"), this.hasShownSinceSeek_ = !1, this.hide())), this.previousTime_ = e }, e }(h); n.default.registerComponent("Overlay", c); var f = function(t) { var e = this, i = n.default.mergeOptions(a, t); Array.isArray(this.overlays_) && this.overlays_.forEach((function(t) { e.removeChild(t), e.controlBar && e.controlBar.removeChild(t), t.dispose() })); var o = i.overlays; delete i.overlays, this.overlays_ = o.map((function(t) { var o = n.default.mergeOptions(i, t), r = "string" == typeof o.attachToControlBar || !0 === o.attachToControlBar; if (!e.controls() || !e.controlBar) return e.addChild("overlay", o); if (r && -1 !== o.align.indexOf("bottom")) { var s = e.controlBar.children()[0]; if (void 0 !== e.controlBar.getChild(o.attachToControlBar) && (s = e.controlBar.getChild(o.attachToControlBar)), s) { var a = e.controlBar.children().indexOf(s); return e.controlBar.addChild("overlay", o, a) } } var h = e.addChild("overlay", o); return e.el().insertBefore(h.el(), e.controlBar.el()), h })) }; return f.VERSION = "v2.1.6-f.97-master", l("overlay", f), f })); /** * videojs-share * @version 3.2.1 * @copyright 2019 Mikhail Khazov * @license MIT */ ! function(t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("video.js")) : "function" == typeof define && define.amd ? define(["video.js"], e) : t.videojsShare = e(t.videojs) }(this, function(t) { "use strict"; function e(t, e) { return e = { exports: {} }, t(e, e.exports), e.exports } function n(t) { var e; if ("SELECT" === t.nodeName) t.focus(), e = t.value; else if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) { var n = t.hasAttribute("readonly"); n || t.setAttribute("readonly", ""), t.select(), t.setSelectionRange(0, t.value.length), n || t.removeAttribute("readonly"), e = t.value } else { t.hasAttribute("contenteditable") && t.focus(); var i = window.getSelection(), o = document.createRange(); o.selectNodeContents(t), i.removeAllRanges(), i.addRange(o), e = i.toString() } return e } function i() {} function o(t, e) { for (; t && t.nodeType !== G;) { if ("function" == typeof t.matches && t.matches(e)) return t; t = t.parentNode } } function r(t, e, n, i, o) { var r = l.apply(this, arguments); return t.addEventListener(n, r, o), { destroy: function() { t.removeEventListener(n, r, o) } } } function a(t, e, n, i, o) { return "function" == typeof t.addEventListener ? r.apply(null, arguments) : "function" == typeof n ? r.bind(null, document).apply(null, arguments) : ("string" == typeof t && (t = document.querySelectorAll(t)), Array.prototype.map.call(t, function(t) { return r(t, e, n, i, o) })) } function l(t, e, n, i) { return function(n) { n.delegateTarget = K(n.target, e), n.delegateTarget && i.call(t, n) } } function s(t, e, n) { if (!t && !e && !n) throw new Error("Missing required arguments"); if (!X.string(e)) throw new TypeError("Second argument must be a String"); if (!X.fn(n)) throw new TypeError("Third argument must be a Function"); if (X.node(t)) return c(t, e, n); if (X.nodeList(t)) return u(t, e, n); if (X.string(t)) return h(t, e, n); throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList") } function c(t, e, n) { return t.addEventListener(e, n), { destroy: function() { t.removeEventListener(e, n) } } } function u(t, e, n) { return Array.prototype.forEach.call(t, function(t) { t.addEventListener(e, n) }), { destroy: function() { Array.prototype.forEach.call(t, function(t) { t.removeEventListener(e, n) }) } } } function h(t, e, n) { return Q(document.body, t, e, n) } function d(t) { return Object.keys(t).filter(function(e) { return void 0 !== t[e] && "" !== t[e] }).map(function(e) { return encodeURIComponent(e) + "=" + encodeURIComponent(t[e]) }).join("&") } function f() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.fbAppId, n = t.url, i = t.redirectUri; if (!e) throw new Error("fbAppId is not defined"); var o = d({ app_id: e, display: "popup", redirect_uri: i, link: n }); return window.open("https://www.facebook.com/dialog/feed?" + o, "_blank", tt) } function p() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.fbAppId, n = t.url, i = t.hashtag, o = t.redirectUri; if (!e) throw new Error("fbAppId is not defined"); var r = d({ app_id: e, display: "popup", redirect_uri: o, href: n, hashtag: i }); return window.open("https://www.facebook.com/dialog/share?" + r, "_blank", tt) } function v() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).url; if (!t) throw new Error("url is not defined"); var e = d({ kid_directed_site: "0", sdk: "joey", u: t, display: "popup", ref: "plugin", src: "share_button" }); return window.open("https://www.facebook.com/sharer/sharer.php?" + e, "_blank", tt) } function g() { var t = d({ url: (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).url }); return window.open("https://plus.google.com/share?" + t, "_blank", tt) } function w() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = d({ share_url: t.url, title: t.title, description: t.description, imageurl: t.image }); return window.open("http://connect.mail.ru/share?" + e, "_blank", tt) } function m() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.url, n = t.title, i = t.description, o = (n || "") + "\r\n" + (i || "") + "\r\n" + (e || ""), r = "mailto:?body=" + encodeURIComponent(o); return window.location.assign(r) } function y() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = d({ "st.cmd": "addShare", "st._surl": t.url, title: t.title }); return window.open("https://ok.ru/dk?" + e, "_blank", tt) } function b() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = d({ url: t.url, text: t.title }); return window.open("https://t.me/share/url?" + e, "_blank", tt) } function k() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.title, n = t.url, i = t.hashtags, o = d({ text: e, url: n, hashtags: (void 0 === i ? [] : i).join(",") }); return window.open("https://twitter.com/intent/tweet?" + o, "_blank", tt) } function _() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = d({ url: t.url, title: t.title }); return window.open("https://www.reddit.com/submit?" + e, "_blank", tt) } function C() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.description, n = d({ url: t.url, description: e, media: t.media }); return window.open("https://pinterest.com/pin/create/button/?" + n, "_blank", tt) } function x() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.url, n = t.title, i = t.caption, o = t.tags, r = void 0 === o ? [] : o, a = t.posttype, l = void 0 === a ? "link" : a, s = d({ canonicalUrl: e, title: n, caption: i, tags: r.join(","), posttype: l }); return window.open("https://www.tumblr.com/widgets/share/tool?" + s, "_blank", tt) } function E() { return !!window.navigator.userAgent.match(/Version\/[\d.]+.*Safari/) } function S(t) { return E() ? window.open(t) : window.location.assign(t) } function j() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.url, n = t.title; if (!e && !n) throw new Error("url and title not specified"); return S("viber://forward?" + d({ text: [n, e].filter(function(t) { return t }).join(" ") })) } function F() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.url, n = t.image, i = t.isVkParse, o = t.description, r = t.title; o && o.length > et && (o = o.substr(0, et) + "..."), r && r.length > et && (r = r.substr(0, et) + "..."); return "https://vk.com/share.php?" + d(i ? { url: e } : { url: e, title: r, description: o, image: n, noparse: !0 }) } function A() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; return window.open(F(t), "_blank", tt) } function T() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.phone, n = d({ text: [t.title, t.url].filter(function(t) { return t }).join(" "), phone: e }); return window.open("https://api.whatsapp.com/send?" + n, "_blank", tt) } function z() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.title, n = t.url, i = d({ title: e, summary: t.description, url: n }); return window.open("https://www.linkedin.com/shareArticle?mini=true&" + i, "_blank", tt) } function M() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.fbAppId, n = t.url; if (!e) throw new Error("fbAppId is not defined"); var i = d({ app_id: e, link: n }); return window.location.assign("fb-messenger://share?" + i) } function O() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, e = t.title, n = t.url; if (!n) throw new Error("url is not defined"); var i = encodeURIComponent("" + n); return e && (i = "" + encodeURIComponent(e + " ") + i), window.open("https://line.me/R/msg/text/?" + i, "_blank", tt) } function L() { return "ontouchstart" in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 } function V() { return /Android/.test(window.navigator.userAgent) || /iP(hone|ad|od)/i.test(window.navigator.userAgent) } function H() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; return !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1] ? V() ? t : t.filter(function(t) { return !it.includes(t) }) : t } t = t && t.hasOwnProperty("default") ? t.default : t; var I = function() { return "undefined" == typeof window ? "" : window.location.href }(), P = { mobileVerification: !0, title: "Video", url: I, socials: ["fbFeed", "tw", "reddit", "gp", "messenger", "linkedin", "vk", "ok", "mail", "email", "telegram", "whatsapp", "viber"], embedCode: function() { return "" }(), redirectUri: function() { return I + "#close_window" }() }, R = function(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") }, U = function() { function t(t, e) { for (var n = 0; n < e.length; n++) { var i = e[n]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(t, i.key, i) } } return function(e, n, i) { return n && t(e.prototype, n), i && t(e, i), e } }(), N = function(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) }, B = function(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e }, q = function(t) { function e(n, i) { R(this, e); var o = B(this, t.call(this, n, i)); return o.addClass("vjs-menu-button"), o.addClass("vjs-share-control"), o.addClass("vjs-icon-share"), o.controlText(n.localize("Share")), o } return N(e, t), e.prototype.handleClick = function() { this.player().getChild("ShareOverlay").open() }, e }(t.getComponent("Button")), D = ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self && self, n), Y = e(function(t, e) { ! function(e, n) { n(t, D) }(0, function(t, e) { function n(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } var i = function(t) { return t && t.__esModule ? t : { default: t } }(e), o = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) { return typeof t } : function(t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, r = function() { function t(t, e) { for (var n = 0; n < e.length; n++) { var i = e[n]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(t, i.key, i) } } return function(e, n, i) { return n && t(e.prototype, n), i && t(e, i), e } }(), a = function() { function t(e) { n(this, t), this.resolveOptions(e), this.initSelection() } return r(t, [{ key: "resolveOptions", value: function() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; this.action = t.action, this.container = t.container, this.emitter = t.emitter, this.target = t.target, this.text = t.text, this.trigger = t.trigger, this.selectedText = "" } }, { key: "initSelection", value: function() { this.text ? this.selectFake() : this.target && this.selectTarget() } }, { key: "selectFake", value: function() { var t = this, e = "rtl" == document.documentElement.getAttribute("dir"); this.removeFake(), this.fakeHandlerCallback = function() { return t.removeFake() }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[e ? "right" : "left"] = "-9999px"; var n = window.pageYOffset || document.documentElement.scrollTop; this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, i.default)(this.fakeElem), this.copyText() } }, { key: "removeFake", value: function() { this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) } }, { key: "selectTarget", value: function() { this.selectedText = (0, i.default)(this.target), this.copyText() } }, { key: "copyText", value: function() { var t = void 0; try { t = document.execCommand(this.action) } catch (e) { t = !1 } this.handleResult(t) } }, { key: "handleResult", value: function(t) { this.emitter.emit(t ? "success" : "error", { action: this.action, text: this.selectedText, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) }) } }, { key: "clearSelection", value: function() { this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() } }, { key: "destroy", value: function() { this.removeFake() } }, { key: "action", set: function() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "copy"; if (this._action = t, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') }, get: function() { return this._action } }, { key: "target", set: function(t) { if (void 0 !== t) { if (!t || "object" !== (void 0 === t ? "undefined" : o(t)) || 1 !== t.nodeType) throw new Error('Invalid "target" value, use a valid Element'); if ("copy" === this.action && t.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); if ("cut" === this.action && (t.hasAttribute("readonly") || t.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); this._target = t } }, get: function() { return this._target } }]), t }(); t.exports = a }) }); i.prototype = { on: function(t, e, n) { var i = this.e || (this.e = {}); return (i[t] || (i[t] = [])).push({ fn: e, ctx: n }), this }, once: function(t, e, n) { function i() { o.off(t, i), e.apply(n, arguments) } var o = this; return i._ = e, this.on(t, i, n) }, emit: function(t) { var e = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[t] || []).slice(), i = 0, o = n.length; for (i; i < o; i++) n[i].fn.apply(n[i].ctx, e); return this }, off: function(t, e) { var n = this.e || (this.e = {}), i = n[t], o = []; if (i && e) for (var r = 0, a = i.length; r < a; r++) i[r].fn !== e && i[r].fn._ !== e && o.push(i[r]); return o.length ? n[t] = o : delete n[t], this } }; var W = i, X = e(function(t, e) { e.node = function(t) { return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType }, e.nodeList = function(t) { var n = Object.prototype.toString.call(t); return void 0 !== t && ("[object NodeList]" === n || "[object HTMLCollection]" === n) && "length" in t && (0 === t.length || e.node(t[0])) }, e.string = function(t) { return "string" == typeof t || t instanceof String }, e.fn = function(t) { return "[object Function]" === Object.prototype.toString.call(t) } }), G = 9; if ("undefined" != typeof Element && !Element.prototype.matches) { var J = Element.prototype; J.matches = J.matchesSelector || J.mozMatchesSelector || J.msMatchesSelector || J.oMatchesSelector || J.webkitMatchesSelector } var K = o, Q = a, Z = s, $ = function(t) { return t && t.__esModule ? t.default : t }(e(function(t, e) { ! function(e, n) { n(t, Y, W, Z) }(0, function(t, e, n, i) { function o(t) { return t && t.__esModule ? t : { default: t } } function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function a(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e) { var n = "data-clipboard-" + t; if (e.hasAttribute(n)) return e.getAttribute(n) } var c = o(e), u = o(n), h = o(i), d = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) { return typeof t } : function(t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, f = function() { function t(t, e) { for (var n = 0; n < e.length; n++) { var i = e[n]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(t, i.key, i) } } return function(e, n, i) { return n && t(e.prototype, n), i && t(e, i), e } }(), p = function(t) { function e(t, n) { r(this, e); var i = a(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); return i.resolveOptions(n), i.listenClick(t), i } return l(e, t), f(e, [{ key: "resolveOptions", value: function() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; this.action = "function" == typeof t.action ? t.action : this.defaultAction, this.target = "function" == typeof t.target ? t.target : this.defaultTarget, this.text = "function" == typeof t.text ? t.text : this.defaultText, this.container = "object" === d(t.container) ? t.container : document.body } }, { key: "listenClick", value: function(t) { var e = this; this.listener = (0, h.default)(t, "click", function(t) { return e.onClick(t) }) } }, { key: "onClick", value: function(t) { var e = t.delegateTarget || t.currentTarget; this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new c.default({ action: this.action(e), target: this.target(e), text: this.text(e), container: this.container, trigger: e, emitter: this }) } }, { key: "defaultAction", value: function(t) { return s("action", t) } }, { key: "defaultTarget", value: function(t) { var e = s("target", t); if (e) return document.querySelector(e) } }, { key: "defaultText", value: function(t) { return s("text", t) } }, { key: "destroy", value: function() { this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) } }], [{ key: "isSupported", value: function() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], e = "string" == typeof t ? [t] : t, n = !!document.queryCommandSupported; return e.forEach(function(t) { n = n && !!document.queryCommandSupported(t) }), n } }]), e }(u.default); t.exports = p }) })), tt = "scrollbars=0, resizable=1, menubar=0, left=100, top=100, width=550, height=440, toolbar=0, status=0", et = 80, nt = (Object.freeze || Object)({ fbFeed: f, fbShare: p, fbButton: v, gp: g, mail: w, email: m, ok: y, telegram: b, tw: k, reddit: _, pinterest: C, tumblr: x, viber: j, getVkUrl: F, vk: A, whatsapp: T, linkedin: z, messenger: M, line: O }), it = ["whatsapp", "viber", "messenger"], ot = { fbFeed: '\n \n\n', tw: '\n \n\n', reddit: '\n \n\n', gp: '\n \n\n', messenger: '\n \n \n\n', linkedin: '\n \n\n', vk: '\n \n\n', ok: '\n \n\n', mail: '\n \n\n', email: '\n \n\n', telegram: '\n \n\n', whatsapp: '\n \n\n', viber: '\n \n\n' }, rt = function() { function t(e, n) { R(this, t), this.player = e, this.options = n, this.socials = H(n.socials, n.mobileVerification), this.copyBtnTextClass = "vjs-share__btn-text", this.socialBtnClass = "vjs-share__social", this._createContent(), this._initToggle(), this._initClipboard(), this._initSharing() } return t.prototype.getContent = function() { return this.content }, t.prototype._createContent = function() { var t = '\n \n \n \n ' + this.player.localize("Copy") + "\n ", e = document.createElement("div"), n = ""; this.options.embedCode && (n = '\n \n "), e.innerHTML = '
\n \n\n
\n \n \n\n " + n + '\n
\n\n
\n
\n ' + this._getSocialItems().join("") + "\n
\n
\n
", this.content = e.firstChild }, t.prototype._initClipboard = function() { var t = this; new $(".vjs-share__btn", { target: function(t) { return t.previousElementSibling } }).on("success", function(e) { var n = e.trigger.querySelector("." + t.copyBtnTextClass), i = function() { n.innerText = t.player.localize("Copy"), e.clearSelection() }; n.innerText = t.player.localize("Copied"), L() ? setTimeout(i, 1e3) : n.parentElement.addEventListener("mouseleave", function() { setTimeout(i, 300) }) }) }, t.prototype._initSharing = function() { var t = this, e = this.content.querySelectorAll("." + this.socialBtnClass); Array.from(e).forEach(function(e) { e.addEventListener("click", function(e) { var n = e.currentTarget.getAttribute("data-social"), i = nt[n]; "function" == typeof i && i(t.socialOptions) }) }) }, t.prototype._initToggle = function() { var t = this.content.querySelector(".vjs-share__socials"); this.socials.length > 10 || window.innerWidth <= 180 && this.socials.length > 6 ? t.style.height = "calc((2em + 5px) * 2)" : t.classList.add("horizontal") }, t.prototype._getSocialItems = function() { var t = []; return this.socials.forEach(function(e) { ot[e] && t.push('\n \n ") }), t }, U(t, [{ key: "socialOptions", get: function() { var t = this.options; return { url: t.url, title: t.title, description: t.description, image: t.image, fbAppId: t.fbAppId, isVkParse: t.isVkParse, redirectUri: t.redirectUri } } }]), t }(), at = function(t) { function e(n, i) { R(this, e); var o = B(this, t.call(this, n, i)); return o.playerClassName = "vjs-videojs-share_open", o } return N(e, t), e.prototype.open = function() { var e = this.player(); e.addClass(this.playerClassName), t.prototype.open.call(this), e.trigger("sharing:opened") }, e.prototype.close = function() { var e = this.player(); e.removeClass(this.playerClassName), t.prototype.close.call(this), e.trigger("sharing:closed") }, e }(t.getComponent("ModalDialog")), lt = function(t) { function e(n, i) { R(this, e); var o = B(this, t.call(this, n, i)); return o.player = n, o.options = i, o } return N(e, t), e.prototype._createModal = function() { var t = new rt(this.player, this.options).getContent(); this.modal = new at(this.player, { content: t, temporary: !0 }), this.el = this.modal.contentEl(), this.player.addChild(this.modal) }, e.prototype.open = function() { this._createModal(), this.modal.open() }, e }(t.getComponent("Component")), st = function(e) { function n(i, o) { R(this, n); var r = B(this, e.call(this, i)); return r.options = t.mergeOptions(P, o), r.player.ready(function() { r.player.addClass("vjs-share"), i.addClass("vjs-videojs-share"), i.getChild("controlBar").addChild("ShareButton", o), i.addChild("ShareOverlay", o) }), r } return N(n, e), n }(t.getPlugin("plugin")); return st.defaultState = {}, st.VERSION = "3.2.1", t.registerComponent("ShareButton", q), t.registerComponent("ShareOverlay", lt), t.registerPlugin("share", st), st }); /** * videojs-watermark * @version 2.0.0 * @copyright 2017 Brooks Lyrette * @license Apache-2.0 */ ! function(e) { if ("object" == typeof exports && "undefined" != typeof module) module.exports = e(); else if ("function" == typeof define && define.amd) define([], e); else { var n; n = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this, n.videojsWatermark = e() } }(function() { return function e(n, t, i) { function o(d, a) { if (!t[d]) { if (!n[d]) { var f = "function" == typeof require && require; if (!a && f) return f(d, !0); if (r) return r(d, !0); var u = new Error("Cannot find module '" + d + "'"); throw u.code = "MODULE_NOT_FOUND", u } var l = t[d] = { exports: {} }; n[d][0].call(l.exports, function(e) { var t = n[d][1][e]; return o(t || e) }, l, l.exports, e, n, t, i) } return t[d].exports } for (var r = "function" == typeof require && require, d = 0; d < i.length; d++) o(i[d]); return o }({ 1: [function(e, n, t) { (function(e) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }); var i = "undefined" != typeof window ? window.videojs : void 0 !== e ? e.videojs : null, o = function(e) { return e && e.__esModule ? e : { default: e } }(i), r = { position: "top-right", fadeTime: 3e3, url: void 0, image: void 0 }, d = function(e, n) { var t = e.el(), i = document.createElement("div"), o = document.createElement("img"); if (i.classList.add("vjs-watermark-content"), i.classList.add("vjs-watermark-" + n.position), o.src = n.image, n.url) { var r = document.createElement("a"); r.href = n.url, r.onclick = function(t) { t.preventDefault(), e.pause(), window.open(n.url) }, r.appendChild(o), i.appendChild(r) } else i.appendChild(o); t.appendChild(i) }, a = function(e) { setTimeout(function() { return document.getElementsByClassName("vjs-watermark-content")[0].classList.add("vjs-watermark-fade") }, e.fadeTime) }, f = function(e, n) { e.addClass("vjs-watermark"), n.image && (d(e, n), null !== n.fadeTime && e.on("play", function() { return a(n) })) }, u = function(e) { var n = this; this.ready(function() { f(n, o.default.mergeOptions(r, e)) }) }; o.default.registerPlugin("watermark", u), u.VERSION = "2.0.0", t.default = u, n.exports = t.default }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {}) }, {}] }, {}, [1])(1) }); /*! @name videojs-vr @version 1.10.1 @license MIT */ ! function(t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("global/window"), require("global/document"), require("video.js")) : "function" == typeof define && define.amd ? define(["global/window", "global/document", "video.js"], e) : (t = t || self).videojsVr = e(t.window, t.document, t.videojs) }(this, (function(t, e, n) { "use strict"; t = t && t.hasOwnProperty("default") ? t.default : t, e = e && e.hasOwnProperty("default") ? e.default : e, n = n && n.hasOwnProperty("default") ? n.default : n; var i = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}; function r(t) { return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t } function o(t, e) { return t(e = { exports: {} }, e.exports), e.exports } var s = r(o((function(t) { t.exports = function(t) { if (void 0 === t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return t }, t.exports.default = t.exports, t.exports.__esModule = !0 }))), a = o((function(t) { function e(n, i) { return t.exports = e = Object.setPrototypeOf || function(t, e) { return t.__proto__ = e, t }, t.exports.default = t.exports, t.exports.__esModule = !0, e(n, i) } t.exports = e, t.exports.default = t.exports, t.exports.__esModule = !0 })); r(a); var l = r(o((function(t) { t.exports = function(t, e) { t.prototype = Object.create(e.prototype), t.prototype.constructor = t, a(t, e) }, t.exports.default = t.exports, t.exports.__esModule = !0 }))), c = r(o((function(t, e) { /** * @license * webvr-polyfill * Copyright (c) 2015-2017 Google * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @license * cardboard-vr-display * Copyright (c) 2015-2017 Google * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @license * webvr-polyfill-dpdb * Copyright (c) 2017 Google * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @license * wglu-preserve-state * Copyright (c) 2016, Brandon Jones. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @license * nosleep.js * Copyright (c) 2017, Rich Tibbett * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ t.exports = function() { var t, e = "undefined" != typeof window ? window : void 0 !== i ? i : "undefined" != typeof self ? self : {}, n = function() { return /Android/i.test(navigator.userAgent) || /iPhone|iPad|iPod/i.test(navigator.userAgent) }, r = function(t, e) { for (var n = 0, i = t.length; n < i; n++) e[n] = t[n] }, o = function(t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]); return t }, s = (t = function(t, e) { return t(e = { exports: {} }, e.exports), e.exports }((function(t, n) { /** * @license * cardboard-vr-display * Copyright (c) 2015-2017 Google * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @license * gl-preserve-state * Copyright (c) 2016, Brandon Jones. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @license * webvr-polyfill-dpdb * Copyright (c) 2015-2017 Google * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @license * nosleep.js * Copyright (c) 2017, Rich Tibbett * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ t.exports = function() { var t, n, i, r = function() { function t(t, e) { for (var n = 0; n < e.length; n++) { var i = e[n]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(t, i.key, i) } } return function(e, n, i) { return n && t(e.prototype, n), i && t(e, i), e } }(), o = function(t, e) { if (Array.isArray(t)) return t; if (Symbol.iterator in Object(t)) return function(t, e) { var n = [], i = !0, r = !1, o = void 0; try { for (var s, a = t[Symbol.iterator](); !(i = (s = a.next()).done) && (n.push(s.value), !e || n.length !== e); i = !0); } catch (t) { r = !0, o = t } finally { try { !i && a.return && a.return() } finally { if (r) throw o } } return n }(t, e); throw new TypeError("Invalid attempt to destructure non-iterable instance") }, s = function(t, e, n) { return t + (e - t) * n }, a = function() { var t = /iPad|iPhone|iPod/.test(navigator.platform); return function() { return t } }(), l = function() { var t = -1 !== navigator.userAgent.indexOf("Version") && -1 !== navigator.userAgent.indexOf("Android") && -1 !== navigator.userAgent.indexOf("Chrome"); return function() { return t } }(), c = function() { var t = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); return function() { return t } }(), h = function() { var t = -1 !== navigator.userAgent.indexOf("Firefox") && -1 !== navigator.userAgent.indexOf("Android"); return function() { return t } }(), u = (n = navigator.userAgent.match(/.*Chrome\/([0-9]+)/), i = n ? parseInt(n[1], 10) : null, function() { return i }), d = function() { var t; return t = a() && c() && -1 !== navigator.userAgent.indexOf("13_4"), function() { return t } }(), p = function() { var t = !1; if (65 === u()) { var e = navigator.userAgent.match(/.*Chrome\/([0-9\.]*)/); if (e) { var n = e[1].split("."), i = o(n, 4), r = (i[0], i[1], i[2]), s = i[3]; t = 3325 === parseInt(r, 10) && parseInt(s, 10) < 148 } } return function() { return t } }(), f = function() { var t = -1 !== navigator.userAgent.indexOf("R7 Build"); return function() { return t } }(), m = function() { var t = 90 == window.orientation || -90 == window.orientation; return f() ? !t : t }, g = function() { return Math.max(window.screen.width, window.screen.height) * window.devicePixelRatio }, v = function() { return Math.min(window.screen.width, window.screen.height) * window.devicePixelRatio }, y = function() { if (document.exitFullscreen) document.exitFullscreen(); else if (document.webkitExitFullscreen) document.webkitExitFullscreen(); else if (document.mozCancelFullScreen) document.mozCancelFullScreen(); else { if (!document.msExitFullscreen) return !1; document.msExitFullscreen() } return !0 }, A = function(t, e, n, i) { var r = t.createShader(t.VERTEX_SHADER); t.shaderSource(r, e), t.compileShader(r); var o = t.createShader(t.FRAGMENT_SHADER); t.shaderSource(o, n), t.compileShader(o); var s = t.createProgram(); for (var a in t.attachShader(s, r), t.attachShader(s, o), i) t.bindAttribLocation(s, i[a], a); return t.linkProgram(s), t.deleteShader(r), t.deleteShader(o), s }, x = function(t, e) { for (var n = {}, i = t.getProgramParameter(e, t.ACTIVE_UNIFORMS), r = "", o = 0; o < i; o++) n[r = t.getActiveUniform(e, o).name.replace("[0]", "")] = t.getUniformLocation(e, r); return n }, _ = function() { var t, e = !1; return t = navigator.userAgent || navigator.vendor || window.opera, (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0, 4))) && (e = !0), e }, b = function(t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]); return t }, w = function(t) { if (a()) { var e = t.style.width, n = t.style.height; t.style.width = parseInt(e) + 1 + "px", t.style.height = parseInt(n) + "px", setTimeout((function() { t.style.width = e, t.style.height = n }), 100) } window.canvas = t }, M = function() { var t = Math.PI / 180, e = .25 * Math.PI, n = new Float32Array([0, 0, 0, 1]), i = new Float32Array([0, 0, 0]); function r(r, o, s, a, l, c) { ! function(n, i, r, o) { var s = Math.tan(i ? i.upDegrees * t : e), a = Math.tan(i ? i.downDegrees * t : e), l = Math.tan(i ? i.leftDegrees * t : e), c = Math.tan(i ? i.rightDegrees * t : e), h = 2 / (l + c), u = 2 / (s + a); n[0] = h, n[1] = 0, n[2] = 0, n[3] = 0, n[4] = 0, n[5] = u, n[6] = 0, n[7] = 0, n[8] = -(l - c) * h * .5, n[9] = (s - a) * u * .5, n[10] = o / (r - o), n[11] = -1, n[12] = 0, n[13] = 0, n[14] = o * r / (r - o), n[15] = 0 }(r, a || null, c.depthNear, c.depthFar); var h, u, d, p, f, m, g, v, y, A, x, _, b, w, M, E, S, T, L, R = s.orientation || n, C = s.position || i; h = o, d = C, p = (u = R)[0], f = u[1], m = u[2], g = u[3], x = p * (v = p + p), _ = p * (y = f + f), b = p * (A = m + m), w = f * y, M = f * A, E = m * A, S = g * v, T = g * y, L = g * A, h[0] = 1 - (w + E), h[1] = _ + L, h[2] = b - T, h[3] = 0, h[4] = _ - L, h[5] = 1 - (x + E), h[6] = M + S, h[7] = 0, h[8] = b + T, h[9] = M - S, h[10] = 1 - (x + w), h[11] = 0, h[12] = d[0], h[13] = d[1], h[14] = d[2], h[15] = 1, l && function(t, e, n) { var i, r, o, s, a, l, c, h, u, d, p, f, m = n[0], g = n[1], v = n[2]; e === t ? (t[12] = e[0] * m + e[4] * g + e[8] * v + e[12], t[13] = e[1] * m + e[5] * g + e[9] * v + e[13], t[14] = e[2] * m + e[6] * g + e[10] * v + e[14], t[15] = e[3] * m + e[7] * g + e[11] * v + e[15]) : (i = e[0], r = e[1], o = e[2], s = e[3], a = e[4], l = e[5], c = e[6], h = e[7], u = e[8], d = e[9], p = e[10], f = e[11], t[0] = i, t[1] = r, t[2] = o, t[3] = s, t[4] = a, t[5] = l, t[6] = c, t[7] = h, t[8] = u, t[9] = d, t[10] = p, t[11] = f, t[12] = i * m + a * g + u * v + e[12], t[13] = r * m + l * g + d * v + e[13], t[14] = o * m + c * g + p * v + e[14], t[15] = s * m + h * g + f * v + e[15]) }(o, o, l), function(t, e) { var n = e[0], i = e[1], r = e[2], o = e[3], s = e[4], a = e[5], l = e[6], c = e[7], h = e[8], u = e[9], d = e[10], p = e[11], f = e[12], m = e[13], g = e[14], v = e[15], y = n * a - i * s, A = n * l - r * s, x = n * c - o * s, _ = i * l - r * a, b = i * c - o * a, w = r * c - o * l, M = h * m - u * f, E = h * g - d * f, S = h * v - p * f, T = u * g - d * m, L = u * v - p * m, R = d * v - p * g, C = y * R - A * L + x * T + _ * S - b * E + w * M; C && (C = 1 / C, t[0] = (a * R - l * L + c * T) * C, t[1] = (r * L - i * R - o * T) * C, t[2] = (m * w - g * b + v * _) * C, t[3] = (d * b - u * w - p * _) * C, t[4] = (l * S - s * R - c * E) * C, t[5] = (n * R - r * S + o * E) * C, t[6] = (g * x - f * w - v * A) * C, t[7] = (h * w - d * x + p * A) * C, t[8] = (s * L - a * S + c * M) * C, t[9] = (i * S - n * L - o * M) * C, t[10] = (f * b - m * x + v * y) * C, t[11] = (u * x - h * b - p * y) * C, t[12] = (a * E - s * T - l * M) * C, t[13] = (n * T - i * E + r * M) * C, t[14] = (m * A - f * _ - g * y) * C, t[15] = (h * _ - u * A + d * y) * C) }(o, o) } return function(t, e, n) { return !(!t || !e || (t.pose = e, t.timestamp = e.timestamp, r(t.leftProjectionMatrix, t.leftViewMatrix, e, n._getFieldOfView("left"), n._getEyeOffset("left"), n), r(t.rightProjectionMatrix, t.rightViewMatrix, e, n._getFieldOfView("right"), n._getEyeOffset("right"), n), 0)) } }(), E = function(t) { var e, n = t.indexOf("://"); e = -1 !== n ? n + 3 : 0; var i = t.indexOf("/", e); return -1 === i && (i = t.length), t.substring(0, i) }, S = (t = {}, function(e, n) { void 0 === t[e] && (console.warn("webvr-polyfill: " + n), t[e] = !0) }), T = function(t, e) { S(t, t + " has been deprecated. This may not work on native WebVR displays. " + (e ? "Please use " + e + " instead." : "")) }, L = function(t, e, n) { if (e) { for (var i = [], r = null, o = 0; o < e.length; ++o) switch (s = e[o]) { case t.TEXTURE_BINDING_2D: case t.TEXTURE_BINDING_CUBE_MAP: if ((l = e[++o]) < t.TEXTURE0 || l > t.TEXTURE31) { console.error("TEXTURE_BINDING_2D or TEXTURE_BINDING_CUBE_MAP must be followed by a valid texture unit"), i.push(null, null); break } r || (r = t.getParameter(t.ACTIVE_TEXTURE)), t.activeTexture(l), i.push(t.getParameter(s), null); break; case t.ACTIVE_TEXTURE: r = t.getParameter(t.ACTIVE_TEXTURE), i.push(null); break; default: i.push(t.getParameter(s)) } for (n(t), o = 0; o < e.length; ++o) { var s = e[o], a = i[o]; switch (s) { case t.ACTIVE_TEXTURE: break; case t.ARRAY_BUFFER_BINDING: t.bindBuffer(t.ARRAY_BUFFER, a); break; case t.COLOR_CLEAR_VALUE: t.clearColor(a[0], a[1], a[2], a[3]); break; case t.COLOR_WRITEMASK: t.colorMask(a[0], a[1], a[2], a[3]); break; case t.CURRENT_PROGRAM: t.useProgram(a); break; case t.ELEMENT_ARRAY_BUFFER_BINDING: t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, a); break; case t.FRAMEBUFFER_BINDING: t.bindFramebuffer(t.FRAMEBUFFER, a); break; case t.RENDERBUFFER_BINDING: t.bindRenderbuffer(t.RENDERBUFFER, a); break; case t.TEXTURE_BINDING_2D: if ((l = e[++o]) < t.TEXTURE0 || l > t.TEXTURE31) break; t.activeTexture(l), t.bindTexture(t.TEXTURE_2D, a); break; case t.TEXTURE_BINDING_CUBE_MAP: var l; if ((l = e[++o]) < t.TEXTURE0 || l > t.TEXTURE31) break; t.activeTexture(l), t.bindTexture(t.TEXTURE_CUBE_MAP, a); break; case t.VIEWPORT: t.viewport(a[0], a[1], a[2], a[3]); break; case t.BLEND: case t.CULL_FACE: case t.DEPTH_TEST: case t.SCISSOR_TEST: case t.STENCIL_TEST: a ? t.enable(s) : t.disable(s); break; default: console.log("No GL restore behavior for 0x" + s.toString(16)) } r && t.activeTexture(r) } } else n(t) }, R = ["attribute vec2 position;", "attribute vec3 texCoord;", "varying vec2 vTexCoord;", "uniform vec4 viewportOffsetScale[2];", "void main() {", " vec4 viewport = viewportOffsetScale[int(texCoord.z)];", " vTexCoord = (texCoord.xy * viewport.zw) + viewport.xy;", " gl_Position = vec4( position, 1.0, 1.0 );", "}"].join("\n"), C = ["precision mediump float;", "uniform sampler2D diffuse;", "varying vec2 vTexCoord;", "void main() {", " gl_FragColor = texture2D(diffuse, vTexCoord);", "}"].join("\n"); function P(t, e, n, i) { this.gl = t, this.cardboardUI = e, this.bufferScale = n, this.dirtySubmitFrameBindings = i, this.ctxAttribs = t.getContextAttributes(), this.instanceExt = t.getExtension("ANGLE_instanced_arrays"), this.meshWidth = 20, this.meshHeight = 20, this.bufferWidth = t.drawingBufferWidth, this.bufferHeight = t.drawingBufferHeight, this.realBindFramebuffer = t.bindFramebuffer, this.realEnable = t.enable, this.realDisable = t.disable, this.realColorMask = t.colorMask, this.realClearColor = t.clearColor, this.realViewport = t.viewport, a() || (this.realCanvasWidth = Object.getOwnPropertyDescriptor(t.canvas.__proto__, "width"), this.realCanvasHeight = Object.getOwnPropertyDescriptor(t.canvas.__proto__, "height")), this.isPatched = !1, this.lastBoundFramebuffer = null, this.cullFace = !1, this.depthTest = !1, this.blend = !1, this.scissorTest = !1, this.stencilTest = !1, this.viewport = [0, 0, 0, 0], this.colorMask = [!0, !0, !0, !0], this.clearColor = [0, 0, 0, 0], this.attribs = { position: 0, texCoord: 1 }, this.program = A(t, R, C, this.attribs), this.uniforms = x(t, this.program), this.viewportOffsetScale = new Float32Array(8), this.setTextureBounds(), this.vertexBuffer = t.createBuffer(), this.indexBuffer = t.createBuffer(), this.indexCount = 0, this.renderTarget = t.createTexture(), this.framebuffer = t.createFramebuffer(), this.depthStencilBuffer = null, this.depthBuffer = null, this.stencilBuffer = null, this.ctxAttribs.depth && this.ctxAttribs.stencil ? this.depthStencilBuffer = t.createRenderbuffer() : this.ctxAttribs.depth ? this.depthBuffer = t.createRenderbuffer() : this.ctxAttribs.stencil && (this.stencilBuffer = t.createRenderbuffer()), this.patch(), this.onResize() } P.prototype.destroy = function() { var t = this.gl; this.unpatch(), t.deleteProgram(this.program), t.deleteBuffer(this.vertexBuffer), t.deleteBuffer(this.indexBuffer), t.deleteTexture(this.renderTarget), t.deleteFramebuffer(this.framebuffer), this.depthStencilBuffer && t.deleteRenderbuffer(this.depthStencilBuffer), this.depthBuffer && t.deleteRenderbuffer(this.depthBuffer), this.stencilBuffer && t.deleteRenderbuffer(this.stencilBuffer), this.cardboardUI && this.cardboardUI.destroy() }, P.prototype.onResize = function() { var t = this.gl, e = this, n = [t.RENDERBUFFER_BINDING, t.TEXTURE_BINDING_2D, t.TEXTURE0]; L(t, n, (function(t) { e.realBindFramebuffer.call(t, t.FRAMEBUFFER, null), e.scissorTest && e.realDisable.call(t, t.SCISSOR_TEST), e.realColorMask.call(t, !0, !0, !0, !0), e.realViewport.call(t, 0, 0, t.drawingBufferWidth, t.drawingBufferHeight), e.realClearColor.call(t, 0, 0, 0, 1), t.clear(t.COLOR_BUFFER_BIT), e.realBindFramebuffer.call(t, t.FRAMEBUFFER, e.framebuffer), t.bindTexture(t.TEXTURE_2D, e.renderTarget), t.texImage2D(t.TEXTURE_2D, 0, e.ctxAttribs.alpha ? t.RGBA : t.RGB, e.bufferWidth, e.bufferHeight, 0, e.ctxAttribs.alpha ? t.RGBA : t.RGB, t.UNSIGNED_BYTE, null), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, t.LINEAR), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, t.LINEAR), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, t.CLAMP_TO_EDGE), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, t.CLAMP_TO_EDGE), t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, e.renderTarget, 0), e.ctxAttribs.depth && e.ctxAttribs.stencil ? (t.bindRenderbuffer(t.RENDERBUFFER, e.depthStencilBuffer), t.renderbufferStorage(t.RENDERBUFFER, t.DEPTH_STENCIL, e.bufferWidth, e.bufferHeight), t.framebufferRenderbuffer(t.FRAMEBUFFER, t.DEPTH_STENCIL_ATTACHMENT, t.RENDERBUFFER, e.depthStencilBuffer)) : e.ctxAttribs.depth ? (t.bindRenderbuffer(t.RENDERBUFFER, e.depthBuffer), t.renderbufferStorage(t.RENDERBUFFER, t.DEPTH_COMPONENT16, e.bufferWidth, e.bufferHeight), t.framebufferRenderbuffer(t.FRAMEBUFFER, t.DEPTH_ATTACHMENT, t.RENDERBUFFER, e.depthBuffer)) : e.ctxAttribs.stencil && (t.bindRenderbuffer(t.RENDERBUFFER, e.stencilBuffer), t.renderbufferStorage(t.RENDERBUFFER, t.STENCIL_INDEX8, e.bufferWidth, e.bufferHeight), t.framebufferRenderbuffer(t.FRAMEBUFFER, t.STENCIL_ATTACHMENT, t.RENDERBUFFER, e.stencilBuffer)), !t.checkFramebufferStatus(t.FRAMEBUFFER) === t.FRAMEBUFFER_COMPLETE && console.error("Framebuffer incomplete!"), e.realBindFramebuffer.call(t, t.FRAMEBUFFER, e.lastBoundFramebuffer), e.scissorTest && e.realEnable.call(t, t.SCISSOR_TEST), e.realColorMask.apply(t, e.colorMask), e.realViewport.apply(t, e.viewport), e.realClearColor.apply(t, e.clearColor) })), this.cardboardUI && this.cardboardUI.onResize() }, P.prototype.patch = function() { if (!this.isPatched) { var t = this, e = this.gl.canvas, n = this.gl; a() || (e.width = g() * this.bufferScale, e.height = v() * this.bufferScale, Object.defineProperty(e, "width", { configurable: !0, enumerable: !0, get: function() { return t.bufferWidth }, set: function(n) { t.bufferWidth = n, t.realCanvasWidth.set.call(e, n), t.onResize() } }), Object.defineProperty(e, "height", { configurable: !0, enumerable: !0, get: function() { return t.bufferHeight }, set: function(n) { t.bufferHeight = n, t.realCanvasHeight.set.call(e, n), t.onResize() } })), this.lastBoundFramebuffer = n.getParameter(n.FRAMEBUFFER_BINDING), null == this.lastBoundFramebuffer && (this.lastBoundFramebuffer = this.framebuffer, this.gl.bindFramebuffer(n.FRAMEBUFFER, this.framebuffer)), this.gl.bindFramebuffer = function(e, i) { t.lastBoundFramebuffer = i || t.framebuffer, t.realBindFramebuffer.call(n, e, t.lastBoundFramebuffer) }, this.cullFace = n.getParameter(n.CULL_FACE), this.depthTest = n.getParameter(n.DEPTH_TEST), this.blend = n.getParameter(n.BLEND), this.scissorTest = n.getParameter(n.SCISSOR_TEST), this.stencilTest = n.getParameter(n.STENCIL_TEST), n.enable = function(e) { switch (e) { case n.CULL_FACE: t.cullFace = !0; break; case n.DEPTH_TEST: t.depthTest = !0; break; case n.BLEND: t.blend = !0; break; case n.SCISSOR_TEST: t.scissorTest = !0; break; case n.STENCIL_TEST: t.stencilTest = !0 } t.realEnable.call(n, e) }, n.disable = function(e) { switch (e) { case n.CULL_FACE: t.cullFace = !1; break; case n.DEPTH_TEST: t.depthTest = !1; break; case n.BLEND: t.blend = !1; break; case n.SCISSOR_TEST: t.scissorTest = !1; break; case n.STENCIL_TEST: t.stencilTest = !1 } t.realDisable.call(n, e) }, this.colorMask = n.getParameter(n.COLOR_WRITEMASK), n.colorMask = function(e, i, r, o) { t.colorMask[0] = e, t.colorMask[1] = i, t.colorMask[2] = r, t.colorMask[3] = o, t.realColorMask.call(n, e, i, r, o) }, this.clearColor = n.getParameter(n.COLOR_CLEAR_VALUE), n.clearColor = function(e, i, r, o) { t.clearColor[0] = e, t.clearColor[1] = i, t.clearColor[2] = r, t.clearColor[3] = o, t.realClearColor.call(n, e, i, r, o) }, this.viewport = n.getParameter(n.VIEWPORT), n.viewport = function(e, i, r, o) { t.viewport[0] = e, t.viewport[1] = i, t.viewport[2] = r, t.viewport[3] = o, t.realViewport.call(n, e, i, r, o) }, this.isPatched = !0, w(e) } }, P.prototype.unpatch = function() { if (this.isPatched) { var t = this.gl, e = this.gl.canvas; a() || (Object.defineProperty(e, "width", this.realCanvasWidth), Object.defineProperty(e, "height", this.realCanvasHeight)), e.width = this.bufferWidth, e.height = this.bufferHeight, t.bindFramebuffer = this.realBindFramebuffer, t.enable = this.realEnable, t.disable = this.realDisable, t.colorMask = this.realColorMask, t.clearColor = this.realClearColor, t.viewport = this.realViewport, this.lastBoundFramebuffer == this.framebuffer && t.bindFramebuffer(t.FRAMEBUFFER, null), this.isPatched = !1, setTimeout((function() { w(e) }), 1) } }, P.prototype.setTextureBounds = function(t, e) { t || (t = [0, 0, .5, 1]), e || (e = [.5, 0, .5, 1]), this.viewportOffsetScale[0] = t[0], this.viewportOffsetScale[1] = t[1], this.viewportOffsetScale[2] = t[2], this.viewportOffsetScale[3] = t[3], this.viewportOffsetScale[4] = e[0], this.viewportOffsetScale[5] = e[1], this.viewportOffsetScale[6] = e[2], this.viewportOffsetScale[7] = e[3] }, P.prototype.submitFrame = function() { var t = this.gl, e = this, n = []; if (this.dirtySubmitFrameBindings || n.push(t.CURRENT_PROGRAM, t.ARRAY_BUFFER_BINDING, t.ELEMENT_ARRAY_BUFFER_BINDING, t.TEXTURE_BINDING_2D, t.TEXTURE0), L(t, n, (function(t) { e.realBindFramebuffer.call(t, t.FRAMEBUFFER, null); var n = 0, i = 0; e.instanceExt && (n = t.getVertexAttrib(e.attribs.position, e.instanceExt.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE), i = t.getVertexAttrib(e.attribs.texCoord, e.instanceExt.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE)), e.cullFace && e.realDisable.call(t, t.CULL_FACE), e.depthTest && e.realDisable.call(t, t.DEPTH_TEST), e.blend && e.realDisable.call(t, t.BLEND), e.scissorTest && e.realDisable.call(t, t.SCISSOR_TEST), e.stencilTest && e.realDisable.call(t, t.STENCIL_TEST), e.realColorMask.call(t, !0, !0, !0, !0), e.realViewport.call(t, 0, 0, t.drawingBufferWidth, t.drawingBufferHeight), (e.ctxAttribs.alpha || a()) && (e.realClearColor.call(t, 0, 0, 0, 1), t.clear(t.COLOR_BUFFER_BIT)), t.useProgram(e.program), t.bindBuffer(t.ELEMENT_ARRAY_BUFFER, e.indexBuffer), t.bindBuffer(t.ARRAY_BUFFER, e.vertexBuffer), t.enableVertexAttribArray(e.attribs.position), t.enableVertexAttribArray(e.attribs.texCoord), t.vertexAttribPointer(e.attribs.position, 2, t.FLOAT, !1, 20, 0), t.vertexAttribPointer(e.attribs.texCoord, 3, t.FLOAT, !1, 20, 8), e.instanceExt && (0 != n && e.instanceExt.vertexAttribDivisorANGLE(e.attribs.position, 0), 0 != i && e.instanceExt.vertexAttribDivisorANGLE(e.attribs.texCoord, 0)), t.activeTexture(t.TEXTURE0), t.uniform1i(e.uniforms.diffuse, 0), t.bindTexture(t.TEXTURE_2D, e.renderTarget), t.uniform4fv(e.uniforms.viewportOffsetScale, e.viewportOffsetScale), t.drawElements(t.TRIANGLES, e.indexCount, t.UNSIGNED_SHORT, 0), e.cardboardUI && e.cardboardUI.renderNoState(), e.realBindFramebuffer.call(e.gl, t.FRAMEBUFFER, e.framebuffer), e.ctxAttribs.preserveDrawingBuffer || (e.realClearColor.call(t, 0, 0, 0, 0), t.clear(t.COLOR_BUFFER_BIT)), e.dirtySubmitFrameBindings || e.realBindFramebuffer.call(t, t.FRAMEBUFFER, e.lastBoundFramebuffer), e.cullFace && e.realEnable.call(t, t.CULL_FACE), e.depthTest && e.realEnable.call(t, t.DEPTH_TEST), e.blend && e.realEnable.call(t, t.BLEND), e.scissorTest && e.realEnable.call(t, t.SCISSOR_TEST), e.stencilTest && e.realEnable.call(t, t.STENCIL_TEST), e.realColorMask.apply(t, e.colorMask), e.realViewport.apply(t, e.viewport), !e.ctxAttribs.alpha && e.ctxAttribs.preserveDrawingBuffer || e.realClearColor.apply(t, e.clearColor), e.instanceExt && (0 != n && e.instanceExt.vertexAttribDivisorANGLE(e.attribs.position, n), 0 != i && e.instanceExt.vertexAttribDivisorANGLE(e.attribs.texCoord, i)) })), a()) { var i = t.canvas; i.width == e.bufferWidth && i.height == e.bufferHeight || (e.bufferWidth = i.width, e.bufferHeight = i.height, e.onResize()) } }, P.prototype.updateDeviceInfo = function(t) { var e = this.gl, n = this, i = [e.ARRAY_BUFFER_BINDING, e.ELEMENT_ARRAY_BUFFER_BINDING]; L(e, i, (function(e) { var i = n.computeMeshVertices_(n.meshWidth, n.meshHeight, t); if (e.bindBuffer(e.ARRAY_BUFFER, n.vertexBuffer), e.bufferData(e.ARRAY_BUFFER, i, e.STATIC_DRAW), !n.indexCount) { var r = n.computeMeshIndices_(n.meshWidth, n.meshHeight); e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, n.indexBuffer), e.bufferData(e.ELEMENT_ARRAY_BUFFER, r, e.STATIC_DRAW), n.indexCount = r.length } })) }, P.prototype.computeMeshVertices_ = function(t, e, n) { for (var i = new Float32Array(2 * t * e * 5), r = n.getLeftEyeVisibleTanAngles(), o = n.getLeftEyeNoLensTanAngles(), a = n.getLeftEyeVisibleScreenRect(o), l = 0, c = 0; c < 2; c++) { for (var h = 0; h < e; h++) for (var u = 0; u < t; u++, l++) { var d = u / (t - 1), p = h / (e - 1), f = d, m = p, g = s(r[0], r[2], d), v = s(r[3], r[1], p), y = Math.sqrt(g * g + v * v), A = n.distortion.distortInverse(y), x = v * A / y; d = (g * A / y - o[0]) / (o[2] - o[0]), p = (x - o[3]) / (o[1] - o[3]), d = 2 * (a.x + d * a.width - .5), p = 2 * (a.y + p * a.height - .5), i[5 * l + 0] = d, i[5 * l + 1] = p, i[5 * l + 2] = f, i[5 * l + 3] = m, i[5 * l + 4] = c } var _ = r[2] - r[0]; r[0] = -(_ + r[0]), r[2] = _ - r[2], _ = o[2] - o[0], o[0] = -(_ + o[0]), o[2] = _ - o[2], a.x = 1 - (a.x + a.width) } return i }, P.prototype.computeMeshIndices_ = function(t, e) { for (var n = new Uint16Array(2 * (t - 1) * (e - 1) * 6), i = t / 2, r = e / 2, o = 0, s = 0, a = 0; a < 2; a++) for (var l = 0; l < e; l++) for (var c = 0; c < t; c++, o++) 0 != c && 0 != l && (c <= i == l <= r ? (n[s++] = o, n[s++] = o - t - 1, n[s++] = o - t, n[s++] = o - t - 1, n[s++] = o, n[s++] = o - 1) : (n[s++] = o - 1, n[s++] = o - t, n[s++] = o, n[s++] = o - t, n[s++] = o - 1, n[s++] = o - t - 1)); return n }, P.prototype.getOwnPropertyDescriptor_ = function(t, e) { var n = Object.getOwnPropertyDescriptor(t, e); return void 0 !== n.get && void 0 !== n.set || (n.configurable = !0, n.enumerable = !0, n.get = function() { return this.getAttribute(e) }, n.set = function(t) { this.setAttribute(e, t) }), n }; var D = ["attribute vec2 position;", "uniform mat4 projectionMat;", "void main() {", " gl_Position = projectionMat * vec4( position, -1.0, 1.0 );", "}"].join("\n"), I = ["precision mediump float;", "uniform vec4 color;", "void main() {", " gl_FragColor = color;", "}"].join("\n"), O = Math.PI / 180; function N(t) { this.gl = t, this.attribs = { position: 0 }, this.program = A(t, D, I, this.attribs), this.uniforms = x(t, this.program), this.vertexBuffer = t.createBuffer(), this.gearOffset = 0, this.gearVertexCount = 0, this.arrowOffset = 0, this.arrowVertexCount = 0, this.projMat = new Float32Array(16), this.listener = null, this.onResize() } function B(t) { this.coefficients = t } N.prototype.destroy = function() { var t = this.gl; this.listener && t.canvas.removeEventListener("click", this.listener, !1), t.deleteProgram(this.program), t.deleteBuffer(this.vertexBuffer) }, N.prototype.listen = function(t, e) { var n = this.gl.canvas; this.listener = function(i) { var r = n.clientWidth / 2; i.clientX > r - 42 && i.clientX < r + 42 && i.clientY > n.clientHeight - 42 ? t(i) : i.clientX < 42 && i.clientY < 42 && e(i) }, n.addEventListener("click", this.listener, !1) }, N.prototype.onResize = function() { var t = this.gl, e = this, n = [t.ARRAY_BUFFER_BINDING]; L(t, n, (function(t) { var n = [], i = t.drawingBufferWidth / 2, r = Math.max(screen.width, screen.height) * window.devicePixelRatio, o = t.drawingBufferWidth / r * window.devicePixelRatio, s = 4 * o / 2, a = 42 * o, l = 28 * o / 2, c = 14 * o; function h(t, e) { var r = (90 - t) * O, o = Math.cos(r), s = Math.sin(r); n.push(.3125 * o * l + i, .3125 * s * l + l), n.push(e * o * l + i, e * s * l + l) } n.push(i - s, a), n.push(i - s, t.drawingBufferHeight), n.push(i + s, a), n.push(i + s, t.drawingBufferHeight), e.gearOffset = n.length / 2; for (var u = 0; u <= 6; u++) { var d = 60 * u; h(d, 1), h(d + 12, 1), h(d + 20, .75), h(d + 40, .75), h(d + 48, 1) } function p(e, i) { n.push(c + e, t.drawingBufferHeight - c - i) } e.gearVertexCount = n.length / 2 - e.gearOffset, e.arrowOffset = n.length / 2; var f = s / Math.sin(45 * O); p(0, l), p(l, 0), p(l + f, f), p(f, l + f), p(f, l - f), p(0, l), p(l, 2 * l), p(l + f, 2 * l - f), p(f, l - f), p(0, l), p(f, l - s), p(28 * o, l - s), p(f, l + s), p(28 * o, l + s), e.arrowVertexCount = n.length / 2 - e.arrowOffset, t.bindBuffer(t.ARRAY_BUFFER, e.vertexBuffer), t.bufferData(t.ARRAY_BUFFER, new Float32Array(n), t.STATIC_DRAW) })) }, N.prototype.render = function() { var t = this.gl, e = this, n = [t.CULL_FACE, t.DEPTH_TEST, t.BLEND, t.SCISSOR_TEST, t.STENCIL_TEST, t.COLOR_WRITEMASK, t.VIEWPORT, t.CURRENT_PROGRAM, t.ARRAY_BUFFER_BINDING]; L(t, n, (function(t) { t.disable(t.CULL_FACE), t.disable(t.DEPTH_TEST), t.disable(t.BLEND), t.disable(t.SCISSOR_TEST), t.disable(t.STENCIL_TEST), t.colorMask(!0, !0, !0, !0), t.viewport(0, 0, t.drawingBufferWidth, t.drawingBufferHeight), e.renderNoState() })) }, N.prototype.renderNoState = function() { var t, e, n, i, r, o, s, a, l, c, h = this.gl; h.useProgram(this.program), h.bindBuffer(h.ARRAY_BUFFER, this.vertexBuffer), h.enableVertexAttribArray(this.attribs.position), h.vertexAttribPointer(this.attribs.position, 2, h.FLOAT, !1, 8, 0), h.uniform4f(this.uniforms.color, 1, 1, 1, 1), t = this.projMat, e = 0, n = h.drawingBufferWidth, i = 0, r = h.drawingBufferHeight, a = 1 / (e - n), l = 1 / (i - r), c = 1 / ((o = .1) - (s = 1024)), t[0] = -2 * a, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, t[5] = -2 * l, t[6] = 0, t[7] = 0, t[8] = 0, t[9] = 0, t[10] = 2 * c, t[11] = 0, t[12] = (e + n) * a, t[13] = (r + i) * l, t[14] = (s + o) * c, t[15] = 1, h.uniformMatrix4fv(this.uniforms.projectionMat, !1, this.projMat), h.drawArrays(h.TRIANGLE_STRIP, 0, 4), h.drawArrays(h.TRIANGLE_STRIP, this.gearOffset, this.gearVertexCount), h.drawArrays(h.TRIANGLE_STRIP, this.arrowOffset, this.arrowVertexCount) }, B.prototype.distortInverse = function(t) { for (var e = 0, n = 1, i = t - this.distort(e); Math.abs(n - e) > 1e-4;) { var r = t - this.distort(n), o = n - r * ((n - e) / (r - i)); e = n, n = o, i = r } return n }, B.prototype.distort = function(t) { for (var e = t * t, n = 0, i = 0; i < this.coefficients.length; i++) n = e * (n + this.coefficients[i]); return (n + 1) * t }; var F = Math.PI / 180, z = 180 / Math.PI, U = function(t, e, n) { this.x = t || 0, this.y = e || 0, this.z = n || 0 }; U.prototype = { constructor: U, set: function(t, e, n) { return this.x = t, this.y = e, this.z = n, this }, copy: function(t) { return this.x = t.x, this.y = t.y, this.z = t.z, this }, length: function() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z) }, normalize: function() { var t = this.length(); if (0 !== t) { var e = 1 / t; this.multiplyScalar(e) } else this.x = 0, this.y = 0, this.z = 0; return this }, multiplyScalar: function(t) { this.x *= t, this.y *= t, this.z *= t }, applyQuaternion: function(t) { var e = this.x, n = this.y, i = this.z, r = t.x, o = t.y, s = t.z, a = t.w, l = a * e + o * i - s * n, c = a * n + s * e - r * i, h = a * i + r * n - o * e, u = -r * e - o * n - s * i; return this.x = l * a + u * -r + c * -s - h * -o, this.y = c * a + u * -o + h * -r - l * -s, this.z = h * a + u * -s + l * -o - c * -r, this }, dot: function(t) { return this.x * t.x + this.y * t.y + this.z * t.z }, crossVectors: function(t, e) { var n = t.x, i = t.y, r = t.z, o = e.x, s = e.y, a = e.z; return this.x = i * a - r * s, this.y = r * o - n * a, this.z = n * s - i * o, this } }; var H, G, V = function(t, e, n, i) { this.x = t || 0, this.y = e || 0, this.z = n || 0, this.w = void 0 !== i ? i : 1 }; function k(t) { this.width = t.width || g(), this.height = t.height || v(), this.widthMeters = t.widthMeters, this.heightMeters = t.heightMeters, this.bevelMeters = t.bevelMeters } V.prototype = { constructor: V, set: function(t, e, n, i) { return this.x = t, this.y = e, this.z = n, this.w = i, this }, copy: function(t) { return this.x = t.x, this.y = t.y, this.z = t.z, this.w = t.w, this }, setFromEulerXYZ: function(t, e, n) { var i = Math.cos(t / 2), r = Math.cos(e / 2), o = Math.cos(n / 2), s = Math.sin(t / 2), a = Math.sin(e / 2), l = Math.sin(n / 2); return this.x = s * r * o + i * a * l, this.y = i * a * o - s * r * l, this.z = i * r * l + s * a * o, this.w = i * r * o - s * a * l, this }, setFromEulerYXZ: function(t, e, n) { var i = Math.cos(t / 2), r = Math.cos(e / 2), o = Math.cos(n / 2), s = Math.sin(t / 2), a = Math.sin(e / 2), l = Math.sin(n / 2); return this.x = s * r * o + i * a * l, this.y = i * a * o - s * r * l, this.z = i * r * l - s * a * o, this.w = i * r * o + s * a * l, this }, setFromAxisAngle: function(t, e) { var 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 }, multiply: function(t) { return this.multiplyQuaternions(this, t) }, multiplyQuaternions: function(t, e) { var n = t.x, i = t.y, r = t.z, o = t.w, s = e.x, a = e.y, l = e.z, c = e.w; return this.x = n * c + o * s + i * l - r * a, this.y = i * c + o * a + r * s - n * l, this.z = r * c + o * l + n * a - i * s, this.w = o * c - n * s - i * a - r * l, this }, inverse: function() { return this.x *= -1, this.y *= -1, this.z *= -1, this.normalize(), this }, normalize: function() { var t = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); 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 }, slerp: function(t, e) { if (0 === e) return this; if (1 === e) return this.copy(t); var n = this.x, i = this.y, r = this.z, o = this.w, s = o * t.w + n * t.x + i * t.y + r * t.z; if (s < 0 ? (this.w = -t.w, this.x = -t.x, this.y = -t.y, this.z = -t.z, s = -s) : this.copy(t), s >= 1) return this.w = o, this.x = n, this.y = i, this.z = r, this; var a = Math.acos(s), l = Math.sqrt(1 - s * s); if (Math.abs(l) < .001) return this.w = .5 * (o + this.w), this.x = .5 * (n + this.x), this.y = .5 * (i + this.y), this.z = .5 * (r + this.z), this; var c = Math.sin((1 - e) * a) / l, h = Math.sin(e * a) / l; return this.w = o * c + this.w * h, this.x = n * c + this.x * h, this.y = i * c + this.y * h, this.z = r * c + this.z * h, this }, setFromUnitVectors: function(t, e) { return void 0 === H && (H = new U), (G = t.dot(e) + 1) < 1e-6 ? (G = 0, Math.abs(t.x) > Math.abs(t.z) ? H.set(-t.y, t.x, 0) : H.set(0, -t.z, t.y)) : H.crossVectors(t, e), this.x = H.x, this.y = H.y, this.z = H.z, this.w = G, this.normalize(), this } }; var W = new k({ widthMeters: .11, heightMeters: .062, bevelMeters: .004 }), j = new k({ widthMeters: .1038, heightMeters: .0584, bevelMeters: .004 }), X = { CardboardV1: new Y({ id: "CardboardV1", label: "Cardboard I/O 2014", fov: 40, interLensDistance: .06, baselineLensDistance: .035, screenLensDistance: .042, distortionCoefficients: [.441, .156], inverseCoefficients: [-.4410035, .42756155, -.4804439, .5460139, -.58821183, .5733938, -.48303202, .33299083, -.17573841, .0651772, -.01488963, .001559834] }), CardboardV2: new Y({ id: "CardboardV2", label: "Cardboard I/O 2015", fov: 60, interLensDistance: .064, baselineLensDistance: .035, screenLensDistance: .039, distortionCoefficients: [.34, .55], inverseCoefficients: [-.33836704, -.18162185, .862655, -1.2462051, 1.0560602, -.58208317, .21609078, -.05444823, .009177956, -.0009904169, 6183535e-11, -16981803e-13] }) }; function q(t, e) { this.viewer = X.CardboardV2, this.updateDeviceParams(t), this.distortion = new B(this.viewer.distortionCoefficients); for (var n = 0; n < e.length; n++) { var i = e[n]; X[i.id] = new Y(i) } } function Y(t) { this.id = t.id, this.label = t.label, this.fov = t.fov, this.interLensDistance = t.interLensDistance, this.baselineLensDistance = t.baselineLensDistance, this.screenLensDistance = t.screenLensDistance, this.distortionCoefficients = t.distortionCoefficients, this.inverseCoefficients = t.inverseCoefficients } q.prototype.updateDeviceParams = function(t) { this.device = this.determineDevice_(t) || this.device }, q.prototype.getDevice = function() { return this.device }, q.prototype.setViewer = function(t) { this.viewer = t, this.distortion = new B(this.viewer.distortionCoefficients) }, q.prototype.determineDevice_ = function(t) { if (!t) return a() ? (console.warn("Using fallback iOS device measurements."), j) : (console.warn("Using fallback Android device measurements."), W); var e = .0254 / t.xdpi, n = .0254 / t.ydpi; return new k({ widthMeters: e * g(), heightMeters: n * v(), bevelMeters: .001 * t.bevelMm }) }, q.prototype.getDistortedFieldOfViewLeftEye = function() { var t = this.viewer, e = this.device, n = this.distortion, i = t.screenLensDistance, r = (e.widthMeters - t.interLensDistance) / 2, o = t.interLensDistance / 2, s = t.baselineLensDistance - e.bevelMeters, a = e.heightMeters - s, l = z * Math.atan(n.distort(r / i)), c = z * Math.atan(n.distort(o / i)), h = z * Math.atan(n.distort(s / i)), u = z * Math.atan(n.distort(a / i)); return { leftDegrees: Math.min(l, t.fov), rightDegrees: Math.min(c, t.fov), downDegrees: Math.min(h, t.fov), upDegrees: Math.min(u, t.fov) } }, q.prototype.getLeftEyeVisibleTanAngles = function() { var t = this.viewer, e = this.device, n = this.distortion, i = Math.tan(-F * t.fov), r = Math.tan(F * t.fov), o = Math.tan(F * t.fov), s = Math.tan(-F * t.fov), a = e.widthMeters / 4, l = e.heightMeters / 2, c = t.baselineLensDistance - e.bevelMeters - l, h = t.interLensDistance / 2 - a, u = -c, d = t.screenLensDistance, p = n.distort((h - a) / d), f = n.distort((u + l) / d), m = n.distort((h + a) / d), g = n.distort((u - l) / d), v = new Float32Array(4); return v[0] = Math.max(i, p), v[1] = Math.min(r, f), v[2] = Math.min(o, m), v[3] = Math.max(s, g), v }, q.prototype.getLeftEyeNoLensTanAngles = function() { var t = this.viewer, e = this.device, n = this.distortion, i = new Float32Array(4), r = n.distortInverse(Math.tan(-F * t.fov)), o = n.distortInverse(Math.tan(F * t.fov)), s = n.distortInverse(Math.tan(F * t.fov)), a = n.distortInverse(Math.tan(-F * t.fov)), l = e.widthMeters / 4, c = e.heightMeters / 2, h = t.baselineLensDistance - e.bevelMeters - c, u = t.interLensDistance / 2 - l, d = -h, p = t.screenLensDistance, f = (u - l) / p, m = (d + c) / p, g = (u + l) / p, v = (d - c) / p; return i[0] = Math.max(r, f), i[1] = Math.min(o, m), i[2] = Math.min(s, g), i[3] = Math.max(a, v), i }, q.prototype.getLeftEyeVisibleScreenRect = function(t) { var e = this.viewer, n = this.device, i = e.screenLensDistance, r = (n.widthMeters - e.interLensDistance) / 2, o = e.baselineLensDistance - n.bevelMeters, s = (t[0] * i + r) / n.widthMeters, a = (t[1] * i + o) / n.heightMeters, l = (t[2] * i + r) / n.widthMeters, c = (t[3] * i + o) / n.heightMeters; return { x: s, y: c, width: l - s, height: a - c } }, q.prototype.getFieldOfViewLeftEye = function(t) { return t ? this.getUndistortedFieldOfViewLeftEye() : this.getDistortedFieldOfViewLeftEye() }, q.prototype.getFieldOfViewRightEye = function(t) { var e = this.getFieldOfViewLeftEye(t); return { leftDegrees: e.rightDegrees, rightDegrees: e.leftDegrees, upDegrees: e.upDegrees, downDegrees: e.downDegrees } }, q.prototype.getUndistortedFieldOfViewLeftEye = function() { var t = this.getUndistortedParams_(); return { leftDegrees: z * Math.atan(t.outerDist), rightDegrees: z * Math.atan(t.innerDist), downDegrees: z * Math.atan(t.bottomDist), upDegrees: z * Math.atan(t.topDist) } }, q.prototype.getUndistortedViewportLeftEye = function() { var t = this.getUndistortedParams_(), e = this.viewer, n = this.device, i = e.screenLensDistance, r = n.widthMeters / i, o = n.heightMeters / i, s = n.width / r, a = n.height / o, l = Math.round((t.eyePosX - t.outerDist) * s), c = Math.round((t.eyePosY - t.bottomDist) * a); return { x: l, y: c, width: Math.round((t.eyePosX + t.innerDist) * s) - l, height: Math.round((t.eyePosY + t.topDist) * a) - c } }, q.prototype.getUndistortedParams_ = function() { var t = this.viewer, e = this.device, n = this.distortion, i = t.screenLensDistance, r = t.interLensDistance / 2 / i, o = e.widthMeters / i, s = e.heightMeters / i, a = o / 2 - r, l = (t.baselineLensDistance - e.bevelMeters) / i, c = t.fov, h = n.distortInverse(Math.tan(F * c)), u = Math.min(a, h), d = Math.min(r, h), p = Math.min(l, h); return { outerDist: u, innerDist: d, topDist: Math.min(s - l, h), bottomDist: p, eyePosX: a, eyePosY: l } }, q.Viewers = X; var Q = { format: 1, last_updated: "2019-11-09T17:36:14Z", devices: [{ type: "android", rules: [{ mdmh: "asus/*/Nexus 7/*" }, { ua: "Nexus 7" }], dpi: [320.8, 323], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "asus/*/ASUS_X00PD/*" }, { ua: "ASUS_X00PD" }], dpi: 245, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "asus/*/ASUS_X008D/*" }, { ua: "ASUS_X008D" }], dpi: 282, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "asus/*/ASUS_Z00AD/*" }, { ua: "ASUS_Z00AD" }], dpi: [403, 404.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Google/*/Pixel 2 XL/*" }, { ua: "Pixel 2 XL" }], dpi: 537.9, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Google/*/Pixel 3 XL/*" }, { ua: "Pixel 3 XL" }], dpi: [558.5, 553.8], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Google/*/Pixel XL/*" }, { ua: "Pixel XL" }], dpi: [537.9, 533], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Google/*/Pixel 3/*" }, { ua: "Pixel 3" }], dpi: 442.4, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Google/*/Pixel 2/*" }, { ua: "Pixel 2" }], dpi: 441, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "Google/*/Pixel/*" }, { ua: "Pixel" }], dpi: [432.6, 436.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "HTC/*/HTC6435LVW/*" }, { ua: "HTC6435LVW" }], dpi: [449.7, 443.3], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "HTC/*/HTC One XL/*" }, { ua: "HTC One XL" }], dpi: [315.3, 314.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "htc/*/Nexus 9/*" }, { ua: "Nexus 9" }], dpi: 289, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "HTC/*/HTC One M9/*" }, { ua: "HTC One M9" }], dpi: [442.5, 443.3], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "HTC/*/HTC One_M8/*" }, { ua: "HTC One_M8" }], dpi: [449.7, 447.4], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "HTC/*/HTC One/*" }, { ua: "HTC One" }], dpi: 472.8, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Huawei/*/Nexus 6P/*" }, { ua: "Nexus 6P" }], dpi: [515.1, 518], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Huawei/*/BLN-L24/*" }, { ua: "HONORBLN-L24" }], dpi: 480, bw: 4, ac: 500 }, { type: "android", rules: [{ mdmh: "Huawei/*/BKL-L09/*" }, { ua: "BKL-L09" }], dpi: 403, bw: 3.47, ac: 500 }, { type: "android", rules: [{ mdmh: "LENOVO/*/Lenovo PB2-690Y/*" }, { ua: "Lenovo PB2-690Y" }], dpi: [457.2, 454.713], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "LGE/*/Nexus 5X/*" }, { ua: "Nexus 5X" }], dpi: [422, 419.9], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "LGE/*/LGMS345/*" }, { ua: "LGMS345" }], dpi: [221.7, 219.1], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "LGE/*/LG-D800/*" }, { ua: "LG-D800" }], dpi: [422, 424.1], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "LGE/*/LG-D850/*" }, { ua: "LG-D850" }], dpi: [537.9, 541.9], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "LGE/*/VS985 4G/*" }, { ua: "VS985 4G" }], dpi: [537.9, 535.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "LGE/*/Nexus 5/*" }, { ua: "Nexus 5 B" }], dpi: [442.4, 444.8], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "LGE/*/Nexus 4/*" }, { ua: "Nexus 4" }], dpi: [319.8, 318.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "LGE/*/LG-P769/*" }, { ua: "LG-P769" }], dpi: [240.6, 247.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "LGE/*/LGMS323/*" }, { ua: "LGMS323" }], dpi: [206.6, 204.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "LGE/*/LGLS996/*" }, { ua: "LGLS996" }], dpi: [403.4, 401.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Micromax/*/4560MMX/*" }, { ua: "4560MMX" }], dpi: [240, 219.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Micromax/*/A250/*" }, { ua: "Micromax A250" }], dpi: [480, 446.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Micromax/*/Micromax AQ4501/*" }, { ua: "Micromax AQ4501" }], dpi: 240, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "motorola/*/G5/*" }, { ua: "Moto G (5) Plus" }], dpi: [403.4, 403], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/DROID RAZR/*" }, { ua: "DROID RAZR" }], dpi: [368.1, 256.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/XT830C/*" }, { ua: "XT830C" }], dpi: [254, 255.9], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1021/*" }, { ua: "XT1021" }], dpi: [254, 256.7], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1023/*" }, { ua: "XT1023" }], dpi: [254, 256.7], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1028/*" }, { ua: "XT1028" }], dpi: [326.6, 327.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1034/*" }, { ua: "XT1034" }], dpi: [326.6, 328.4], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1053/*" }, { ua: "XT1053" }], dpi: [315.3, 316.1], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1562/*" }, { ua: "XT1562" }], dpi: [403.4, 402.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/Nexus 6/*" }, { ua: "Nexus 6 B" }], dpi: [494.3, 489.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1063/*" }, { ua: "XT1063" }], dpi: [295, 296.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1064/*" }, { ua: "XT1064" }], dpi: [295, 295.6], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1092/*" }, { ua: "XT1092" }], dpi: [422, 424.1], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "motorola/*/XT1095/*" }, { ua: "XT1095" }], dpi: [422, 423.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "motorola/*/G4/*" }, { ua: "Moto G (4)" }], dpi: 401, bw: 4, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/A0001/*" }, { ua: "A0001" }], dpi: [403.4, 401], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE E1001/*" }, { ua: "ONE E1001" }], dpi: [442.4, 441.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE E1003/*" }, { ua: "ONE E1003" }], dpi: [442.4, 441.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE E1005/*" }, { ua: "ONE E1005" }], dpi: [442.4, 441.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE A2001/*" }, { ua: "ONE A2001" }], dpi: [391.9, 405.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE A2003/*" }, { ua: "ONE A2003" }], dpi: [391.9, 405.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE A2005/*" }, { ua: "ONE A2005" }], dpi: [391.9, 405.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A3000/*" }, { ua: "ONEPLUS A3000" }], dpi: 401, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A3003/*" }, { ua: "ONEPLUS A3003" }], dpi: 401, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A3010/*" }, { ua: "ONEPLUS A3010" }], dpi: 401, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A5000/*" }, { ua: "ONEPLUS A5000 " }], dpi: [403.411, 399.737], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONE A5010/*" }, { ua: "ONEPLUS A5010" }], dpi: [403, 400], bw: 2, ac: 1e3 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A6000/*" }, { ua: "ONEPLUS A6000" }], dpi: 401, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A6003/*" }, { ua: "ONEPLUS A6003" }], dpi: 401, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A6010/*" }, { ua: "ONEPLUS A6010" }], dpi: 401, bw: 2, ac: 500 }, { type: "android", rules: [{ mdmh: "OnePlus/*/ONEPLUS A6013/*" }, { ua: "ONEPLUS A6013" }], dpi: 401, bw: 2, ac: 500 }, { type: "android", rules: [{ mdmh: "OPPO/*/X909/*" }, { ua: "X909" }], dpi: [442.4, 444.1], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9082/*" }, { ua: "GT-I9082" }], dpi: [184.7, 185.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G360P/*" }, { ua: "SM-G360P" }], dpi: [196.7, 205.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/Nexus S/*" }, { ua: "Nexus S" }], dpi: [234.5, 229.8], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9300/*" }, { ua: "GT-I9300" }], dpi: [304.8, 303.9], bw: 5, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-T230NU/*" }, { ua: "SM-T230NU" }], dpi: 216, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SGH-T399/*" }, { ua: "SGH-T399" }], dpi: [217.7, 231.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SGH-M919/*" }, { ua: "SGH-M919" }], dpi: [440.8, 437.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-N9005/*" }, { ua: "SM-N9005" }], dpi: [386.4, 387], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SAMSUNG-SM-N900A/*" }, { ua: "SAMSUNG-SM-N900A" }], dpi: [386.4, 387.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9500/*" }, { ua: "GT-I9500" }], dpi: [442.5, 443.3], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9505/*" }, { ua: "GT-I9505" }], dpi: 439.4, bw: 4, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G900F/*" }, { ua: "SM-G900F" }], dpi: [415.6, 431.6], bw: 5, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G900M/*" }, { ua: "SM-G900M" }], dpi: [415.6, 431.6], bw: 5, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G800F/*" }, { ua: "SM-G800F" }], dpi: 326.8, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G906S/*" }, { ua: "SM-G906S" }], dpi: [562.7, 572.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9300/*" }, { ua: "GT-I9300" }], dpi: [306.7, 304.8], bw: 5, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-T535/*" }, { ua: "SM-T535" }], dpi: [142.6, 136.4], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-N920C/*" }, { ua: "SM-N920C" }], dpi: [515.1, 518.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-N920P/*" }, { ua: "SM-N920P" }], dpi: [386.3655, 390.144], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-N920W8/*" }, { ua: "SM-N920W8" }], dpi: [515.1, 518.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9300I/*" }, { ua: "GT-I9300I" }], dpi: [304.8, 305.8], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-I9195/*" }, { ua: "GT-I9195" }], dpi: [249.4, 256.7], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SPH-L520/*" }, { ua: "SPH-L520" }], dpi: [249.4, 255.9], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SAMSUNG-SGH-I717/*" }, { ua: "SAMSUNG-SGH-I717" }], dpi: 285.8, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SPH-D710/*" }, { ua: "SPH-D710" }], dpi: [217.7, 204.2], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/GT-N7100/*" }, { ua: "GT-N7100" }], dpi: 265.1, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SCH-I605/*" }, { ua: "SCH-I605" }], dpi: 265.1, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/Galaxy Nexus/*" }, { ua: "Galaxy Nexus" }], dpi: [315.3, 314.2], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-N910H/*" }, { ua: "SM-N910H" }], dpi: [515.1, 518], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-N910C/*" }, { ua: "SM-N910C" }], dpi: [515.2, 520.2], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G130M/*" }, { ua: "SM-G130M" }], dpi: [165.9, 164.8], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G928I/*" }, { ua: "SM-G928I" }], dpi: [515.1, 518.4], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G920F/*" }, { ua: "SM-G920F" }], dpi: 580.6, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G920P/*" }, { ua: "SM-G920P" }], dpi: [522.5, 577], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G925F/*" }, { ua: "SM-G925F" }], dpi: 580.6, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G925V/*" }, { ua: "SM-G925V" }], dpi: [522.5, 576.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G930F/*" }, { ua: "SM-G930F" }], dpi: 576.6, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G935F/*" }, { ua: "SM-G935F" }], dpi: 533, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G950F/*" }, { ua: "SM-G950F" }], dpi: [562.707, 565.293], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G955U/*" }, { ua: "SM-G955U" }], dpi: [522.514, 525.762], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G955F/*" }, { ua: "SM-G955F" }], dpi: [522.514, 525.762], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G960F/*" }, { ua: "SM-G960F" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G9600/*" }, { ua: "SM-G9600" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G960T/*" }, { ua: "SM-G960T" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G960N/*" }, { ua: "SM-G960N" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G960U/*" }, { ua: "SM-G960U" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G9608/*" }, { ua: "SM-G9608" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G960FD/*" }, { ua: "SM-G960FD" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G960W/*" }, { ua: "SM-G960W" }], dpi: [569.575, 571.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G965F/*" }, { ua: "SM-G965F" }], dpi: 529, bw: 2, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Sony/*/C6903/*" }, { ua: "C6903" }], dpi: [442.5, 443.3], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "Sony/*/D6653/*" }, { ua: "D6653" }], dpi: [428.6, 427.6], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Sony/*/E6653/*" }, { ua: "E6653" }], dpi: [428.6, 425.7], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Sony/*/E6853/*" }, { ua: "E6853" }], dpi: [403.4, 401.9], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Sony/*/SGP321/*" }, { ua: "SGP321" }], dpi: [224.7, 224.1], bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "TCT/*/ALCATEL ONE TOUCH Fierce/*" }, { ua: "ALCATEL ONE TOUCH Fierce" }], dpi: [240, 247.5], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "THL/*/thl 5000/*" }, { ua: "thl 5000" }], dpi: [480, 443.3], bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Fly/*/IQ4412/*" }, { ua: "IQ4412" }], dpi: 307.9, bw: 3, ac: 1e3 }, { type: "android", rules: [{ mdmh: "ZTE/*/ZTE Blade L2/*" }, { ua: "ZTE Blade L2" }], dpi: 240, bw: 3, ac: 500 }, { type: "android", rules: [{ mdmh: "BENEVE/*/VR518/*" }, { ua: "VR518" }], dpi: 480, bw: 3, ac: 500 }, { type: "ios", rules: [{ res: [640, 960] }], dpi: [325.1, 328.4], bw: 4, ac: 1e3 }, { type: "ios", rules: [{ res: [640, 1136] }], dpi: [317.1, 320.2], bw: 3, ac: 1e3 }, { type: "ios", rules: [{ res: [750, 1334] }], dpi: 326.4, bw: 4, ac: 1e3 }, { type: "ios", rules: [{ res: [1242, 2208] }], dpi: [453.6, 458.4], bw: 4, ac: 1e3 }, { type: "ios", rules: [{ res: [1125, 2001] }], dpi: [410.9, 415.4], bw: 4, ac: 1e3 }, { type: "ios", rules: [{ res: [1125, 2436] }], dpi: 458, bw: 4, ac: 1e3 }, { type: "android", rules: [{ mdmh: "Huawei/*/EML-L29/*" }, { ua: "EML-L29" }], dpi: 428, bw: 3.45, ac: 500 }, { type: "android", rules: [{ mdmh: "Nokia/*/Nokia 7.1/*" }, { ua: "Nokia 7.1" }], dpi: [432, 431.9], bw: 3, ac: 500 }, { type: "ios", rules: [{ res: [1242, 2688] }], dpi: 458, bw: 4, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G570M/*" }, { ua: "SM-G570M" }], dpi: 320, bw: 3.684, ac: 1e3 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G970F/*" }, { ua: "SM-G970F" }], dpi: 438, bw: 2.281, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G973F/*" }, { ua: "SM-G973F" }], dpi: 550, bw: 2.002, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G975F/*" }, { ua: "SM-G975F" }], dpi: 522, bw: 2.054, ac: 500 }, { type: "android", rules: [{ mdmh: "samsung/*/SM-G977F/*" }, { ua: "SM-G977F" }], dpi: 505, bw: 2.334, ac: 500 }, { type: "ios", rules: [{ res: [828, 1792] }], dpi: 326, bw: 5, ac: 500 }] }; function Z(t, e) { if (this.dpdb = Q, this.recalculateDeviceParams_(), t) { this.onDeviceParamsUpdated = e; var n = new XMLHttpRequest, i = this; n.open("GET", t, !0), n.addEventListener("load", (function() { i.loading = !1, n.status >= 200 && n.status <= 299 ? (i.dpdb = JSON.parse(n.response), i.recalculateDeviceParams_()) : console.error("Error loading online DPDB!") })), n.send() } } function J(t) { this.xdpi = t.xdpi, this.ydpi = t.ydpi, this.bevelMm = t.bevelMm } function K(t, e) { this.set(t, e) } function $(t, e) { this.kFilter = t, this.isDebug = e, this.currentAccelMeasurement = new K, this.currentGyroMeasurement = new K, this.previousGyroMeasurement = new K, a() ? this.filterQ = new V(-1, 0, 0, 1) : this.filterQ = new V(1, 0, 0, 1), this.previousFilterQ = new V, this.previousFilterQ.copy(this.filterQ), this.accelQ = new V, this.isOrientationInitialized = !1, this.estimatedGravity = new U, this.measuredGravity = new U, this.gyroIntegralQ = new V } function tt(t, e) { this.predictionTimeS = t, this.isDebug = e, this.previousQ = new V, this.previousTimestampS = null, this.deltaQ = new V, this.outQ = new V } function et(t, e, n, i) { this.yawOnly = n, this.accelerometer = new U, this.gyroscope = new U, this.filter = new $(t, i), this.posePredictor = new tt(e, i), this.isFirefoxAndroid = h(), this.isIOS = a(); var r = u(); this.isDeviceMotionInRadians = !this.isIOS && r && r < 66, this.isWithoutDeviceMotion = p() || d(), this.filterToWorldQ = new V, a() ? this.filterToWorldQ.setFromAxisAngle(new U(1, 0, 0), Math.PI / 2) : this.filterToWorldQ.setFromAxisAngle(new U(1, 0, 0), -Math.PI / 2), this.inverseWorldToScreenQ = new V, this.worldToScreenQ = new V, this.originalPoseAdjustQ = new V, this.originalPoseAdjustQ.setFromAxisAngle(new U(0, 0, 1), -window.orientation * Math.PI / 180), this.setScreenTransform_(), m() && this.filterToWorldQ.multiply(this.inverseWorldToScreenQ), this.resetQ = new V, this.orientationOut_ = new Float32Array(4), this.start() } Z.prototype.getDeviceParams = function() { return this.deviceParams }, Z.prototype.recalculateDeviceParams_ = function() { var t = this.calcDeviceParams_(); t ? (this.deviceParams = t, this.onDeviceParamsUpdated && this.onDeviceParamsUpdated(this.deviceParams)) : console.error("Failed to recalculate device parameters.") }, Z.prototype.calcDeviceParams_ = function() { var t = this.dpdb; if (!t) return console.error("DPDB not available."), null; if (1 != t.format) return console.error("DPDB has unexpected format version."), null; if (!t.devices || !t.devices.length) return console.error("DPDB does not have a devices section."), null; var e = navigator.userAgent || navigator.vendor || window.opera, n = g(), i = v(); if (!t.devices) return console.error("DPDB has no devices section."), null; for (var r = 0; r < t.devices.length; r++) { var o = t.devices[r]; if (o.rules) if ("ios" == o.type || "android" == o.type) { if (a() == ("ios" == o.type)) { for (var s = !1, l = 0; l < o.rules.length; l++) { var c = o.rules[l]; if (this.ruleMatches_(c, e, n, i)) { s = !0; break } } if (s) return new J({ xdpi: o.dpi[0] || o.dpi, ydpi: o.dpi[1] || o.dpi, bevelMm: o.bw }) } } else console.warn("Device[" + r + "] has invalid type."); else console.warn("Device[" + r + "] has no rules section.") } return console.warn("No DPDB device match."), null }, Z.prototype.ruleMatches_ = function(t, e, n, i) { if (!t.ua && !t.res) return !1; if (t.ua && "SM" === t.ua.substring(0, 2) && (t.ua = t.ua.substring(0, 7)), t.ua && e.indexOf(t.ua) < 0) return !1; if (t.res) { if (!t.res[0] || !t.res[1]) return !1; var r = t.res[0], o = t.res[1]; if (Math.min(n, i) != Math.min(r, o) || Math.max(n, i) != Math.max(r, o)) return !1 } return !0 }, K.prototype.set = function(t, e) { this.sample = t, this.timestampS = e }, K.prototype.copy = function(t) { this.set(t.sample, t.timestampS) }, $.prototype.addAccelMeasurement = function(t, e) { this.currentAccelMeasurement.set(t, e) }, $.prototype.addGyroMeasurement = function(t, e) { this.currentGyroMeasurement.set(t, e); var n, i = e - this.previousGyroMeasurement.timestampS; n = i, isNaN(n) || n <= .001 || n > 1 || this.run_(), this.previousGyroMeasurement.copy(this.currentGyroMeasurement) }, $.prototype.run_ = function() { if (!this.isOrientationInitialized) return this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample), this.previousFilterQ.copy(this.accelQ), void(this.isOrientationInitialized = !0); var t = this.currentGyroMeasurement.timestampS - this.previousGyroMeasurement.timestampS, e = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, t); this.gyroIntegralQ.multiply(e), this.filterQ.copy(this.previousFilterQ), this.filterQ.multiply(e); var n = new V; n.copy(this.filterQ), n.inverse(), this.estimatedGravity.set(0, 0, -1), this.estimatedGravity.applyQuaternion(n), this.estimatedGravity.normalize(), this.measuredGravity.copy(this.currentAccelMeasurement.sample), this.measuredGravity.normalize(); var i, r = new V; r.setFromUnitVectors(this.estimatedGravity, this.measuredGravity), r.inverse(), this.isDebug && console.log("Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)", z * ((i = r).w > 1 ? (console.warn("getQuaternionAngle: w > 1"), 0) : 2 * Math.acos(i.w)), this.estimatedGravity.x.toFixed(1), this.estimatedGravity.y.toFixed(1), this.estimatedGravity.z.toFixed(1), this.measuredGravity.x.toFixed(1), this.measuredGravity.y.toFixed(1), this.measuredGravity.z.toFixed(1)); var o = new V; o.copy(this.filterQ), o.multiply(r), this.filterQ.slerp(o, 1 - this.kFilter), this.previousFilterQ.copy(this.filterQ) }, $.prototype.getOrientation = function() { return this.filterQ }, $.prototype.accelToQuaternion_ = function(t) { var e = new U; e.copy(t), e.normalize(); var n = new V; return n.setFromUnitVectors(new U(0, 0, -1), e), n.inverse(), n }, $.prototype.gyroToQuaternionDelta_ = function(t, e) { var n = new V, i = new U; return i.copy(t), i.normalize(), n.setFromAxisAngle(i, t.length() * e), n }, tt.prototype.getPrediction = function(t, e, n) { if (!this.previousTimestampS) return this.previousQ.copy(t), this.previousTimestampS = n, t; var i = new U; i.copy(e), i.normalize(); var r = e.length(); if (r < 20 * F) return this.isDebug && console.log("Moving slowly, at %s deg/s: no prediction", (z * r).toFixed(1)), this.outQ.copy(t), this.previousQ.copy(t), this.outQ; var o = r * this.predictionTimeS; return this.deltaQ.setFromAxisAngle(i, o), this.outQ.copy(this.previousQ), this.outQ.multiply(this.deltaQ), this.previousQ.copy(t), this.previousTimestampS = n, this.outQ }, et.prototype.getPosition = function() { return null }, et.prototype.getOrientation = function() { var t = void 0; if (this.isWithoutDeviceMotion && this._deviceOrientationQ) return this.deviceOrientationFixQ = this.deviceOrientationFixQ || (n = (new V).setFromAxisAngle(new U(0, 0, -1), 0), i = new V, -90 === window.orientation ? i.setFromAxisAngle(new U(0, 1, 0), Math.PI / -2) : i.setFromAxisAngle(new U(0, 1, 0), Math.PI / 2), n.multiply(i)), this.deviceOrientationFilterToWorldQ = this.deviceOrientationFilterToWorldQ || ((e = new V).setFromAxisAngle(new U(1, 0, 0), -Math.PI / 2), e), t = this._deviceOrientationQ, (r = new V).copy(t), r.multiply(this.deviceOrientationFilterToWorldQ), r.multiply(this.resetQ), r.multiply(this.worldToScreenQ), r.multiplyQuaternions(this.deviceOrientationFixQ, r), this.yawOnly && (r.x = 0, r.z = 0, r.normalize()), this.orientationOut_[0] = r.x, this.orientationOut_[1] = r.y, this.orientationOut_[2] = r.z, this.orientationOut_[3] = r.w, this.orientationOut_; var e, n, i, r, o = this.filter.getOrientation(); return t = this.posePredictor.getPrediction(o, this.gyroscope, this.previousTimestampS), (r = new V).copy(this.filterToWorldQ), r.multiply(this.resetQ), r.multiply(t), r.multiply(this.worldToScreenQ), this.yawOnly && (r.x = 0, r.z = 0, r.normalize()), this.orientationOut_[0] = r.x, this.orientationOut_[1] = r.y, this.orientationOut_[2] = r.z, this.orientationOut_[3] = r.w, this.orientationOut_ }, et.prototype.resetPose = function() { this.resetQ.copy(this.filter.getOrientation()), this.resetQ.x = 0, this.resetQ.y = 0, this.resetQ.z *= -1, this.resetQ.normalize(), m() && this.resetQ.multiply(this.inverseWorldToScreenQ), this.resetQ.multiply(this.originalPoseAdjustQ) }, et.prototype.onDeviceOrientation_ = function(t) { this._deviceOrientationQ = this._deviceOrientationQ || new V; var e = t.alpha, n = t.beta, i = t.gamma; e = (e || 0) * Math.PI / 180, n = (n || 0) * Math.PI / 180, i = (i || 0) * Math.PI / 180, this._deviceOrientationQ.setFromEulerYXZ(n, e, -i) }, et.prototype.onDeviceMotion_ = function(t) { this.updateDeviceMotion_(t) }, et.prototype.updateDeviceMotion_ = function(t) { var e = t.accelerationIncludingGravity, n = t.rotationRate, i = t.timeStamp / 1e3, r = i - this.previousTimestampS; return r < 0 ? (S("fusion-pose-sensor:invalid:non-monotonic", "Invalid timestamps detected: non-monotonic timestamp from devicemotion"), void(this.previousTimestampS = i)) : r <= .001 || r > 1 ? (S("fusion-pose-sensor:invalid:outside-threshold", "Invalid timestamps detected: Timestamp from devicemotion outside expected range."), void(this.previousTimestampS = i)) : (this.accelerometer.set(-e.x, -e.y, -e.z), n && (f() ? this.gyroscope.set(-n.beta, n.alpha, n.gamma) : this.gyroscope.set(n.alpha, n.beta, n.gamma), this.isDeviceMotionInRadians || this.gyroscope.multiplyScalar(Math.PI / 180), this.filter.addGyroMeasurement(this.gyroscope, i)), this.filter.addAccelMeasurement(this.accelerometer, i), void(this.previousTimestampS = i)) }, et.prototype.onOrientationChange_ = function(t) { this.setScreenTransform_() }, et.prototype.onMessage_ = function(t) { var e = t.data; e && e.type && "devicemotion" === e.type.toLowerCase() && this.updateDeviceMotion_(e.deviceMotionEvent) }, et.prototype.setScreenTransform_ = function() { switch (this.worldToScreenQ.set(0, 0, 0, 1), window.orientation) { case 0: break; case 90: this.worldToScreenQ.setFromAxisAngle(new U(0, 0, 1), -Math.PI / 2); break; case -90: this.worldToScreenQ.setFromAxisAngle(new U(0, 0, 1), Math.PI / 2) } this.inverseWorldToScreenQ.copy(this.worldToScreenQ), this.inverseWorldToScreenQ.inverse() }, et.prototype.start = function() { var t, e, n; this.onDeviceMotionCallback_ = this.onDeviceMotion_.bind(this), this.onOrientationChangeCallback_ = this.onOrientationChange_.bind(this), this.onMessageCallback_ = this.onMessage_.bind(this), this.onDeviceOrientationCallback_ = this.onDeviceOrientation_.bind(this), a() && (t = window.self !== window.top, e = E(document.referrer), n = E(window.location.href), t && e !== n) && window.addEventListener("message", this.onMessageCallback_), window.addEventListener("orientationchange", this.onOrientationChangeCallback_), this.isWithoutDeviceMotion ? window.addEventListener("deviceorientation", this.onDeviceOrientationCallback_) : window.addEventListener("devicemotion", this.onDeviceMotionCallback_) }, et.prototype.stop = function() { window.removeEventListener("devicemotion", this.onDeviceMotionCallback_), window.removeEventListener("deviceorientation", this.onDeviceOrientationCallback_), window.removeEventListener("orientationchange", this.onOrientationChangeCallback_), window.removeEventListener("message", this.onMessageCallback_) }; var nt = new U(1, 0, 0), it = new U(0, 0, 1), rt = new V; rt.setFromAxisAngle(nt, -Math.PI / 2), rt.multiply((new V).setFromAxisAngle(it, Math.PI / 2)); var ot = function() { function t(e) { ! function(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") }(this, t), this.config = e, this.sensor = null, this.fusionSensor = null, this._out = new Float32Array(4), this.api = null, this.errors = [], this._sensorQ = new V, this._outQ = new V, this._onSensorRead = this._onSensorRead.bind(this), this._onSensorError = this._onSensorError.bind(this), this.init() } return r(t, [{ key: "init", value: function() { var t = null; try { (t = new RelativeOrientationSensor({ frequency: 60, referenceFrame: "screen" })).addEventListener("error", this._onSensorError) } catch (t) { this.errors.push(t), "SecurityError" === t.name ? (console.error("Cannot construct sensors due to the Feature Policy"), console.warn('Attempting to fall back using "devicemotion"; however this will fail in the future without correct permissions.'), this.useDeviceMotion()) : "ReferenceError" === t.name ? this.useDeviceMotion() : console.error(t) } t && (this.api = "sensor", this.sensor = t, this.sensor.addEventListener("reading", this._onSensorRead), this.sensor.start()) } }, { key: "useDeviceMotion", value: function() { this.api = "devicemotion", this.fusionSensor = new et(this.config.K_FILTER, this.config.PREDICTION_TIME_S, this.config.YAW_ONLY, this.config.DEBUG), this.sensor && (this.sensor.removeEventListener("reading", this._onSensorRead), this.sensor.removeEventListener("error", this._onSensorError), this.sensor = null) } }, { key: "getOrientation", value: function() { if (this.fusionSensor) return this.fusionSensor.getOrientation(); if (!this.sensor || !this.sensor.quaternion) return this._out[0] = this._out[1] = this._out[2] = 0, this._out[3] = 1, this._out; var t = this.sensor.quaternion; this._sensorQ.set(t[0], t[1], t[2], t[3]); var e = this._outQ; return e.copy(rt), e.multiply(this._sensorQ), this.config.YAW_ONLY && (e.x = e.z = 0, e.normalize()), this._out[0] = e.x, this._out[1] = e.y, this._out[2] = e.z, this._out[3] = e.w, this._out } }, { key: "_onSensorError", value: function(t) { this.errors.push(t.error), "NotAllowedError" === t.error.name ? console.error("Permission to access sensor was denied") : "NotReadableError" === t.error.name ? console.error("Sensor could not be read") : console.error(t.error), this.useDeviceMotion() } }, { key: "_onSensorRead", value: function() {} }]), t }(); function st() { this.loadIcon_(); var t = document.createElement("div"); (o = t.style).position = "fixed", o.top = 0, o.right = 0, o.bottom = 0, o.left = 0, o.backgroundColor = "gray", o.fontFamily = "sans-serif", o.zIndex = 1e6; var e = document.createElement("img"); e.src = this.icon, (o = e.style).marginLeft = "25%", o.marginTop = "25%", o.width = "50%", t.appendChild(e); var n = document.createElement("div"); (o = n.style).textAlign = "center", o.fontSize = "16px", o.lineHeight = "24px", o.margin = "24px 25%", o.width = "50%", n.innerHTML = "Place your phone into your Cardboard viewer.", t.appendChild(n); var i = document.createElement("div"); (o = i.style).backgroundColor = "#CFD8DC", o.position = "fixed", o.bottom = 0, o.width = "100%", o.height = "48px", o.padding = "14px 24px", o.boxSizing = "border-box", o.color = "#656A6B", t.appendChild(i); var r = document.createElement("div"); r.style.float = "left", r.innerHTML = "No Cardboard viewer?"; var o, s = document.createElement("a"); s.href = "https://www.google.com/get/cardboard/get-cardboard/", s.innerHTML = "get one", s.target = "_blank", (o = s.style).float = "right", o.fontWeight = 600, o.textTransform = "uppercase", o.borderLeft = "1px solid gray", o.paddingLeft = "24px", o.textDecoration = "none", o.color = "#656A6B", i.appendChild(r), i.appendChild(s), this.overlay = t, this.text = n, this.hide() } function at(t) { try { this.selectedKey = localStorage.getItem("WEBVR_CARDBOARD_VIEWER") } catch (t) { console.error("Failed to load viewer profile: %s", t) } this.selectedKey || (this.selectedKey = t || "CardboardV1"), this.dialog = this.createDialog_(q.Viewers), this.root = null, this.onChangeCallbacks_ = [] } st.prototype.show = function(t) { t || this.overlay.parentElement ? t && (this.overlay.parentElement && this.overlay.parentElement != t && this.overlay.parentElement.removeChild(this.overlay), t.appendChild(this.overlay)) : document.body.appendChild(this.overlay), this.overlay.style.display = "block"; var e = this.overlay.querySelector("img").style; m() ? (e.width = "20%", e.marginLeft = "40%", e.marginTop = "3%") : (e.width = "50%", e.marginLeft = "25%", e.marginTop = "25%") }, st.prototype.hide = function() { this.overlay.style.display = "none" }, st.prototype.showTemporarily = function(t, e) { this.show(e), this.timer = setTimeout(this.hide.bind(this), t) }, st.prototype.disableShowTemporarily = function() { clearTimeout(this.timer) }, st.prototype.update = function() { this.disableShowTemporarily(), !m() && _() ? this.show() : this.hide() }, st.prototype.loadIcon_ = function() { this.icon = "data:image/svg+xml," + encodeURIComponent("") }, at.prototype.show = function(t) { this.root = t, t.appendChild(this.dialog), this.dialog.querySelector("#" + this.selectedKey).checked = !0, this.dialog.style.display = "block" }, at.prototype.hide = function() { this.root && this.root.contains(this.dialog) && this.root.removeChild(this.dialog), this.dialog.style.display = "none" }, at.prototype.getCurrentViewer = function() { return q.Viewers[this.selectedKey] }, at.prototype.getSelectedKey_ = function() { var t = this.dialog.querySelector("input[name=field]:checked"); return t ? t.id : null }, at.prototype.onChange = function(t) { this.onChangeCallbacks_.push(t) }, at.prototype.fireOnChange_ = function(t) { for (var e = 0; e < this.onChangeCallbacks_.length; e++) this.onChangeCallbacks_[e](t) }, at.prototype.onSave_ = function() { if (this.selectedKey = this.getSelectedKey_(), this.selectedKey && q.Viewers[this.selectedKey]) { this.fireOnChange_(q.Viewers[this.selectedKey]); try { localStorage.setItem("WEBVR_CARDBOARD_VIEWER", this.selectedKey) } catch (t) { console.error("Failed to save viewer profile: %s", t) } this.hide() } else console.error("ViewerSelector.onSave_: this should never happen!") }, at.prototype.createDialog_ = function(t) { var e = document.createElement("div"); e.classList.add("webvr-polyfill-viewer-selector"), e.style.display = "none"; var n = document.createElement("div"); (r = n.style).position = "fixed", r.left = 0, r.top = 0, r.width = "100%", r.height = "100%", r.background = "rgba(0, 0, 0, 0.3)", n.addEventListener("click", this.hide.bind(this)); var i = document.createElement("div"), r = i.style; for (var o in r.boxSizing = "border-box", r.position = "fixed", r.top = "24px", r.left = "50%", r.marginLeft = "-140px", r.width = "280px", r.padding = "24px", r.overflow = "hidden", r.background = "#fafafa", r.fontFamily = "'Roboto', sans-serif", r.boxShadow = "0px 5px 20px #666", i.appendChild(this.createH1_("Select your viewer")), t) i.appendChild(this.createChoice_(o, t[o].label)); return i.appendChild(this.createButton_("Save", this.onSave_.bind(this))), e.appendChild(n), e.appendChild(i), e }, at.prototype.createH1_ = function(t) { var e = document.createElement("h1"), n = e.style; return n.color = "black", n.fontSize = "20px", n.fontWeight = "bold", n.marginTop = 0, n.marginBottom = "24px", e.innerHTML = t, e }, at.prototype.createChoice_ = function(t, e) { var n = document.createElement("div"); n.style.marginTop = "8px", n.style.color = "black"; var i = document.createElement("input"); i.style.fontSize = "30px", i.setAttribute("id", t), i.setAttribute("type", "radio"), i.setAttribute("value", t), i.setAttribute("name", "field"); var r = document.createElement("label"); return r.style.marginLeft = "4px", r.setAttribute("for", t), r.innerHTML = e, n.appendChild(i), n.appendChild(r), n }, at.prototype.createButton_ = function(t, e) { var n = document.createElement("button"); n.innerHTML = t; var i = n.style; return i.float = "right", i.textTransform = "uppercase", i.color = "#1094f7", i.fontSize = "14px", i.letterSpacing = 0, i.border = 0, i.background = "none", i.marginTop = "16px", n.addEventListener("click", e), n }, "undefined" != typeof window ? window : void 0 !== e || "undefined" != typeof self && self; var lt, ct = (lt = function(t, e) { return t(e = { exports: {} }, e.exports), e.exports }((function(t, e) { ! function(e, n) { t.exports = n() }(0, (function() { return function(t) { var e = {}; function n(i) { if (e[i]) return e[i].exports; var r = e[i] = { i: i, l: !1, exports: {} }; return t[i].call(r.exports, r, r.exports, n), r.l = !0, r.exports } return n.m = t, n.c = e, n.d = function(t, e, i) { n.o(t, e) || Object.defineProperty(t, e, { configurable: !1, enumerable: !0, get: i }) }, n.n = function(t) { var e = t && t.__esModule ? function() { return t.default } : function() { return t }; return n.d(e, "a", e), e }, n.o = function(t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, n.p = "", n(n.s = 0) }([function(t, e, n) { var i = function() { function t(t, e) { for (var n = 0; n < e.length; n++) { var i = e[n]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(t, i.key, i) } } return function(e, n, i) { return n && t(e.prototype, n), i && t(e, i), e } }(), r = n(1), o = "undefined" != typeof navigator && parseFloat(("" + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0, ""])[1]).replace("undefined", "3_2").replace("_", ".").replace("_", "")) < 10 && !window.MSStream, s = function() { function t() { ! function(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") }(this, t), o ? this.noSleepTimer = null : (this.noSleepVideo = document.createElement("video"), this.noSleepVideo.setAttribute("playsinline", ""), this.noSleepVideo.setAttribute("src", r), this.noSleepVideo.addEventListener("timeupdate", function(t) { this.noSleepVideo.currentTime > .5 && (this.noSleepVideo.currentTime = Math.random()) }.bind(this))) } return i(t, [{ key: "enable", value: function() { o ? (this.disable(), this.noSleepTimer = window.setInterval((function() { window.location.href = "/", window.setTimeout(window.stop, 0) }), 15e3)) : this.noSleepVideo.play() } }, { key: "disable", value: function() { o ? this.noSleepTimer && (window.clearInterval(this.noSleepTimer), this.noSleepTimer = null) : this.noSleepVideo.pause() } }]), t }(); t.exports = s }, function(t, e, n) { t.exports = "data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQADQGgcIQADQGgcAAAACQGeYUQn/wALKCEAA0BoHAAAAAkBnmNEJ/8ACykhAANAaBwhAANAaBwAAAANQZpoNExDP/6plgAMuSEAA0BoHAAAAAtBnoZFESwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBnqVEJ/8ACykhAANAaBwAAAAJAZ6nRCf/AAsoIQADQGgcIQADQGgcAAAADUGarDRMQz/+qZYADLghAANAaBwAAAALQZ7KRRUsK/8ACPkhAANAaBwAAAAJAZ7pRCf/AAsoIQADQGgcIQADQGgcAAAACQGe60Qn/wALKCEAA0BoHAAAAA1BmvA0TEM//qmWAAy5IQADQGgcIQADQGgcAAAAC0GfDkUVLCv/AAj5IQADQGgcAAAACQGfLUQn/wALKSEAA0BoHCEAA0BoHAAAAAkBny9EJ/8ACyghAANAaBwAAAANQZs0NExDP/6plgAMuCEAA0BoHAAAAAtBn1JFFSwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBn3FEJ/8ACyghAANAaBwAAAAJAZ9zRCf/AAsoIQADQGgcIQADQGgcAAAADUGbeDRMQz/+qZYADLkhAANAaBwAAAALQZ+WRRUsK/8ACPghAANAaBwhAANAaBwAAAAJAZ+1RCf/AAspIQADQGgcAAAACQGft0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bm7w0TEM//qmWAAy4IQADQGgcAAAAC0Gf2kUVLCv/AAj5IQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHAAAAAkBn/tEJ/8ACykhAANAaBwAAAANQZvgNExDP/6plgAMuSEAA0BoHCEAA0BoHAAAAAtBnh5FFSwr/wAI+CEAA0BoHAAAAAkBnj1EJ/8ACyghAANAaBwhAANAaBwAAAAJAZ4/RCf/AAspIQADQGgcAAAADUGaJDRMQz/+qZYADLghAANAaBwAAAALQZ5CRRUsK/8ACPkhAANAaBwhAANAaBwAAAAJAZ5hRCf/AAsoIQADQGgcAAAACQGeY0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bmmg0TEM//qmWAAy5IQADQGgcAAAAC0GehkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGepUQn/wALKSEAA0BoHAAAAAkBnqdEJ/8ACyghAANAaBwAAAANQZqsNExDP/6plgAMuCEAA0BoHCEAA0BoHAAAAAtBnspFFSwr/wAI+SEAA0BoHAAAAAkBnulEJ/8ACyghAANAaBwhAANAaBwAAAAJAZ7rRCf/AAsoIQADQGgcAAAADUGa8DRMQz/+qZYADLkhAANAaBwhAANAaBwAAAALQZ8ORRUsK/8ACPkhAANAaBwAAAAJAZ8tRCf/AAspIQADQGgcIQADQGgcAAAACQGfL0Qn/wALKCEAA0BoHAAAAA1BmzQ0TEM//qmWAAy4IQADQGgcAAAAC0GfUkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGfcUQn/wALKCEAA0BoHAAAAAkBn3NEJ/8ACyghAANAaBwhAANAaBwAAAANQZt4NExC//6plgAMuSEAA0BoHAAAAAtBn5ZFFSwr/wAI+CEAA0BoHCEAA0BoHAAAAAkBn7VEJ/8ACykhAANAaBwAAAAJAZ+3RCf/AAspIQADQGgcAAAADUGbuzRMQn/+nhAAYsAhAANAaBwhAANAaBwAAAAJQZ/aQhP/AAspIQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHAAACiFtb292AAAAbG12aGQAAAAA1YCCX9WAgl8AAAPoAAAH/AABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAGGlvZHMAAAAAEICAgAcAT////v7/AAAF+XRyYWsAAABcdGtoZAAAAAPVgIJf1YCCXwAAAAEAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAygAAAMoAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAB9AAABdwAAEAAAAABXFtZGlhAAAAIG1kaGQAAAAA1YCCX9WAgl8AAV+QAAK/IFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAUcbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAE3HN0YmwAAACYc3RzZAAAAAAAAAABAAAAiGF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAygDKAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAyYXZjQwFNQCj/4QAbZ01AKOyho3ySTUBAQFAAAAMAEAAr8gDxgxlgAQAEaO+G8gAAABhzdHRzAAAAAAAAAAEAAAA8AAALuAAAABRzdHNzAAAAAAAAAAEAAAABAAAB8GN0dHMAAAAAAAAAPAAAAAEAABdwAAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAAC7gAAAAAQAAF3AAAAABAAAAAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAEEc3RzegAAAAAAAAAAAAAAPAAAAzQAAAAQAAAADQAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAANAAAADQAAAQBzdGNvAAAAAAAAADwAAAAwAAADZAAAA3QAAAONAAADoAAAA7kAAAPQAAAD6wAAA/4AAAQXAAAELgAABEMAAARcAAAEbwAABIwAAAShAAAEugAABM0AAATkAAAE/wAABRIAAAUrAAAFQgAABV0AAAVwAAAFiQAABaAAAAW1AAAFzgAABeEAAAX+AAAGEwAABiwAAAY/AAAGVgAABnEAAAaEAAAGnQAABrQAAAbPAAAG4gAABvUAAAcSAAAHJwAAB0AAAAdTAAAHcAAAB4UAAAeeAAAHsQAAB8gAAAfjAAAH9gAACA8AAAgmAAAIQQAACFQAAAhnAAAIhAAACJcAAAMsdHJhawAAAFx0a2hkAAAAA9WAgl/VgIJfAAAAAgAAAAAAAAf8AAAAAAAAAAAAAAABAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAACsm1kaWEAAAAgbWRoZAAAAADVgIJf1YCCXwAArEQAAWAAVcQAAAAAACdoZGxyAAAAAAAAAABzb3VuAAAAAAAAAAAAAAAAU3RlcmVvAAAAAmNtaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAidzdGJsAAAAZ3N0c2QAAAAAAAAAAQAAAFdtcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAADNlc2RzAAAAAAOAgIAiAAIABICAgBRAFQAAAAADDUAAAAAABYCAgAISEAaAgIABAgAAABhzdHRzAAAAAAAAAAEAAABYAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAAGAAAAWAAAAXBzdGNvAAAAAAAAAFgAAAOBAAADhwAAA5oAAAOtAAADswAAA8oAAAPfAAAD5QAAA/gAAAQLAAAEEQAABCgAAAQ9AAAEUAAABFYAAARpAAAEgAAABIYAAASbAAAErgAABLQAAATHAAAE3gAABPMAAAT5AAAFDAAABR8AAAUlAAAFPAAABVEAAAVXAAAFagAABX0AAAWDAAAFmgAABa8AAAXCAAAFyAAABdsAAAXyAAAF+AAABg0AAAYgAAAGJgAABjkAAAZQAAAGZQAABmsAAAZ+AAAGkQAABpcAAAauAAAGwwAABskAAAbcAAAG7wAABwYAAAcMAAAHIQAABzQAAAc6AAAHTQAAB2QAAAdqAAAHfwAAB5IAAAeYAAAHqwAAB8IAAAfXAAAH3QAAB/AAAAgDAAAICQAACCAAAAg1AAAIOwAACE4AAAhhAAAIeAAACH4AAAiRAAAIpAAACKoAAAiwAAAItgAACLwAAAjCAAAAFnVkdGEAAAAObmFtZVN0ZXJlbwAAAHB1ZHRhAAAAaG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAO2lsc3QAAAAzqXRvbwAAACtkYXRhAAAAAQAAAABIYW5kQnJha2UgMC4xMC4yIDIwMTUwNjExMDA=" }]) })) }))) && lt.__esModule && Object.prototype.hasOwnProperty.call(lt, "default") ? lt.default : lt, ht = 1e3, ut = [0, 0, .5, 1], dt = [.5, 0, .5, 1], pt = window.requestAnimationFrame, ft = window.cancelAnimationFrame; function mt(t) { Object.defineProperties(this, { hasPosition: { writable: !1, enumerable: !0, value: t.hasPosition }, hasExternalDisplay: { writable: !1, enumerable: !0, value: t.hasExternalDisplay }, canPresent: { writable: !1, enumerable: !0, value: t.canPresent }, maxLayers: { writable: !1, enumerable: !0, value: t.maxLayers }, hasOrientation: { enumerable: !0, get: function() { return T("VRDisplayCapabilities.prototype.hasOrientation", "VRDisplay.prototype.getFrameData"), t.hasOrientation } } }) } function gt(t) { var e = !("wakelock" in (t = t || {})) || t.wakelock; this.isPolyfilled = !0, this.displayId = ht++, this.displayName = "", this.depthNear = .01, this.depthFar = 1e4, this.isPresenting = !1, Object.defineProperty(this, "isConnected", { get: function() { return T("VRDisplay.prototype.isConnected", "VRDisplayCapabilities.prototype.hasExternalDisplay"), !1 } }), this.capabilities = new mt({ hasPosition: !1, hasOrientation: !1, hasExternalDisplay: !1, canPresent: !1, maxLayers: 1 }), this.stageParameters = null, this.waitingForPresent_ = !1, this.layer_ = null, this.originalParent_ = null, this.fullscreenElement_ = null, this.fullscreenWrapper_ = null, this.fullscreenElementCachedStyle_ = null, this.fullscreenEventTarget_ = null, this.fullscreenChangeHandler_ = null, this.fullscreenErrorHandler_ = null, e && _() && (this.wakelock_ = new ct) } gt.prototype.getFrameData = function(t) { return M(t, this._getPose(), this) }, gt.prototype.getPose = function() { return T("VRDisplay.prototype.getPose", "VRDisplay.prototype.getFrameData"), this._getPose() }, gt.prototype.resetPose = function() { return T("VRDisplay.prototype.resetPose"), this._resetPose() }, gt.prototype.getImmediatePose = function() { return T("VRDisplay.prototype.getImmediatePose", "VRDisplay.prototype.getFrameData"), this._getPose() }, gt.prototype.requestAnimationFrame = function(t) { return pt(t) }, gt.prototype.cancelAnimationFrame = function(t) { return ft(t) }, gt.prototype.wrapForFullscreen = function(t) { if (a()) return t; if (!this.fullscreenWrapper_) { this.fullscreenWrapper_ = document.createElement("div"); var e = ["height: " + Math.min(screen.height, screen.width) + "px !important", "top: 0 !important", "left: 0 !important", "right: 0 !important", "border: 0", "margin: 0", "padding: 0", "z-index: 999999 !important", "position: fixed"]; this.fullscreenWrapper_.setAttribute("style", e.join("; ") + ";"), this.fullscreenWrapper_.classList.add("webvr-polyfill-fullscreen-wrapper") } if (this.fullscreenElement_ == t) return this.fullscreenWrapper_; if (this.fullscreenElement_ && (this.originalParent_ ? this.originalParent_.appendChild(this.fullscreenElement_) : this.fullscreenElement_.parentElement.removeChild(this.fullscreenElement_)), this.fullscreenElement_ = t, this.originalParent_ = t.parentElement, this.originalParent_ || document.body.appendChild(t), !this.fullscreenWrapper_.parentElement) { var n = this.fullscreenElement_.parentElement; n.insertBefore(this.fullscreenWrapper_, this.fullscreenElement_), n.removeChild(this.fullscreenElement_) } this.fullscreenWrapper_.insertBefore(this.fullscreenElement_, this.fullscreenWrapper_.firstChild), this.fullscreenElementCachedStyle_ = this.fullscreenElement_.getAttribute("style"); var i = this; return function() { if (i.fullscreenElement_) { var t = ["position: absolute", "top: 0", "left: 0", "width: " + Math.max(screen.width, screen.height) + "px", "height: " + Math.min(screen.height, screen.width) + "px", "border: 0", "margin: 0", "padding: 0"]; i.fullscreenElement_.setAttribute("style", t.join("; ") + ";") } }(), this.fullscreenWrapper_ }, gt.prototype.removeFullscreenWrapper = function() { if (this.fullscreenElement_) { var t = this.fullscreenElement_; this.fullscreenElementCachedStyle_ ? t.setAttribute("style", this.fullscreenElementCachedStyle_) : t.removeAttribute("style"), this.fullscreenElement_ = null, this.fullscreenElementCachedStyle_ = null; var e = this.fullscreenWrapper_.parentElement; return this.fullscreenWrapper_.removeChild(t), this.originalParent_ === e ? e.insertBefore(t, this.fullscreenWrapper_) : this.originalParent_ && this.originalParent_.appendChild(t), e.removeChild(this.fullscreenWrapper_), t } }, gt.prototype.requestPresent = function(t) { var e = this.isPresenting, n = this; return t instanceof Array || (T("VRDisplay.prototype.requestPresent with non-array argument", "an array of VRLayers as the first argument"), t = [t]), new Promise((function(i, r) { if (n.capabilities.canPresent) if (0 == t.length || t.length > n.capabilities.maxLayers) r(new Error("Invalid number of layers.")); else { var o = t[0]; if (o.source) { var s = o.leftBounds || ut, c = o.rightBounds || dt; if (e) { var h = n.layer_; h.source !== o.source && (h.source = o.source); for (var u = 0; u < 4; u++) h.leftBounds[u] = s[u], h.rightBounds[u] = c[u]; return n.wrapForFullscreen(n.layer_.source), n.updatePresent_(), void i() } if (n.layer_ = { predistorted: o.predistorted, source: o.source, leftBounds: s.slice(0), rightBounds: c.slice(0) }, n.waitingForPresent_ = !1, n.layer_ && n.layer_.source) { var d = n.wrapForFullscreen(n.layer_.source); n.addFullscreenListeners_(d, (function() { var t = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement; n.isPresenting = d === t, n.isPresenting ? (screen.orientation && screen.orientation.lock && screen.orientation.lock("landscape-primary").catch((function(t) { console.error("screen.orientation.lock() failed due to", t.message) })), n.waitingForPresent_ = !1, n.beginPresent_(), i()) : (screen.orientation && screen.orientation.unlock && screen.orientation.unlock(), n.removeFullscreenWrapper(), n.disableWakeLock(), n.endPresent_(), n.removeFullscreenListeners_()), n.fireVRDisplayPresentChange_() }), (function() { n.waitingForPresent_ && (n.removeFullscreenWrapper(), n.removeFullscreenListeners_(), n.disableWakeLock(), n.waitingForPresent_ = !1, n.isPresenting = !1, r(new Error("Unable to present."))) })), function(t) { if (l()) return !1; if (t.requestFullscreen) t.requestFullscreen(); else if (t.webkitRequestFullscreen) t.webkitRequestFullscreen(); else if (t.mozRequestFullScreen) t.mozRequestFullScreen(); else { if (!t.msRequestFullscreen) return !1; t.msRequestFullscreen() } return !0 }(d) ? (n.enableWakeLock(), n.waitingForPresent_ = !0) : (a() || l()) && (n.enableWakeLock(), n.isPresenting = !0, n.beginPresent_(), n.fireVRDisplayPresentChange_(), i()) } n.waitingForPresent_ || a() || (y(), r(new Error("Unable to present."))) } else i() } else r(new Error("VRDisplay is not capable of presenting.")) })) }, gt.prototype.exitPresent = function() { var t = this.isPresenting, e = this; return this.isPresenting = !1, this.layer_ = null, this.disableWakeLock(), new Promise((function(n, i) { t ? (!y() && a() && (e.endPresent_(), e.fireVRDisplayPresentChange_()), l() && (e.removeFullscreenWrapper(), e.removeFullscreenListeners_(), e.endPresent_(), e.fireVRDisplayPresentChange_()), n()) : i(new Error("Was not presenting to VRDisplay.")) })) }, gt.prototype.getLayers = function() { return this.layer_ ? [this.layer_] : [] }, gt.prototype.fireVRDisplayPresentChange_ = function() { var t = new CustomEvent("vrdisplaypresentchange", { detail: { display: this } }); window.dispatchEvent(t) }, gt.prototype.fireVRDisplayConnect_ = function() { var t = new CustomEvent("vrdisplayconnect", { detail: { display: this } }); window.dispatchEvent(t) }, gt.prototype.addFullscreenListeners_ = function(t, e, n) { this.removeFullscreenListeners_(), this.fullscreenEventTarget_ = t, this.fullscreenChangeHandler_ = e, this.fullscreenErrorHandler_ = n, e && (document.fullscreenEnabled ? t.addEventListener("fullscreenchange", e, !1) : document.webkitFullscreenEnabled ? t.addEventListener("webkitfullscreenchange", e, !1) : document.mozFullScreenEnabled ? document.addEventListener("mozfullscreenchange", e, !1) : document.msFullscreenEnabled && t.addEventListener("msfullscreenchange", e, !1)), n && (document.fullscreenEnabled ? t.addEventListener("fullscreenerror", n, !1) : document.webkitFullscreenEnabled ? t.addEventListener("webkitfullscreenerror", n, !1) : document.mozFullScreenEnabled ? document.addEventListener("mozfullscreenerror", n, !1) : document.msFullscreenEnabled && t.addEventListener("msfullscreenerror", n, !1)) }, gt.prototype.removeFullscreenListeners_ = function() { if (this.fullscreenEventTarget_) { var t = this.fullscreenEventTarget_; if (this.fullscreenChangeHandler_) { var e = this.fullscreenChangeHandler_; t.removeEventListener("fullscreenchange", e, !1), t.removeEventListener("webkitfullscreenchange", e, !1), document.removeEventListener("mozfullscreenchange", e, !1), t.removeEventListener("msfullscreenchange", e, !1) } if (this.fullscreenErrorHandler_) { var n = this.fullscreenErrorHandler_; t.removeEventListener("fullscreenerror", n, !1), t.removeEventListener("webkitfullscreenerror", n, !1), document.removeEventListener("mozfullscreenerror", n, !1), t.removeEventListener("msfullscreenerror", n, !1) } this.fullscreenEventTarget_ = null, this.fullscreenChangeHandler_ = null, this.fullscreenErrorHandler_ = null } }, gt.prototype.enableWakeLock = function() { this.wakelock_ && this.wakelock_.enable() }, gt.prototype.disableWakeLock = function() { this.wakelock_ && this.wakelock_.disable() }, gt.prototype.beginPresent_ = function() {}, gt.prototype.endPresent_ = function() {}, gt.prototype.submitFrame = function(t) {}, gt.prototype.getEyeParameters = function(t) { return null }; var vt = { ADDITIONAL_VIEWERS: [], DEFAULT_VIEWER: "", MOBILE_WAKE_LOCK: !0, DEBUG: !1, DPDB_URL: "https://dpdb.webvr.rocks/dpdb.json", K_FILTER: .98, PREDICTION_TIME_S: .04, CARDBOARD_UI_DISABLED: !1, ROTATE_INSTRUCTIONS_DISABLED: !1, YAW_ONLY: !1, BUFFER_SCALE: .5, DIRTY_SUBMIT_FRAME_BINDINGS: !1 }, yt = "left", At = "right"; function xt(t) { var e = b({}, vt); t = b(e, t || {}), gt.call(this, { wakelock: t.MOBILE_WAKE_LOCK }), this.config = t, this.displayName = "Cardboard VRDisplay", this.capabilities = new mt({ hasPosition: !1, hasOrientation: !0, hasExternalDisplay: !1, canPresent: !0, maxLayers: 1 }), this.stageParameters = null, this.bufferScale_ = this.config.BUFFER_SCALE, this.poseSensor_ = new ot(this.config), this.distorter_ = null, this.cardboardUI_ = null, this.dpdb_ = new Z(this.config.DPDB_URL, this.onDeviceParamsUpdated_.bind(this)), this.deviceInfo_ = new q(this.dpdb_.getDeviceParams(), t.ADDITIONAL_VIEWERS), this.viewerSelector_ = new at(t.DEFAULT_VIEWER), this.viewerSelector_.onChange(this.onViewerChanged_.bind(this)), this.deviceInfo_.setViewer(this.viewerSelector_.getCurrentViewer()), this.config.ROTATE_INSTRUCTIONS_DISABLED || (this.rotateInstructions_ = new st), a() && window.addEventListener("resize", this.onResize_.bind(this)) } return xt.prototype = Object.create(gt.prototype), xt.prototype._getPose = function() { return { position: null, orientation: this.poseSensor_.getOrientation(), linearVelocity: null, linearAcceleration: null, angularVelocity: null, angularAcceleration: null } }, xt.prototype._resetPose = function() { this.poseSensor_.resetPose && this.poseSensor_.resetPose() }, xt.prototype._getFieldOfView = function(t) { var e; if (t == yt) e = this.deviceInfo_.getFieldOfViewLeftEye(); else { if (t != At) return console.error("Invalid eye provided: %s", t), null; e = this.deviceInfo_.getFieldOfViewRightEye() } return e }, xt.prototype._getEyeOffset = function(t) { var e; if (t == yt) e = [.5 * -this.deviceInfo_.viewer.interLensDistance, 0, 0]; else { if (t != At) return console.error("Invalid eye provided: %s", t), null; e = [.5 * this.deviceInfo_.viewer.interLensDistance, 0, 0] } return e }, xt.prototype.getEyeParameters = function(t) { var e = this._getEyeOffset(t), n = this._getFieldOfView(t), i = { offset: e, renderWidth: .5 * this.deviceInfo_.device.width * this.bufferScale_, renderHeight: this.deviceInfo_.device.height * this.bufferScale_ }; return Object.defineProperty(i, "fieldOfView", { enumerable: !0, get: function() { return T("VRFieldOfView", "VRFrameData's projection matrices"), n } }), i }, xt.prototype.onDeviceParamsUpdated_ = function(t) { this.config.DEBUG && console.log("DPDB reported that device params were updated."), this.deviceInfo_.updateDeviceParams(t), this.distorter_ && this.distorter_.updateDeviceInfo(this.deviceInfo_) }, xt.prototype.updateBounds_ = function() { this.layer_ && this.distorter_ && (this.layer_.leftBounds || this.layer_.rightBounds) && this.distorter_.setTextureBounds(this.layer_.leftBounds, this.layer_.rightBounds) }, xt.prototype.beginPresent_ = function() { var t = this.layer_.source.getContext("webgl"); t || (t = this.layer_.source.getContext("experimental-webgl")), t || (t = this.layer_.source.getContext("webgl2")), t && (this.layer_.predistorted ? this.config.CARDBOARD_UI_DISABLED || (t.canvas.width = g() * this.bufferScale_, t.canvas.height = v() * this.bufferScale_, this.cardboardUI_ = new N(t)) : (this.config.CARDBOARD_UI_DISABLED || (this.cardboardUI_ = new N(t)), this.distorter_ = new P(t, this.cardboardUI_, this.config.BUFFER_SCALE, this.config.DIRTY_SUBMIT_FRAME_BINDINGS), this.distorter_.updateDeviceInfo(this.deviceInfo_)), this.cardboardUI_ && this.cardboardUI_.listen(function(t) { this.viewerSelector_.show(this.layer_.source.parentElement), t.stopPropagation(), t.preventDefault() }.bind(this), function(t) { this.exitPresent(), t.stopPropagation(), t.preventDefault() }.bind(this)), this.rotateInstructions_ && (m() && _() ? this.rotateInstructions_.showTemporarily(3e3, this.layer_.source.parentElement) : this.rotateInstructions_.update()), this.orientationHandler = this.onOrientationChange_.bind(this), window.addEventListener("orientationchange", this.orientationHandler), this.vrdisplaypresentchangeHandler = this.updateBounds_.bind(this), window.addEventListener("vrdisplaypresentchange", this.vrdisplaypresentchangeHandler), this.fireVRDisplayDeviceParamsChange_()) }, xt.prototype.endPresent_ = function() { this.distorter_ && (this.distorter_.destroy(), this.distorter_ = null), this.cardboardUI_ && (this.cardboardUI_.destroy(), this.cardboardUI_ = null), this.rotateInstructions_ && this.rotateInstructions_.hide(), this.viewerSelector_.hide(), window.removeEventListener("orientationchange", this.orientationHandler), window.removeEventListener("vrdisplaypresentchange", this.vrdisplaypresentchangeHandler) }, xt.prototype.updatePresent_ = function() { this.endPresent_(), this.beginPresent_() }, xt.prototype.submitFrame = function(t) { if (this.distorter_) this.updateBounds_(), this.distorter_.submitFrame(); else if (this.cardboardUI_ && this.layer_) { var e = this.layer_.source.getContext("webgl"); e || (e = this.layer_.source.getContext("experimental-webgl")), e || (e = this.layer_.source.getContext("webgl2")); var n = e.canvas; n.width == this.lastWidth && n.height == this.lastHeight || this.cardboardUI_.onResize(), this.lastWidth = n.width, this.lastHeight = n.height, this.cardboardUI_.render() } }, xt.prototype.onOrientationChange_ = function(t) { this.viewerSelector_.hide(), this.rotateInstructions_ && this.rotateInstructions_.update(), this.onResize_() }, xt.prototype.onResize_ = function(t) { if (this.layer_) { var e = this.layer_.source.getContext("webgl"); e || (e = this.layer_.source.getContext("experimental-webgl")), e || (e = this.layer_.source.getContext("webgl2")), e.canvas.setAttribute("style", ["position: absolute", "top: 0", "left: 0", "width: 100vw", "height: 100vh", "border: 0", "margin: 0", "padding: 0px", "box-sizing: content-box"].join("; ") + ";"), w(e.canvas) } }, xt.prototype.onViewerChanged_ = function(t) { this.deviceInfo_.setViewer(t), this.distorter_ && this.distorter_.updateDeviceInfo(this.deviceInfo_), this.fireVRDisplayDeviceParamsChange_() }, xt.prototype.fireVRDisplayDeviceParamsChange_ = function() { var t = new CustomEvent("vrdisplaydeviceparamschange", { detail: { vrdisplay: this, deviceInfo: this.deviceInfo_ } }); window.dispatchEvent(t) }, xt.VRFrameData = function() { this.leftProjectionMatrix = new Float32Array(16), this.leftViewMatrix = new Float32Array(16), this.rightProjectionMatrix = new Float32Array(16), this.rightViewMatrix = new Float32Array(16), this.pose = null }, xt.VRDisplay = gt, xt }() }))) && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t, a = { ADDITIONAL_VIEWERS: [], DEFAULT_VIEWER: "", PROVIDE_MOBILE_VRDISPLAY: !0, MOBILE_WAKE_LOCK: !0, DEBUG: !1, DPDB_URL: "https://dpdb.webvr.rocks/dpdb.json", K_FILTER: .98, PREDICTION_TIME_S: .04, CARDBOARD_UI_DISABLED: !1, ROTATE_INSTRUCTIONS_DISABLED: !1, YAW_ONLY: !1, BUFFER_SCALE: .5, DIRTY_SUBMIT_FRAME_BINDINGS: !1 }; function l(t) { this.config = o(o({}, a), t), this.polyfillDisplays = [], this.enabled = !1, this.hasNative = "getVRDisplays" in navigator, this.native = {}, this.native.getVRDisplays = navigator.getVRDisplays, this.native.VRFrameData = window.VRFrameData, this.native.VRDisplay = window.VRDisplay, (!this.hasNative || this.config.PROVIDE_MOBILE_VRDISPLAY && n()) && (this.enable(), this.getVRDisplays().then((function(t) { t && t[0] && t[0].fireVRDisplayConnect_ && t[0].fireVRDisplayConnect_() }))) } l.prototype.getPolyfillDisplays = function() { if (this._polyfillDisplaysPopulated) return this.polyfillDisplays; if (n()) { var t = new s({ ADDITIONAL_VIEWERS: this.config.ADDITIONAL_VIEWERS, DEFAULT_VIEWER: this.config.DEFAULT_VIEWER, MOBILE_WAKE_LOCK: this.config.MOBILE_WAKE_LOCK, DEBUG: this.config.DEBUG, DPDB_URL: this.config.DPDB_URL, CARDBOARD_UI_DISABLED: this.config.CARDBOARD_UI_DISABLED, K_FILTER: this.config.K_FILTER, PREDICTION_TIME_S: this.config.PREDICTION_TIME_S, ROTATE_INSTRUCTIONS_DISABLED: this.config.ROTATE_INSTRUCTIONS_DISABLED, YAW_ONLY: this.config.YAW_ONLY, BUFFER_SCALE: this.config.BUFFER_SCALE, DIRTY_SUBMIT_FRAME_BINDINGS: this.config.DIRTY_SUBMIT_FRAME_BINDINGS }); this.polyfillDisplays.push(t) } return this._polyfillDisplaysPopulated = !0, this.polyfillDisplays }, l.prototype.enable = function() { if (this.enabled = !0, this.hasNative && this.native.VRFrameData) { var t = this.native.VRFrameData, e = new this.native.VRFrameData, n = this.native.VRDisplay.prototype.getFrameData; window.VRDisplay.prototype.getFrameData = function(i) { i instanceof t ? n.call(this, i) : (n.call(this, e), i.pose = e.pose, r(e.leftProjectionMatrix, i.leftProjectionMatrix), r(e.rightProjectionMatrix, i.rightProjectionMatrix), r(e.leftViewMatrix, i.leftViewMatrix), r(e.rightViewMatrix, i.rightViewMatrix)) } } navigator.getVRDisplays = this.getVRDisplays.bind(this), window.VRDisplay = s.VRDisplay, window.VRFrameData = s.VRFrameData }, l.prototype.getVRDisplays = function() { var t = this; return this.config, this.hasNative ? this.native.getVRDisplays.call(navigator).then((function(e) { return e.length > 0 ? e : t.getPolyfillDisplays() })) : Promise.resolve(this.getPolyfillDisplays()) }, l.version = "0.10.12", l.VRFrameData = s.VRFrameData, l.VRDisplay = s.VRDisplay; var c = Object.freeze({ default: l }), h = c && l || c; return void 0 !== e && e.window && (e.document || (e.document = e.window.document), e.navigator || (e.navigator = e.window.navigator)), h }() }))); const h = 0, u = 1, d = 2; function p() {} Object.assign(p.prototype, { addEventListener: function(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: function(t, e) { if (void 0 === this._listeners) return !1; const n = this._listeners; return void 0 !== n[t] && -1 !== n[t].indexOf(e) }, removeEventListener: function(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: function(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) } } }); const f = []; for (let t = 0; t < 256; t++) f[t] = (t < 16 ? "0" : "") + t.toString(16); let m = 1234567; const g = { DEG2RAD: Math.PI / 180, RAD2DEG: 180 / Math.PI, generateUUID: function() { const t = 4294967295 * Math.random() | 0, e = 4294967295 * Math.random() | 0, n = 4294967295 * Math.random() | 0, i = 4294967295 * Math.random() | 0; return (f[255 & t] + f[t >> 8 & 255] + f[t >> 16 & 255] + f[t >> 24 & 255] + "-" + f[255 & e] + f[e >> 8 & 255] + "-" + f[e >> 16 & 15 | 64] + f[e >> 24 & 255] + "-" + f[63 & n | 128] + f[n >> 8 & 255] + "-" + f[n >> 16 & 255] + f[n >> 24 & 255] + f[255 & i] + f[i >> 8 & 255] + f[i >> 16 & 255] + f[i >> 24 & 255]).toUpperCase() }, clamp: function(t, e, n) { return Math.max(e, Math.min(n, t)) }, euclideanModulo: function(t, e) { return (t % e + e) % e }, mapLinear: function(t, e, n, i, r) { return i + (t - e) * (r - i) / (n - e) }, lerp: function(t, e, n) { return (1 - n) * t + n * e }, damp: function(t, e, n, i) { return g.lerp(t, e, 1 - Math.exp(-n * i)) }, pingpong: function(t, e = 1) { return e - Math.abs(g.euclideanModulo(t, 2 * e) - e) }, smoothstep: function(t, e, n) { return t <= e ? 0 : t >= n ? 1 : (t = (t - e) / (n - e)) * t * (3 - 2 * t) }, smootherstep: function(t, e, n) { return t <= e ? 0 : t >= n ? 1 : (t = (t - e) / (n - e)) * t * t * (t * (6 * t - 15) + 10) }, randInt: function(t, e) { return t + Math.floor(Math.random() * (e - t + 1)) }, randFloat: function(t, e) { return t + Math.random() * (e - t) }, randFloatSpread: function(t) { return t * (.5 - Math.random()) }, seededRandom: function(t) { return void 0 !== t && (m = t % 2147483647), m = 16807 * m % 2147483647, (m - 1) / 2147483646 }, degToRad: function(t) { return t * g.DEG2RAD }, radToDeg: function(t) { return t * g.RAD2DEG }, isPowerOfTwo: function(t) { return 0 == (t & t - 1) && 0 !== t }, ceilPowerOfTwo: function(t) { return Math.pow(2, Math.ceil(Math.log(t) / Math.LN2)) }, floorPowerOfTwo: function(t) { return Math.pow(2, Math.floor(Math.log(t) / Math.LN2)) }, setQuaternionFromProperEuler: function(t, e, n, i, r) { const o = Math.cos, s = Math.sin, a = o(n / 2), l = s(n / 2), c = o((e + i) / 2), h = s((e + i) / 2), u = o((e - i) / 2), d = s((e - i) / 2), p = o((i - e) / 2), f = s((i - e) / 2); switch (r) { case "XYX": t.set(a * h, l * u, l * d, a * c); break; case "YZY": t.set(l * d, a * h, l * u, a * c); break; case "ZXZ": t.set(l * u, l * d, a * h, a * c); break; case "XZX": t.set(a * h, l * f, l * p, a * c); break; case "YXY": t.set(l * p, a * h, l * f, a * c); break; case "ZYZ": t.set(l * f, l * p, a * h, a * c); break; default: console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: " + r) } } }; class v { constructor(t = 0, e = 0) { Object.defineProperty(this, "isVector2", { value: !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, o = this.y - t.y; return this.x = r * n - o * i + t.x, this.y = r * i + o * n + t.y, this } random() { return this.x = Math.random(), this.y = Math.random(), this } } class y { constructor() { Object.defineProperty(this, "isMatrix3", { value: !0 }), 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, o, s, a, l) { const c = this.elements; return c[0] = t, c[1] = i, c[2] = s, c[3] = e, c[4] = r, c[5] = a, c[6] = n, c[7] = o, c[8] = l, this } identity() { return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1), this } clone() { return (new this.constructor).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], 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, o = n[0], s = n[3], a = n[6], l = n[1], c = n[4], h = n[7], u = n[2], d = n[5], p = n[8], f = i[0], m = i[3], g = i[6], v = i[1], y = i[4], A = i[7], x = i[2], _ = i[5], b = i[8]; return r[0] = o * f + s * v + a * x, r[3] = o * m + s * y + a * _, r[6] = o * g + s * A + a * b, r[1] = l * f + c * v + h * x, r[4] = l * m + c * y + h * _, r[7] = l * g + c * A + h * b, r[2] = u * f + d * v + p * x, r[5] = u * m + d * y + p * _, r[8] = u * g + d * A + p * b, 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], o = t[4], s = t[5], a = t[6], l = t[7], c = t[8]; return e * o * c - e * s * l - n * r * c + n * s * a + i * r * l - i * o * a } invert() { const t = this.elements, e = t[0], n = t[1], i = t[2], r = t[3], o = t[4], s = t[5], a = t[6], l = t[7], c = t[8], h = c * o - s * l, u = s * a - c * r, d = l * r - o * a, p = e * h + 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] = h * f, t[1] = (i * l - c * n) * f, t[2] = (s * n - i * o) * f, t[3] = u * f, t[4] = (c * e - i * a) * f, t[5] = (i * r - s * e) * f, t[6] = d * f, t[7] = (n * a - l * e) * f, t[8] = (o * 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).copy(this).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, o, s) { const a = Math.cos(r), l = Math.sin(r); return this.set(n * a, n * l, -n * (a * o + l * s) + o + t, -i * l, i * a, -i * (-l * o + a * s) + s + 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], o = i[3], s = i[6], a = i[1], l = i[4], c = i[7]; return i[0] = e * r + n * a, i[3] = e * o + n * l, i[6] = e * s + n * c, i[1] = -n * r + e * a, i[4] = -n * o + e * l, i[7] = -n * s + e * c, 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 } } let A; const x = { getDataURL: function(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 === A && (A = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas")), A.width = t.width, A.height = t.height; const n = A.getContext("2d"); t instanceof ImageData ? n.putImageData(t, 0, 0) : n.drawImage(t, 0, 0, t.width, t.height), e = A } return e.width > 2048 || e.height > 2048 ? e.toDataURL("image/jpeg", .6) : e.toDataURL("image/png") } }; let _ = 0; function b(t = b.DEFAULT_IMAGE, e = b.DEFAULT_MAPPING, n = 1001, i = 1001, r = 1006, o = 1008, s = 1023, a = 1009, l = 1, c = 3e3) { Object.defineProperty(this, "id", { value: _++ }), this.uuid = g.generateUUID(), this.name = "", this.image = t, this.mipmaps = [], this.mapping = e, this.wrapS = n, this.wrapT = i, this.magFilter = r, this.minFilter = o, this.anisotropy = l, this.format = s, this.internalFormat = null, this.type = a, this.offset = new v(0, 0), this.repeat = new v(1, 1), this.center = new v(0, 0), this.rotation = 0, this.matrixAutoUpdate = !0, this.matrix = new y, this.generateMipmaps = !0, this.premultiplyAlpha = !1, this.flipY = !0, this.unpackAlignment = 4, this.encoding = c, this.version = 0, this.onUpdate = null } function w(t) { return "undefined" != typeof HTMLImageElement && t instanceof HTMLImageElement || "undefined" != typeof HTMLCanvasElement && t instanceof HTMLCanvasElement || "undefined" != typeof ImageBitmap && t instanceof ImageBitmap ? x.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."), {}) } b.DEFAULT_IMAGE = void 0, b.DEFAULT_MAPPING = 300, b.prototype = Object.assign(Object.create(p.prototype), { constructor: b, isTexture: !0, updateMatrix: function() { this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y) }, clone: function() { return (new this.constructor).copy(this) }, copy: function(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 }, toJSON: function(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 = g.generateUUID()), !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(w(i[t].image)) : e.push(w(i[t])) } else e = w(i); t.images[i.uuid] = { uuid: i.uuid, url: e } } n.image = i.uuid } return e || (t.textures[this.uuid] = n), n }, dispose: function() { this.dispatchEvent({ type: "dispose" }) }, transformUv: function(t) { if (300 !== this.mapping) return t; if (t.applyMatrix3(this.matrix), t.x < 0 || t.x > 1) switch (this.wrapS) { case 1e3: t.x = t.x - Math.floor(t.x); break; case 1001: t.x = t.x < 0 ? 0 : 1; break; case 1002: 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 1e3: t.y = t.y - Math.floor(t.y); break; case 1001: t.y = t.y < 0 ? 0 : 1; break; case 1002: 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 } }), Object.defineProperty(b.prototype, "needsUpdate", { set: function(t) { !0 === t && this.version++ } }); class M { constructor(t = 0, e = 0, n = 0, i = 1) { Object.defineProperty(this, "isVector4", { value: !0 }), 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, o = t.elements; return this.x = o[0] * e + o[4] * n + o[8] * i + o[12] * r, this.y = o[1] * e + o[5] * n + o[9] * i + o[13] * r, this.z = o[2] * e + o[6] * n + o[10] * i + o[14] * r, this.w = o[3] * e + o[7] * n + o[11] * i + o[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 o = t.elements, s = o[0], a = o[4], l = o[8], c = o[1], h = o[5], u = o[9], d = o[2], p = o[6], f = o[10]; if (Math.abs(a - c) < .01 && Math.abs(l - d) < .01 && Math.abs(u - p) < .01) { if (Math.abs(a + c) < .1 && Math.abs(l + d) < .1 && Math.abs(u + p) < .1 && Math.abs(s + h + f - 3) < .1) return this.set(1, 0, 0, 0), this; e = Math.PI; const t = (s + 1) / 2, o = (h + 1) / 2, m = (f + 1) / 2, g = (a + c) / 4, v = (l + d) / 4, y = (u + p) / 4; return t > o && t > m ? t < .01 ? (n = 0, i = .707106781, r = .707106781) : (n = Math.sqrt(t), i = g / n, r = v / n) : o > m ? o < .01 ? (n = .707106781, i = 0, r = .707106781) : (i = Math.sqrt(o), n = g / i, r = y / i) : m < .01 ? (n = .707106781, i = .707106781, r = 0) : (r = Math.sqrt(m), n = v / r, i = y / r), this.set(n, i, r, e), this } let m = Math.sqrt((p - u) * (p - u) + (l - d) * (l - d) + (c - a) * (c - a)); return Math.abs(m) < .001 && (m = 1), this.x = (p - u) / m, this.y = (l - d) / m, this.z = (c - a) / m, this.w = Math.acos((s + h + f - 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 } } class E extends p { constructor(t, e, n) { super(), Object.defineProperty(this, "isWebGLRenderTarget", { value: !0 }), this.width = t, this.height = e, this.scissor = new M(0, 0, t, e), this.scissorTest = !1, this.viewport = new M(0, 0, t, e), n = n || {}, this.texture = new b(void 0, n.mapping, n.wrapS, n.wrapT, n.magFilter, n.minFilter, n.format, n.type, n.anisotropy, n.encoding), this.texture.image = {}, this.texture.image.width = t, this.texture.image.height = e, this.texture.generateMipmaps = void 0 !== n.generateMipmaps && n.generateMipmaps, this.texture.minFilter = void 0 !== n.minFilter ? n.minFilter : 1006, 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 } setSize(t, e) { this.width === t && this.height === e || (this.width = t, this.height = e, this.texture.image.width = t, this.texture.image.height = e, 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.viewport.copy(t.viewport), this.texture = t.texture.clone(), this.depthBuffer = t.depthBuffer, this.stencilBuffer = t.stencilBuffer, this.depthTexture = t.depthTexture, this } dispose() { this.dispatchEvent({ type: "dispose" }) } } class S { constructor(t = 0, e = 0, n = 0, i = 1) { Object.defineProperty(this, "isQuaternion", { value: !0 }), this._x = t, this._y = e, this._z = n, this._w = i } static slerp(t, e, n, i) { return n.copy(t).slerp(e, i) } static slerpFlat(t, e, n, i, r, o, s) { let a = n[i + 0], l = n[i + 1], c = n[i + 2], h = n[i + 3]; const u = r[o + 0], d = r[o + 1], p = r[o + 2], f = r[o + 3]; if (h !== f || a !== u || l !== d || c !== p) { let t = 1 - s; const e = a * u + l * d + c * p + h * f, n = e >= 0 ? 1 : -1, i = 1 - e * e; if (i > Number.EPSILON) { const r = Math.sqrt(i), o = Math.atan2(r, e * n); t = Math.sin(t * o) / r, s = Math.sin(s * o) / r } const r = s * n; if (a = a * t + u * r, l = l * t + d * r, c = c * t + p * r, h = h * t + f * r, t === 1 - s) { const t = 1 / Math.sqrt(a * a + l * l + c * c + h * h); a *= t, l *= t, c *= t, h *= t } } t[e] = a, t[e + 1] = l, t[e + 2] = c, t[e + 3] = h } static multiplyQuaternionsFlat(t, e, n, i, r, o) { const s = n[i], a = n[i + 1], l = n[i + 2], c = n[i + 3], h = r[o], u = r[o + 1], d = r[o + 2], p = r[o + 3]; return t[e] = s * p + c * h + a * d - l * u, t[e + 1] = a * p + c * u + l * h - s * d, t[e + 2] = l * p + c * d + s * u - a * h, t[e + 3] = c * p - s * h - a * 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, o = t._order, s = Math.cos, a = Math.sin, l = s(n / 2), c = s(i / 2), h = s(r / 2), u = a(n / 2), d = a(i / 2), p = a(r / 2); switch (o) { case "XYZ": this._x = u * c * h + l * d * p, this._y = l * d * h - u * c * p, this._z = l * c * p + u * d * h, this._w = l * c * h - u * d * p; break; case "YXZ": this._x = u * c * h + l * d * p, this._y = l * d * h - u * c * p, this._z = l * c * p - u * d * h, this._w = l * c * h + u * d * p; break; case "ZXY": this._x = u * c * h - l * d * p, this._y = l * d * h + u * c * p, this._z = l * c * p + u * d * h, this._w = l * c * h - u * d * p; break; case "ZYX": this._x = u * c * h - l * d * p, this._y = l * d * h + u * c * p, this._z = l * c * p - u * d * h, this._w = l * c * h + u * d * p; break; case "YZX": this._x = u * c * h + l * d * p, this._y = l * d * h + u * c * p, this._z = l * c * p - u * d * h, this._w = l * c * h - u * d * p; break; case "XZY": this._x = u * c * h - l * d * p, this._y = l * d * h - u * c * p, this._z = l * c * p + u * d * h, this._w = l * c * h + u * d * p; break; default: console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: " + o) } 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], o = e[1], s = e[5], a = e[9], l = e[2], c = e[6], h = e[10], u = n + s + h; if (u > 0) { const t = .5 / Math.sqrt(u + 1); this._w = .25 / t, this._x = (c - a) * t, this._y = (r - l) * t, this._z = (o - i) * t } else if (n > s && n > h) { const t = 2 * Math.sqrt(1 + n - s - h); this._w = (c - a) / t, this._x = .25 * t, this._y = (i + o) / t, this._z = (r + l) / t } else if (s > h) { const t = 2 * Math.sqrt(1 + s - n - h); this._w = (r - l) / t, this._x = (i + o) / t, this._y = .25 * t, this._z = (a + c) / t } else { const t = 2 * Math.sqrt(1 + h - n - s); this._w = (o - i) / t, this._x = (r + l) / t, this._y = (a + c) / t, this._z = .25 * t } return this._onChangeCallback(), this } setFromUnitVectors(t, e) { let n = t.dot(e) + 1; return n < 1e-6 ? (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(g.clamp(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, o = t._w, s = e._x, a = e._y, l = e._z, c = e._w; return this._x = n * c + o * s + i * l - r * a, this._y = i * c + o * a + r * s - n * l, this._z = r * c + o * l + n * a - i * s, this._w = o * c - n * s - i * a - 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, o = this._w; let s = o * t._w + n * t._x + i * t._y + r * t._z; if (s < 0 ? (this._w = -t._w, this._x = -t._x, this._y = -t._y, this._z = -t._z, s = -s) : this.copy(t), s >= 1) return this._w = o, this._x = n, this._y = i, this._z = r, this; const a = 1 - s * s; if (a <= Number.EPSILON) { const t = 1 - e; return this._w = t * o + 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(a), c = Math.atan2(l, s), h = Math.sin((1 - e) * c) / l, u = Math.sin(e * c) / l; return this._w = o * h + this._w * u, this._x = n * h + this._x * u, this._y = i * h + this._y * u, this._z = r * h + this._z * u, this._onChangeCallback(), 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._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() {} } class T { constructor(t = 0, e = 0, n = 0) { Object.defineProperty(this, "isVector3", { value: !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(R.setFromEuler(t)) } applyAxisAngle(t, e) { return this.applyQuaternion(R.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, o = 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]) * o, this.y = (r[1] * e + r[5] * n + r[9] * i + r[13]) * o, this.z = (r[2] * e + r[6] * n + r[10] * i + r[14]) * o, this } applyQuaternion(t) { const e = this.x, n = this.y, i = this.z, r = t.x, o = t.y, s = t.z, a = t.w, l = a * e + o * i - s * n, c = a * n + s * e - r * i, h = a * i + r * n - o * e, u = -r * e - o * n - s * i; return this.x = l * a + u * -r + c * -s - h * -o, this.y = c * a + u * -o + h * -r - l * -s, this.z = h * a + u * -s + l * -o - c * -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, o = e.x, s = e.y, a = e.z; return this.x = i * a - r * s, this.y = r * o - n * a, this.z = n * s - i * o, 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 L.copy(this).projectOnVector(t), this.sub(L) } reflect(t) { return this.sub(L.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(g.clamp(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 } } const L = new T, R = new S; class C { constructor(t, e) { Object.defineProperty(this, "isBox3", { value: !0 }), this.min = void 0 !== t ? t : new T(1 / 0, 1 / 0, 1 / 0), this.max = void 0 !== e ? e : new T(-1 / 0, -1 / 0, -1 / 0) } 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, o = -1 / 0, s = -1 / 0; for (let a = 0, l = t.length; a < l; a += 3) { const l = t[a], c = t[a + 1], h = t[a + 2]; l < e && (e = l), c < n && (n = c), h < i && (i = h), l > r && (r = l), c > o && (o = c), h > s && (s = h) } return this.min.set(e, n, i), this.max.set(r, o, s), this } setFromBufferAttribute(t) { let e = 1 / 0, n = 1 / 0, i = 1 / 0, r = -1 / 0, o = -1 / 0, s = -1 / 0; for (let a = 0, l = t.count; a < l; a++) { const l = t.getX(a), c = t.getY(a), h = t.getZ(a); l < e && (e = l), c < n && (n = c), h < i && (i = h), l > r && (r = l), c > o && (o = c), h > s && (s = h) } return this.min.set(e, n, i), this.max.set(r, o, s), 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 = I.copy(e).multiplyScalar(.5); return this.min.copy(t).sub(n), this.max.copy(t).add(n), this } setFromObject(t) { return this.makeEmpty(), this.expandByObject(t) } 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 void 0 === t && (console.warn("THREE.Box3: .getCenter() target is now required"), t = new T), this.isEmpty() ? t.set(0, 0, 0) : t.addVectors(this.min, this.max).multiplyScalar(.5) } getSize(t) { return void 0 === t && (console.warn("THREE.Box3: .getSize() target is now required"), t = new T), 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) { t.updateWorldMatrix(!1, !1); const e = t.geometry; void 0 !== e && (null === e.boundingBox && e.computeBoundingBox(), O.copy(e.boundingBox), O.applyMatrix4(t.matrixWorld), this.union(O)); const n = t.children; for (let t = 0, e = n.length; t < e; t++) this.expandByObject(n[t]); 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 void 0 === e && (console.warn("THREE.Box3: .getParameter() target is now required"), e = new T), 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, I), I.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(G), V.subVectors(this.max, G), N.subVectors(t.a, G), B.subVectors(t.b, G), F.subVectors(t.c, G), z.subVectors(B, N), U.subVectors(F, B), H.subVectors(N, F); let e = [0, -z.z, z.y, 0, -U.z, U.y, 0, -H.z, H.y, z.z, 0, -z.x, U.z, 0, -U.x, H.z, 0, -H.x, -z.y, z.x, 0, -U.y, U.x, 0, -H.y, H.x, 0]; return !!P(e, N, B, F, V) && (e = [1, 0, 0, 0, 1, 0, 0, 0, 1], !!P(e, N, B, F, V) && (k.crossVectors(z, U), e = [k.x, k.y, k.z], P(e, N, B, F, V))) } clampPoint(t, e) { return void 0 === e && (console.warn("THREE.Box3: .clampPoint() target is now required"), e = new T), e.copy(t).clamp(this.min, this.max) } distanceToPoint(t) { return I.copy(t).clamp(this.min, this.max).sub(t).length() } getBoundingSphere(t) { return void 0 === t && console.error("THREE.Box3: .getBoundingSphere() target is now required"), this.getCenter(t.center), t.radius = .5 * this.getSize(I).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() || (D[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(t), D[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(t), D[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(t), D[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(t), D[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(t), D[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(t), D[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(t), D[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(t), this.setFromPoints(D)), 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) } } function P(t, e, n, i, r) { for (let o = 0, s = t.length - 3; o <= s; o += 3) { W.fromArray(t, o); const s = r.x * Math.abs(W.x) + r.y * Math.abs(W.y) + r.z * Math.abs(W.z), a = e.dot(W), l = n.dot(W), c = i.dot(W); if (Math.max(-Math.max(a, l, c), Math.min(a, l, c)) > s) return !1 } return !0 } const D = [new T, new T, new T, new T, new T, new T, new T, new T], I = new T, O = new C, N = new T, B = new T, F = new T, z = new T, U = new T, H = new T, G = new T, V = new T, k = new T, W = new T, j = new C; class X { constructor(t, e) { this.center = void 0 !== t ? t : new T, this.radius = void 0 !== e ? e : -1 } 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) : j.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 } clone() { return (new this.constructor).copy(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 void 0 === e && (console.warn("THREE.Sphere: .clampPoint() target is now required"), e = new T), e.copy(t), n > this.radius * this.radius && (e.sub(this.center).normalize(), e.multiplyScalar(this.radius).add(this.center)), e } getBoundingBox(t) { return void 0 === t && (console.warn("THREE.Sphere: .getBoundingBox() target is now required"), t = new C), 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 } equals(t) { return t.center.equals(this.center) && t.radius === this.radius } } const q = new T, Y = new T, Q = new T, Z = new T, J = new T, K = new T, $ = new T; class tt { constructor(t, e) { this.origin = void 0 !== t ? t : new T, this.direction = void 0 !== e ? e : new T(0, 0, -1) } set(t, e) { return this.origin.copy(t), this.direction.copy(e), this } clone() { return (new this.constructor).copy(this) } copy(t) { return this.origin.copy(t.origin), this.direction.copy(t.direction), this } at(t, e) { return void 0 === e && (console.warn("THREE.Ray: .at() target is now required"), e = new T), 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, q)), this } closestPointToPoint(t, e) { void 0 === e && (console.warn("THREE.Ray: .closestPointToPoint() target is now required"), e = new T), 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 = q.subVectors(t, this.origin).dot(this.direction); return e < 0 ? this.origin.distanceToSquared(t) : (q.copy(this.direction).multiplyScalar(e).add(this.origin), q.distanceToSquared(t)) } distanceSqToSegment(t, e, n, i) { Y.copy(t).add(e).multiplyScalar(.5), Q.copy(e).sub(t).normalize(), Z.copy(this.origin).sub(Y); const r = .5 * t.distanceTo(e), o = -this.direction.dot(Q), s = Z.dot(this.direction), a = -Z.dot(Q), l = Z.lengthSq(), c = Math.abs(1 - o * o); let h, u, d, p; if (c > 0) if (h = o * a - s, u = o * s - a, p = r * c, h >= 0) if (u >= -p) if (u <= p) { const t = 1 / c; h *= t, u *= t, d = h * (h + o * u + 2 * s) + u * (o * h + u + 2 * a) + l } else u = r, h = Math.max(0, -(o * u + s)), d = -h * h + u * (u + 2 * a) + l; else u = -r, h = Math.max(0, -(o * u + s)), d = -h * h + u * (u + 2 * a) + l; else u <= -p ? (h = Math.max(0, -(-o * r + s)), u = h > 0 ? -r : Math.min(Math.max(-r, -a), r), d = -h * h + u * (u + 2 * a) + l) : u <= p ? (h = 0, u = Math.min(Math.max(-r, -a), r), d = u * (u + 2 * a) + l) : (h = Math.max(0, -(o * r + s)), u = h > 0 ? r : Math.min(Math.max(-r, -a), r), d = -h * h + u * (u + 2 * a) + l); else u = o > 0 ? -r : r, h = Math.max(0, -(o * u + s)), d = -h * h + u * (u + 2 * a) + l; return n && n.copy(this.direction).multiplyScalar(h).add(this.origin), i && i.copy(Q).multiplyScalar(u).add(Y), d } intersectSphere(t, e) { q.subVectors(t.center, this.origin); const n = q.dot(this.direction), i = q.dot(q) - n * n, r = t.radius * t.radius; if (i > r) return null; const o = Math.sqrt(r - i), s = n - o, a = n + o; return s < 0 && a < 0 ? null : s < 0 ? this.at(a, e) : this.at(s, 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, o, s, a; const l = 1 / this.direction.x, c = 1 / this.direction.y, h = 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), c >= 0 ? (r = (t.min.y - u.y) * c, o = (t.max.y - u.y) * c) : (r = (t.max.y - u.y) * c, o = (t.min.y - u.y) * c), n > o || r > i ? null : ((r > n || n != n) && (n = r), (o < i || i != i) && (i = o), h >= 0 ? (s = (t.min.z - u.z) * h, a = (t.max.z - u.z) * h) : (s = (t.max.z - u.z) * h, a = (t.min.z - u.z) * h), n > a || s > i ? null : ((s > n || n != n) && (n = s), (a < i || i != i) && (i = a), i < 0 ? null : this.at(n >= 0 ? n : i, e))) } intersectsBox(t) { return null !== this.intersectBox(t, q) } intersectTriangle(t, e, n, i, r) { J.subVectors(e, t), K.subVectors(n, t), $.crossVectors(J, K); let o, s = this.direction.dot($); if (s > 0) { if (i) return null; o = 1 } else { if (!(s < 0)) return null; o = -1, s = -s } Z.subVectors(this.origin, t); const a = o * this.direction.dot(K.crossVectors(Z, K)); if (a < 0) return null; const l = o * this.direction.dot(J.cross(Z)); if (l < 0) return null; if (a + l > s) return null; const c = -o * Z.dot($); return c < 0 ? null : this.at(c / s, 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) } } class et { constructor() { Object.defineProperty(this, "isMatrix4", { value: !0 }), 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, o, s, a, l, c, h, 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] = o, g[9] = s, g[13] = a, g[2] = l, g[6] = c, g[10] = h, 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 et).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 / nt.setFromMatrixColumn(t, 0).length(), r = 1 / nt.setFromMatrixColumn(t, 1).length(), o = 1 / nt.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] * o, e[9] = n[9] * o, e[10] = n[10] * o, 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, o = Math.cos(n), s = Math.sin(n), a = Math.cos(i), l = Math.sin(i), c = Math.cos(r), h = Math.sin(r); if ("XYZ" === t.order) { const t = o * c, n = o * h, i = s * c, r = s * h; e[0] = a * c, e[4] = -a * h, e[8] = l, e[1] = n + i * l, e[5] = t - r * l, e[9] = -s * a, e[2] = r - t * l, e[6] = i + n * l, e[10] = o * a } else if ("YXZ" === t.order) { const t = a * c, n = a * h, i = l * c, r = l * h; e[0] = t + r * s, e[4] = i * s - n, e[8] = o * l, e[1] = o * h, e[5] = o * c, e[9] = -s, e[2] = n * s - i, e[6] = r + t * s, e[10] = o * a } else if ("ZXY" === t.order) { const t = a * c, n = a * h, i = l * c, r = l * h; e[0] = t - r * s, e[4] = -o * h, e[8] = i + n * s, e[1] = n + i * s, e[5] = o * c, e[9] = r - t * s, e[2] = -o * l, e[6] = s, e[10] = o * a } else if ("ZYX" === t.order) { const t = o * c, n = o * h, i = s * c, r = s * h; e[0] = a * c, e[4] = i * l - n, e[8] = t * l + r, e[1] = a * h, e[5] = r * l + t, e[9] = n * l - i, e[2] = -l, e[6] = s * a, e[10] = o * a } else if ("YZX" === t.order) { const t = o * a, n = o * l, i = s * a, r = s * l; e[0] = a * c, e[4] = r - t * h, e[8] = i * h + n, e[1] = h, e[5] = o * c, e[9] = -s * c, e[2] = -l * c, e[6] = n * h + i, e[10] = t - r * h } else if ("XZY" === t.order) { const t = o * a, n = o * l, i = s * a, r = s * l; e[0] = a * c, e[4] = -h, e[8] = l * c, e[1] = t * h + r, e[5] = o * c, e[9] = n * h - i, e[2] = i * h - n, e[6] = s * c, e[10] = r * h + 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(rt, t, ot) } lookAt(t, e, n) { const i = this.elements; return lt.subVectors(t, e), 0 === lt.lengthSq() && (lt.z = 1), lt.normalize(), st.crossVectors(n, lt), 0 === st.lengthSq() && (1 === Math.abs(n.z) ? lt.x += 1e-4 : lt.z += 1e-4, lt.normalize(), st.crossVectors(n, lt)), st.normalize(), at.crossVectors(lt, st), i[0] = st.x, i[4] = at.x, i[8] = lt.x, i[1] = st.y, i[5] = at.y, i[9] = lt.y, i[2] = st.z, i[6] = at.z, i[10] = lt.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, o = n[0], s = n[4], a = n[8], l = n[12], c = n[1], h = n[5], u = n[9], d = n[13], p = n[2], f = n[6], m = n[10], g = n[14], v = n[3], y = n[7], A = n[11], x = n[15], _ = i[0], b = i[4], w = i[8], M = i[12], E = i[1], S = i[5], T = i[9], L = i[13], R = i[2], C = i[6], P = i[10], D = i[14], I = i[3], O = i[7], N = i[11], B = i[15]; return r[0] = o * _ + s * E + a * R + l * I, r[4] = o * b + s * S + a * C + l * O, r[8] = o * w + s * T + a * P + l * N, r[12] = o * M + s * L + a * D + l * B, r[1] = c * _ + h * E + u * R + d * I, r[5] = c * b + h * S + u * C + d * O, r[9] = c * w + h * T + u * P + d * N, r[13] = c * M + h * L + u * D + d * B, r[2] = p * _ + f * E + m * R + g * I, r[6] = p * b + f * S + m * C + g * O, r[10] = p * w + f * T + m * P + g * N, r[14] = p * M + f * L + m * D + g * B, r[3] = v * _ + y * E + A * R + x * I, r[7] = v * b + y * S + A * C + x * O, r[11] = v * w + y * T + A * P + x * N, r[15] = v * M + y * L + A * D + x * B, 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], o = t[1], s = t[5], a = t[9], l = t[13], c = t[2], h = t[6], u = t[10], d = t[14]; return t[3] * (+r * a * h - i * l * h - r * s * u + n * l * u + i * s * d - n * a * d) + t[7] * (+e * a * d - e * l * u + r * o * u - i * o * d + i * l * c - r * a * c) + t[11] * (+e * l * h - e * s * d - r * o * h + n * o * d + r * s * c - n * l * c) + t[15] * (-i * s * c - e * a * h + e * s * u + i * o * h - n * o * u + n * a * c) } 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], o = t[4], s = t[5], a = t[6], l = t[7], c = t[8], h = t[9], u = t[10], d = t[11], p = t[12], f = t[13], m = t[14], g = t[15], v = h * m * l - f * u * l + f * a * d - s * m * d - h * a * g + s * u * g, y = p * u * l - c * m * l - p * a * d + o * m * d + c * a * g - o * u * g, A = c * f * l - p * h * l + p * s * d - o * f * d - c * s * g + o * h * g, x = p * h * a - c * f * a - p * s * u + o * f * u + c * s * m - o * h * m, _ = e * v + n * y + i * A + r * x; if (0 === _) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const b = 1 / _; return t[0] = v * b, t[1] = (f * u * r - h * m * r - f * i * d + n * m * d + h * i * g - n * u * g) * b, t[2] = (s * m * r - f * a * r + f * i * l - n * m * l - s * i * g + n * a * g) * b, t[3] = (h * a * r - s * u * r - h * i * l + n * u * l + s * i * d - n * a * d) * b, t[4] = y * b, t[5] = (c * m * r - p * u * r + p * i * d - e * m * d - c * i * g + e * u * g) * b, t[6] = (p * a * r - o * m * r - p * i * l + e * m * l + o * i * g - e * a * g) * b, t[7] = (o * u * r - c * a * r + c * i * l - e * u * l - o * i * d + e * a * d) * b, t[8] = A * b, t[9] = (p * h * r - c * f * r - p * n * d + e * f * d + c * n * g - e * h * g) * b, t[10] = (o * f * r - p * s * r + p * n * l - e * f * l - o * n * g + e * s * g) * b, t[11] = (c * s * r - o * h * r - c * n * l + e * h * l + o * n * d - e * s * d) * b, t[12] = x * b, t[13] = (c * f * i - p * h * i + p * n * u - e * f * u - c * n * m + e * h * m) * b, t[14] = (p * s * i - o * f * i - p * n * a + e * f * a + o * n * m - e * s * m) * b, t[15] = (o * h * i - c * s * i + c * n * a - e * h * a - o * n * u + e * s * u) * b, 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, o = t.x, s = t.y, a = t.z, l = r * o, c = r * s; return this.set(l * o + n, l * s - i * a, l * a + i * s, 0, l * s + i * a, c * s + n, c * a - i * o, 0, l * a - i * s, c * a + i * o, r * a * a + 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) { return this.set(1, e, n, 0, t, 1, n, 0, t, e, 1, 0, 0, 0, 0, 1), this } compose(t, e, n) { const i = this.elements, r = e._x, o = e._y, s = e._z, a = e._w, l = r + r, c = o + o, h = s + s, u = r * l, d = r * c, p = r * h, f = o * c, m = o * h, g = s * h, v = a * l, y = a * c, A = a * h, x = n.x, _ = n.y, b = n.z; return i[0] = (1 - (f + g)) * x, i[1] = (d + A) * x, i[2] = (p - y) * x, i[3] = 0, i[4] = (d - A) * _, i[5] = (1 - (u + g)) * _, i[6] = (m + v) * _, i[7] = 0, i[8] = (p + y) * b, i[9] = (m - v) * b, i[10] = (1 - (u + f)) * b, 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 = nt.set(i[0], i[1], i[2]).length(); const o = nt.set(i[4], i[5], i[6]).length(), s = nt.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], it.copy(this); const a = 1 / r, l = 1 / o, c = 1 / s; return it.elements[0] *= a, it.elements[1] *= a, it.elements[2] *= a, it.elements[4] *= l, it.elements[5] *= l, it.elements[6] *= l, it.elements[8] *= c, it.elements[9] *= c, it.elements[10] *= c, e.setFromRotationMatrix(it), n.x = r, n.y = o, n.z = s, this } makePerspective(t, e, n, i, r, o) { void 0 === o && console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs."); const s = this.elements, a = 2 * r / (e - t), l = 2 * r / (n - i), c = (e + t) / (e - t), h = (n + i) / (n - i), u = -(o + r) / (o - r), d = -2 * o * r / (o - r); return s[0] = a, s[4] = 0, s[8] = c, s[12] = 0, s[1] = 0, s[5] = l, s[9] = h, s[13] = 0, s[2] = 0, s[6] = 0, s[10] = u, s[14] = d, s[3] = 0, s[7] = 0, s[11] = -1, s[15] = 0, this } makeOrthographic(t, e, n, i, r, o) { const s = this.elements, a = 1 / (e - t), l = 1 / (n - i), c = 1 / (o - r), h = (e + t) * a, u = (n + i) * l, d = (o + r) * c; return s[0] = 2 * a, s[4] = 0, s[8] = 0, s[12] = -h, s[1] = 0, s[5] = 2 * l, s[9] = 0, s[13] = -u, s[2] = 0, s[6] = 0, s[10] = -2 * c, s[14] = -d, s[3] = 0, s[7] = 0, s[11] = 0, s[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 } } const nt = new T, it = new et, rt = new T(0, 0, 0), ot = new T(1, 1, 1), st = new T, at = new T, lt = new T; class ct { constructor(t = 0, e = 0, n = 0, i = ct.DefaultOrder) { Object.defineProperty(this, "isEuler", { value: !0 }), 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) { return this._x = t, this._y = e, this._z = n, this._order = i || this._order, 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, n) { const i = g.clamp, r = t.elements, o = r[0], s = r[4], a = r[8], l = r[1], c = r[5], h = r[9], u = r[2], d = r[6], p = r[10]; switch (e = e || this._order) { case "XYZ": this._y = Math.asin(i(a, -1, 1)), Math.abs(a) < .9999999 ? (this._x = Math.atan2(-h, p), this._z = Math.atan2(-s, o)) : (this._x = Math.atan2(d, c), this._z = 0); break; case "YXZ": this._x = Math.asin(-i(h, -1, 1)), Math.abs(h) < .9999999 ? (this._y = Math.atan2(a, p), this._z = Math.atan2(l, c)) : (this._y = Math.atan2(-u, o), this._z = 0); break; case "ZXY": this._x = Math.asin(i(d, -1, 1)), Math.abs(d) < .9999999 ? (this._y = Math.atan2(-u, p), this._z = Math.atan2(-s, c)) : (this._y = 0, this._z = Math.atan2(l, o)); break; case "ZYX": this._y = Math.asin(-i(u, -1, 1)), Math.abs(u) < .9999999 ? (this._x = Math.atan2(d, p), this._z = Math.atan2(l, o)) : (this._x = 0, this._z = Math.atan2(-s, c)); break; case "YZX": this._z = Math.asin(i(l, -1, 1)), Math.abs(l) < .9999999 ? (this._x = Math.atan2(-h, c), this._y = Math.atan2(-u, o)) : (this._x = 0, this._y = Math.atan2(a, p)); break; case "XZY": this._z = Math.asin(-i(s, -1, 1)), Math.abs(s) < .9999999 ? (this._x = Math.atan2(d, c), this._y = Math.atan2(a, o)) : (this._x = Math.atan2(-h, p), this._y = 0); break; default: console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: " + e) } return this._order = e, !1 !== n && this._onChangeCallback(), this } setFromQuaternion(t, e, n) { return ht.makeRotationFromQuaternion(t), this.setFromRotationMatrix(ht, e, n) } setFromVector3(t, e) { return this.set(t.x, t.y, t.z, e || this._order) } reorder(t) { return ut.setFromEuler(this), this.setFromQuaternion(ut, 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 T(this._x, this._y, this._z) } _onChange(t) { return this._onChangeCallback = t, this } _onChangeCallback() {} } ct.DefaultOrder = "XYZ", ct.RotationOrders = ["XYZ", "YZX", "ZXY", "XZY", "YXZ", "ZYX"]; const ht = new et, ut = new S; class dt { constructor() { this.mask = 1 } set(t) { this.mask = 1 << t | 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) } } let pt = 0; const ft = new T, mt = new S, gt = new et, vt = new T, yt = new T, At = new T, xt = new S, _t = new T(1, 0, 0), bt = new T(0, 1, 0), wt = new T(0, 0, 1), Mt = { type: "added" }, Et = { type: "removed" }; function St() { Object.defineProperty(this, "id", { value: pt++ }), this.uuid = g.generateUUID(), this.name = "", this.type = "Object3D", this.parent = null, this.children = [], this.up = St.DefaultUp.clone(); const t = new T, e = new ct, n = new S, i = new T(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 et }, normalMatrix: { value: new y } }), this.matrix = new et, this.matrixWorld = new et, this.matrixAutoUpdate = St.DefaultMatrixAutoUpdate, this.matrixWorldNeedsUpdate = !1, this.layers = new dt, this.visible = !0, this.castShadow = !1, this.receiveShadow = !1, this.frustumCulled = !0, this.renderOrder = 0, this.animations = [], this.userData = {} } St.DefaultUp = new T(0, 1, 0), St.DefaultMatrixAutoUpdate = !0, St.prototype = Object.assign(Object.create(p.prototype), { constructor: St, isObject3D: !0, onBeforeRender: function() {}, onAfterRender: function() {}, applyMatrix4: function(t) { this.matrixAutoUpdate && this.updateMatrix(), this.matrix.premultiply(t), this.matrix.decompose(this.position, this.quaternion, this.scale) }, applyQuaternion: function(t) { return this.quaternion.premultiply(t), this }, setRotationFromAxisAngle: function(t, e) { this.quaternion.setFromAxisAngle(t, e) }, setRotationFromEuler: function(t) { this.quaternion.setFromEuler(t, !0) }, setRotationFromMatrix: function(t) { this.quaternion.setFromRotationMatrix(t) }, setRotationFromQuaternion: function(t) { this.quaternion.copy(t) }, rotateOnAxis: function(t, e) { return mt.setFromAxisAngle(t, e), this.quaternion.multiply(mt), this }, rotateOnWorldAxis: function(t, e) { return mt.setFromAxisAngle(t, e), this.quaternion.premultiply(mt), this }, rotateX: function(t) { return this.rotateOnAxis(_t, t) }, rotateY: function(t) { return this.rotateOnAxis(bt, t) }, rotateZ: function(t) { return this.rotateOnAxis(wt, t) }, translateOnAxis: function(t, e) { return ft.copy(t).applyQuaternion(this.quaternion), this.position.add(ft.multiplyScalar(e)), this }, translateX: function(t) { return this.translateOnAxis(_t, t) }, translateY: function(t) { return this.translateOnAxis(bt, t) }, translateZ: function(t) { return this.translateOnAxis(wt, t) }, localToWorld: function(t) { return t.applyMatrix4(this.matrixWorld) }, worldToLocal: function(t) { return t.applyMatrix4(gt.copy(this.matrixWorld).invert()) }, lookAt: function(t, e, n) { t.isVector3 ? vt.copy(t) : vt.set(t, e, n); const i = this.parent; this.updateWorldMatrix(!0, !1), yt.setFromMatrixPosition(this.matrixWorld), this.isCamera || this.isLight ? gt.lookAt(yt, vt, this.up) : gt.lookAt(vt, yt, this.up), this.quaternion.setFromRotationMatrix(gt), i && (gt.extractRotation(i.matrixWorld), mt.setFromRotationMatrix(gt), this.quaternion.premultiply(mt.invert())) }, add: function(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(Mt)) : console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", t), this) }, remove: function(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(Et)), this }, clear: function() { for (let t = 0; t < this.children.length; t++) { const e = this.children[t]; e.parent = null, e.dispatchEvent(Et) } return this.children.length = 0, this }, attach: function(t) { return this.updateWorldMatrix(!0, !1), gt.copy(this.matrixWorld).invert(), null !== t.parent && (t.parent.updateWorldMatrix(!0, !1), gt.multiply(t.parent.matrixWorld)), t.applyMatrix4(gt), t.updateWorldMatrix(!1, !1), this.add(t), this }, getObjectById: function(t) { return this.getObjectByProperty("id", t) }, getObjectByName: function(t) { return this.getObjectByProperty("name", t) }, getObjectByProperty: function(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: function(t) { return void 0 === t && (console.warn("THREE.Object3D: .getWorldPosition() target is now required"), t = new T), this.updateWorldMatrix(!0, !1), t.setFromMatrixPosition(this.matrixWorld) }, getWorldQuaternion: function(t) { return void 0 === t && (console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"), t = new S), this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(yt, t, At), t }, getWorldScale: function(t) { return void 0 === t && (console.warn("THREE.Object3D: .getWorldScale() target is now required"), t = new T), this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(yt, xt, t), t }, getWorldDirection: function(t) { void 0 === t && (console.warn("THREE.Object3D: .getWorldDirection() target is now required"), t = new T), this.updateWorldMatrix(!0, !1); const e = this.matrixWorld.elements; return t.set(e[8], e[9], e[10]).normalize() }, raycast: function() {}, traverse: function(t) { t(this); const e = this.children; for (let n = 0, i = e.length; n < i; n++) e[n].traverse(t) }, traverseVisible: function(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: function(t) { const e = this.parent; null !== e && (t(e), e.traverseAncestors(t)) }, updateMatrix: function() { this.matrix.compose(this.position, this.quaternion, this.scale), this.matrixWorldNeedsUpdate = !0 }, updateMatrixWorld: function(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: function(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: function(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()), 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 = o(t.geometries), i = o(t.materials), r = o(t.textures), s = o(t.images), a = o(t.shapes), l = o(t.skeletons), c = o(t.animations); e.length > 0 && (n.geometries = e), i.length > 0 && (n.materials = i), r.length > 0 && (n.textures = r), s.length > 0 && (n.images = s), a.length > 0 && (n.shapes = a), l.length > 0 && (n.skeletons = l), c.length > 0 && (n.animations = c) } return n.object = i, n; function o(t) { const e = []; for (const n in t) { const i = t[n]; delete i.metadata, e.push(i) } return e } }, clone: function(t) { return (new this.constructor).copy(this, t) }, copy: function(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 } }); const Tt = new T, Lt = new T, Rt = new y; class Ct { constructor(t, e) { Object.defineProperty(this, "isPlane", { value: !0 }), this.normal = void 0 !== t ? t : new T(1, 0, 0), this.constant = void 0 !== e ? e : 0 } 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 = Tt.subVectors(n, e).cross(Lt.subVectors(t, e)).normalize(); return this.setFromNormalAndCoplanarPoint(i, t), this } clone() { return (new this.constructor).copy(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 void 0 === e && (console.warn("THREE.Plane: .projectPoint() target is now required"), e = new T), e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t) } intersectLine(t, e) { void 0 === e && (console.warn("THREE.Plane: .intersectLine() target is now required"), e = new T); const n = t.delta(Tt), i = this.normal.dot(n); if (0 === i) return 0 === this.distanceToPoint(t.start) ? e.copy(t.start) : void 0; const r = -(t.start.dot(this.normal) + this.constant) / i; return r < 0 || r > 1 ? void 0 : 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 void 0 === t && (console.warn("THREE.Plane: .coplanarPoint() target is now required"), t = new T), t.copy(this.normal).multiplyScalar(-this.constant) } applyMatrix4(t, e) { const n = e || Rt.getNormalMatrix(t), i = this.coplanarPoint(Tt).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 } } const Pt = new T, Dt = new T, It = new T, Ot = new T, Nt = new T, Bt = new T, Ft = new T, zt = new T, Ut = new T, Ht = new T; class Gt { constructor(t, e, n) { this.a = void 0 !== t ? t : new T, this.b = void 0 !== e ? e : new T, this.c = void 0 !== n ? n : new T } static getNormal(t, e, n, i) { void 0 === i && (console.warn("THREE.Triangle: .getNormal() target is now required"), i = new T), i.subVectors(n, e), Pt.subVectors(t, e), i.cross(Pt); 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) { Pt.subVectors(i, e), Dt.subVectors(n, e), It.subVectors(t, e); const o = Pt.dot(Pt), s = Pt.dot(Dt), a = Pt.dot(It), l = Dt.dot(Dt), c = Dt.dot(It), h = o * l - s * s; if (void 0 === r && (console.warn("THREE.Triangle: .getBarycoord() target is now required"), r = new T), 0 === h) return r.set(-2, -1, -1); const u = 1 / h, d = (l * a - s * c) * u, p = (o * c - s * a) * u; return r.set(1 - d - p, p, d) } static containsPoint(t, e, n, i) { return this.getBarycoord(t, e, n, i, Ot), Ot.x >= 0 && Ot.y >= 0 && Ot.x + Ot.y <= 1 } static getUV(t, e, n, i, r, o, s, a) { return this.getBarycoord(t, e, n, i, Ot), a.set(0, 0), a.addScaledVector(r, Ot.x), a.addScaledVector(o, Ot.y), a.addScaledVector(s, Ot.z), a } static isFrontFacing(t, e, n, i) { return Pt.subVectors(n, e), Dt.subVectors(t, e), Pt.cross(Dt).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 } 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 Pt.subVectors(this.c, this.b), Dt.subVectors(this.a, this.b), .5 * Pt.cross(Dt).length() } getMidpoint(t) { return void 0 === t && (console.warn("THREE.Triangle: .getMidpoint() target is now required"), t = new T), t.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3) } getNormal(t) { return Gt.getNormal(this.a, this.b, this.c, t) } getPlane(t) { return void 0 === t && (console.warn("THREE.Triangle: .getPlane() target is now required"), t = new Ct), t.setFromCoplanarPoints(this.a, this.b, this.c) } getBarycoord(t, e) { return Gt.getBarycoord(t, this.a, this.b, this.c, e) } getUV(t, e, n, i, r) { return Gt.getUV(t, this.a, this.b, this.c, e, n, i, r) } containsPoint(t) { return Gt.containsPoint(t, this.a, this.b, this.c) } isFrontFacing(t) { return Gt.isFrontFacing(this.a, this.b, this.c, t) } intersectsBox(t) { return t.intersectsTriangle(this) } closestPointToPoint(t, e) { void 0 === e && (console.warn("THREE.Triangle: .closestPointToPoint() target is now required"), e = new T); const n = this.a, i = this.b, r = this.c; let o, s; Nt.subVectors(i, n), Bt.subVectors(r, n), zt.subVectors(t, n); const a = Nt.dot(zt), l = Bt.dot(zt); if (a <= 0 && l <= 0) return e.copy(n); Ut.subVectors(t, i); const c = Nt.dot(Ut), h = Bt.dot(Ut); if (c >= 0 && h <= c) return e.copy(i); const u = a * h - c * l; if (u <= 0 && a >= 0 && c <= 0) return o = a / (a - c), e.copy(n).addScaledVector(Nt, o); Ht.subVectors(t, r); const d = Nt.dot(Ht), p = Bt.dot(Ht); if (p >= 0 && d <= p) return e.copy(r); const f = d * l - a * p; if (f <= 0 && l >= 0 && p <= 0) return s = l / (l - p), e.copy(n).addScaledVector(Bt, s); const m = c * p - d * h; if (m <= 0 && h - c >= 0 && d - p >= 0) return Ft.subVectors(r, i), s = (h - c) / (h - c + (d - p)), e.copy(i).addScaledVector(Ft, s); const g = 1 / (m + f + u); return o = f * g, s = u * g, e.copy(n).addScaledVector(Nt, o).addScaledVector(Bt, s) } equals(t) { return t.a.equals(this.a) && t.b.equals(this.b) && t.c.equals(this.c) } } const Vt = { 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 }, kt = { h: 0, s: 0, l: 0 }, Wt = { h: 0, s: 0, l: 0 }; function jt(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 Xt(t) { return t < .04045 ? .0773993808 * t : Math.pow(.9478672986 * t + .0521327014, 2.4) } function qt(t) { return t < .0031308 ? 12.92 * t : 1.055 * Math.pow(t, .41666) - .055 } class Yt { constructor(t, e, n) { return Object.defineProperty(this, "isColor", { value: !0 }), 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 = g.euclideanModulo(t, 1), e = g.clamp(e, 0, 1), n = g.clamp(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 = jt(r, i, t + 1 / 3), this.g = jt(r, i, t), this.b = jt(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 = Vt[t]; 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 } copyGammaToLinear(t, e = 2) { return this.r = Math.pow(t.r, e), this.g = Math.pow(t.g, e), this.b = Math.pow(t.b, e), this } copyLinearToGamma(t, e = 2) { const n = e > 0 ? 1 / e : 1; return this.r = Math.pow(t.r, n), this.g = Math.pow(t.g, n), this.b = Math.pow(t.b, n), this } convertGammaToLinear(t) { return this.copyGammaToLinear(this, t), this } convertLinearToGamma(t) { return this.copyLinearToGamma(this, t), this } copySRGBToLinear(t) { return this.r = Xt(t.r), this.g = Xt(t.g), this.b = Xt(t.b), this } copyLinearToSRGB(t) { return this.r = qt(t.r), this.g = qt(t.g), this.b = qt(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) { void 0 === t && (console.warn("THREE.Color: .getHSL() target is now required"), t = { h: 0, s: 0, l: 0 }); const e = this.r, n = this.g, i = this.b, r = Math.max(e, n, i), o = Math.min(e, n, i); let s, a; const l = (o + r) / 2; if (o === r) s = 0, a = 0; else { const t = r - o; switch (a = l <= .5 ? t / (r + o) : t / (2 - r - o), r) { case e: s = (n - i) / t + (n < i ? 6 : 0); break; case n: s = (i - e) / t + 2; break; case i: s = (e - n) / t + 4 } s /= 6 } return t.h = s, t.s = a, 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(kt), kt.h += t, kt.s += e, kt.l += n, this.setHSL(kt.h, kt.s, kt.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(kt), t.getHSL(Wt); const n = g.lerp(kt.h, Wt.h, e), i = g.lerp(kt.s, Wt.s, e), r = g.lerp(kt.l, Wt.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() } } Yt.NAMES = Vt, Yt.prototype.r = 1, Yt.prototype.g = 1, Yt.prototype.b = 1; class Qt { constructor(t, e, n, i, r, o = 0) { this.a = t, this.b = e, this.c = n, this.normal = i && i.isVector3 ? i : new T, this.vertexNormals = Array.isArray(i) ? i : [], this.color = r && r.isColor ? r : new Yt, this.vertexColors = Array.isArray(r) ? r : [], this.materialIndex = o } clone() { return (new this.constructor).copy(this) } copy(t) { this.a = t.a, this.b = t.b, this.c = t.c, this.normal.copy(t.normal), this.color.copy(t.color), this.materialIndex = t.materialIndex; for (let e = 0, n = t.vertexNormals.length; e < n; e++) this.vertexNormals[e] = t.vertexNormals[e].clone(); for (let e = 0, n = t.vertexColors.length; e < n; e++) this.vertexColors[e] = t.vertexColors[e].clone(); return this } } let Zt = 0; function Jt() { Object.defineProperty(this, "id", { value: Zt++ }), this.uuid = g.generateUUID(), this.name = "", this.type = "Material", this.fog = !0, this.blending = 1, this.side = 0, this.flatShading = !1, this.vertexColors = !1, this.opacity = 1, this.transparent = !1, this.blendSrc = 204, this.blendDst = 205, this.blendEquation = 100, 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 = 7680, this.stencilZFail = 7680, this.stencilZPass = 7680, 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.alphaTest = 0, this.premultipliedAlpha = !1, this.visible = !0, this.toneMapped = !0, this.userData = {}, this.version = 0 } function Kt(t) { Jt.call(this), this.type = "MeshBasicMaterial", this.color = new Yt(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.skinning = !1, this.morphTargets = !1, this.setValues(t) } Jt.prototype = Object.assign(Object.create(p.prototype), { constructor: Jt, isMaterial: !0, onBeforeCompile: function() {}, customProgramCacheKey: function() { return this.onBeforeCompile.toString() }, setValues: function(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: function(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), this.sheen && this.sheen.isColor && (n.sheen = this.sheen.getHex()), 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.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), 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.envMap && this.envMap.isTexture && (n.envMap = this.envMap.toJSON(t).uuid, n.reflectivity = this.reflectivity, n.refractionRatio = this.refractionRatio, void 0 !== this.combine && (n.combine = this.combine), void 0 !== this.envMapIntensity && (n.envMapIntensity = this.envMapIntensity)), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(t).uuid), void 0 !== this.size && (n.size = this.size), void 0 !== this.sizeAttenuation && (n.sizeAttenuation = this.sizeAttenuation), 1 !== this.blending && (n.blending = this.blending), !0 === this.flatShading && (n.flatShading = this.flatShading), 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.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.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.morphTargets && (n.morphTargets = !0), !0 === this.morphNormals && (n.morphNormals = !0), !0 === this.skinning && (n.skinning = !0), !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: function() { return (new this.constructor).copy(this) }, copy: function(t) { this.name = t.name, this.fog = t.fog, this.blending = t.blending, this.side = t.side, this.flatShading = t.flatShading, 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.premultipliedAlpha = t.premultipliedAlpha, this.visible = t.visible, this.toneMapped = t.toneMapped, this.userData = JSON.parse(JSON.stringify(t.userData)), this }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }), Object.defineProperty(Jt.prototype, "needsUpdate", { set: function(t) { !0 === t && this.version++ } }), Kt.prototype = Object.create(Jt.prototype), Kt.prototype.constructor = Kt, Kt.prototype.isMeshBasicMaterial = !0, Kt.prototype.copy = function(t) { return Jt.prototype.copy.call(this, 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.skinning = t.skinning, this.morphTargets = t.morphTargets, this }; const $t = new T, te = new v; function ee(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 } function ne(t, e, n) { ee.call(this, new Int8Array(t), e, n) } function ie(t, e, n) { ee.call(this, new Uint8Array(t), e, n) } function re(t, e, n) { ee.call(this, new Uint8ClampedArray(t), e, n) } function oe(t, e, n) { ee.call(this, new Int16Array(t), e, n) } function se(t, e, n) { ee.call(this, new Uint16Array(t), e, n) } function ae(t, e, n) { ee.call(this, new Int32Array(t), e, n) } function le(t, e, n) { ee.call(this, new Uint32Array(t), e, n) } function ce(t, e, n) { ee.call(this, new Uint16Array(t), e, n) } function he(t, e, n) { ee.call(this, new Float32Array(t), e, n) } function ue(t, e, n) { ee.call(this, new Float64Array(t), e, n) } function de(t) { if (0 === t.length) return -1 / 0; let e = t[0]; for (let n = 1, i = t.length; n < i; ++n) t[n] > e && (e = t[n]); return e } Object.defineProperty(ee.prototype, "needsUpdate", { set: function(t) { !0 === t && this.version++ } }), Object.assign(ee.prototype, { isBufferAttribute: !0, onUploadCallback: function() {}, setUsage: function(t) { return this.usage = t, this }, copy: function(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: function(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: function(t) { return this.array.set(t), this }, copyColorsArray: function(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 Yt), e[n++] = r.r, e[n++] = r.g, e[n++] = r.b } return this }, copyVector2sArray: function(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 v), e[n++] = r.x, e[n++] = r.y } return this }, copyVector3sArray: function(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 T), e[n++] = r.x, e[n++] = r.y, e[n++] = r.z } return this }, copyVector4sArray: function(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 M), e[n++] = r.x, e[n++] = r.y, e[n++] = r.z, e[n++] = r.w } return this }, applyMatrix3: function(t) { if (2 === this.itemSize) for (let e = 0, n = this.count; e < n; e++) te.fromBufferAttribute(this, e), te.applyMatrix3(t), this.setXY(e, te.x, te.y); else if (3 === this.itemSize) for (let e = 0, n = this.count; e < n; e++) $t.fromBufferAttribute(this, e), $t.applyMatrix3(t), this.setXYZ(e, $t.x, $t.y, $t.z); return this }, applyMatrix4: function(t) { for (let e = 0, n = this.count; e < n; e++) $t.x = this.getX(e), $t.y = this.getY(e), $t.z = this.getZ(e), $t.applyMatrix4(t), this.setXYZ(e, $t.x, $t.y, $t.z); return this }, applyNormalMatrix: function(t) { for (let e = 0, n = this.count; e < n; e++) $t.x = this.getX(e), $t.y = this.getY(e), $t.z = this.getZ(e), $t.applyNormalMatrix(t), this.setXYZ(e, $t.x, $t.y, $t.z); return this }, transformDirection: function(t) { for (let e = 0, n = this.count; e < n; e++) $t.x = this.getX(e), $t.y = this.getY(e), $t.z = this.getZ(e), $t.transformDirection(t), this.setXYZ(e, $t.x, $t.y, $t.z); return this }, set: function(t, e = 0) { return this.array.set(t, e), this }, getX: function(t) { return this.array[t * this.itemSize] }, setX: function(t, e) { return this.array[t * this.itemSize] = e, this }, getY: function(t) { return this.array[t * this.itemSize + 1] }, setY: function(t, e) { return this.array[t * this.itemSize + 1] = e, this }, getZ: function(t) { return this.array[t * this.itemSize + 2] }, setZ: function(t, e) { return this.array[t * this.itemSize + 2] = e, this }, getW: function(t) { return this.array[t * this.itemSize + 3] }, setW: function(t, e) { return this.array[t * this.itemSize + 3] = e, this }, setXY: function(t, e, n) { return t *= this.itemSize, this.array[t + 0] = e, this.array[t + 1] = n, this }, setXYZ: function(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: function(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: function(t) { return this.onUploadCallback = t, this }, clone: function() { return new this.constructor(this.array, this.itemSize).copy(this) }, toJSON: function() { return { itemSize: this.itemSize, type: this.array.constructor.name, array: Array.prototype.slice.call(this.array), normalized: this.normalized } } }), ne.prototype = Object.create(ee.prototype), ne.prototype.constructor = ne, ie.prototype = Object.create(ee.prototype), ie.prototype.constructor = ie, re.prototype = Object.create(ee.prototype), re.prototype.constructor = re, oe.prototype = Object.create(ee.prototype), oe.prototype.constructor = oe, se.prototype = Object.create(ee.prototype), se.prototype.constructor = se, ae.prototype = Object.create(ee.prototype), ae.prototype.constructor = ae, le.prototype = Object.create(ee.prototype), le.prototype.constructor = le, ce.prototype = Object.create(ee.prototype), ce.prototype.constructor = ce, ce.prototype.isFloat16BufferAttribute = !0, he.prototype = Object.create(ee.prototype), he.prototype.constructor = he, ue.prototype = Object.create(ee.prototype), ue.prototype.constructor = ue; const pe = { Int8Array: Int8Array, Uint8Array: Uint8Array, Uint8ClampedArray: "undefined" != typeof Uint8ClampedArray ? Uint8ClampedArray : Uint8Array, Int16Array: Int16Array, Uint16Array: Uint16Array, Int32Array: Int32Array, Uint32Array: Uint32Array, Float32Array: Float32Array, Float64Array: Float64Array }; function fe(t, e) { return new pe[t](e) } let me = 0; const ge = new et, ve = new St, ye = new T, Ae = new C, xe = new C, _e = new T; function be() { Object.defineProperty(this, "id", { value: me++ }), this.uuid = g.generateUUID(), 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 = {} } be.prototype = Object.assign(Object.create(p.prototype), { constructor: be, isBufferGeometry: !0, getIndex: function() { return this.index }, setIndex: function(t) { return Array.isArray(t) ? this.index = new(de(t) > 65535 ? le : se)(t, 1) : this.index = t, this }, getAttribute: function(t) { return this.attributes[t] }, setAttribute: function(t, e) { return this.attributes[t] = e, this }, deleteAttribute: function(t) { return delete this.attributes[t], this }, hasAttribute: function(t) { return void 0 !== this.attributes[t] }, addGroup: function(t, e, n = 0) { this.groups.push({ start: t, count: e, materialIndex: n }) }, clearGroups: function() { this.groups = [] }, setDrawRange: function(t, e) { this.drawRange.start = t, this.drawRange.count = e }, applyMatrix4: function(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 y).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 }, rotateX: function(t) { return ge.makeRotationX(t), this.applyMatrix4(ge), this }, rotateY: function(t) { return ge.makeRotationY(t), this.applyMatrix4(ge), this }, rotateZ: function(t) { return ge.makeRotationZ(t), this.applyMatrix4(ge), this }, translate: function(t, e, n) { return ge.makeTranslation(t, e, n), this.applyMatrix4(ge), this }, scale: function(t, e, n) { return ge.makeScale(t, e, n), this.applyMatrix4(ge), this }, lookAt: function(t) { return ve.lookAt(t), ve.updateMatrix(), this.applyMatrix4(ve.matrix), this }, center: function() { return this.computeBoundingBox(), this.boundingBox.getCenter(ye).negate(), this.translate(ye.x, ye.y, ye.z), this }, setFromPoints: function(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 he(e, 3)), this }, computeBoundingBox: function() { null === this.boundingBox && (this.boundingBox = new C); 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 T(-1 / 0, -1 / 0, -1 / 0), new T(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]; Ae.setFromBufferAttribute(n), this.morphTargetsRelative ? (_e.addVectors(this.boundingBox.min, Ae.min), this.boundingBox.expandByPoint(_e), _e.addVectors(this.boundingBox.max, Ae.max), this.boundingBox.expandByPoint(_e)) : (this.boundingBox.expandByPoint(Ae.min), this.boundingBox.expandByPoint(Ae.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: function() { null === this.boundingSphere && (this.boundingSphere = new X); 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 T, 1 / 0); if (t) { const n = this.boundingSphere.center; if (Ae.setFromBufferAttribute(t), e) for (let t = 0, n = e.length; t < n; t++) { const n = e[t]; xe.setFromBufferAttribute(n), this.morphTargetsRelative ? (_e.addVectors(Ae.min, xe.min), Ae.expandByPoint(_e), _e.addVectors(Ae.max, xe.max), Ae.expandByPoint(_e)) : (Ae.expandByPoint(xe.min), Ae.expandByPoint(xe.max)) } Ae.getCenter(n); let i = 0; for (let e = 0, r = t.count; e < r; e++) _e.fromBufferAttribute(t, e), i = Math.max(i, n.distanceToSquared(_e)); if (e) for (let r = 0, o = e.length; r < o; r++) { const o = e[r], s = this.morphTargetsRelative; for (let e = 0, r = o.count; e < r; e++) _e.fromBufferAttribute(o, e), s && (ye.fromBufferAttribute(t, e), _e.add(ye)), i = Math.max(i, n.distanceToSquared(_e)) } 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) } }, computeFaceNormals: function() {}, computeTangents: function() { 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, o = e.uv.array, s = i.length / 3; void 0 === e.tangent && this.setAttribute("tangent", new ee(new Float32Array(4 * s), 4)); const a = e.tangent.array, l = [], c = []; for (let t = 0; t < s; t++) l[t] = new T, c[t] = new T; const h = new T, u = new T, d = new T, p = new v, f = new v, m = new v, g = new T, y = new T; function A(t, e, n) { h.fromArray(i, 3 * t), u.fromArray(i, 3 * e), d.fromArray(i, 3 * n), p.fromArray(o, 2 * t), f.fromArray(o, 2 * e), m.fromArray(o, 2 * n), u.sub(h), d.sub(h), 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), y.copy(d).multiplyScalar(f.x).addScaledVector(u, -m.x).multiplyScalar(r), l[t].add(g), l[e].add(g), l[n].add(g), c[t].add(y), c[e].add(y), c[n].add(y)) } let x = this.groups; 0 === x.length && (x = [{ start: 0, count: n.length }]); for (let t = 0, e = x.length; t < e; ++t) { const e = x[t], i = e.start; for (let t = i, r = i + e.count; t < r; t += 3) A(n[t + 0], n[t + 1], n[t + 2]) } const _ = new T, b = new T, w = new T, M = new T; function E(t) { w.fromArray(r, 3 * t), M.copy(w); const e = l[t]; _.copy(e), _.sub(w.multiplyScalar(w.dot(e))).normalize(), b.crossVectors(M, e); const n = b.dot(c[t]) < 0 ? -1 : 1; a[4 * t] = _.x, a[4 * t + 1] = _.y, a[4 * t + 2] = _.z, a[4 * t + 3] = n } for (let t = 0, e = x.length; t < e; ++t) { const e = x[t], i = e.start; for (let t = i, r = i + e.count; t < r; t += 3) E(n[t + 0]), E(n[t + 1]), E(n[t + 2]) } }, computeVertexNormals: function() { const t = this.index, e = this.getAttribute("position"); if (void 0 !== e) { let n = this.getAttribute("normal"); if (void 0 === n) n = new ee(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 T, r = new T, o = new T, s = new T, a = new T, l = new T, c = new T, h = new T; 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), o.fromBufferAttribute(e, f), c.subVectors(o, r), h.subVectors(i, r), c.cross(h), s.fromBufferAttribute(n, d), a.fromBufferAttribute(n, p), l.fromBufferAttribute(n, f), s.add(c), a.add(c), l.add(c), n.setXYZ(d, s.x, s.y, s.z), n.setXYZ(p, a.x, a.y, a.z), n.setXYZ(f, l.x, l.y, l.z) } else for (let t = 0, s = e.count; t < s; t += 3) i.fromBufferAttribute(e, t + 0), r.fromBufferAttribute(e, t + 1), o.fromBufferAttribute(e, t + 2), c.subVectors(o, r), h.subVectors(i, r), c.cross(h), n.setXYZ(t + 0, c.x, c.y, c.z), n.setXYZ(t + 1, c.x, c.y, c.z), n.setXYZ(t + 2, c.x, c.y, c.z); this.normalizeNormals(), n.needsUpdate = !0 } }, merge: function(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, o = t.attributes[i], s = o.array, a = o.itemSize * e, l = Math.min(s.length, r.length - a); for (let t = 0, e = a; t < l; t++, e++) r[e] = s[t] } return this }, normalizeNormals: function() { const t = this.attributes.normal; for (let e = 0, n = t.count; e < n; e++) _e.fromBufferAttribute(t, e), _e.normalize(), t.setXYZ(e, _e.x, _e.y, _e.z) }, toNonIndexed: function() { function t(t, e) { const n = t.array, i = t.itemSize, r = t.normalized, o = new n.constructor(e.length * i); let s = 0, a = 0; for (let t = 0, r = e.length; t < r; t++) { s = e[t] * i; for (let t = 0; t < i; t++) o[a++] = n[s++] } return new ee(o, i, r) } if (null === this.index) return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."), this; const e = new be, n = this.index.array, i = this.attributes; for (const r in i) { const o = t(i[r], n); e.setAttribute(r, o) } const r = this.morphAttributes; for (const i in r) { const o = [], s = r[i]; for (let e = 0, i = s.length; e < i; e++) { const i = t(s[e], n); o.push(i) } e.morphAttributes[i] = o } e.morphTargetsRelative = this.morphTargetsRelative; const o = this.groups; for (let t = 0, n = o.length; t < n; t++) { const n = o[t]; e.addGroup(n.start, n.count, n.materialIndex) } return e }, toJSON: function() { 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], r = i.toJSON(t.data); "" !== i.name && (r.name = i.name), t.data.attributes[e] = r } const i = {}; let r = !1; for (const e in this.morphAttributes) { const n = this.morphAttributes[e], o = []; for (let e = 0, i = n.length; e < i; e++) { const i = n[e], r = i.toJSON(t.data); "" !== i.name && (r.name = i.name), o.push(r) } o.length > 0 && (i[e] = o, r = !0) } r && (t.data.morphAttributes = i, t.data.morphTargetsRelative = this.morphTargetsRelative); const o = this.groups; o.length > 0 && (t.data.groups = JSON.parse(JSON.stringify(o))); const s = this.boundingSphere; return null !== s && (t.data.boundingSphere = { center: s.center.toArray(), radius: s.radius }), t }, clone: function() { return (new be).copy(this) }, copy: function(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 o = t.groups; for (let t = 0, e = o.length; t < e; t++) { const e = o[t]; this.addGroup(e.start, e.count, e.materialIndex) } const s = t.boundingBox; null !== s && (this.boundingBox = s.clone()); const a = t.boundingSphere; return null !== a && (this.boundingSphere = a.clone()), this.drawRange.start = t.drawRange.start, this.drawRange.count = t.drawRange.count, this.userData = t.userData, this }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }); const we = new et, Me = new tt, Ee = new X, Se = new T, Te = new T, Le = new T, Re = new T, Ce = new T, Pe = new T, De = new T, Ie = new T, Oe = new T, Ne = new v, Be = new v, Fe = new v, ze = new T, Ue = new T; function He(t = new be, e = new Kt) { St.call(this), this.type = "Mesh", this.geometry = t, this.material = e, this.updateMorphTargets() } function Ge(t, e, n, i, r, o, s, a, l, c, h, u) { Se.fromBufferAttribute(r, c), Te.fromBufferAttribute(r, h), Le.fromBufferAttribute(r, u); const d = t.morphTargetInfluences; if (e.morphTargets && o && d) { De.set(0, 0, 0), Ie.set(0, 0, 0), Oe.set(0, 0, 0); for (let t = 0, e = o.length; t < e; t++) { const e = d[t], n = o[t]; 0 !== e && (Re.fromBufferAttribute(n, c), Ce.fromBufferAttribute(n, h), Pe.fromBufferAttribute(n, u), s ? (De.addScaledVector(Re, e), Ie.addScaledVector(Ce, e), Oe.addScaledVector(Pe, e)) : (De.addScaledVector(Re.sub(Se), e), Ie.addScaledVector(Ce.sub(Te), e), Oe.addScaledVector(Pe.sub(Le), e))) } Se.add(De), Te.add(Ie), Le.add(Oe) } t.isSkinnedMesh && (t.boneTransform(c, Se), t.boneTransform(h, Te), t.boneTransform(u, Le)); const p = function(t, e, n, i, r, o, s, a) { let l; if (l = 1 === e.side ? i.intersectTriangle(s, o, r, !0, a) : i.intersectTriangle(r, o, s, 2 !== e.side, a), null === l) return null; Ue.copy(a), Ue.applyMatrix4(t.matrixWorld); const c = n.ray.origin.distanceTo(Ue); return c < n.near || c > n.far ? null : { distance: c, point: Ue.clone(), object: t } }(t, e, n, i, Se, Te, Le, ze); if (p) { a && (Ne.fromBufferAttribute(a, c), Be.fromBufferAttribute(a, h), Fe.fromBufferAttribute(a, u), p.uv = Gt.getUV(ze, Se, Te, Le, Ne, Be, Fe, new v)), l && (Ne.fromBufferAttribute(l, c), Be.fromBufferAttribute(l, h), Fe.fromBufferAttribute(l, u), p.uv2 = Gt.getUV(ze, Se, Te, Le, Ne, Be, Fe, new v)); const t = new Qt(c, h, u); Gt.getNormal(Se, Te, Le, t.normal), p.face = t } return p } He.prototype = Object.assign(Object.create(St.prototype), { constructor: He, isMesh: !0, copy: function(t) { return St.prototype.copy.call(this, 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: function() { 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: function(t, e) { const n = this.geometry, i = this.material, r = this.matrixWorld; if (void 0 === i) return; if (null === n.boundingSphere && n.computeBoundingSphere(), Ee.copy(n.boundingSphere), Ee.applyMatrix4(r), !1 === t.ray.intersectsSphere(Ee)) return; if (we.copy(r).invert(), Me.copy(t.ray).applyMatrix4(we), null !== n.boundingBox && !1 === Me.intersectsBox(n.boundingBox)) return; let o; if (n.isBufferGeometry) { const r = n.index, s = n.attributes.position, a = n.morphAttributes.position, l = n.morphTargetsRelative, c = n.attributes.uv, h = 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(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); o = Ge(this, f, t, Me, s, a, l, c, h, i, u, d), o && (o.faceIndex = Math.floor(n / 3), o.face.materialIndex = p.materialIndex, e.push(o)) } } 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); o = Ge(this, i, t, Me, s, a, l, c, h, u, d, p), o && (o.faceIndex = Math.floor(n / 3), e.push(o)) } } else if (void 0 !== s) 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(r.start + r.count, d.start + d.count); n < i; n += 3) { o = Ge(this, p, t, Me, s, a, l, c, h, n, n + 1, n + 2), o && (o.faceIndex = Math.floor(n / 3), o.face.materialIndex = r.materialIndex, e.push(o)) } } else { for (let n = Math.max(0, d.start), r = Math.min(s.count, d.start + d.count); n < r; n += 3) { o = Ge(this, i, t, Me, s, a, l, c, h, n, n + 1, n + 2), o && (o.faceIndex = Math.floor(n / 3), e.push(o)) } } } else n.isGeometry && console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.") } }); class Ve extends be { constructor(t = 1, e = 1, n = 1, i = 1, r = 1, o = 1) { super(), this.type = "BoxGeometry", this.parameters = { width: t, height: e, depth: n, widthSegments: i, heightSegments: r, depthSegments: o }; const s = this; i = Math.floor(i), r = Math.floor(r), o = Math.floor(o); const a = [], l = [], c = [], h = []; let u = 0, d = 0; function p(t, e, n, i, r, o, p, f, m, g, v) { const y = o / m, A = p / g, x = o / 2, _ = p / 2, b = f / 2, w = m + 1, M = g + 1; let E = 0, S = 0; const L = new T; for (let o = 0; o < M; o++) { const s = o * A - _; for (let a = 0; a < w; a++) { const u = a * y - x; L[t] = u * i, L[e] = s * r, L[n] = b, l.push(L.x, L.y, L.z), L[t] = 0, L[e] = 0, L[n] = f > 0 ? 1 : -1, c.push(L.x, L.y, L.z), h.push(a / m), h.push(1 - o / g), E += 1 } } for (let t = 0; t < g; t++) for (let e = 0; e < m; e++) { const n = u + e + w * t, i = u + e + w * (t + 1), r = u + (e + 1) + w * (t + 1), o = u + (e + 1) + w * t; a.push(n, i, o), a.push(i, r, o), S += 6 } s.addGroup(d, S, v), d += S, u += E } p("z", "y", "x", -1, -1, n, e, t, o, r, 0), p("z", "y", "x", 1, -1, n, e, -t, o, r, 1), p("x", "z", "y", 1, 1, t, n, e, i, o, 2), p("x", "z", "y", 1, -1, t, n, -e, i, o, 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(a), this.setAttribute("position", new he(l, 3)), this.setAttribute("normal", new he(c, 3)), this.setAttribute("uv", new he(h, 2)) } } function ke(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) ? e[n][i] = r.clone() : Array.isArray(r) ? e[n][i] = r.slice() : e[n][i] = r } } return e } function We(t) { const e = {}; for (let n = 0; n < t.length; n++) { const i = ke(t[n]); for (const t in i) e[t] = i[t] } return e } const je = { clone: ke, merge: We }; function Xe(t) { Jt.call(this), this.type = "ShaderMaterial", this.defines = {}, this.uniforms = {}, this.vertexShader = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}", this.fragmentShader = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}", this.linewidth = 1, this.wireframe = !1, this.wireframeLinewidth = 1, this.fog = !1, this.lights = !1, this.clipping = !1, this.skinning = !1, this.morphTargets = !1, this.morphNormals = !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)) } function qe() { St.call(this), this.type = "Camera", this.matrixWorldInverse = new et, this.projectionMatrix = new et, this.projectionMatrixInverse = new et } function Ye(t = 50, e = 1, n = .1, i = 2e3) { qe.call(this), 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() } Xe.prototype = Object.create(Jt.prototype), Xe.prototype.constructor = Xe, Xe.prototype.isShaderMaterial = !0, Xe.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.fragmentShader = t.fragmentShader, this.vertexShader = t.vertexShader, this.uniforms = ke(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.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this.extensions = Object.assign({}, t.extensions), this.glslVersion = t.glslVersion, this }, Xe.prototype.toJSON = function(t) { const e = Jt.prototype.toJSON.call(this, 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 = Object.assign(Object.create(St.prototype), { constructor: qe, isCamera: !0, copy: function(t, e) { return St.prototype.copy.call(this, t, e), this.matrixWorldInverse.copy(t.matrixWorldInverse), this.projectionMatrix.copy(t.projectionMatrix), this.projectionMatrixInverse.copy(t.projectionMatrixInverse), this }, getWorldDirection: function(t) { void 0 === t && (console.warn("THREE.Camera: .getWorldDirection() target is now required"), t = new T), this.updateWorldMatrix(!0, !1); const e = this.matrixWorld.elements; return t.set(-e[8], -e[9], -e[10]).normalize() }, updateMatrixWorld: function(t) { St.prototype.updateMatrixWorld.call(this, t), this.matrixWorldInverse.copy(this.matrixWorld).invert() }, updateWorldMatrix: function(t, e) { St.prototype.updateWorldMatrix.call(this, t, e), this.matrixWorldInverse.copy(this.matrixWorld).invert() }, clone: function() { return (new this.constructor).copy(this) } }), Ye.prototype = Object.assign(Object.create(qe.prototype), { constructor: Ye, isPerspectiveCamera: !0, copy: function(t, e) { return qe.prototype.copy.call(this, 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: function(t) { const e = .5 * this.getFilmHeight() / t; this.fov = 2 * g.RAD2DEG * Math.atan(e), this.updateProjectionMatrix() }, getFocalLength: function() { const t = Math.tan(.5 * g.DEG2RAD * this.fov); return .5 * this.getFilmHeight() / t }, getEffectiveFOV: function() { return 2 * g.RAD2DEG * Math.atan(Math.tan(.5 * g.DEG2RAD * this.fov) / this.zoom) }, getFilmWidth: function() { return this.filmGauge * Math.min(this.aspect, 1) }, getFilmHeight: function() { return this.filmGauge / Math.max(this.aspect, 1) }, setViewOffset: function(t, e, n, i, r, o) { 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 = o, this.updateProjectionMatrix() }, clearViewOffset: function() { null !== this.view && (this.view.enabled = !1), this.updateProjectionMatrix() }, updateProjectionMatrix: function() { const t = this.near; let e = t * Math.tan(.5 * g.DEG2RAD * this.fov) / this.zoom, n = 2 * e, i = this.aspect * n, r = -.5 * i; const o = this.view; if (null !== this.view && this.view.enabled) { const t = o.fullWidth, s = o.fullHeight; r += o.offsetX * i / t, e -= o.offsetY * n / s, i *= o.width / t, n *= o.height / s } const s = this.filmOffset; 0 !== s && (r += t * s / this.getFilmWidth()), this.projectionMatrix.makePerspective(r, r + i, e, e - n, t, this.far), this.projectionMatrixInverse.copy(this.projectionMatrix).invert() }, toJSON: function(t) { const e = St.prototype.toJSON.call(this, 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 } }); function Qe(t, e, n) { if (St.call(this), 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 Ye(90, 1, t, e); i.layers = this.layers, i.up.set(0, -1, 0), i.lookAt(new T(1, 0, 0)), this.add(i); const r = new Ye(90, 1, t, e); r.layers = this.layers, r.up.set(0, -1, 0), r.lookAt(new T(-1, 0, 0)), this.add(r); const o = new Ye(90, 1, t, e); o.layers = this.layers, o.up.set(0, 0, 1), o.lookAt(new T(0, 1, 0)), this.add(o); const s = new Ye(90, 1, t, e); s.layers = this.layers, s.up.set(0, 0, -1), s.lookAt(new T(0, -1, 0)), this.add(s); const a = new Ye(90, 1, t, e); a.layers = this.layers, a.up.set(0, -1, 0), a.lookAt(new T(0, 0, 1)), this.add(a); const l = new Ye(90, 1, t, e); l.layers = this.layers, l.up.set(0, -1, 0), l.lookAt(new T(0, 0, -1)), this.add(l), this.update = function(t, e) { null === this.parent && this.updateMatrixWorld(); const c = t.xr.enabled, h = 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, o), t.setRenderTarget(n, 3), t.render(e, s), t.setRenderTarget(n, 4), t.render(e, a), n.texture.generateMipmaps = u, t.setRenderTarget(n, 5), t.render(e, l), t.setRenderTarget(h), t.xr.enabled = c } } function Ze(t, e, n, i, r, o, s, a, l, c) { t = void 0 !== t ? t : [], e = void 0 !== e ? e : 301, s = void 0 !== s ? s : 1022, b.call(this, t, e, n, i, r, o, s, a, l, c), this.flipY = !1, this._needsFlipEnvMap = !0 } Qe.prototype = Object.create(St.prototype), Qe.prototype.constructor = Qe, Ze.prototype = Object.create(b.prototype), Ze.prototype.constructor = Ze, Ze.prototype.isCubeTexture = !0, Object.defineProperty(Ze.prototype, "images", { get: function() { return this.image }, set: function(t) { this.image = t } }); class Je extends E { constructor(t, e, n) { Number.isInteger(e) && (console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"), e = n), super(t, t, e), Object.defineProperty(this, "isWebGLCubeRenderTarget", { value: !0 }), e = e || {}, this.texture = new Ze(void 0, e.mapping, e.wrapS, e.wrapT, e.magFilter, e.minFilter, e.format, e.type, e.anisotropy, e.encoding), this.texture._needsFlipEnvMap = !1 } fromEquirectangularTexture(t, e) { this.texture.type = e.type, this.texture.format = 1023, 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 \n\t\t\t\t\t#include \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 \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 Ve(5, 5, 5), r = new Xe({ name: "CubemapFromEquirect", uniforms: ke(n.uniforms), vertexShader: n.vertexShader, fragmentShader: n.fragmentShader, side: 1, blending: 0 }); r.uniforms.tEquirect.value = e; const o = new He(i, r), s = e.minFilter; 1008 === e.minFilter && (e.minFilter = 1006); return new Qe(1, 10, this).update(t, o), e.minFilter = s, o.geometry.dispose(), o.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 Ke(t, e, n, i, r, o, s, a, l, c, h, u) { b.call(this, null, o, s, a, l, c, i, r, h, u), this.image = { data: t || null, width: e || 1, height: n || 1 }, this.magFilter = void 0 !== l ? l : 1003, this.minFilter = void 0 !== c ? c : 1003, this.generateMipmaps = !1, this.flipY = !1, this.unpackAlignment = 1, this.needsUpdate = !0 } Ke.prototype = Object.create(b.prototype), Ke.prototype.constructor = Ke, Ke.prototype.isDataTexture = !0; const $e = new X, tn = new T; class en { constructor(t, e, n, i, r, o) { this.planes = [void 0 !== t ? t : new Ct, void 0 !== e ? e : new Ct, void 0 !== n ? n : new Ct, void 0 !== i ? i : new Ct, void 0 !== r ? r : new Ct, void 0 !== o ? o : new Ct] } set(t, e, n, i, r, o) { const s = this.planes; return s[0].copy(t), s[1].copy(e), s[2].copy(n), s[3].copy(i), s[4].copy(r), s[5].copy(o), this } clone() { return (new this.constructor).copy(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], o = n[2], s = n[3], a = n[4], l = n[5], c = n[6], h = n[7], u = n[8], d = n[9], p = n[10], f = n[11], m = n[12], g = n[13], v = n[14], y = n[15]; return e[0].setComponents(s - i, h - a, f - u, y - m).normalize(), e[1].setComponents(s + i, h + a, f + u, y + m).normalize(), e[2].setComponents(s + r, h + l, f + d, y + g).normalize(), e[3].setComponents(s - r, h - l, f - d, y - g).normalize(), e[4].setComponents(s - o, h - c, f - p, y - v).normalize(), e[5].setComponents(s + o, h + c, f + p, y + v).normalize(), this } intersectsObject(t) { const e = t.geometry; return null === e.boundingSphere && e.computeBoundingSphere(), $e.copy(e.boundingSphere).applyMatrix4(t.matrixWorld), this.intersectsSphere($e) } intersectsSprite(t) { return $e.center.set(0, 0, 0), $e.radius = .7071067811865476, $e.applyMatrix4(t.matrixWorld), this.intersectsSphere($e) } 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 (tn.x = i.normal.x > 0 ? t.max.x : t.min.x, tn.y = i.normal.y > 0 ? t.max.y : t.min.y, tn.z = i.normal.z > 0 ? t.max.z : t.min.z, i.distanceToPoint(tn) < 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 } } function nn() { let t = null, e = !1, n = null, i = null; function r(e, o) { n(e, o), 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 rn(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 o = i.get(e); void 0 === o ? i.set(e, function(e, i) { const r = e.array, o = e.usage, s = t.createBuffer(); t.bindBuffer(i, s), t.bufferData(i, r, o), e.onUploadCallback(); let a = 5126; return r instanceof Float32Array ? a = 5126 : r instanceof Float64Array ? console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.") : r instanceof Uint16Array ? e.isFloat16BufferAttribute ? n ? a = 5131 : console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.") : a = 5123 : r instanceof Int16Array ? a = 5122 : r instanceof Uint32Array ? a = 5125 : r instanceof Int32Array ? a = 5124 : r instanceof Int8Array ? a = 5120 : r instanceof Uint8Array && (a = 5121), { buffer: s, type: a, bytesPerElement: r.BYTES_PER_ELEMENT, version: e.version } }(e, r)) : o.version < e.version && (! function(e, i, r) { const o = i.array, s = i.updateRange; t.bindBuffer(r, e), -1 === s.count ? t.bufferSubData(r, 0, o) : (n ? t.bufferSubData(r, s.offset * o.BYTES_PER_ELEMENT, o, s.offset, s.count) : t.bufferSubData(r, s.offset * o.BYTES_PER_ELEMENT, o.subarray(s.offset, s.offset + s.count)), s.count = -1) }(o.buffer, e, r), o.version = e.version) } } } class on extends be { 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, o = e / 2, s = Math.floor(n), a = Math.floor(i), l = s + 1, c = a + 1, h = t / s, u = e / a, d = [], p = [], f = [], m = []; for (let t = 0; t < c; t++) { const e = t * u - o; for (let n = 0; n < l; n++) { const i = n * h - r; p.push(i, -e, 0), f.push(0, 0, 1), m.push(n / s), m.push(1 - t / a) } } for (let t = 0; t < a; t++) for (let e = 0; e < s; e++) { const n = e + l * t, i = e + l * (t + 1), r = e + 1 + l * (t + 1), o = e + 1 + l * t; d.push(n, i, o), d.push(i, r, o) } this.setIndex(d), this.setAttribute("position", new he(p, 3)), this.setAttribute("normal", new he(f, 3)), this.setAttribute("uv", new he(m, 2)) } } const sn = { alphamap_fragment: "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif", alphamap_pars_fragment: "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif", alphatest_fragment: "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif", aomap_fragment: "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif", aomap_pars_fragment: "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif", begin_vertex: "vec3 transformed = vec3( position );", beginnormal_vertex: "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif", bsdfs: "vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\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\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\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\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\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\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\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\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\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\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif", bumpmap_pars_fragment: "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\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\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\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;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif", clipping_planes_fragment: "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif", clipping_planes_pars_fragment: "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif", clipping_planes_pars_vertex: "#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif", clipping_planes_vertex: "#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif", color_fragment: "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif", color_pars_fragment: "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif", color_pars_vertex: "#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif", color_vertex: "#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor.xyz *= color.xyz;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif", common: "#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#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\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 average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\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\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\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\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}", cube_uv_reflection_fragment: "#ifdef ENVMAP_TYPE_CUBE_UV\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\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\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\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif", defaultnormal_vertex: "vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif", displacementmap_pars_vertex: "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif", displacementmap_vertex: "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif", emissivemap_fragment: "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif", emissivemap_pars_fragment: "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif", encodings_fragment: "gl_FragColor = linearToOutputTexel( gl_FragColor );", encodings_pars_fragment: "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\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}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}", envmap_fragment: "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif", envmap_common_pars_fragment: "#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\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", envmap_pars_fragment: "#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif", envmap_pars_vertex: "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif", envmap_physical_pars_fragment: "#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif", envmap_vertex: "#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif", fog_vertex: "#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif", fog_pars_vertex: "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif", fog_fragment: "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif", fog_pars_fragment: "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif", gradientmap_pars_fragment: "#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}", lightmap_fragment: "#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif", lightmap_pars_fragment: "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif", lights_lambert_vertex: "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif", lights_pars_begin: "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\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\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\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\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\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif", lights_toon_fragment: "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;", lights_toon_pars_fragment: "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)", lights_phong_fragment: "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;", lights_phong_pars_fragment: "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)", lights_physical_fragment: "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif", lights_physical_pars_fragment: "struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\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.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\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\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\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\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\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\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}", lights_fragment_begin: "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\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\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\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\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\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\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif", lights_fragment_maps: "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif", lights_fragment_end: "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif", logdepthbuf_fragment: "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif", logdepthbuf_pars_fragment: "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif", logdepthbuf_pars_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif", logdepthbuf_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif", map_fragment: "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif", map_pars_fragment: "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif", map_particle_fragment: "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif", map_particle_pars_fragment: "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif", metalnessmap_fragment: "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif", metalnessmap_pars_fragment: "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif", morphnormal_vertex: "#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif", morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif", morphtarget_vertex: "#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif", normal_fragment_begin: "#ifdef FLAT_SHADED\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#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;", normal_fragment_maps: "#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif", normalmap_pars_fragment: "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\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\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif", clearcoat_normal_fragment_begin: "#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif", clearcoat_normal_fragment_maps: "#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif", clearcoat_pars_fragment: "#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif", packing: "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\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}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\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}\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}", premultiplied_alpha_fragment: "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif", project_vertex: "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;", dithering_fragment: "#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif", dithering_pars_fragment: "#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif", roughnessmap_fragment: "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif", roughnessmap_pars_fragment: "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif", shadowmap_pars_fragment: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\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\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\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\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\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\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\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 );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\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\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\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\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\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\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\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\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\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\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\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif", shadowmap_pars_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\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\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\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\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\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\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif", shadowmap_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif", shadowmask_pars_fragment: "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\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\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}", skinbase_vertex: "#ifdef USE_SKINNING\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#endif", skinning_pars_vertex: "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\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\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\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\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif", skinning_vertex: "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif", skinnormal_vertex: "#ifdef USE_SKINNING\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\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif", specularmap_fragment: "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif", specularmap_pars_fragment: "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif", tonemapping_fragment: "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif", tonemapping_pars_fragment: "#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\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}\nvec3 RRTAndODTFit( vec3 v ) {\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}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }", transmissionmap_fragment: "#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif", transmissionmap_pars_fragment: "#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif", uv_pars_fragment: "#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif", uv_pars_vertex: "#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif", uv_vertex: "#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif", uv2_pars_fragment: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif", uv2_pars_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif", uv2_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif", worldpos_vertex: "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif", background_frag: "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}", background_vert: "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}", cube_frag: "#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}", cube_vert: "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}", depth_frag: "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}", depth_vert: "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}", distanceRGBA_frag: "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}", distanceRGBA_vert: "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}", equirect_frag: "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}", equirect_vert: "varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}", linedashed_frag: "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}", linedashed_vert: "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshbasic_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshbasic_vert: "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshlambert_frag: "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshlambert_vert: "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshmatcap_frag: "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshmatcap_vert: "#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}", meshtoon_frag: "#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshtoon_vert: "#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}", meshphong_frag: "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshphong_vert: "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}", meshphysical_frag: "#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", meshphysical_vert: "#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}", normal_frag: "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}", normal_vert: "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}", points_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}", points_vert: "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}", shadow_frag: "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}", shadow_vert: "#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}", sprite_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}", sprite_vert: "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\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\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\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\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}" }, an = { common: { diffuse: { value: new Yt(15658734) }, opacity: { value: 1 }, map: { value: null }, uvTransform: { value: new y }, uv2Transform: { value: new y }, alphaMap: { value: null } }, specularmap: { specularMap: { value: null } }, envmap: { envMap: { value: null }, flipEnvMap: { value: -1 }, reflectivity: { value: 1 }, refractionRatio: { value: .98 }, maxMipLevel: { value: 0 } }, 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 v(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 Yt(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 Yt(15658734) }, opacity: { value: 1 }, size: { value: 1 }, scale: { value: 1 }, map: { value: null }, alphaMap: { value: null }, uvTransform: { value: new y } }, sprite: { diffuse: { value: new Yt(15658734) }, opacity: { value: 1 }, center: { value: new v(.5, .5) }, rotation: { value: 0 }, map: { value: null }, alphaMap: { value: null }, uvTransform: { value: new y } } }, ln = { basic: { uniforms: We([an.common, an.specularmap, an.envmap, an.aomap, an.lightmap, an.fog]), vertexShader: sn.meshbasic_vert, fragmentShader: sn.meshbasic_frag }, lambert: { uniforms: We([an.common, an.specularmap, an.envmap, an.aomap, an.lightmap, an.emissivemap, an.fog, an.lights, { emissive: { value: new Yt(0) } }]), vertexShader: sn.meshlambert_vert, fragmentShader: sn.meshlambert_frag }, phong: { uniforms: We([an.common, an.specularmap, an.envmap, an.aomap, an.lightmap, an.emissivemap, an.bumpmap, an.normalmap, an.displacementmap, an.fog, an.lights, { emissive: { value: new Yt(0) }, specular: { value: new Yt(1118481) }, shininess: { value: 30 } }]), vertexShader: sn.meshphong_vert, fragmentShader: sn.meshphong_frag }, standard: { uniforms: We([an.common, an.envmap, an.aomap, an.lightmap, an.emissivemap, an.bumpmap, an.normalmap, an.displacementmap, an.roughnessmap, an.metalnessmap, an.fog, an.lights, { emissive: { value: new Yt(0) }, roughness: { value: 1 }, metalness: { value: 0 }, envMapIntensity: { value: 1 } }]), vertexShader: sn.meshphysical_vert, fragmentShader: sn.meshphysical_frag }, toon: { uniforms: We([an.common, an.aomap, an.lightmap, an.emissivemap, an.bumpmap, an.normalmap, an.displacementmap, an.gradientmap, an.fog, an.lights, { emissive: { value: new Yt(0) } }]), vertexShader: sn.meshtoon_vert, fragmentShader: sn.meshtoon_frag }, matcap: { uniforms: We([an.common, an.bumpmap, an.normalmap, an.displacementmap, an.fog, { matcap: { value: null } }]), vertexShader: sn.meshmatcap_vert, fragmentShader: sn.meshmatcap_frag }, points: { uniforms: We([an.points, an.fog]), vertexShader: sn.points_vert, fragmentShader: sn.points_frag }, dashed: { uniforms: We([an.common, an.fog, { scale: { value: 1 }, dashSize: { value: 1 }, totalSize: { value: 2 } }]), vertexShader: sn.linedashed_vert, fragmentShader: sn.linedashed_frag }, depth: { uniforms: We([an.common, an.displacementmap]), vertexShader: sn.depth_vert, fragmentShader: sn.depth_frag }, normal: { uniforms: We([an.common, an.bumpmap, an.normalmap, an.displacementmap, { opacity: { value: 1 } }]), vertexShader: sn.normal_vert, fragmentShader: sn.normal_frag }, sprite: { uniforms: We([an.sprite, an.fog]), vertexShader: sn.sprite_vert, fragmentShader: sn.sprite_frag }, background: { uniforms: { uvTransform: { value: new y }, t2D: { value: null } }, vertexShader: sn.background_vert, fragmentShader: sn.background_frag }, cube: { uniforms: We([an.envmap, { opacity: { value: 1 } }]), vertexShader: sn.cube_vert, fragmentShader: sn.cube_frag }, equirect: { uniforms: { tEquirect: { value: null } }, vertexShader: sn.equirect_vert, fragmentShader: sn.equirect_frag }, distanceRGBA: { uniforms: We([an.common, an.displacementmap, { referencePosition: { value: new T }, nearDistance: { value: 1 }, farDistance: { value: 1e3 } }]), vertexShader: sn.distanceRGBA_vert, fragmentShader: sn.distanceRGBA_frag }, shadow: { uniforms: We([an.lights, an.fog, { color: { value: new Yt(0) }, opacity: { value: 1 } }]), vertexShader: sn.shadow_vert, fragmentShader: sn.shadow_frag } }; function cn(t, e, n, i, r) { const o = new Yt(0); let s, a, l = 0, c = null, h = 0, u = null; function d(t, e) { n.buffers.color.setClear(t.r, t.g, t.b, e, r) } return { getClearColor: function() { return o }, setClearColor: function(t, e = 1) { o.set(t), l = e, d(o, l) }, getClearAlpha: function() { return l }, setClearAlpha: function(t) { l = t, d(o, l) }, render: function(n, r, p, f) { let m = !0 === r.isScene ? r.background : null; m && m.isTexture && (m = e.get(m)); const g = t.xr, v = g.getSession && g.getSession(); v && "additive" === v.environmentBlendMode && (m = null), null === m ? d(o, l) : m && m.isColor && (d(m, 1), f = !0), (t.autoClear || f) && t.clear(t.autoClearColor, t.autoClearDepth, t.autoClearStencil), m && (m.isCubeTexture || m.isWebGLCubeRenderTarget || 306 === m.mapping) ? (void 0 === a && (a = new He(new Ve(1, 1, 1), new Xe({ name: "BackgroundCubeMaterial", uniforms: ke(ln.cube.uniforms), vertexShader: ln.cube.vertexShader, fragmentShader: ln.cube.fragmentShader, side: 1, depthTest: !1, depthWrite: !1, fog: !1 })), a.geometry.deleteAttribute("normal"), a.geometry.deleteAttribute("uv"), a.onBeforeRender = function(t, e, n) { this.matrixWorld.copyPosition(n.matrixWorld) }, Object.defineProperty(a.material, "envMap", { get: function() { return this.uniforms.envMap.value } }), i.update(a)), m.isWebGLCubeRenderTarget && (m = m.texture), a.material.uniforms.envMap.value = m, a.material.uniforms.flipEnvMap.value = m.isCubeTexture && m._needsFlipEnvMap ? -1 : 1, c === m && h === m.version && u === t.toneMapping || (a.material.needsUpdate = !0, c = m, h = m.version, u = t.toneMapping), n.unshift(a, a.geometry, a.material, 0, 0, null)) : m && m.isTexture && (void 0 === s && (s = new He(new on(2, 2), new Xe({ name: "BackgroundMaterial", uniforms: ke(ln.background.uniforms), vertexShader: ln.background.vertexShader, fragmentShader: ln.background.fragmentShader, side: 0, depthTest: !1, depthWrite: !1, fog: !1 })), s.geometry.deleteAttribute("normal"), Object.defineProperty(s.material, "map", { get: function() { return this.uniforms.t2D.value } }), i.update(s)), s.material.uniforms.t2D.value = m, !0 === m.matrixAutoUpdate && m.updateMatrix(), s.material.uniforms.uvTransform.value.copy(m.matrix), c === m && h === m.version && u === t.toneMapping || (s.material.needsUpdate = !0, c = m, h = m.version, u = t.toneMapping), n.unshift(s, s.geometry, s.material, 0, 0, null)) } } } function hn(t, e, n, i) { const r = t.getParameter(34921), o = i.isWebGL2 ? null : e.get("OES_vertex_array_object"), s = i.isWebGL2 || null !== o, a = {}, l = d(null); let c = l; function h(e) { return i.isWebGL2 ? t.bindVertexArray(e) : o.bindVertexArrayOES(e) } function u(e) { return i.isWebGL2 ? t.deleteVertexArray(e) : o.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 = c.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 o = c.newAttributes, s = c.enabledAttributes, a = c.attributeDivisors; if (o[n] = 1, 0 === s[n] && (t.enableVertexAttribArray(n), s[n] = 1), a[n] !== r) { (i.isWebGL2 ? t : e.get("ANGLE_instanced_arrays"))[i.isWebGL2 ? "vertexAttribDivisor" : "vertexAttribDivisorANGLE"](n, r), a[n] = r } } function g() { const e = c.newAttributes, n = c.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, o, s, a) { !0 !== i.isWebGL2 || 5124 !== r && 5125 !== r ? t.vertexAttribPointer(e, n, r, o, s, a) : t.vertexAttribIPointer(e, n, r, s, a) } function y() { A(), c !== l && (c = l, h(c.object)) } function A() { l.geometry = null, l.program = null, l.wireframe = !1 } return { setup: function(r, l, u, y, A) { let x = !1; if (s) { const e = function(e, n, r) { const s = !0 === r.wireframe; let l = a[e.id]; void 0 === l && (l = {}, a[e.id] = l); let c = l[n.id]; void 0 === c && (c = {}, l[n.id] = c); let h = c[s]; void 0 === h && (h = d(i.isWebGL2 ? t.createVertexArray() : o.createVertexArrayOES()), c[s] = h); return h }(y, u, l); c !== e && (c = e, h(c.object)), x = function(t, e) { const n = c.attributes, i = t.attributes; let r = 0; for (const t in i) { const e = n[t], o = i[t]; if (void 0 === e) return !0; if (e.attribute !== o) return !0; if (e.data !== o.data) return !0; r++ } return c.attributesNum !== r || c.index !== e }(y, A), x && function(t, e) { const n = {}, i = t.attributes; let r = 0; for (const t in i) { const e = i[t], o = {}; o.attribute = e, e.data && (o.data = e.data), n[t] = o, r++ } c.attributes = n, c.attributesNum = r, c.index = e }(y, A) } else { const t = !0 === l.wireframe; c.geometry === y.id && c.program === u.id && c.wireframe === t || (c.geometry = y.id, c.program = u.id, c.wireframe = t, x = !0) }!0 === r.isInstancedMesh && (x = !0), null !== A && n.update(A, 34963), x && (! function(r, o, s, a) { if (!1 === i.isWebGL2 && (r.isInstancedMesh || a.isInstancedBufferGeometry) && null === e.get("ANGLE_instanced_arrays")) return; p(); const l = a.attributes, c = s.getAttributes(), h = o.defaultAttributeValues; for (const e in c) { const i = c[e]; if (i >= 0) { const o = l[e]; if (void 0 !== o) { const e = o.normalized, r = o.itemSize, s = n.get(o); if (void 0 === s) continue; const l = s.buffer, c = s.type, h = s.bytesPerElement; if (o.isInterleavedBufferAttribute) { const n = o.data, s = n.stride, u = o.offset; n && n.isInstancedInterleavedBuffer ? (m(i, n.meshPerAttribute), void 0 === a._maxInstanceCount && (a._maxInstanceCount = n.meshPerAttribute * n.count)) : f(i), t.bindBuffer(34962, l), v(i, r, c, e, s * h, u * h) } else o.isInstancedBufferAttribute ? (m(i, o.meshPerAttribute), void 0 === a._maxInstanceCount && (a._maxInstanceCount = o.meshPerAttribute * o.count)) : f(i), t.bindBuffer(34962, l), v(i, r, c, e, 0, 0) } else if ("instanceMatrix" === e) { const e = n.get(r.instanceMatrix); if (void 0 === e) continue; const o = e.buffer, s = e.type; m(i + 0, 1), m(i + 1, 1), m(i + 2, 1), m(i + 3, 1), t.bindBuffer(34962, o), t.vertexAttribPointer(i + 0, 4, s, !1, 64, 0), t.vertexAttribPointer(i + 1, 4, s, !1, 64, 16), t.vertexAttribPointer(i + 2, 4, s, !1, 64, 32), t.vertexAttribPointer(i + 3, 4, s, !1, 64, 48) } else if ("instanceColor" === e) { const e = n.get(r.instanceColor); if (void 0 === e) continue; const o = e.buffer, s = e.type; m(i, 1), t.bindBuffer(34962, o), t.vertexAttribPointer(i, 3, s, !1, 12, 0) } else if (void 0 !== h) { const n = h[e]; if (void 0 !== n) switch (n.length) { case 2: t.vertexAttrib2fv(i, n); break; case 3: t.vertexAttrib3fv(i, n); break; case 4: t.vertexAttrib4fv(i, n); break; default: t.vertexAttrib1fv(i, n) } } } } g() }(r, l, u, y), null !== A && t.bindBuffer(34963, n.get(A).buffer)) }, reset: y, resetDefaultState: A, dispose: function() { y(); for (const t in a) { const e = a[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 a[t] } }, releaseStatesOfGeometry: function(t) { if (void 0 === a[t.id]) return; const e = a[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 a[t.id] }, releaseStatesOfProgram: function(t) { for (const e in a) { const n = a[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 un(t, e, n, i) { const r = i.isWebGL2; let o; this.setMode = function(t) { o = t }, this.render = function(e, i) { t.drawArrays(o, e, i), n.update(i, o, 1) }, this.renderInstances = function(i, s, a) { if (0 === a) return; let l, c; if (r) l = t, c = "drawArraysInstanced"; else if (l = e.get("ANGLE_instanced_arrays"), c = "drawArraysInstancedANGLE", null === l) return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); l[c](o, i, s, a), n.update(s, o, a) } } function dn(t, e, n) { let i; function r(e) { if ("highp" === e) { if (t.getShaderPrecisionFormat(35633, 36338).precision > 0 && t.getShaderPrecisionFormat(35632, 36338).precision > 0) return "highp"; e = "mediump" } return "mediump" === e && t.getShaderPrecisionFormat(35633, 36337).precision > 0 && t.getShaderPrecisionFormat(35632, 36337).precision > 0 ? "mediump" : "lowp" } const o = "undefined" != typeof WebGL2RenderingContext && t instanceof WebGL2RenderingContext || "undefined" != typeof WebGL2ComputeRenderingContext && t instanceof WebGL2ComputeRenderingContext; let s = void 0 !== n.precision ? n.precision : "highp"; const a = r(s); a !== s && (console.warn("THREE.WebGLRenderer:", s, "not supported, using", a, "instead."), s = a); const l = !0 === n.logarithmicDepthBuffer, c = t.getParameter(34930), h = t.getParameter(35660), u = t.getParameter(3379), d = t.getParameter(34076), p = t.getParameter(34921), f = t.getParameter(36347), m = t.getParameter(36348), g = t.getParameter(36349), v = h > 0, y = o || !!e.get("OES_texture_float"); return { isWebGL2: o, getMaxAnisotropy: function() { if (void 0 !== i) return i; const n = e.get("EXT_texture_filter_anisotropic"); return i = null !== n ? t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0, i }, getMaxPrecision: r, precision: s, logarithmicDepthBuffer: l, maxTextures: c, maxVertexTextures: h, maxTextureSize: u, maxCubemapSize: d, maxAttributes: p, maxVertexUniforms: f, maxVaryings: m, maxFragmentUniforms: g, vertexTextures: v, floatFragmentTextures: y, floatVertexTextures: v && y, maxSamples: o ? t.getParameter(36183) : 0 } } function pn(t) { const e = this; let n = null, i = 0, r = !1, o = !1; const s = new Ct, a = new y, l = { value: null, needsUpdate: !1 }; function c() { l.value !== n && (l.value = n, l.needsUpdate = i > 0), e.numPlanes = i, e.numIntersection = 0 } function h(t, n, i, r) { const o = null !== t ? t.length : 0; let c = null; if (0 !== o) { if (c = l.value, !0 !== r || null === c) { const e = i + 4 * o, r = n.matrixWorldInverse; a.getNormalMatrix(r), (null === c || c.length < e) && (c = new Float32Array(e)); for (let e = 0, n = i; e !== o; ++e, n += 4) s.copy(t[e]).applyMatrix4(r, a), s.normal.toArray(c, n), c[n + 3] = s.constant } l.value = c, l.needsUpdate = !0 } return e.numPlanes = o, e.numIntersection = 0, c } this.uniform = l, this.numPlanes = 0, this.numIntersection = 0, this.init = function(t, e, o) { const s = 0 !== t.length || e || 0 !== i || r; return r = e, n = h(t, o, 0), i = t.length, s }, this.beginShadows = function() { o = !0, h(null) }, this.endShadows = function() { o = !1, c() }, this.setState = function(e, s, a) { const u = e.clippingPlanes, d = e.clipIntersection, p = e.clipShadows, f = t.get(e); if (!r || null === u || 0 === u.length || o && !p) o ? h(null) : c(); else { const t = o ? 0 : i, e = 4 * t; let r = f.clippingState || null; l.value = r, r = h(u, s, e, a); for (let t = 0; t !== e; ++t) r[t] = n[t]; f.clippingState = r, this.numIntersection = d ? this.numPlanes : 0, this.numPlanes += t } } } function fn(t) { let e = new WeakMap; function n(t, e) { return 303 === e ? t.mapping = 301 : 304 === e && (t.mapping = 302), 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) { const o = r.mapping; if (303 === o || 304 === o) { if (e.has(r)) { return n(e.get(r).texture, r.mapping) } { const o = r.image; if (o && o.height > 0) { const s = t.getRenderList(), a = t.getRenderTarget(), l = new Je(o.height / 2); return l.fromEquirectangularTexture(t, r), e.set(r, l), t.setRenderTarget(a), t.setRenderList(s), r.addEventListener("dispose", i), n(l.texture, r.mapping) } return null } } } return r }, dispose: function() { e = new WeakMap } } } function mn(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") }, get: function(t) { const e = n(t); return null === e && console.warn("THREE.WebGLRenderer: " + t + " extension not supported."), e } } } function gn(t, e, n, i) { const r = {}, o = new WeakMap; function s(t) { const a = t.target; null !== a.index && e.remove(a.index); for (const t in a.attributes) e.remove(a.attributes[t]); a.removeEventListener("dispose", s), delete r[a.id]; const l = o.get(a); l && (e.remove(l), o.delete(a)), i.releaseStatesOfGeometry(a), !0 === a.isInstancedBufferGeometry && delete a._maxInstanceCount, n.memory.geometries-- } function a(t) { const n = [], i = t.index, r = t.attributes.position; let s = 0; if (null !== i) { const t = i.array; s = i.version; for (let e = 0, i = t.length; e < i; e += 3) { const i = t[e + 0], r = t[e + 1], o = t[e + 2]; n.push(i, r, r, o, o, i) } } else { const t = r.array; s = 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 a = new(de(n) > 65535 ? le : se)(n, 1); a.version = s; const l = o.get(t); l && e.remove(l), o.set(t, a) } return { get: function(t, e) { return !0 === r[e.id] || (e.addEventListener("dispose", s), r[e.id] = !0, n.memory.geometries++), e }, update: function(t) { const n = t.attributes; for (const t in n) e.update(n[t], 34962); const i = t.morphAttributes; for (const t in i) { const n = i[t]; for (let t = 0, i = n.length; t < i; t++) e.update(n[t], 34962) } }, getWireframeAttribute: function(t) { const e = o.get(t); if (e) { const n = t.index; null !== n && e.version < n.version && a(t) } else a(t); return o.get(t) } } } function vn(t, e, n, i) { const r = i.isWebGL2; let o, s, a; this.setMode = function(t) { o = t }, this.setIndex = function(t) { s = t.type, a = t.bytesPerElement }, this.render = function(e, i) { t.drawElements(o, i, s, e * a), n.update(i, o, 1) }, this.renderInstances = function(i, l, c) { if (0 === c) return; let h, u; if (r) h = t, u = "drawElementsInstanced"; else if (h = e.get("ANGLE_instanced_arrays"), u = "drawElementsInstancedANGLE", null === h) return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); h[u](o, l, s, i * a, c), n.update(l, o, c) } } function yn(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(t, n, i) { switch (e.calls++, n) { case 4: e.triangles += i * (t / 3); break; case 1: e.lines += i * (t / 2); break; case 3: e.lines += i * (t - 1); break; case 2: e.lines += i * t; break; case 0: e.points += i * t; break; default: console.error("THREE.WebGLInfo: Unknown draw mode:", n) } } } } function An(t, e) { return t[0] - e[0] } function xn(t, e) { return Math.abs(e[1]) - Math.abs(t[1]) } function _n(t) { const e = {}, n = new Float32Array(8), i = []; for (let t = 0; t < 8; t++) i[t] = [t, 0]; return { update: function(r, o, s, a) { const l = r.morphTargetInfluences, c = void 0 === l ? 0 : l.length; let h = e[o.id]; if (void 0 === h) { h = []; for (let t = 0; t < c; t++) h[t] = [t, 0]; e[o.id] = h } for (let t = 0; t < c; t++) { const e = h[t]; e[0] = t, e[1] = l[t] } h.sort(xn); for (let t = 0; t < 8; t++) t < c && h[t][1] ? (i[t][0] = h[t][0], i[t][1] = h[t][1]) : (i[t][0] = Number.MAX_SAFE_INTEGER, i[t][1] = 0); i.sort(An); const u = s.morphTargets && o.morphAttributes.position, d = s.morphNormals && o.morphAttributes.normal; let p = 0; for (let t = 0; t < 8; t++) { const e = i[t], r = e[0], s = e[1]; r !== Number.MAX_SAFE_INTEGER && s ? (u && o.getAttribute("morphTarget" + t) !== u[r] && o.setAttribute("morphTarget" + t, u[r]), d && o.getAttribute("morphNormal" + t) !== d[r] && o.setAttribute("morphNormal" + t, d[r]), n[t] = s, p += s) : (u && !0 === o.hasAttribute("morphTarget" + t) && o.deleteAttribute("morphTarget" + t), d && !0 === o.hasAttribute("morphNormal" + t) && o.deleteAttribute("morphNormal" + t), n[t] = 0) } const f = o.morphTargetsRelative ? 1 : 1 - p; a.getUniforms().setValue(t, "morphTargetBaseInfluence", f), a.getUniforms().setValue(t, "morphTargetInfluences", n) } } } function bn(t, e, n, i) { let r = new WeakMap; function o(t) { const e = t.target; e.removeEventListener("dispose", o), n.remove(e.instanceMatrix), null !== e.instanceColor && n.remove(e.instanceColor) } return { update: function(t) { const s = i.render.frame, a = t.geometry, l = e.get(t, a); return r.get(l) !== s && (e.update(l), r.set(l, s)), t.isInstancedMesh && (!1 === t.hasEventListener("dispose", o) && t.addEventListener("dispose", o), n.update(t.instanceMatrix, 34962), null !== t.instanceColor && n.update(t.instanceColor, 34962)), l }, dispose: function() { r = new WeakMap } } } function wn(t = null, e = 1, n = 1, i = 1) { b.call(this, null), this.image = { data: t, width: e, height: n, depth: i }, this.magFilter = 1003, this.minFilter = 1003, this.wrapR = 1001, this.generateMipmaps = !1, this.flipY = !1, this.needsUpdate = !0 } function Mn(t = null, e = 1, n = 1, i = 1) { b.call(this, null), this.image = { data: t, width: e, height: n, depth: i }, this.magFilter = 1003, this.minFilter = 1003, this.wrapR = 1001, this.generateMipmaps = !1, this.flipY = !1, this.needsUpdate = !0 } ln.physical = { uniforms: We([ln.standard.uniforms, { clearcoat: { value: 0 }, clearcoatMap: { value: null }, clearcoatRoughness: { value: 0 }, clearcoatRoughnessMap: { value: null }, clearcoatNormalScale: { value: new v(1, 1) }, clearcoatNormalMap: { value: null }, sheen: { value: new Yt(0) }, transmission: { value: 0 }, transmissionMap: { value: null } }]), vertexShader: sn.meshphysical_vert, fragmentShader: sn.meshphysical_frag }, wn.prototype = Object.create(b.prototype), wn.prototype.constructor = wn, wn.prototype.isDataTexture2DArray = !0, Mn.prototype = Object.create(b.prototype), Mn.prototype.constructor = Mn, Mn.prototype.isDataTexture3D = !0; const En = new b, Sn = new wn, Tn = new Mn, Ln = new Ze, Rn = [], Cn = [], Pn = new Float32Array(16), Dn = new Float32Array(9), In = new Float32Array(4); function On(t, e, n) { const i = t[0]; if (i <= 0 || i > 0) return t; const r = e * n; let o = Rn[r]; if (void 0 === o && (o = new Float32Array(r), Rn[r] = o), 0 !== e) { i.toArray(o, 0); for (let i = 1, r = 0; i !== e; ++i) r += n, t[i].toArray(o, r) } return o } function Nn(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 Bn(t, e) { for (let n = 0, i = e.length; n < i; n++) t[n] = e[n] } function Fn(t, e) { let n = Cn[e]; void 0 === n && (n = new Int32Array(e), Cn[e] = n); for (let i = 0; i !== e; ++i) n[i] = t.allocateTextureUnit(); return n } function zn(t, e) { const n = this.cache; n[0] !== e && (t.uniform1f(this.addr, e), n[0] = e) } function Un(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 (Nn(n, e)) return; t.uniform2fv(this.addr, e), Bn(n, e) } } function Hn(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 (Nn(n, e)) return; t.uniform3fv(this.addr, e), Bn(n, e) } } function Gn(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 (Nn(n, e)) return; t.uniform4fv(this.addr, e), Bn(n, e) } } function Vn(t, e) { const n = this.cache, i = e.elements; if (void 0 === i) { if (Nn(n, e)) return; t.uniformMatrix2fv(this.addr, !1, e), Bn(n, e) } else { if (Nn(n, i)) return; In.set(i), t.uniformMatrix2fv(this.addr, !1, In), Bn(n, i) } } function kn(t, e) { const n = this.cache, i = e.elements; if (void 0 === i) { if (Nn(n, e)) return; t.uniformMatrix3fv(this.addr, !1, e), Bn(n, e) } else { if (Nn(n, i)) return; Dn.set(i), t.uniformMatrix3fv(this.addr, !1, Dn), Bn(n, i) } } function Wn(t, e) { const n = this.cache, i = e.elements; if (void 0 === i) { if (Nn(n, e)) return; t.uniformMatrix4fv(this.addr, !1, e), Bn(n, e) } else { if (Nn(n, i)) return; Pn.set(i), t.uniformMatrix4fv(this.addr, !1, Pn), Bn(n, i) } } function jn(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), i[0] = r), n.safeSetTexture2D(e || En, r) } function Xn(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), i[0] = r), n.setTexture2DArray(e || Sn, r) } function qn(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), i[0] = r), n.setTexture3D(e || Tn, r) } function Yn(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), i[0] = r), n.safeSetTextureCube(e || Ln, r) } function Qn(t, e) { const n = this.cache; n[0] !== e && (t.uniform1i(this.addr, e), n[0] = e) } function Zn(t, e) { const n = this.cache; Nn(n, e) || (t.uniform2iv(this.addr, e), Bn(n, e)) } function Jn(t, e) { const n = this.cache; Nn(n, e) || (t.uniform3iv(this.addr, e), Bn(n, e)) } function Kn(t, e) { const n = this.cache; Nn(n, e) || (t.uniform4iv(this.addr, e), Bn(n, e)) } function $n(t, e) { const n = this.cache; n[0] !== e && (t.uniform1ui(this.addr, e), n[0] = e) } function ti(t, e) { t.uniform1fv(this.addr, e) } function ei(t, e) { t.uniform1iv(this.addr, e) } function ni(t, e) { t.uniform2iv(this.addr, e) } function ii(t, e) { t.uniform3iv(this.addr, e) } function ri(t, e) { t.uniform4iv(this.addr, e) } function oi(t, e) { const n = On(e, this.size, 2); t.uniform2fv(this.addr, n) } function si(t, e) { const n = On(e, this.size, 3); t.uniform3fv(this.addr, n) } function ai(t, e) { const n = On(e, this.size, 4); t.uniform4fv(this.addr, n) } function li(t, e) { const n = On(e, this.size, 4); t.uniformMatrix2fv(this.addr, !1, n) } function ci(t, e) { const n = On(e, this.size, 9); t.uniformMatrix3fv(this.addr, !1, n) } function hi(t, e) { const n = On(e, this.size, 16); t.uniformMatrix4fv(this.addr, !1, n) } function ui(t, e, n) { const i = e.length, r = Fn(n, i); t.uniform1iv(this.addr, r); for (let t = 0; t !== i; ++t) n.safeSetTexture2D(e[t] || En, r[t]) } function di(t, e, n) { const i = e.length, r = Fn(n, i); t.uniform1iv(this.addr, r); for (let t = 0; t !== i; ++t) n.safeSetTextureCube(e[t] || Ln, r[t]) } function pi(t, e, n) { this.id = t, this.addr = n, this.cache = [], this.setValue = function(t) { switch (t) { case 5126: return zn; case 35664: return Un; case 35665: return Hn; case 35666: return Gn; case 35674: return Vn; case 35675: return kn; case 35676: return Wn; case 5124: case 35670: return Qn; case 35667: case 35671: return Zn; case 35668: case 35672: return Jn; case 35669: case 35673: return Kn; case 5125: return $n; case 35678: case 36198: case 36298: case 36306: case 35682: return jn; case 35679: case 36299: case 36307: return qn; case 35680: case 36300: case 36308: case 36293: return Yn; case 36289: case 36303: case 36311: case 36292: return Xn } }(e.type) } function fi(t, e, n) { this.id = t, this.addr = n, this.cache = [], this.size = e.size, this.setValue = function(t) { switch (t) { case 5126: return ti; case 35664: return oi; case 35665: return si; case 35666: return ai; case 35674: return li; case 35675: return ci; case 35676: return hi; case 5124: case 35670: return ei; case 35667: case 35671: return ni; case 35668: case 35672: return ii; case 35669: case 35673: return ri; case 35678: case 36198: case 36298: case 36306: case 35682: return ui; case 35680: case 36300: case 36308: case 36293: return di } }(e.type) } function mi(t) { this.id = t, this.seq = [], this.map = {} } fi.prototype.updateCache = function(t) { const e = this.cache; t instanceof Float32Array && e.length !== t.length && (this.cache = new Float32Array(t.length)), Bn(e, t) }, mi.prototype.setValue = function(t, e, n) { const i = this.seq; for (let r = 0, o = i.length; r !== o; ++r) { const o = i[r]; o.setValue(t, e[o.id], n) } }; const gi = /(\w+)(\])?(\[|\.)?/g; function vi(t, e) { t.seq.push(e), t.map[e.id] = e } function yi(t, e, n) { const i = t.name, r = i.length; for (gi.lastIndex = 0;;) { const o = gi.exec(i), s = gi.lastIndex; let a = o[1]; const l = "]" === o[2], c = o[3]; if (l && (a |= 0), void 0 === c || "[" === c && s + 2 === r) { vi(n, void 0 === c ? new pi(a, t, e) : new fi(a, t, e)); break } { let t = n.map[a]; void 0 === t && (t = new mi(a), vi(n, t)), n = t } } } function Ai(t, e) { this.seq = [], this.map = {}; const n = t.getProgramParameter(e, 35718); for (let i = 0; i < n; ++i) { const n = t.getActiveUniform(e, i); yi(n, t.getUniformLocation(e, n.name), this) } } function xi(t, e, n) { const i = t.createShader(e); return t.shaderSource(i, n), t.compileShader(i), i } Ai.prototype.setValue = function(t, e, n, i) { const r = this.map[e]; void 0 !== r && r.setValue(t, n, i) }, Ai.prototype.setOptional = function(t, e, n) { const i = e[n]; void 0 !== i && this.setValue(t, n, i) }, Ai.upload = function(t, e, n, i) { for (let r = 0, o = e.length; r !== o; ++r) { const o = e[r], s = n[o.id]; !1 !== s.needsUpdate && o.setValue(t, s.value, i) } }, Ai.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 _i = 0; function bi(t) { switch (t) { case 3e3: return ["Linear", "( value )"]; case 3001: return ["sRGB", "( value )"]; case 3002: return ["RGBE", "( value )"]; case 3004: return ["RGBM", "( value, 7.0 )"]; case 3005: return ["RGBM", "( value, 16.0 )"]; case 3006: return ["RGBD", "( value, 256.0 )"]; case 3007: return ["Gamma", "( value, float( GAMMA_FACTOR ) )"]; case 3003: return ["LogLuv", "( value )"]; default: return console.warn("THREE.WebGLProgram: Unsupported encoding:", t), ["Linear", "( value )"] } } function wi(t, e, n) { const i = t.getShaderParameter(e, 35713), r = t.getShaderInfoLog(e).trim(); if (i && "" === r) return ""; return "THREE.WebGLShader: gl.getShaderInfoLog() " + n + "\n" + r + 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 Mi(t, e) { const n = bi(e); return "vec4 " + t + "( vec4 value ) { return " + n[0] + "ToLinear" + n[1] + "; }" } function Ei(t, e) { const n = bi(e); return "vec4 " + t + "( vec4 value ) { return LinearTo" + n[0] + n[1] + "; }" } function Si(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 Ti(t) { return "" !== t } function Li(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 Ri(t, e) { return t.replace(/NUM_CLIPPING_PLANES/g, e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, e.numClippingPlanes - e.numClipIntersection) } const Ci = /^[ \t]*#include +<([\w\d./]+)>/gm; function Pi(t) { return t.replace(Ci, Di) } function Di(t, e) { const n = sn[e]; if (void 0 === n) throw new Error("Can not resolve #include <" + e + ">"); return Pi(n) } const Ii = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g, Oi = /#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 Ni(t) { return t.replace(Oi, Fi).replace(Ii, Bi) } function Bi(t, e, n, i) { return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."), Fi(t, e, n, i) } function Fi(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 zi(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 Ui(t, e, n, i) { const r = t.getContext(), o = n.defines; let s = n.vertexShader, a = 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), c = function(t) { let e = "ENVMAP_TYPE_CUBE"; if (t.envMap) switch (t.envMapMode) { case 301: case 302: e = "ENVMAP_TYPE_CUBE"; break; case 306: case 307: e = "ENVMAP_TYPE_CUBE_UV" } return e }(n), h = function(t) { let e = "ENVMAP_MODE_REFLECTION"; if (t.envMap) switch (t.envMapMode) { case 302: 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 = t.gammaFactor > 0 ? t.gammaFactor : 1, p = 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.rendererExtensionShaderTextureLod ? "#extension GL_EXT_shader_texture_lod : enable" : ""].filter(Ti).join("\n") }(n), f = function(t) { const e = []; for (const n in t) { const i = t[n]; !1 !== i && e.push("#define " + n + " " + i) } return e.join("\n") }(o), m = r.createProgram(); let g, v, y = n.glslVersion ? "#version " + n.glslVersion + "\n" : ""; n.isRawShaderMaterial ? (g = [f].filter(Ti).join("\n"), g.length > 0 && (g += "\n"), v = [p, f].filter(Ti).join("\n"), v.length > 0 && (v += "\n")) : (g = [zi(n), "#define SHADER_NAME " + n.shaderName, f, n.instancing ? "#define USE_INSTANCING" : "", n.instancingColor ? "#define USE_INSTANCING_COLOR" : "", n.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "", "#define GAMMA_FACTOR " + d, "#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 " + h : "", 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.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", n.metalnessMap ? "#define USE_METALNESSMAP" : "", n.alphaMap ? "#define USE_ALPHAMAP" : "", n.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", n.vertexTangents ? "#define USE_TANGENT" : "", n.vertexColors ? "#define USE_COLOR" : "", 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.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", "#ifdef USE_COLOR", "\tattribute vec3 color;", "#endif", "#ifdef USE_MORPHTARGETS", "\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(Ti).join("\n"), v = [p, zi(n), "#define SHADER_NAME " + n.shaderName, f, n.alphaTest ? "#define ALPHATEST " + n.alphaTest + (n.alphaTest % 1 ? "" : ".0") : "", "#define GAMMA_FACTOR " + d, 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 " + c : "", n.envMap ? "#define " + h : "", 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.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", n.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", n.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", n.specularMap ? "#define USE_SPECULARMAP" : "", n.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", n.metalnessMap ? "#define USE_METALNESSMAP" : "", n.alphaMap ? "#define USE_ALPHAMAP" : "", n.sheen ? "#define USE_SHEEN" : "", n.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", n.vertexTangents ? "#define USE_TANGENT" : "", n.vertexColors || n.instancingColor ? "#define USE_COLOR" : "", 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 ? sn.tonemapping_pars_fragment : "", 0 !== n.toneMapping ? Si("toneMapping", n.toneMapping) : "", n.dithering ? "#define DITHERING" : "", sn.encodings_pars_fragment, n.map ? Mi("mapTexelToLinear", n.mapEncoding) : "", n.matcap ? Mi("matcapTexelToLinear", n.matcapEncoding) : "", n.envMap ? Mi("envMapTexelToLinear", n.envMapEncoding) : "", n.emissiveMap ? Mi("emissiveMapTexelToLinear", n.emissiveMapEncoding) : "", n.lightMap ? Mi("lightMapTexelToLinear", n.lightMapEncoding) : "", Ei("linearToOutputTexel", n.outputEncoding), n.depthPacking ? "#define DEPTH_PACKING " + n.depthPacking : "", "\n"].filter(Ti).join("\n")), s = Pi(s), s = Li(s, n), s = Ri(s, n), a = Pi(a), a = Li(a, n), a = Ri(a, n), s = Ni(s), a = Ni(a), n.isWebGL2 && !0 !== n.isRawShaderMaterial && (y = "#version 300 es\n", g = ["#define attribute in", "#define varying out", "#define texture2D texture"].join("\n") + "\n" + g, v = ["#define varying in", "300 es" === n.glslVersion ? "" : "out highp vec4 pc_fragColor;", "300 es" === n.glslVersion ? "" : "#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" + v); const A = y + v + a, x = xi(r, 35633, y + g + s), _ = xi(r, 35632, A); if (r.attachShader(m, x), r.attachShader(m, _), void 0 !== n.index0AttributeName ? r.bindAttribLocation(m, 0, n.index0AttributeName) : !0 === n.morphTargets && r.bindAttribLocation(m, 0, "position"), r.linkProgram(m), t.debug.checkShaderErrors) { const t = r.getProgramInfoLog(m).trim(), e = r.getShaderInfoLog(x).trim(), n = r.getShaderInfoLog(_).trim(); let i = !0, o = !0; if (!1 === r.getProgramParameter(m, 35714)) { i = !1; const e = wi(r, x, "vertex"), n = wi(r, _, "fragment"); console.error("THREE.WebGLProgram: shader error: ", r.getError(), "35715", r.getProgramParameter(m, 35715), "gl.getProgramInfoLog", t, e, n) } else "" !== t ? console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()", t) : "" !== e && "" !== n || (o = !1); o && (this.diagnostics = { runnable: i, programLog: t, vertexShader: { log: e, prefix: g }, fragmentShader: { log: n, prefix: v } }) } let b, w; return r.deleteShader(x), r.deleteShader(_), this.getUniforms = function() { return void 0 === b && (b = new Ai(r, m)), b }, this.getAttributes = function() { return void 0 === w && (w = function(t, e) { const n = {}, i = t.getProgramParameter(e, 35721); for (let r = 0; r < i; r++) { const i = t.getActiveAttrib(e, r).name; n[i] = t.getAttribLocation(e, i) } return n }(r, m)), w }, this.destroy = function() { i.releaseStatesOfProgram(this), r.deleteProgram(m), this.program = void 0 }, this.name = n.shaderName, this.id = _i++, this.cacheKey = e, this.usedTimes = 1, this.program = m, this.vertexShader = x, this.fragmentShader = _, this } function Hi(t, e, n, i, r, o) { const s = [], a = i.isWebGL2, l = i.logarithmicDepthBuffer, c = i.floatVertexTextures, h = i.maxVertexUniforms, u = i.vertexTextures; let d = i.precision; const p = { 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" }, f = ["precision", "isWebGL2", "supportsVertexTextures", "outputEncoding", "instancing", "instancingColor", "map", "mapEncoding", "matcap", "matcapEncoding", "envMap", "envMapMode", "envMapEncoding", "envMapCubeUV", "lightMap", "lightMapEncoding", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "tangentSpaceNormalMap", "clearcoatMap", "clearcoatRoughnessMap", "clearcoatNormalMap", "displacementMap", "specularMap", "roughnessMap", "metalnessMap", "gradientMap", "alphaMap", "combine", "vertexColors", "vertexTangents", "vertexUvs", "uvsVertexOnly", "fog", "useFog", "fogExp2", "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", "maxBones", "useVertexTexture", "morphTargets", "morphNormals", "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", "numDirLightShadows", "numPointLightShadows", "numSpotLightShadows", "shadowMapEnabled", "shadowMapType", "toneMapping", "physicallyCorrectLights", "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering", "sheen", "transmissionMap"]; function m(t) { let e; return t && t.isTexture ? e = t.encoding : t && t.isWebGLRenderTarget ? (console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."), e = t.texture.encoding) : e = 3e3, e } return { getParameters: function(r, s, f, g, v) { const y = g.fog, A = r.isMeshStandardMaterial ? g.environment : null, x = e.get(r.envMap || A), _ = p[r.type], b = v.isSkinnedMesh ? function(t) { const e = t.skeleton.bones; if (c) return 1024; { const t = h, 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 } }(v) : 0; let w, M; if (null !== r.precision && (d = i.getMaxPrecision(r.precision), d !== r.precision && console.warn("THREE.WebGLProgram.getParameters:", r.precision, "not supported, using", d, "instead.")), _) { const t = ln[_]; w = t.vertexShader, M = t.fragmentShader } else w = r.vertexShader, M = r.fragmentShader; const E = t.getRenderTarget(); return { isWebGL2: a, shaderID: _, shaderName: r.type, vertexShader: w, fragmentShader: M, defines: r.defines, isRawShaderMaterial: !0 === r.isRawShaderMaterial, glslVersion: r.glslVersion, precision: d, instancing: !0 === v.isInstancedMesh, instancingColor: !0 === v.isInstancedMesh && null !== v.instanceColor, supportsVertexTextures: u, outputEncoding: null !== E ? m(E.texture) : t.outputEncoding, map: !!r.map, mapEncoding: m(r.map), matcap: !!r.matcap, matcapEncoding: m(r.matcap), envMap: !!x, envMapMode: x && x.mapping, envMapEncoding: m(x), envMapCubeUV: !!x && (306 === x.mapping || 307 === x.mapping), lightMap: !!r.lightMap, lightMapEncoding: m(r.lightMap), aoMap: !!r.aoMap, emissiveMap: !!r.emissiveMap, emissiveMapEncoding: m(r.emissiveMap), bumpMap: !!r.bumpMap, normalMap: !!r.normalMap, objectSpaceNormalMap: 1 === r.normalMapType, tangentSpaceNormalMap: 0 === r.normalMapType, clearcoatMap: !!r.clearcoatMap, clearcoatRoughnessMap: !!r.clearcoatRoughnessMap, clearcoatNormalMap: !!r.clearcoatNormalMap, displacementMap: !!r.displacementMap, roughnessMap: !!r.roughnessMap, metalnessMap: !!r.metalnessMap, specularMap: !!r.specularMap, alphaMap: !!r.alphaMap, gradientMap: !!r.gradientMap, sheen: !!r.sheen, transmissionMap: !!r.transmissionMap, combine: r.combine, vertexTangents: r.normalMap && r.vertexTangents, vertexColors: r.vertexColors, vertexUvs: !!(r.map || r.bumpMap || r.normalMap || r.specularMap || r.alphaMap || r.emissiveMap || r.roughnessMap || r.metalnessMap || r.clearcoatMap || r.clearcoatRoughnessMap || r.clearcoatNormalMap || r.displacementMap || r.transmissionMap), uvsVertexOnly: !(r.map || r.bumpMap || r.normalMap || r.specularMap || r.alphaMap || r.emissiveMap || r.roughnessMap || r.metalnessMap || r.clearcoatNormalMap || r.transmissionMap || !r.displacementMap), fog: !!y, useFog: r.fog, fogExp2: y && y.isFogExp2, flatShading: r.flatShading, sizeAttenuation: r.sizeAttenuation, logarithmicDepthBuffer: l, skinning: r.skinning && b > 0, maxBones: b, useVertexTexture: c, morphTargets: r.morphTargets, morphNormals: r.morphNormals, maxMorphTargets: t.maxMorphTargets, maxMorphNormals: t.maxMorphNormals, numDirLights: s.directional.length, numPointLights: s.point.length, numSpotLights: s.spot.length, numRectAreaLights: s.rectArea.length, numHemiLights: s.hemi.length, numDirLightShadows: s.directionalShadowMap.length, numPointLightShadows: s.pointShadowMap.length, numSpotLightShadows: s.spotShadowMap.length, numClippingPlanes: o.numPlanes, numClipIntersection: o.numIntersection, dithering: r.dithering, shadowMapEnabled: t.shadowMap.enabled && f.length > 0, shadowMapType: t.shadowMap.type, toneMapping: r.toneMapped ? t.toneMapping : 0, physicallyCorrectLights: t.physicallyCorrectLights, premultipliedAlpha: r.premultipliedAlpha, alphaTest: r.alphaTest, doubleSided: 2 === r.side, flipSided: 1 === r.side, depthPacking: void 0 !== r.depthPacking && r.depthPacking, index0AttributeName: r.index0AttributeName, extensionDerivatives: r.extensions && r.extensions.derivatives, extensionFragDepth: r.extensions && r.extensions.fragDepth, extensionDrawBuffers: r.extensions && r.extensions.drawBuffers, extensionShaderTextureLOD: r.extensions && r.extensions.shaderTextureLOD, rendererExtensionFragDepth: a || n.has("EXT_frag_depth"), rendererExtensionDrawBuffers: a || n.has("WEBGL_draw_buffers"), rendererExtensionShaderTextureLod: a || n.has("EXT_shader_texture_lod"), customProgramCacheKey: r.customProgramCacheKey() } }, getProgramCacheKey: function(e) { const n = []; if (e.shaderID ? n.push(e.shaderID) : (n.push(e.fragmentShader), n.push(e.vertexShader)), void 0 !== e.defines) for (const t in e.defines) n.push(t), n.push(e.defines[t]); if (!1 === e.isRawShaderMaterial) { for (let t = 0; t < f.length; t++) n.push(e[f[t]]); n.push(t.outputEncoding), n.push(t.gammaFactor) } return n.push(e.customProgramCacheKey), n.join() }, getUniforms: function(t) { const e = p[t.type]; let n; if (e) { const t = ln[e]; n = je.clone(t.uniforms) } else n = t.uniforms; return n }, acquireProgram: function(e, n) { let i; for (let t = 0, e = s.length; t < e; t++) { const e = s[t]; if (e.cacheKey === n) { i = e, ++i.usedTimes; break } } return void 0 === i && (i = new Ui(t, n, e, r), s.push(i)), i }, releaseProgram: function(t) { if (0 == --t.usedTimes) { const e = s.indexOf(t); s[e] = s[s.length - 1], s.pop(), t.destroy() } }, programs: s } } function Gi() { 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 Vi(t, e) { return t.groupOrder !== e.groupOrder ? t.groupOrder - e.groupOrder : t.renderOrder !== e.renderOrder ? t.renderOrder - e.renderOrder : t.program !== e.program ? t.program.id - e.program.id : 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 ki(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 Wi(t) { const e = []; let n = 0; const i = [], r = [], o = { id: -1 }; function s(i, r, s, a, l, c) { let h = e[n]; const u = t.get(s); return void 0 === h ? (h = { id: i.id, object: i, geometry: r, material: s, program: u.program || o, groupOrder: a, renderOrder: i.renderOrder, z: l, group: c }, e[n] = h) : (h.id = i.id, h.object = i, h.geometry = r, h.material = s, h.program = u.program || o, h.groupOrder = a, h.renderOrder = i.renderOrder, h.z = l, h.group = c), n++, h } return { opaque: i, transparent: r, init: function() { n = 0, i.length = 0, r.length = 0 }, push: function(t, e, n, o, a, l) { const c = s(t, e, n, o, a, l); (!0 === n.transparent ? r : i).push(c) }, unshift: function(t, e, n, o, a, l) { const c = s(t, e, n, o, a, l); (!0 === n.transparent ? r : i).unshift(c) }, finish: function() { for (let t = n, i = e.length; t < i; t++) { const n = e[t]; if (null === n.id) break; n.id = null, n.object = null, n.geometry = null, n.material = null, n.program = null, n.group = null } }, sort: function(t, e) { i.length > 1 && i.sort(t || Vi), r.length > 1 && r.sort(e || ki) } } } function ji(t) { let e = new WeakMap; return { get: function(n, i) { const r = e.get(n); let o; return void 0 === r ? (o = new Wi(t), e.set(n, new WeakMap), e.get(n).set(i, o)) : (o = r.get(i), void 0 === o && (o = new Wi(t), r.set(i, o))), o }, dispose: function() { e = new WeakMap } } } function Xi() { 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 T, color: new Yt }; break; case "SpotLight": n = { position: new T, direction: new T, color: new Yt, distance: 0, coneCos: 0, penumbraCos: 0, decay: 0 }; break; case "PointLight": n = { position: new T, color: new Yt, distance: 0, decay: 0 }; break; case "HemisphereLight": n = { direction: new T, skyColor: new Yt, groundColor: new Yt }; break; case "RectAreaLight": n = { color: new Yt, position: new T, halfWidth: new T, halfHeight: new T } } return t[e.id] = n, n } } } let qi = 0; function Yi(t, e) { return (e.castShadow ? 1 : 0) - (t.castShadow ? 1 : 0) } function Qi(t, e) { const n = new Xi, 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 v }; break; case "PointLight": n = { shadowBias: 0, shadowNormalBias: 0, shadowRadius: 1, shadowMapSize: new v, 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 T); const o = new T, s = new et, a = new et; return { setup: function(o) { let s = 0, a = 0, l = 0; for (let t = 0; t < 9; t++) r.probe[t].set(0, 0, 0); let c = 0, h = 0, u = 0, d = 0, p = 0, f = 0, m = 0, g = 0; o.sort(Yi); for (let t = 0, e = o.length; t < e; t++) { const e = o[t], v = e.color, y = e.intensity, A = e.distance, x = e.shadow && e.shadow.map ? e.shadow.map.texture : null; if (e.isAmbientLight) s += v.r * y, a += v.g * y, l += v.b * y; else if (e.isLightProbe) for (let t = 0; t < 9; t++) r.probe[t].addScaledVector(e.sh.coefficients[t], y); else if (e.isDirectionalLight) { const t = n.get(e); if (t.color.copy(e.color).multiplyScalar(e.intensity), 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] = x, r.directionalShadowMatrix[c] = e.shadow.matrix, f++ } r.directional[c] = t, c++ } else if (e.isSpotLight) { const t = n.get(e); if (t.position.setFromMatrixPosition(e.matrixWorld), t.color.copy(v).multiplyScalar(y), t.distance = A, 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[u] = n, r.spotShadowMap[u] = x, r.spotShadowMatrix[u] = e.shadow.matrix, g++ } r.spot[u] = t, u++ } else if (e.isRectAreaLight) { const t = n.get(e); t.color.copy(v).multiplyScalar(y), t.halfWidth.set(.5 * e.width, 0, 0), t.halfHeight.set(0, .5 * e.height, 0), r.rectArea[d] = t, d++ } else if (e.isPointLight) { const t = n.get(e); if (t.color.copy(e.color).multiplyScalar(e.intensity), 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[h] = n, r.pointShadowMap[h] = x, r.pointShadowMatrix[h] = e.shadow.matrix, m++ } r.point[h] = t, h++ } else if (e.isHemisphereLight) { const t = n.get(e); t.skyColor.copy(e.color).multiplyScalar(y), t.groundColor.copy(e.groundColor).multiplyScalar(y), r.hemi[p] = t, p++ } } d > 0 && (e.isWebGL2 || !0 === t.has("OES_texture_float_linear") ? (r.rectAreaLTC1 = an.LTC_FLOAT_1, r.rectAreaLTC2 = an.LTC_FLOAT_2) : !0 === t.has("OES_texture_half_float_linear") ? (r.rectAreaLTC1 = an.LTC_HALF_1, r.rectAreaLTC2 = an.LTC_HALF_2) : console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")), r.ambient[0] = s, r.ambient[1] = a, r.ambient[2] = l; const v = r.hash; v.directionalLength === c && v.pointLength === h && v.spotLength === u && v.rectAreaLength === d && v.hemiLength === p && v.numDirectionalShadows === f && v.numPointShadows === m && v.numSpotShadows === g || (r.directional.length = c, r.spot.length = u, r.rectArea.length = d, r.point.length = h, r.hemi.length = p, r.directionalShadow.length = f, r.directionalShadowMap.length = f, r.pointShadow.length = m, r.pointShadowMap.length = m, r.spotShadow.length = g, r.spotShadowMap.length = g, r.directionalShadowMatrix.length = f, r.pointShadowMatrix.length = m, r.spotShadowMatrix.length = g, v.directionalLength = c, v.pointLength = h, v.spotLength = u, v.rectAreaLength = d, v.hemiLength = p, v.numDirectionalShadows = f, v.numPointShadows = m, v.numSpotShadows = g, r.version = qi++) }, setupView: function(t, e) { let n = 0, i = 0, l = 0, c = 0, h = 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), o.setFromMatrixPosition(d.target.matrixWorld), t.direction.sub(o), 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), o.setFromMatrixPosition(d.target.matrixWorld), t.direction.sub(o), t.direction.transformDirection(u), l++ } else if (d.isRectAreaLight) { const t = r.rectArea[c]; t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), a.identity(), s.copy(d.matrixWorld), s.premultiply(u), a.extractRotation(s), t.halfWidth.set(.5 * d.width, 0, 0), t.halfHeight.set(0, .5 * d.height, 0), t.halfWidth.applyMatrix4(a), t.halfHeight.applyMatrix4(a), c++ } 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[h]; t.direction.setFromMatrixPosition(d.matrixWorld), t.direction.transformDirection(u), t.direction.normalize(), h++ } } }, state: r } } function Zi(t, e) { const n = new Qi(t, e), i = [], r = []; return { init: function() { i.length = 0, r.length = 0 }, state: { lightsArray: i, shadowsArray: r, lights: n }, setupLights: function() { n.setup(i) }, setupLightsView: function(t) { n.setupView(i, t) }, pushLight: function(t) { i.push(t) }, pushShadow: function(t) { r.push(t) } } } function Ji(t, e) { let n = new WeakMap; return { get: function(i, r = 0) { let o; return !1 === n.has(i) ? (o = new Zi(t, e), n.set(i, []), n.get(i).push(o)) : r >= n.get(i).length ? (o = new Zi(t, e), n.get(i).push(o)) : o = n.get(i)[r], o }, dispose: function() { n = new WeakMap } } } function Ki(t) { Jt.call(this), this.type = "MeshDepthMaterial", this.depthPacking = 3200, this.skinning = !1, this.morphTargets = !1, 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) } function $i(t) { Jt.call(this), this.type = "MeshDistanceMaterial", this.referencePosition = new T, this.nearDistance = 1, this.farDistance = 1e3, this.skinning = !1, this.morphTargets = !1, this.map = null, this.alphaMap = null, this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.fog = !1, this.setValues(t) } Ki.prototype = Object.create(Jt.prototype), Ki.prototype.constructor = Ki, Ki.prototype.isMeshDepthMaterial = !0, Ki.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.depthPacking = t.depthPacking, this.skinning = t.skinning, this.morphTargets = t.morphTargets, 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 }, $i.prototype = Object.create(Jt.prototype), $i.prototype.constructor = $i, $i.prototype.isMeshDistanceMaterial = !0, $i.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.referencePosition.copy(t.referencePosition), this.nearDistance = t.nearDistance, this.farDistance = t.farDistance, this.skinning = t.skinning, this.morphTargets = t.morphTargets, this.map = t.map, this.alphaMap = t.alphaMap, this.displacementMap = t.displacementMap, this.displacementScale = t.displacementScale, this.displacementBias = t.displacementBias, this }; function tr(t, e, n) { let i = new en; const r = new v, o = new v, s = new M, a = [], l = [], c = {}, h = { 0: 1, 1: 0, 2: 2 }, u = new Xe({ defines: { SAMPLE_RATE: 2 / 8, HALF_SAMPLE_RATE: 1 / 8 }, uniforms: { shadow_pass: { value: null }, resolution: { value: new v }, radius: { value: 4 } }, vertexShader: "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}", fragmentShader: "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}" }), d = u.clone(); d.defines.HORIZONTAL_PASS = 1; const p = new be; p.setAttribute("position", new ee(new Float32Array([-1, -1, .5, 3, -1, .5, -1, 3, .5]), 3)); const f = new He(p, u), m = this; function g(n, i) { const r = e.update(f); u.uniforms.shadow_pass.value = n.map.texture, u.uniforms.resolution.value = n.mapSize, u.uniforms.radius.value = n.radius, t.setRenderTarget(n.mapPass), t.clear(), t.renderBufferDirect(i, null, r, u, f, null), d.uniforms.shadow_pass.value = n.mapPass.texture, d.uniforms.resolution.value = n.mapSize, d.uniforms.radius.value = n.radius, t.setRenderTarget(n.map), t.clear(), t.renderBufferDirect(i, null, r, d, f, null) } function y(t, e, n) { const i = t << 0 | e << 1 | n << 2; let r = a[i]; return void 0 === r && (r = new Ki({ depthPacking: 3201, morphTargets: t, skinning: e }), a[i] = r), r } function A(t, e, n) { const i = t << 0 | e << 1 | n << 2; let r = l[i]; return void 0 === r && (r = new $i({ morphTargets: t, skinning: e }), l[i] = r), r } function x(e, n, i, r, o, s, a) { let l = null, u = y, d = e.customDepthMaterial; if (!0 === r.isPointLight && (u = A, d = e.customDistanceMaterial), void 0 === d) { let t = !1; !0 === i.morphTargets && (t = n.morphAttributes && n.morphAttributes.position && n.morphAttributes.position.length > 0); let r = !1; !0 === e.isSkinnedMesh && (!0 === i.skinning ? r = !0 : console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:", e)); l = u(t, r, !0 === e.isInstancedMesh) } else l = d; if (t.localClippingEnabled && !0 === i.clipShadows && 0 !== i.clippingPlanes.length) { const t = l.uuid, e = i.uuid; let n = c[t]; void 0 === n && (n = {}, c[t] = n); let r = n[e]; void 0 === r && (r = l.clone(), n[e] = r), l = r } return l.visible = i.visible, l.wireframe = i.wireframe, l.side = 3 === a ? null !== i.shadowSide ? i.shadowSide : i.side : null !== i.shadowSide ? i.shadowSide : h[i.side], l.clipShadows = i.clipShadows, l.clippingPlanes = i.clippingPlanes, l.clipIntersection = i.clipIntersection, l.wireframeLinewidth = i.wireframeLinewidth, l.linewidth = i.linewidth, !0 === r.isPointLight && !0 === l.isMeshDistanceMaterial && (l.referencePosition.setFromMatrixPosition(r.matrixWorld), l.nearDistance = o, l.farDistance = s), l } function _(n, r, o, s, a) { if (!1 === n.visible) return; if (n.layers.test(r.layers) && (n.isMesh || n.isLine || n.isPoints) && (n.castShadow || n.receiveShadow && 3 === a) && (!n.frustumCulled || i.intersectsObject(n))) { n.modelViewMatrix.multiplyMatrices(o.matrixWorldInverse, n.matrixWorld); const i = e.update(n), r = n.material; if (Array.isArray(r)) { const e = i.groups; for (let l = 0, c = e.length; l < c; l++) { const c = e[l], h = r[c.materialIndex]; if (h && h.visible) { const e = x(n, i, h, s, o.near, o.far, a); t.renderBufferDirect(o, null, i, e, n, c) } } } else if (r.visible) { const e = x(n, i, r, s, o.near, o.far, a); t.renderBufferDirect(o, null, i, e, n, null) } } const l = n.children; for (let t = 0, e = l.length; t < e; t++) _(l[t], r, o, s, a) } this.enabled = !1, this.autoUpdate = !0, this.needsUpdate = !1, this.type = 1, this.render = function(e, a, l) { if (!1 === m.enabled) return; if (!1 === m.autoUpdate && !1 === m.needsUpdate) return; if (0 === e.length) return; const c = 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 c = 0, h = e.length; c < h; c++) { const h = e[c], 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), o.copy(u.mapSize), (r.x > n || r.y > n) && (r.x > n && (o.x = Math.floor(n / p.x), r.x = o.x * p.x, u.mapSize.x = o.x), r.y > n && (o.y = Math.floor(n / p.y), r.y = o.y * p.y, u.mapSize.y = o.y)), null === u.map && !u.isPointLightShadow && 3 === this.type) { const t = { minFilter: 1006, magFilter: 1006, format: 1023 }; u.map = new E(r.x, r.y, t), u.map.texture.name = h.name + ".shadowMap", u.mapPass = new E(r.x, r.y, t), u.camera.updateProjectionMatrix() } if (null === u.map) { const t = { minFilter: 1003, magFilter: 1003, format: 1023 }; u.map = new E(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); s.set(o.x * e.x, o.y * e.y, o.x * e.z, o.y * e.w), d.viewport(s), u.updateMatrices(h, t), i = u.getFrustum(), _(a, l, u.camera, h, this.type) } u.isPointLightShadow || 3 !== this.type || g(u, l), u.needsUpdate = !1 } m.needsUpdate = !1, t.setRenderTarget(c, h, u) } } function er(t, e, n) { const i = n.isWebGL2; const r = new function() { let e = !1; const n = new M; let i = null; const r = new M(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, o, s, a) { !0 === a && (e *= s, i *= s, o *= s), n.set(e, i, o, s), !1 === r.equals(n) && (t.clearColor(e, i, o, s), r.copy(n)) }, reset: function() { e = !1, i = null, r.set(-1, 0, 0, 0) } } }, o = new function() { let e = !1, n = null, i = null, r = null; return { setTest: function(t) { t ? O(2929) : N(2929) }, 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(512); break; case 1: t.depthFunc(519); break; case 2: t.depthFunc(513); break; case 3: t.depthFunc(515); break; case 4: t.depthFunc(514); break; case 5: t.depthFunc(518); break; case 6: t.depthFunc(516); break; case 7: t.depthFunc(517); break; default: t.depthFunc(515) } else t.depthFunc(515); 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 } } }, s = new function() { let e = !1, n = null, i = null, r = null, o = null, s = null, a = null, l = null, c = null; return { setTest: function(t) { e || (t ? O(2960) : N(2960)) }, setMask: function(i) { n === i || e || (t.stencilMask(i), n = i) }, setFunc: function(e, n, s) { i === e && r === n && o === s || (t.stencilFunc(e, n, s), i = e, r = n, o = s) }, setOp: function(e, n, i) { s === e && a === n && l === i || (t.stencilOp(e, n, i), s = e, a = n, l = i) }, setLocked: function(t) { e = t }, setClear: function(e) { c !== e && (t.clearStencil(e), c = e) }, reset: function() { e = !1, n = null, i = null, r = null, o = null, s = null, a = null, l = null, c = null } } }; let a = {}, l = null, c = null, h = null, u = null, d = null, p = null, f = null, m = null, g = null, v = !1, y = null, A = null, x = null, _ = null, b = null; const w = t.getParameter(35661); let E = !1, S = 0; const T = t.getParameter(7938); - 1 !== T.indexOf("WebGL") ? (S = parseFloat(/^WebGL (\d)/.exec(T)[1]), E = S >= 1) : -1 !== T.indexOf("OpenGL ES") && (S = parseFloat(/^OpenGL ES (\d)/.exec(T)[1]), E = S >= 2); let L = null, R = {}; const C = new M, P = new M; function D(e, n, i) { const r = new Uint8Array(4), o = t.createTexture(); t.bindTexture(e, o), t.texParameteri(e, 10241, 9728), t.texParameteri(e, 10240, 9728); for (let e = 0; e < i; e++) t.texImage2D(n + e, 0, 6408, 1, 1, 0, 6408, 5121, r); return o } const I = {}; function O(e) { !0 !== a[e] && (t.enable(e), a[e] = !0) } function N(e) { !1 !== a[e] && (t.disable(e), a[e] = !1) } I[3553] = D(3553, 3553, 1), I[34067] = D(34067, 34069, 6), r.setClear(0, 0, 0, 1), o.setClear(1), s.setClear(0), O(2929), o.setFunc(3), U(!1), H(1), O(2884), z(0); const B = { 100: 32774, 101: 32778, 102: 32779 }; if (i) B[103] = 32775, B[104] = 32776; else { const t = e.get("EXT_blend_minmax"); null !== t && (B[103] = t.MIN_EXT, B[104] = t.MAX_EXT) } const F = { 200: 0, 201: 1, 202: 768, 204: 770, 210: 776, 208: 774, 206: 772, 203: 769, 205: 771, 209: 775, 207: 773 }; function z(e, n, i, r, o, s, a, l) { if (0 !== e) { if (c || (O(3042), c = !0), 5 === e) o = o || n, s = s || i, a = a || r, n === u && o === f || (t.blendEquationSeparate(B[n], B[o]), u = n, f = o), i === d && r === p && s === m && a === g || (t.blendFuncSeparate(F[i], F[r], F[s], F[a]), d = i, p = r, m = s, g = a), h = e, v = null; else if (e !== h || l !== v) { if (100 === u && 100 === f || (t.blendEquation(32774), u = 100, f = 100), l) switch (e) { case 1: t.blendFuncSeparate(1, 771, 1, 771); break; case 2: t.blendFunc(1, 1); break; case 3: t.blendFuncSeparate(0, 0, 769, 771); break; case 4: t.blendFuncSeparate(0, 768, 0, 770); break; default: console.error("THREE.WebGLState: Invalid blending: ", e) } else switch (e) { case 1: t.blendFuncSeparate(770, 771, 1, 771); break; case 2: t.blendFunc(770, 1); break; case 3: t.blendFunc(0, 769); break; case 4: t.blendFunc(0, 768); break; default: console.error("THREE.WebGLState: Invalid blending: ", e) } d = null, p = null, m = null, g = null, h = e, v = l } } else c && (N(3042), c = !1) } function U(e) { y !== e && (e ? t.frontFace(2304) : t.frontFace(2305), y = e) } function H(e) { 0 !== e ? (O(2884), e !== A && (1 === e ? t.cullFace(1029) : 2 === e ? t.cullFace(1028) : t.cullFace(1032))) : N(2884), A = e } function G(e, n, i) { e ? (O(32823), _ === n && b === i || (t.polygonOffset(n, i), _ = n, b = i)) : N(32823) } function V(e) { void 0 === e && (e = 33984 + w - 1), L !== e && (t.activeTexture(e), L = e) } return { buffers: { color: r, depth: o, stencil: s }, enable: O, disable: N, useProgram: function(e) { return l !== e && (t.useProgram(e), l = e, !0) }, setBlending: z, setMaterial: function(t, e) { 2 === t.side ? N(2884) : O(2884); let n = 1 === t.side; e && (n = !n), U(n), 1 === t.blending && !1 === t.transparent ? z(0) : z(t.blending, t.blendEquation, t.blendSrc, t.blendDst, t.blendEquationAlpha, t.blendSrcAlpha, t.blendDstAlpha, t.premultipliedAlpha), o.setFunc(t.depthFunc), o.setTest(t.depthTest), o.setMask(t.depthWrite), r.setMask(t.colorWrite); const i = t.stencilWrite; s.setTest(i), i && (s.setMask(t.stencilWriteMask), s.setFunc(t.stencilFunc, t.stencilRef, t.stencilFuncMask), s.setOp(t.stencilFail, t.stencilZFail, t.stencilZPass)), G(t.polygonOffset, t.polygonOffsetFactor, t.polygonOffsetUnits) }, setFlipSided: U, setCullFace: H, setLineWidth: function(e) { e !== x && (E && t.lineWidth(e), x = e) }, setPolygonOffset: G, setScissorTest: function(t) { t ? O(3089) : N(3089) }, activeTexture: V, bindTexture: function(e, n) { null === L && V(); let i = R[L]; void 0 === i && (i = { type: void 0, texture: void 0 }, R[L] = i), i.type === e && i.texture === n || (t.bindTexture(e, n || I[e]), i.type = e, i.texture = n) }, unbindTexture: function() { const e = R[L]; 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) } }, scissor: function(e) { !1 === C.equals(e) && (t.scissor(e.x, e.y, e.z, e.w), C.copy(e)) }, viewport: function(e) { !1 === P.equals(e) && (t.viewport(e.x, e.y, e.z, e.w), P.copy(e)) }, reset: function() { a = {}, L = null, R = {}, l = null, c = null, h = null, u = null, d = null, p = null, f = null, m = null, g = null, v = !1, y = null, A = null, x = null, _ = null, b = null, r.reset(), o.reset(), s.reset() } } } function nr(t, e, n, i, r, o, s) { const a = r.isWebGL2, l = r.maxTextures, c = r.maxCubemapSize, h = r.maxTextureSize, u = r.maxSamples, d = new WeakMap; let p, f = !1; try { f = "undefined" != typeof OffscreenCanvas && null !== new OffscreenCanvas(1, 1).getContext("2d") } catch (t) {} function m(t, e) { return f ? new OffscreenCanvas(t, e) : document.createElementNS("http://www.w3.org/1999/xhtml", "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 ? g.floorPowerOfTwo : Math.floor, o = i(r * t.width), s = i(r * t.height); void 0 === p && (p = m(o, s)); const a = n ? m(o, s) : p; a.width = o, a.height = s; return a.getContext("2d").drawImage(t, 0, 0, o, s), console.warn("THREE.WebGLRenderer: Texture has been resized from (" + t.width + "x" + t.height + ") to (" + o + "x" + s + ")."), a } return "data" in t && console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + t.width + "x" + t.height + ")."), t } return t } function y(t) { return g.isPowerOfTwo(t.width) && g.isPowerOfTwo(t.height) } function A(t, e) { return t.generateMipmaps && e && 1003 !== t.minFilter && 1006 !== t.minFilter } function x(e, n, r, o) { t.generateMipmap(e); i.get(n).__maxMipLevel = Math.log(Math.max(r, o)) * Math.LOG2E } function _(n, i, r) { if (!1 === a) 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 o = i; return 6403 === i && (5126 === r && (o = 33326), 5131 === r && (o = 33325), 5121 === r && (o = 33321)), 6407 === i && (5126 === r && (o = 34837), 5131 === r && (o = 34843), 5121 === r && (o = 32849)), 6408 === i && (5126 === r && (o = 34836), 5131 === r && (o = 34842), 5121 === r && (o = 32856)), 33325 !== o && 33326 !== o && 34842 !== o && 34836 !== o || e.get("EXT_color_buffer_float"), o } function b(t) { return 1003 === t || 1004 === t || 1005 === t ? 9728 : 9729 } function w(e) { const n = e.target; n.removeEventListener("dispose", w), function(e) { const n = i.get(e); if (void 0 === n.__webglInit) return; t.deleteTexture(n.__webglTexture), i.remove(e) }(n), n.isVideoTexture && d.delete(n), s.memory.textures-- } function M(e) { const n = e.target; n.removeEventListener("dispose", M), function(e) { const n = i.get(e), r = i.get(e.texture); if (!e) return; void 0 !== r.__webglTexture && t.deleteTexture(r.__webglTexture); e.depthTexture && e.depthTexture.dispose(); if (e.isWebGLCubeRenderTarget) for (let e = 0; e < 6; e++) t.deleteFramebuffer(n.__webglFramebuffer[e]), n.__webglDepthbuffer && t.deleteRenderbuffer(n.__webglDepthbuffer[e]); else t.deleteFramebuffer(n.__webglFramebuffer), n.__webglDepthbuffer && t.deleteRenderbuffer(n.__webglDepthbuffer), n.__webglMultisampledFramebuffer && t.deleteFramebuffer(n.__webglMultisampledFramebuffer), n.__webglColorRenderbuffer && t.deleteRenderbuffer(n.__webglColorRenderbuffer), n.__webglDepthRenderbuffer && t.deleteRenderbuffer(n.__webglDepthRenderbuffer); i.remove(e.texture), i.remove(e) }(n), s.memory.textures-- } let E = 0; function S(t, e) { const r = i.get(t); if (t.isVideoTexture && function(t) { const e = s.render.frame; d.get(t) !== e && (d.set(t, e), t.update()) }(t), t.version > 0 && r.__version !== t.version) { const n = t.image; if (void 0 === n) console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined"); else { if (!1 !== n.complete) return void D(r, t, e); console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete") } } n.activeTexture(33984 + e), n.bindTexture(3553, r.__webglTexture) } function T(e, r) { const s = i.get(e); e.version > 0 && s.__version !== e.version ? function(e, i, r) { if (6 !== i.image.length) return; P(e, i), n.activeTexture(33984 + r), n.bindTexture(34067, e.__webglTexture), t.pixelStorei(37440, i.flipY), t.pixelStorei(37441, i.premultiplyAlpha), t.pixelStorei(3317, i.unpackAlignment); const s = i && (i.isCompressedTexture || i.image[0].isCompressedTexture), l = i.image[0] && i.image[0].isDataTexture, h = []; for (let t = 0; t < 6; t++) h[t] = s || l ? l ? i.image[t].image : i.image[t] : v(i.image[t], !1, !0, c); const u = h[0], d = y(u) || a, p = o.convert(i.format), f = o.convert(i.type), m = _(i.internalFormat, p, f); let g; if (C(34067, i, d), s) { for (let t = 0; t < 6; t++) { g = h[t].mipmaps; for (let e = 0; e < g.length; e++) { const r = g[e]; 1023 !== i.format && 1022 !== i.format ? null !== p ? n.compressedTexImage2D(34069 + t, e, m, r.width, r.height, 0, r.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()") : n.texImage2D(34069 + t, e, m, r.width, r.height, 0, p, f, r.data) } } e.__maxMipLevel = g.length - 1 } else { g = i.mipmaps; for (let t = 0; t < 6; t++) if (l) { n.texImage2D(34069 + t, 0, m, h[t].width, h[t].height, 0, p, f, h[t].data); for (let e = 0; e < g.length; e++) { const i = g[e].image[t].image; n.texImage2D(34069 + t, e + 1, m, i.width, i.height, 0, p, f, i.data) } } else { n.texImage2D(34069 + t, 0, m, p, f, h[t]); for (let e = 0; e < g.length; e++) { const i = g[e]; n.texImage2D(34069 + t, e + 1, m, p, f, i.image[t]) } } e.__maxMipLevel = g.length } A(i, d) && x(34067, i, u.width, u.height); e.__version = i.version, i.onUpdate && i.onUpdate(i) }(s, e, r) : (n.activeTexture(33984 + r), n.bindTexture(34067, s.__webglTexture)) } const L = { 1e3: 10497, 1001: 33071, 1002: 33648 }, R = { 1003: 9728, 1004: 9984, 1005: 9986, 1006: 9729, 1007: 9985, 1008: 9987 }; function C(n, o, s) { s ? (t.texParameteri(n, 10242, L[o.wrapS]), t.texParameteri(n, 10243, L[o.wrapT]), 32879 !== n && 35866 !== n || t.texParameteri(n, 32882, L[o.wrapR]), t.texParameteri(n, 10240, R[o.magFilter]), t.texParameteri(n, 10241, R[o.minFilter])) : (t.texParameteri(n, 10242, 33071), t.texParameteri(n, 10243, 33071), 32879 !== n && 35866 !== n || t.texParameteri(n, 32882, 33071), 1001 === o.wrapS && 1001 === o.wrapT || console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."), t.texParameteri(n, 10240, b(o.magFilter)), t.texParameteri(n, 10241, b(o.minFilter)), 1003 !== o.minFilter && 1006 !== o.minFilter && console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")); const l = e.get("EXT_texture_filter_anisotropic"); if (l) { if (1015 === o.type && null === e.get("OES_texture_float_linear")) return; if (1016 === o.type && null === (a || e.get("OES_texture_half_float_linear"))) return; (o.anisotropy > 1 || i.get(o).__currentAnisotropy) && (t.texParameterf(n, l.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(o.anisotropy, r.getMaxAnisotropy())), i.get(o).__currentAnisotropy = o.anisotropy) } } function P(e, n) { void 0 === e.__webglInit && (e.__webglInit = !0, n.addEventListener("dispose", w), e.__webglTexture = t.createTexture(), s.memory.textures++) } function D(e, i, r) { let s = 3553; i.isDataTexture2DArray && (s = 35866), i.isDataTexture3D && (s = 32879), P(e, i), n.activeTexture(33984 + r), n.bindTexture(s, e.__webglTexture), t.pixelStorei(37440, i.flipY), t.pixelStorei(37441, i.premultiplyAlpha), t.pixelStorei(3317, i.unpackAlignment); const l = function(t) { return !a && (1001 !== t.wrapS || 1001 !== t.wrapT || 1003 !== t.minFilter && 1006 !== t.minFilter) }(i) && !1 === y(i.image), c = v(i.image, l, !1, h), u = y(c) || a, d = o.convert(i.format); let p, f = o.convert(i.type), m = _(i.internalFormat, d, f); C(s, i, u); const g = i.mipmaps; if (i.isDepthTexture) m = 6402, a ? m = 1015 === i.type ? 36012 : 1014 === i.type ? 33190 : 1020 === i.type ? 35056 : 33189 : 1015 === i.type && console.error("WebGLRenderer: Floating point depth texture requires WebGL2."), 1026 === i.format && 6402 === m && 1012 !== i.type && 1014 !== i.type && (console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."), i.type = 1012, f = o.convert(i.type)), 1027 === i.format && 6402 === m && (m = 34041, 1020 !== i.type && (console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."), i.type = 1020, f = o.convert(i.type))), n.texImage2D(3553, 0, m, c.width, c.height, 0, d, f, null); else if (i.isDataTexture) if (g.length > 0 && u) { for (let t = 0, e = g.length; t < e; t++) p = g[t], n.texImage2D(3553, t, m, p.width, p.height, 0, d, f, p.data); i.generateMipmaps = !1, e.__maxMipLevel = g.length - 1 } else n.texImage2D(3553, 0, m, c.width, c.height, 0, d, f, c.data), e.__maxMipLevel = 0; else if (i.isCompressedTexture) { for (let t = 0, e = g.length; t < e; t++) p = g[t], 1023 !== i.format && 1022 !== i.format ? null !== d ? n.compressedTexImage2D(3553, t, m, p.width, p.height, 0, p.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()") : n.texImage2D(3553, t, m, p.width, p.height, 0, d, f, p.data); e.__maxMipLevel = g.length - 1 } else if (i.isDataTexture2DArray) n.texImage3D(35866, 0, m, c.width, c.height, c.depth, 0, d, f, c.data), e.__maxMipLevel = 0; else if (i.isDataTexture3D) n.texImage3D(32879, 0, m, c.width, c.height, c.depth, 0, d, f, c.data), e.__maxMipLevel = 0; else if (g.length > 0 && u) { for (let t = 0, e = g.length; t < e; t++) p = g[t], n.texImage2D(3553, t, m, d, f, p); i.generateMipmaps = !1, e.__maxMipLevel = g.length - 1 } else n.texImage2D(3553, 0, m, d, f, c), e.__maxMipLevel = 0; A(i, u) && x(s, i, c.width, c.height), e.__version = i.version, i.onUpdate && i.onUpdate(i) } function I(e, r, s, a) { const l = o.convert(r.texture.format), c = o.convert(r.texture.type), h = _(r.texture.internalFormat, l, c); n.texImage2D(a, 0, h, r.width, r.height, 0, l, c, null), t.bindFramebuffer(36160, e), t.framebufferTexture2D(36160, s, a, i.get(r.texture).__webglTexture, 0), t.bindFramebuffer(36160, null) } function O(e, n, i) { if (t.bindRenderbuffer(36161, e), n.depthBuffer && !n.stencilBuffer) { let r = 33189; if (i) { const e = n.depthTexture; e && e.isDepthTexture && (1015 === e.type ? r = 36012 : 1014 === e.type && (r = 33190)); const i = B(n); t.renderbufferStorageMultisample(36161, i, r, n.width, n.height) } else t.renderbufferStorage(36161, r, n.width, n.height); t.framebufferRenderbuffer(36160, 36096, 36161, e) } else if (n.depthBuffer && n.stencilBuffer) { if (i) { const e = B(n); t.renderbufferStorageMultisample(36161, e, 35056, n.width, n.height) } else t.renderbufferStorage(36161, 34041, n.width, n.height); t.framebufferRenderbuffer(36160, 33306, 36161, e) } else { const e = o.convert(n.texture.format), r = o.convert(n.texture.type), s = _(n.texture.internalFormat, e, r); if (i) { const e = B(n); t.renderbufferStorageMultisample(36161, e, s, n.width, n.height) } else t.renderbufferStorage(36161, s, n.width, n.height) } t.bindRenderbuffer(36161, null) } function N(e) { const n = i.get(e), r = !0 === e.isWebGLCubeRenderTarget; if (e.depthTexture) { if (r) throw new Error("target.depthTexture not supported in Cube render targets"); ! function(e, n) { if (n && n.isWebGLCubeRenderTarget) throw new Error("Depth Texture with cube render targets is not supported"); if (t.bindFramebuffer(36160, e), !n.depthTexture || !n.depthTexture.isDepthTexture) throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture"); i.get(n.depthTexture).__webglTexture && n.depthTexture.image.width === n.width && n.depthTexture.image.height === n.height || (n.depthTexture.image.width = n.width, n.depthTexture.image.height = n.height, n.depthTexture.needsUpdate = !0), S(n.depthTexture, 0); const r = i.get(n.depthTexture).__webglTexture; if (1026 === n.depthTexture.format) t.framebufferTexture2D(36160, 36096, 3553, r, 0); else { if (1027 !== n.depthTexture.format) throw new Error("Unknown depthTexture format"); t.framebufferTexture2D(36160, 33306, 3553, r, 0) } }(n.__webglFramebuffer, e) } else if (r) { n.__webglDepthbuffer = []; for (let i = 0; i < 6; i++) t.bindFramebuffer(36160, n.__webglFramebuffer[i]), n.__webglDepthbuffer[i] = t.createRenderbuffer(), O(n.__webglDepthbuffer[i], e, !1) } else t.bindFramebuffer(36160, n.__webglFramebuffer), n.__webglDepthbuffer = t.createRenderbuffer(), O(n.__webglDepthbuffer, e, !1); t.bindFramebuffer(36160, null) } function B(t) { return a && t.isWebGLMultisampleRenderTarget ? Math.min(u, t.samples) : 0 } let F = !1, z = !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 = S, this.setTexture2DArray = function(t, e) { const r = i.get(t); t.version > 0 && r.__version !== t.version ? D(r, t, e) : (n.activeTexture(33984 + e), n.bindTexture(35866, r.__webglTexture)) }, this.setTexture3D = function(t, e) { const r = i.get(t); t.version > 0 && r.__version !== t.version ? D(r, t, e) : (n.activeTexture(33984 + e), n.bindTexture(32879, r.__webglTexture)) }, this.setTextureCube = T, this.setupRenderTarget = function(e) { const r = i.get(e), l = i.get(e.texture); e.addEventListener("dispose", M), l.__webglTexture = t.createTexture(), s.memory.textures++; const c = !0 === e.isWebGLCubeRenderTarget, h = !0 === e.isWebGLMultisampleRenderTarget, u = y(e) || a; if (!a || 1022 !== e.texture.format || 1015 !== e.texture.type && 1016 !== e.texture.type || (e.texture.format = 1023, console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")), c) { r.__webglFramebuffer = []; for (let e = 0; e < 6; e++) r.__webglFramebuffer[e] = t.createFramebuffer() } else if (r.__webglFramebuffer = t.createFramebuffer(), h) if (a) { r.__webglMultisampledFramebuffer = t.createFramebuffer(), r.__webglColorRenderbuffer = t.createRenderbuffer(), t.bindRenderbuffer(36161, r.__webglColorRenderbuffer); const n = o.convert(e.texture.format), i = o.convert(e.texture.type), s = _(e.texture.internalFormat, n, i), a = B(e); t.renderbufferStorageMultisample(36161, a, s, e.width, e.height), t.bindFramebuffer(36160, r.__webglMultisampledFramebuffer), t.framebufferRenderbuffer(36160, 36064, 36161, r.__webglColorRenderbuffer), t.bindRenderbuffer(36161, null), e.depthBuffer && (r.__webglDepthRenderbuffer = t.createRenderbuffer(), O(r.__webglDepthRenderbuffer, e, !0)), t.bindFramebuffer(36160, null) } else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2."); if (c) { n.bindTexture(34067, l.__webglTexture), C(34067, e.texture, u); for (let t = 0; t < 6; t++) I(r.__webglFramebuffer[t], e, 36064, 34069 + t); A(e.texture, u) && x(34067, e.texture, e.width, e.height), n.bindTexture(34067, null) } else n.bindTexture(3553, l.__webglTexture), C(3553, e.texture, u), I(r.__webglFramebuffer, e, 36064, 3553), A(e.texture, u) && x(3553, e.texture, e.width, e.height), n.bindTexture(3553, null); e.depthBuffer && N(e) }, this.updateRenderTargetMipmap = function(t) { const e = t.texture; if (A(e, y(t) || a)) { const r = t.isWebGLCubeRenderTarget ? 34067 : 3553, o = i.get(e).__webglTexture; n.bindTexture(r, o), x(r, e, t.width, t.height), n.bindTexture(r, null) } }, this.updateMultisampleRenderTarget = function(e) { if (e.isWebGLMultisampleRenderTarget) if (a) { const n = i.get(e); t.bindFramebuffer(36008, n.__webglMultisampledFramebuffer), t.bindFramebuffer(36009, n.__webglFramebuffer); const r = e.width, o = e.height; let s = 16384; e.depthBuffer && (s |= 256), e.stencilBuffer && (s |= 1024), t.blitFramebuffer(0, 0, r, o, 0, 0, r, o, s, 9728), t.bindFramebuffer(36160, n.__webglMultisampledFramebuffer) } else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.") }, this.safeSetTexture2D = function(t, e) { t && t.isWebGLRenderTarget && (!1 === F && (console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."), F = !0), t = t.texture), S(t, e) }, this.safeSetTextureCube = function(t, e) { t && t.isWebGLCubeRenderTarget && (!1 === z && (console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."), z = !0), t = t.texture), T(t, e) } } function ir(t, e, n) { const i = n.isWebGL2; return { convert: function(t) { let n; if (1009 === t) return 5121; if (1017 === t) return 32819; if (1018 === t) return 32820; if (1019 === t) return 33635; if (1010 === t) return 5120; if (1011 === t) return 5122; if (1012 === t) return 5123; if (1013 === t) return 5124; if (1014 === t) return 5125; if (1015 === t) return 5126; if (1016 === t) return i ? 5131 : (n = e.get("OES_texture_half_float"), null !== n ? n.HALF_FLOAT_OES : null); if (1021 === t) return 6406; if (1022 === t) return 6407; if (1023 === t) return 6408; if (1024 === t) return 6409; if (1025 === t) return 6410; if (1026 === t) return 6402; if (1027 === t) return 34041; if (1028 === t) return 6403; if (1029 === t) return 36244; if (1030 === t) return 33319; if (1031 === t) return 33320; if (1032 === t) return 36248; if (1033 === t) return 36249; if (33776 === t || 33777 === t || 33778 === t || 33779 === t) { if (n = e.get("WEBGL_compressed_texture_s3tc"), null === n) return null; if (33776 === t) return n.COMPRESSED_RGB_S3TC_DXT1_EXT; if (33777 === t) return n.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (33778 === t) return n.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (33779 === t) return n.COMPRESSED_RGBA_S3TC_DXT5_EXT } if (35840 === t || 35841 === t || 35842 === t || 35843 === t) { if (n = e.get("WEBGL_compressed_texture_pvrtc"), null === n) return null; if (35840 === t) return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (35841 === t) return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (35842 === t) return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (35843 === t) return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG } if (36196 === t) return n = e.get("WEBGL_compressed_texture_etc1"), null !== n ? n.COMPRESSED_RGB_ETC1_WEBGL : null; if ((37492 === t || 37496 === t) && (n = e.get("WEBGL_compressed_texture_etc"), null !== n)) { if (37492 === t) return n.COMPRESSED_RGB8_ETC2; if (37496 === t) return n.COMPRESSED_RGBA8_ETC2_EAC } return 37808 === t || 37809 === t || 37810 === t || 37811 === t || 37812 === t || 37813 === t || 37814 === t || 37815 === t || 37816 === t || 37817 === t || 37818 === t || 37819 === t || 37820 === t || 37821 === t || 37840 === t || 37841 === t || 37842 === t || 37843 === t || 37844 === t || 37845 === t || 37846 === t || 37847 === t || 37848 === t || 37849 === t || 37850 === t || 37851 === t || 37852 === t || 37853 === t ? (n = e.get("WEBGL_compressed_texture_astc"), null !== n ? t : null) : 36492 === t ? (n = e.get("EXT_texture_compression_bptc"), null !== n ? t : null) : 1020 === t ? i ? 34042 : (n = e.get("WEBGL_depth_texture"), null !== n ? n.UNSIGNED_INT_24_8_WEBGL : null) : void 0 } } } function rr(t = []) { Ye.call(this), this.cameras = t } function or() { St.call(this), this.type = "Group" } function sr() { this._targetRay = null, this._grip = null, this._hand = null } function ar(t, e) { const n = this; let i = null, r = 1, o = null, s = "local-floor", a = null; const l = [], c = new Map, h = new Ye; h.layers.enable(1), h.viewport = new M; const u = new Ye; u.layers.enable(2), u.viewport = new M; const d = [h, u], p = new rr; p.layers.enable(1), p.layers.enable(2); let f = null, m = null; function g(t) { const e = c.get(t.inputSource); e && e.dispatchEvent({ type: t.type, data: t.inputSource }) } function v() { c.forEach((function(t, e) { t.disconnect(e) })), c.clear(), f = null, m = null, t.setFramebuffer(null), t.setRenderTarget(t.getRenderTarget()), w.stop(), n.isPresenting = !1, n.dispatchEvent({ type: "sessionend" }) } function y(t) { const e = i.inputSources; for (let t = 0; t < l.length; t++) c.set(e[t], l[t]); for (let e = 0; e < t.removed.length; e++) { const n = t.removed[e], i = c.get(n); i && (i.dispatchEvent({ type: "disconnected", data: n }), c.delete(n)) } for (let e = 0; e < t.added.length; e++) { const n = t.added[e], i = c.get(n); i && i.dispatchEvent({ type: "connected", data: n }) } } this.enabled = !1, this.isPresenting = !1, this.getController = function(t) { let e = l[t]; return void 0 === e && (e = new sr, l[t] = e), e.getTargetRaySpace() }, this.getControllerGrip = function(t) { let e = l[t]; return void 0 === e && (e = new sr, l[t] = e), e.getGripSpace() }, this.getHand = function(t) { let e = l[t]; return void 0 === e && (e = new sr, l[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) { s = t, !0 === n.isPresenting && console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.") }, this.getReferenceSpace = function() { return o }, this.getSession = function() { return i }, this.setSession = async function(t) { if (i = t, null !== i) { i.addEventListener("select", g), i.addEventListener("selectstart", g), i.addEventListener("selectend", g), i.addEventListener("squeeze", g), i.addEventListener("squeezestart", g), i.addEventListener("squeezeend", g), i.addEventListener("end", v), i.addEventListener("inputsourceschange", y); const t = e.getContextAttributes(); !0 !== t.xrCompatible && await e.makeXRCompatible(); const a = { antialias: t.antialias, alpha: t.alpha, depth: t.depth, stencil: t.stencil, framebufferScaleFactor: r }, l = new XRWebGLLayer(i, e, a); i.updateRenderState({ baseLayer: l }), o = await i.requestReferenceSpace(s), w.setContext(i), w.start(), n.isPresenting = !0, n.dispatchEvent({ type: "sessionstart" }) } }; const A = new T, x = new T; function _(t, e) { null === e ? t.matrixWorld.copy(t.matrix) : t.matrixWorld.multiplyMatrices(e.matrixWorld, t.matrix), t.matrixWorldInverse.copy(t.matrixWorld).invert() } this.getCamera = function(t) { p.near = u.near = h.near = t.near, p.far = u.far = h.far = t.far, f === p.near && m === p.far || (i.updateRenderState({ depthNear: p.near, depthFar: p.far }), f = p.near, m = p.far); const e = t.parent, n = p.cameras; _(p, e); for (let t = 0; t < n.length; t++) _(n[t], e); t.matrixWorld.copy(p.matrixWorld), t.matrix.copy(p.matrix), t.matrix.decompose(t.position, t.quaternion, t.scale); const r = t.children; for (let t = 0, e = r.length; t < e; t++) r[t].updateMatrixWorld(!0); return 2 === n.length ? function(t, e, n) { A.setFromMatrixPosition(e.matrixWorld), x.setFromMatrixPosition(n.matrixWorld); const i = A.distanceTo(x), r = e.projectionMatrix.elements, o = n.projectionMatrix.elements, s = r[14] / (r[10] - 1), a = r[14] / (r[10] + 1), l = (r[9] + 1) / r[5], c = (r[9] - 1) / r[5], h = (r[8] - 1) / r[0], u = (o[8] + 1) / o[0], d = s * h, p = s * u, f = i / (-h + u), m = f * -h; 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 = s + f, v = a + f, y = d - m, _ = p + (i - m), b = l * a / v * g, w = c * a / v * g; t.projectionMatrix.makePerspective(y, _, b, w, g, v) }(p, h, u) : p.projectionMatrix.copy(h.projectionMatrix), p }; let b = null; const w = new nn; w.setAnimationLoop((function(e, n) { if (a = n.getViewerPose(o), null !== a) { const e = a.views, n = i.renderState.baseLayer; t.setFramebuffer(n.framebuffer); let r = !1; e.length !== p.cameras.length && (p.cameras.length = 0, r = !0); for (let t = 0; t < e.length; t++) { const i = e[t], o = n.getViewport(i), s = d[t]; s.matrix.fromArray(i.transform.matrix), s.projectionMatrix.fromArray(i.projectionMatrix), s.viewport.set(o.x, o.y, o.width, o.height), 0 === t && p.matrix.copy(s.matrix), !0 === r && p.cameras.push(s) } } const r = i.inputSources; for (let t = 0; t < l.length; t++) { const e = l[t], i = r[t]; e.update(i, n, o) } b && b(e, n) })), this.setAnimationLoop = function(t) { b = t }, this.dispose = function() {} } function lr(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); const i = t.get(n).envMap; if (i) { e.envMap.value = i, e.flipEnvMap.value = i.isCubeTexture && i._needsFlipEnvMap ? -1 : 1, e.reflectivity.value = n.reflectivity, e.refractionRatio.value = n.refractionRatio; const r = t.get(i).__maxMipLevel; void 0 !== r && (e.maxMipLevel.value = r) } let r, o; 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), void 0 !== r && (r.isWebGLRenderTarget && (r = r.texture), !0 === r.matrixAutoUpdate && r.updateMatrix(), e.uvTransform.value.copy(r.matrix)), n.aoMap ? o = n.aoMap : n.lightMap && (o = n.lightMap), void 0 !== o && (o.isWebGLRenderTarget && (o = o.texture), !0 === o.matrixAutoUpdate && o.updateMatrix(), e.uv2Transform.value.copy(o.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, o) { 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) { n(t, e), t.reflectivity.value = e.reflectivity, t.clearcoat.value = e.clearcoat, t.clearcoatRoughness.value = e.clearcoatRoughness, e.sheen && t.sheen.value.copy(e.sheen); 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()); t.transmission.value = e.transmission, e.transmissionMap && (t.transmissionMap.value = e.transmissionMap) }(t, i) : 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); 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, o) : 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); 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 cr(t) { const e = void 0 !== (t = t || {}).canvas ? t.canvas : function() { const t = document.createElementNS("http://www.w3.org/1999/xhtml", "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, o = void 0 === t.stencil || t.stencil, s = void 0 !== t.antialias && t.antialias, a = void 0 === t.premultipliedAlpha || t.premultipliedAlpha, l = void 0 !== t.preserveDrawingBuffer && t.preserveDrawingBuffer, c = void 0 !== t.powerPreference ? t.powerPreference : "default", h = void 0 !== t.failIfMajorPerformanceCaveat && t.failIfMajorPerformanceCaveat; let u = null, d = null; const p = []; 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.gammaFactor = 2, this.outputEncoding = 3e3, this.physicallyCorrectLights = !1, this.toneMapping = 0, this.toneMappingExposure = 1, this.maxMorphTargets = 8, this.maxMorphNormals = 4; const f = this; let m = !1, y = null, A = 0, x = 0, _ = null, b = null, w = -1, E = null; const S = new M, L = new M; let R = null, C = e.width, P = e.height, D = 1, I = null, O = null; const N = new M(0, 0, C, P), B = new M(0, 0, C, P); let F = !1; const z = new en; let U = !1, H = !1; const G = new et, V = new T, k = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: !0 }; function W() { return null === _ ? D : 1 } let j, X, q, Y, Q, Z, J, K, $, tt, nt, it, rt, ot, st, at, lt, ct, ht, ut, dt, pt = n; function ft(t, n) { for (let i = 0; i < t.length; i++) { const r = t[i], o = e.getContext(r, n); if (null !== o) return o } return null } try { const t = { alpha: i, depth: r, stencil: o, antialias: s, premultipliedAlpha: a, preserveDrawingBuffer: l, powerPreference: c, failIfMajorPerformanceCaveat: h }; if (e.addEventListener("webglcontextlost", yt, !1), e.addEventListener("webglcontextrestored", At, !1), null === pt) { const e = ["webgl2", "webgl", "experimental-webgl"]; if (!0 === f.isWebGL1Renderer && e.shift(), pt = ft(e, t), null === pt) throw ft(e) ? new Error("Error creating WebGL context with your selected attributes.") : new Error("Error creating WebGL context.") } void 0 === pt.getShaderPrecisionFormat && (pt.getShaderPrecisionFormat = function() { return { rangeMin: 1, rangeMax: 1, precision: 1 } }) } catch (t) { throw console.error("THREE.WebGLRenderer: " + t.message), t } function mt() { j = new mn(pt), X = new dn(pt, j, t), j.init(X), ut = new ir(pt, j, X), q = new er(pt, j, X), q.scissor(L.copy(B).multiplyScalar(D).floor()), q.viewport(S.copy(N).multiplyScalar(D).floor()), Y = new yn(pt), Q = new Gi, Z = new nr(pt, j, q, Q, X, ut, Y), J = new fn(f), K = new rn(pt, X), dt = new hn(pt, j, K, X), $ = new gn(pt, K, Y, dt), tt = new bn(pt, $, K, Y), lt = new _n(pt), st = new pn(Q), nt = new Hi(f, J, j, X, dt, st), it = new lr(Q), rt = new ji(Q), ot = new Ji(j, X), at = new cn(f, J, q, tt, a), ct = new un(pt, j, Y, X), ht = new vn(pt, j, Y, X), Y.programs = nt.programs, f.capabilities = X, f.extensions = j, f.properties = Q, f.renderLists = rt, f.state = q, f.info = Y } mt(); const gt = new ar(f, pt); this.xr = gt; const vt = new tr(f, tt, X.maxTextureSize); function yt(t) { t.preventDefault(), console.log("THREE.WebGLRenderer: Context Lost."), m = !0 } function At() { console.log("THREE.WebGLRenderer: Context Restored."), m = !1, mt() } function xt(t) { const e = t.target; e.removeEventListener("dispose", xt), function(t) { _t(t), Q.remove(t) }(e) } function _t(t) { const e = Q.get(t).program; void 0 !== e && nt.releaseProgram(e) } this.shadowMap = vt, this.getContext = function() { return pt }, this.getContextAttributes = function() { return pt.getContextAttributes() }, this.forceContextLoss = function() { const t = j.get("WEBGL_lose_context"); t && t.loseContext() }, this.forceContextRestore = function() { const t = j.get("WEBGL_lose_context"); t && t.restoreContext() }, this.getPixelRatio = function() { return D }, this.setPixelRatio = function(t) { void 0 !== t && (D = t, this.setSize(C, P, !1)) }, this.getSize = function(t) { return void 0 === t && (console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"), t = new v), t.set(C, P) }, this.setSize = function(t, n, i) { gt.isPresenting ? console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.") : (C = t, P = n, e.width = Math.floor(t * D), e.height = Math.floor(n * D), !1 !== i && (e.style.width = t + "px", e.style.height = n + "px"), this.setViewport(0, 0, t, n)) }, this.getDrawingBufferSize = function(t) { return void 0 === t && (console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"), t = new v), t.set(C * D, P * D).floor() }, this.setDrawingBufferSize = function(t, n, i) { C = t, P = n, D = i, e.width = Math.floor(t * i), e.height = Math.floor(n * i), this.setViewport(0, 0, t, n) }, this.getCurrentViewport = function(t) { return void 0 === t && (console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"), t = new M), t.copy(S) }, this.getViewport = function(t) { return t.copy(N) }, this.setViewport = function(t, e, n, i) { t.isVector4 ? N.set(t.x, t.y, t.z, t.w) : N.set(t, e, n, i), q.viewport(S.copy(N).multiplyScalar(D).floor()) }, this.getScissor = function(t) { return t.copy(B) }, this.setScissor = function(t, e, n, i) { t.isVector4 ? B.set(t.x, t.y, t.z, t.w) : B.set(t, e, n, i), q.scissor(L.copy(B).multiplyScalar(D).floor()) }, this.getScissorTest = function() { return F }, this.setScissorTest = function(t) { q.setScissorTest(F = t) }, this.setOpaqueSort = function(t) { I = t }, this.setTransparentSort = function(t) { O = t }, this.getClearColor = function(t) { return void 0 === t && (console.warn("WebGLRenderer: .getClearColor() now requires a Color as an argument"), t = new Yt), 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 |= 16384), (void 0 === e || e) && (i |= 256), (void 0 === n || n) && (i |= 1024), pt.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", yt, !1), e.removeEventListener("webglcontextrestored", At, !1), rt.dispose(), ot.dispose(), Q.dispose(), J.dispose(), tt.dispose(), dt.dispose(), gt.dispose(), wt.stop() }, this.renderBufferImmediate = function(t, e) { dt.initAttributes(); const n = Q.get(t); t.hasPositions && !n.position && (n.position = pt.createBuffer()), t.hasNormals && !n.normal && (n.normal = pt.createBuffer()), t.hasUvs && !n.uv && (n.uv = pt.createBuffer()), t.hasColors && !n.color && (n.color = pt.createBuffer()); const i = e.getAttributes(); t.hasPositions && (pt.bindBuffer(34962, n.position), pt.bufferData(34962, t.positionArray, 35048), dt.enableAttribute(i.position), pt.vertexAttribPointer(i.position, 3, 5126, !1, 0, 0)), t.hasNormals && (pt.bindBuffer(34962, n.normal), pt.bufferData(34962, t.normalArray, 35048), dt.enableAttribute(i.normal), pt.vertexAttribPointer(i.normal, 3, 5126, !1, 0, 0)), t.hasUvs && (pt.bindBuffer(34962, n.uv), pt.bufferData(34962, t.uvArray, 35048), dt.enableAttribute(i.uv), pt.vertexAttribPointer(i.uv, 2, 5126, !1, 0, 0)), t.hasColors && (pt.bindBuffer(34962, n.color), pt.bufferData(34962, t.colorArray, 35048), dt.enableAttribute(i.color), pt.vertexAttribPointer(i.color, 3, 5126, !1, 0, 0)), dt.disableUnusedAttributes(), pt.drawArrays(4, 0, t.count), t.count = 0 }, this.renderBufferDirect = function(t, e, n, i, r, o) { null === e && (e = k); const s = r.isMesh && r.matrixWorld.determinant() < 0, a = Lt(t, e, i, r); q.setMaterial(i, s); let l = n.index; const c = n.attributes.position; if (null === l) { if (void 0 === c || 0 === c.count) return } else if (0 === l.count) return; let h, u = 1; !0 === i.wireframe && (l = $.getWireframeAttribute(n), u = 2), (i.morphTargets || i.morphNormals) && lt.update(r, n, i, a), dt.setup(r, i, a, n, l); let d = ct; null !== l && (h = K.get(l), d = ht, d.setIndex(h)); const p = null !== l ? l.count : c.count, f = n.drawRange.start * u, m = n.drawRange.count * u, g = null !== o ? o.start * u : 0, v = null !== o ? o.count * u : 1 / 0, y = Math.max(f, g), A = Math.min(p, f + m, g + v) - 1, x = Math.max(0, A - y + 1); if (0 !== x) { if (r.isMesh) !0 === i.wireframe ? (q.setLineWidth(i.wireframeLinewidth * W()), d.setMode(1)) : d.setMode(4); else if (r.isLine) { let t = i.linewidth; void 0 === t && (t = 1), q.setLineWidth(t * W()), r.isLineSegments ? d.setMode(1) : r.isLineLoop ? d.setMode(2) : d.setMode(3) } else r.isPoints ? d.setMode(0) : r.isSprite && d.setMode(4); if (r.isInstancedMesh) d.renderInstances(y, x, r.count); else if (n.isInstancedBufferGeometry) { const t = Math.min(n.instanceCount, n._maxInstanceCount); d.renderInstances(y, x, t) } else d.render(y, x) } }, this.compile = function(t, e) { d = ot.get(t), d.init(), t.traverseVisible((function(t) { t.isLight && t.layers.test(e.layers) && (d.pushLight(t), t.castShadow && d.pushShadow(t)) })), d.setupLights(); const n = new WeakMap; t.traverse((function(e) { const i = e.material; if (i) if (Array.isArray(i)) for (let r = 0; r < i.length; r++) { const o = i[r]; !1 === n.has(o) && (Tt(o, t, e), n.set(o)) } else !1 === n.has(i) && (Tt(i, t, e), n.set(i)) })) }; let bt = null; const wt = new nn; 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 || z.intersectsSprite(t)) { i && V.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G); const e = tt.update(t), r = t.material; r.visible && u.push(t, e, r, n, V.z, null) } } else if (t.isImmediateRenderObject) i && V.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G), u.push(t, null, t.material, n, V.z, null); else if ((t.isMesh || t.isLine || t.isPoints) && (t.isSkinnedMesh && t.skeleton.frame !== Y.render.frame && (t.skeleton.update(), t.skeleton.frame = Y.render.frame), !t.frustumCulled || z.intersectsObject(t))) { i && V.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G); const e = tt.update(t), r = t.material; if (Array.isArray(r)) { const i = e.groups; for (let o = 0, s = i.length; o < s; o++) { const s = i[o], a = r[s.materialIndex]; a && a.visible && u.push(t, e, a, n, V.z, s) } } else r.visible && u.push(t, e, r, n, V.z, null) } const r = t.children; for (let t = 0, o = r.length; t < o; t++) Mt(r[t], e, n, i) } function Et(t, e, n) { const i = !0 === e.isScene ? e.overrideMaterial : null; for (let r = 0, o = t.length; r < o; r++) { const o = t[r], s = o.object, a = o.geometry, l = null === i ? o.material : i, c = o.group; if (n.isArrayCamera) { const t = n.cameras; for (let n = 0, i = t.length; n < i; n++) { const i = t[n]; s.layers.test(i.layers) && (q.viewport(S.copy(i.viewport)), d.setupLightsView(i), St(s, e, i, a, l, c)) } } else St(s, e, n, a, l, c) } } function St(t, e, n, i, r, o) { if (t.onBeforeRender(f, e, n, i, r, o), t.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse, t.matrixWorld), t.normalMatrix.getNormalMatrix(t.modelViewMatrix), t.isImmediateRenderObject) { const i = Lt(n, e, r, t); q.setMaterial(r), dt.reset(), function(t, e) { t.render((function(t) { f.renderBufferImmediate(t, e) })) }(t, i) } else f.renderBufferDirect(n, e, i, r, t, o); t.onAfterRender(f, e, n, i, r, o) } function Tt(t, e, n) { !0 !== e.isScene && (e = k); const i = Q.get(t), r = d.state.lights, o = d.state.shadowsArray, s = r.state.version, a = nt.getParameters(t, r.state, o, e, n), l = nt.getProgramCacheKey(a); let c = i.program, h = !0; if (i.environment = t.isMeshStandardMaterial ? e.environment : null, i.fog = e.fog, i.envMap = J.get(t.envMap || i.environment), void 0 === c) t.addEventListener("dispose", xt); else if (c.cacheKey !== l) _t(t); else if (i.lightsStateVersion !== s) h = !1; else { if (void 0 !== a.shaderID) return; h = !1 } h && (a.uniforms = nt.getUniforms(t), t.onBeforeCompile(a, f), c = nt.acquireProgram(a, l), i.program = c, i.uniforms = a.uniforms, i.outputEncoding = a.outputEncoding); const u = i.uniforms; (t.isShaderMaterial || t.isRawShaderMaterial) && !0 !== t.clipping || (i.numClippingPlanes = st.numPlanes, i.numIntersection = st.numIntersection, u.clippingPlanes = st.uniform), i.needsLights = function(t) { return t.isMeshLambertMaterial || t.isMeshToonMaterial || t.isMeshPhongMaterial || t.isMeshStandardMaterial || t.isShadowMaterial || t.isShaderMaterial && !0 === t.lights }(t), i.lightsStateVersion = s, 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 = i.program.getUniforms(), m = Ai.seqWithValue(p.seq, u); i.uniformsList = m } function Lt(t, e, n, i) { !0 !== e.isScene && (e = k), Z.resetTextureUnits(); const r = e.fog, o = n.isMeshStandardMaterial ? e.environment : null, s = null === _ ? f.outputEncoding : _.texture.encoding, a = J.get(n.envMap || o), l = Q.get(n), c = d.state.lights; if (!0 === U && (!0 === H || t !== E)) { const e = t === E && n.id === w; st.setState(n, t, e) } n.version === l.__version ? n.fog && l.fog !== r || l.environment !== o || l.needsLights && l.lightsStateVersion !== c.state.version ? Tt(n, e, i) : void 0 === l.numClippingPlanes || l.numClippingPlanes === st.numPlanes && l.numIntersection === st.numIntersection ? (l.outputEncoding !== s || l.envMap !== a) && Tt(n, e, i) : Tt(n, e, i) : (Tt(n, e, i), l.__version = n.version); let h = !1, u = !1, p = !1; const m = l.program, v = m.getUniforms(), y = l.uniforms; if (q.useProgram(m.program) && (h = !0, u = !0, p = !0), n.id !== w && (w = n.id, u = !0), h || E !== t) { if (v.setValue(pt, "projectionMatrix", t.projectionMatrix), X.logarithmicDepthBuffer && v.setValue(pt, "logDepthBufFC", 2 / (Math.log(t.far + 1) / Math.LN2)), E !== t && (E = t, u = !0, p = !0), n.isShaderMaterial || n.isMeshPhongMaterial || n.isMeshToonMaterial || n.isMeshStandardMaterial || n.envMap) { const e = v.map.cameraPosition; void 0 !== e && e.setValue(pt, V.setFromMatrixPosition(t.matrixWorld)) }(n.isMeshPhongMaterial || n.isMeshToonMaterial || n.isMeshLambertMaterial || n.isMeshBasicMaterial || n.isMeshStandardMaterial || n.isShaderMaterial) && v.setValue(pt, "isOrthographic", !0 === t.isOrthographicCamera), (n.isMeshPhongMaterial || n.isMeshToonMaterial || n.isMeshLambertMaterial || n.isMeshBasicMaterial || n.isMeshStandardMaterial || n.isShaderMaterial || n.isShadowMaterial || n.skinning) && v.setValue(pt, "viewMatrix", t.matrixWorldInverse) } if (n.skinning) { v.setOptional(pt, i, "bindMatrix"), v.setOptional(pt, i, "bindMatrixInverse"); const t = i.skeleton; if (t) { const e = t.bones; if (X.floatVertexTextures) { if (null === t.boneTexture) { let n = Math.sqrt(4 * e.length); n = g.ceilPowerOfTwo(n), n = Math.max(n, 4); const i = new Float32Array(n * n * 4); i.set(t.boneMatrices); const r = new Ke(i, n, n, 1023, 1015); t.boneMatrices = i, t.boneTexture = r, t.boneTextureSize = n } v.setValue(pt, "boneTexture", t.boneTexture, Z), v.setValue(pt, "boneTextureSize", t.boneTextureSize) } else v.setOptional(pt, t, "boneMatrices") } } var A, x; return (u || l.receiveShadow !== i.receiveShadow) && (l.receiveShadow = i.receiveShadow, v.setValue(pt, "receiveShadow", i.receiveShadow)), u && (v.setValue(pt, "toneMappingExposure", f.toneMappingExposure), l.needsLights && (x = p, (A = y).ambientLightColor.needsUpdate = x, A.lightProbe.needsUpdate = x, A.directionalLights.needsUpdate = x, A.directionalLightShadows.needsUpdate = x, A.pointLights.needsUpdate = x, A.pointLightShadows.needsUpdate = x, A.spotLights.needsUpdate = x, A.spotLightShadows.needsUpdate = x, A.rectAreaLights.needsUpdate = x, A.hemisphereLights.needsUpdate = x), r && n.fog && it.refreshFogUniforms(y, r), it.refreshMaterialUniforms(y, n, D, P), Ai.upload(pt, l.uniformsList, y, Z)), n.isShaderMaterial && !0 === n.uniformsNeedUpdate && (Ai.upload(pt, l.uniformsList, y, Z), n.uniformsNeedUpdate = !1), n.isSpriteMaterial && v.setValue(pt, "center", i.center), v.setValue(pt, "modelViewMatrix", i.modelViewMatrix), v.setValue(pt, "normalMatrix", i.normalMatrix), v.setValue(pt, "modelMatrix", i.matrixWorld), m } wt.setAnimationLoop((function(t) { gt.isPresenting || bt && bt(t) })), "undefined" != typeof window && wt.setContext(window), this.setAnimationLoop = function(t) { bt = t, gt.setAnimationLoop(t), null === t ? wt.stop() : wt.start() }, this.render = function(t, e) { let n, i; if (void 0 !== arguments[2] && (console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."), n = arguments[2]), void 0 !== arguments[3] && (console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."), i = arguments[3]), void 0 !== e && !0 !== e.isCamera) return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera."); if (!0 === m) return; dt.resetDefaultState(), w = -1, E = null, !0 === t.autoUpdate && t.updateMatrixWorld(), null === e.parent && e.updateMatrixWorld(), !0 === gt.enabled && !0 === gt.isPresenting && (e = gt.getCamera(e)), !0 === t.isScene && t.onBeforeRender(f, t, e, n || _), d = ot.get(t, p.length), d.init(), p.push(d), G.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse), z.setFromProjectionMatrix(G), H = this.localClippingEnabled, U = st.init(this.clippingPlanes, H, e), u = rt.get(t, e), u.init(), Mt(t, e, 0, f.sortObjects), u.finish(), !0 === f.sortObjects && u.sort(I, O), !0 === U && st.beginShadows(); const r = d.state.shadowsArray; vt.render(r, t, e), d.setupLights(), d.setupLightsView(e), !0 === U && st.endShadows(), !0 === this.info.autoReset && this.info.reset(), void 0 !== n && this.setRenderTarget(n), at.render(u, t, e, i); const o = u.opaque, s = u.transparent; o.length > 0 && Et(o, t, e), s.length > 0 && Et(s, t, e), !0 === t.isScene && t.onAfterRender(f, t, e), null !== _ && (Z.updateRenderTargetMipmap(_), Z.updateMultisampleRenderTarget(_)), q.buffers.depth.setTest(!0), q.buffers.depth.setMask(!0), q.buffers.color.setMask(!0), q.setPolygonOffset(!1), p.pop(), d = p.length > 0 ? p[p.length - 1] : null, u = null }, this.setFramebuffer = function(t) { y !== t && null === _ && pt.bindFramebuffer(36160, t), y = t }, this.getActiveCubeFace = function() { return A }, this.getActiveMipmapLevel = function() { return x }, this.getRenderList = function() { return u }, this.setRenderList = function(t) { u = t }, this.getRenderTarget = function() { return _ }, this.setRenderTarget = function(t, e = 0, n = 0) { _ = t, A = e, x = n, t && void 0 === Q.get(t).__webglFramebuffer && Z.setupRenderTarget(t); let i = y, r = !1; if (t) { const n = Q.get(t).__webglFramebuffer; t.isWebGLCubeRenderTarget ? (i = n[e], r = !0) : i = t.isWebGLMultisampleRenderTarget ? Q.get(t).__webglMultisampledFramebuffer : n, S.copy(t.viewport), L.copy(t.scissor), R = t.scissorTest } else S.copy(N).multiplyScalar(D).floor(), L.copy(B).multiplyScalar(D).floor(), R = F; if (b !== i && (pt.bindFramebuffer(36160, i), b = i), q.viewport(S), q.scissor(L), q.setScissorTest(R), r) { const i = Q.get(t.texture); pt.framebufferTexture2D(36160, 36064, 34069 + e, i.__webglTexture, n) } }, this.readRenderTargetPixels = function(t, e, n, i, r, o, s) { if (!t || !t.isWebGLRenderTarget) return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); let a = Q.get(t).__webglFramebuffer; if (t.isWebGLCubeRenderTarget && void 0 !== s && (a = a[s]), a) { let s = !1; a !== b && (pt.bindFramebuffer(36160, a), s = !0); try { const a = t.texture, l = a.format, c = a.type; if (1023 !== l && ut.convert(l) !== pt.getParameter(35739)) return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."); const h = 1016 === c && (j.has("EXT_color_buffer_half_float") || X.isWebGL2 && j.has("EXT_color_buffer_float")); if (!(1009 === c || ut.convert(c) === pt.getParameter(35738) || 1015 === c && (X.isWebGL2 || j.has("OES_texture_float") || j.has("WEBGL_color_buffer_float")) || h)) return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type."); 36053 === pt.checkFramebufferStatus(36160) ? e >= 0 && e <= t.width - i && n >= 0 && n <= t.height - r && pt.readPixels(e, n, i, r, ut.convert(l), ut.convert(c), o) : console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.") } finally { s && pt.bindFramebuffer(36160, b) } } }, this.copyFramebufferToTexture = function(t, e, n = 0) { const i = Math.pow(2, -n), r = Math.floor(e.image.width * i), o = Math.floor(e.image.height * i), s = ut.convert(e.format); Z.setTexture2D(e, 0), pt.copyTexImage2D(3553, n, s, t.x, t.y, r, o, 0), q.unbindTexture() }, this.copyTextureToTexture = function(t, e, n, i = 0) { const r = e.image.width, o = e.image.height, s = ut.convert(n.format), a = ut.convert(n.type); Z.setTexture2D(n, 0), pt.pixelStorei(37440, n.flipY), pt.pixelStorei(37441, n.premultiplyAlpha), pt.pixelStorei(3317, n.unpackAlignment), e.isDataTexture ? pt.texSubImage2D(3553, i, t.x, t.y, r, o, s, a, e.image.data) : e.isCompressedTexture ? pt.compressedTexSubImage2D(3553, i, t.x, t.y, e.mipmaps[0].width, e.mipmaps[0].height, s, e.mipmaps[0].data) : pt.texSubImage2D(3553, i, t.x, t.y, s, a, e.image), 0 === i && n.generateMipmaps && pt.generateMipmap(3553), q.unbindTexture() }, this.initTexture = function(t) { Z.setTexture2D(t, 0), q.unbindTexture() }, this.resetState = function() { q.reset(), dt.reset() }, "undefined" != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })) } function hr(t) { cr.call(this, t) } rr.prototype = Object.assign(Object.create(Ye.prototype), { constructor: rr, isArrayCamera: !0 }), or.prototype = Object.assign(Object.create(St.prototype), { constructor: or, isGroup: !0 }), Object.assign(sr.prototype, { constructor: sr, getHandSpace: function() { return null === this._hand && (this._hand = new or, this._hand.matrixAutoUpdate = !1, this._hand.visible = !1, this._hand.joints = {}, this._hand.inputState = { pinching: !1 }), this._hand }, getTargetRaySpace: function() { return null === this._targetRay && (this._targetRay = new or, this._targetRay.matrixAutoUpdate = !1, this._targetRay.visible = !1), this._targetRay }, getGripSpace: function() { return null === this._grip && (this._grip = new or, this._grip.matrixAutoUpdate = !1, this._grip.visible = !1), this._grip }, dispatchEvent: function(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: function(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: function(t, e, n) { let i = null, r = null, o = null; const s = this._targetRay, a = this._grip, l = this._hand; if (t && "visible-blurred" !== e.session.visibilityState) if (l && t.hand) { o = !0; for (const i of t.hand.values()) { const t = e.getJointPose(i, n); if (void 0 === l.joints[i.jointName]) { const t = new or; 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"], s = i.position.distanceTo(r.position), a = .02, c = .005; l.inputState.pinching && s > a + c ? (l.inputState.pinching = !1, this.dispatchEvent({ type: "pinchend", handedness: t.handedness, target: this })) : !l.inputState.pinching && s <= a - c && (l.inputState.pinching = !0, this.dispatchEvent({ type: "pinchstart", handedness: t.handedness, target: this })) } else null !== s && (i = e.getPose(t.targetRaySpace, n), null !== i && (s.matrix.fromArray(i.transform.matrix), s.matrix.decompose(s.position, s.rotation, s.scale))), null !== a && t.gripSpace && (r = e.getPose(t.gripSpace, n), null !== r && (a.matrix.fromArray(r.transform.matrix), a.matrix.decompose(a.position, a.rotation, a.scale))); return null !== s && (s.visible = null !== i), null !== a && (a.visible = null !== r), null !== l && (l.visible = null !== o), this } }), Object.assign(ar.prototype, p.prototype), hr.prototype = Object.assign(Object.create(cr.prototype), { constructor: hr, isWebGL1Renderer: !0 }); class ur extends St { constructor() { super(), Object.defineProperty(this, "isScene", { value: !0 }), this.type = "Scene", this.background = null, this.environment = null, this.fog = null, this.overrideMaterial = null, this.autoUpdate = !0, "undefined" != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })) } copy(t, e) { return super.copy(t, e), null !== t.background && (this.background = t.background.clone()), null !== t.environment && (this.environment = t.environment.clone()), null !== t.fog && (this.fog = t.fog.clone()), null !== t.overrideMaterial && (this.overrideMaterial = t.overrideMaterial.clone()), this.autoUpdate = t.autoUpdate, this.matrixAutoUpdate = t.matrixAutoUpdate, this } toJSON(t) { const e = super.toJSON(t); return null !== this.background && (e.object.background = this.background.toJSON(t)), null !== this.environment && (e.object.environment = this.environment.toJSON(t)), null !== this.fog && (e.object.fog = this.fog.toJSON()), e } } function dr(t, e) { this.array = t, this.stride = e, this.count = void 0 !== t ? t.length / e : 0, this.usage = 35044, this.updateRange = { offset: 0, count: -1 }, this.version = 0, this.uuid = g.generateUUID() } Object.defineProperty(dr.prototype, "needsUpdate", { set: function(t) { !0 === t && this.version++ } }), Object.assign(dr.prototype, { isInterleavedBuffer: !0, onUploadCallback: function() {}, setUsage: function(t) { return this.usage = t, this }, copy: function(t) { return this.array = new t.array.constructor(t.array), this.count = t.count, this.stride = t.stride, this.usage = t.usage, this }, copyAt: function(t, e, n) { t *= this.stride, n *= e.stride; for (let i = 0, r = this.stride; i < r; i++) this.array[t + i] = e.array[n + i]; return this }, set: function(t, e = 0) { return this.array.set(t, e), this }, clone: function(t) { void 0 === t.arrayBuffers && (t.arrayBuffers = {}), void 0 === this.array.buffer._uuid && (this.array.buffer._uuid = g.generateUUID()), void 0 === t.arrayBuffers[this.array.buffer._uuid] && (t.arrayBuffers[this.array.buffer._uuid] = this.array.slice(0).buffer); const e = new dr(new this.array.constructor(t.arrayBuffers[this.array.buffer._uuid]), this.stride); return e.setUsage(this.usage), e }, onUpload: function(t) { return this.onUploadCallback = t, this }, toJSON: function(t) { return void 0 === t.arrayBuffers && (t.arrayBuffers = {}), void 0 === this.array.buffer._uuid && (this.array.buffer._uuid = g.generateUUID()), void 0 === t.arrayBuffers[this.array.buffer._uuid] && (t.arrayBuffers[this.array.buffer._uuid] = Array.prototype.slice.call(new Uint32Array(this.array.buffer))), { uuid: this.uuid, buffer: this.array.buffer._uuid, type: this.array.constructor.name, stride: this.stride } } }); const pr = new T; function fr(t, e, n, i) { this.name = "", this.data = t, this.itemSize = e, this.offset = n, this.normalized = !0 === i } function mr(t) { Jt.call(this), this.type = "SpriteMaterial", this.color = new Yt(16777215), this.map = null, this.alphaMap = null, this.rotation = 0, this.sizeAttenuation = !0, this.transparent = !0, this.setValues(t) } let gr; Object.defineProperties(fr.prototype, { count: { get: function() { return this.data.count } }, array: { get: function() { return this.data.array } }, needsUpdate: { set: function(t) { this.data.needsUpdate = t } } }), Object.assign(fr.prototype, { isInterleavedBufferAttribute: !0, applyMatrix4: function(t) { for (let e = 0, n = this.data.count; e < n; e++) pr.x = this.getX(e), pr.y = this.getY(e), pr.z = this.getZ(e), pr.applyMatrix4(t), this.setXYZ(e, pr.x, pr.y, pr.z); return this }, setX: function(t, e) { return this.data.array[t * this.data.stride + this.offset] = e, this }, setY: function(t, e) { return this.data.array[t * this.data.stride + this.offset + 1] = e, this }, setZ: function(t, e) { return this.data.array[t * this.data.stride + this.offset + 2] = e, this }, setW: function(t, e) { return this.data.array[t * this.data.stride + this.offset + 3] = e, this }, getX: function(t) { return this.data.array[t * this.data.stride + this.offset] }, getY: function(t) { return this.data.array[t * this.data.stride + this.offset + 1] }, getZ: function(t) { return this.data.array[t * this.data.stride + this.offset + 2] }, getW: function(t) { return this.data.array[t * this.data.stride + this.offset + 3] }, setXY: function(t, e, n) { return t = t * this.data.stride + this.offset, this.data.array[t + 0] = e, this.data.array[t + 1] = n, this }, setXYZ: function(t, e, n, i) { return t = t * this.data.stride + this.offset, this.data.array[t + 0] = e, this.data.array[t + 1] = n, this.data.array[t + 2] = i, this }, setXYZW: function(t, e, n, i, r) { return t = t * this.data.stride + this.offset, this.data.array[t + 0] = e, this.data.array[t + 1] = n, this.data.array[t + 2] = i, this.data.array[t + 3] = r, this }, clone: function(t) { if (void 0 === t) { console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data."); const t = []; for (let e = 0; e < this.count; e++) { const n = e * this.data.stride + this.offset; for (let e = 0; e < this.itemSize; e++) t.push(this.data.array[n + e]) } return new ee(new this.array.constructor(t), this.itemSize, this.normalized) } return void 0 === t.interleavedBuffers && (t.interleavedBuffers = {}), void 0 === t.interleavedBuffers[this.data.uuid] && (t.interleavedBuffers[this.data.uuid] = this.data.clone(t)), new fr(t.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized) }, toJSON: function(t) { if (void 0 === t) { console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data."); const t = []; for (let e = 0; e < this.count; e++) { const n = e * this.data.stride + this.offset; for (let e = 0; e < this.itemSize; e++) t.push(this.data.array[n + e]) } return { itemSize: this.itemSize, type: this.array.constructor.name, array: t, normalized: this.normalized } } return void 0 === t.interleavedBuffers && (t.interleavedBuffers = {}), void 0 === t.interleavedBuffers[this.data.uuid] && (t.interleavedBuffers[this.data.uuid] = this.data.toJSON(t)), { isInterleavedBufferAttribute: !0, itemSize: this.itemSize, data: this.data.uuid, offset: this.offset, normalized: this.normalized } } }), mr.prototype = Object.create(Jt.prototype), mr.prototype.constructor = mr, mr.prototype.isSpriteMaterial = !0, mr.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.color.copy(t.color), this.map = t.map, this.alphaMap = t.alphaMap, this.rotation = t.rotation, this.sizeAttenuation = t.sizeAttenuation, this }; const vr = new T, yr = new T, Ar = new T, xr = new v, _r = new v, br = new et, wr = new T, Mr = new T, Er = new T, Sr = new v, Tr = new v, Lr = new v; function Rr(t) { if (St.call(this), this.type = "Sprite", void 0 === gr) { gr = new be; const t = new dr(new Float32Array([-.5, -.5, 0, 0, 0, .5, -.5, 0, 1, 0, .5, .5, 0, 1, 1, -.5, .5, 0, 0, 1]), 5); gr.setIndex([0, 1, 2, 0, 2, 3]), gr.setAttribute("position", new fr(t, 3, 0, !1)), gr.setAttribute("uv", new fr(t, 2, 3, !1)) } this.geometry = gr, this.material = void 0 !== t ? t : new mr, this.center = new v(.5, .5) } function Cr(t, e, n, i, r, o) { xr.subVectors(t, n).addScalar(.5).multiply(i), void 0 !== r ? (_r.x = o * xr.x - r * xr.y, _r.y = r * xr.x + o * xr.y) : _r.copy(xr), t.copy(e), t.x += _r.x, t.y += _r.y, t.applyMatrix4(br) } Rr.prototype = Object.assign(Object.create(St.prototype), { constructor: Rr, isSprite: !0, raycast: function(t, e) { null === t.camera && console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'), yr.setFromMatrixScale(this.matrixWorld), br.copy(t.camera.matrixWorld), this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse, this.matrixWorld), Ar.setFromMatrixPosition(this.modelViewMatrix), t.camera.isPerspectiveCamera && !1 === this.material.sizeAttenuation && yr.multiplyScalar(-Ar.z); const n = this.material.rotation; let i, r; 0 !== n && (r = Math.cos(n), i = Math.sin(n)); const o = this.center; Cr(wr.set(-.5, -.5, 0), Ar, o, yr, i, r), Cr(Mr.set(.5, -.5, 0), Ar, o, yr, i, r), Cr(Er.set(.5, .5, 0), Ar, o, yr, i, r), Sr.set(0, 0), Tr.set(1, 0), Lr.set(1, 1); let s = t.ray.intersectTriangle(wr, Mr, Er, !1, vr); if (null === s && (Cr(Mr.set(-.5, .5, 0), Ar, o, yr, i, r), Tr.set(0, 1), s = t.ray.intersectTriangle(wr, Er, Mr, !1, vr), null === s)) return; const a = t.ray.origin.distanceTo(vr); a < t.near || a > t.far || e.push({ distance: a, point: vr.clone(), uv: Gt.getUV(vr, wr, Mr, Er, Sr, Tr, Lr, new v), face: null, object: this }) }, copy: function(t) { return St.prototype.copy.call(this, t), void 0 !== t.center && this.center.copy(t.center), this.material = t.material, this } }); const Pr = new T, Dr = new T; function Ir() { St.call(this), this._currentLevel = 0, this.type = "LOD", Object.defineProperties(this, { levels: { enumerable: !0, value: [] } }), this.autoUpdate = !0 } Ir.prototype = Object.assign(Object.create(St.prototype), { constructor: Ir, isLOD: !0, copy: function(t) { St.prototype.copy.call(this, t, !1); const e = t.levels; for (let t = 0, n = e.length; t < n; t++) { const n = e[t]; this.addLevel(n.object.clone(), n.distance) } return this.autoUpdate = t.autoUpdate, this }, addLevel: function(t, e = 0) { e = Math.abs(e); const n = this.levels; let i; for (i = 0; i < n.length && !(e < n[i].distance); i++); return n.splice(i, 0, { distance: e, object: t }), this.add(t), this }, getCurrentLevel: function() { return this._currentLevel }, getObjectForDistance: function(t) { const e = this.levels; if (e.length > 0) { let n, i; for (n = 1, i = e.length; n < i && !(t < e[n].distance); n++); return e[n - 1].object } return null }, raycast: function(t, e) { if (this.levels.length > 0) { Pr.setFromMatrixPosition(this.matrixWorld); const n = t.ray.origin.distanceTo(Pr); this.getObjectForDistance(n).raycast(t, e) } }, update: function(t) { const e = this.levels; if (e.length > 1) { Pr.setFromMatrixPosition(t.matrixWorld), Dr.setFromMatrixPosition(this.matrixWorld); const n = Pr.distanceTo(Dr) / t.zoom; let i, r; for (e[0].object.visible = !0, i = 1, r = e.length; i < r && n >= e[i].distance; i++) e[i - 1].object.visible = !1, e[i].object.visible = !0; for (this._currentLevel = i - 1; i < r; i++) e[i].object.visible = !1 } }, toJSON: function(t) { const e = St.prototype.toJSON.call(this, t); !1 === this.autoUpdate && (e.object.autoUpdate = !1), e.object.levels = []; const n = this.levels; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; e.object.levels.push({ object: i.object.uuid, distance: i.distance }) } return e } }); const Or = new T, Nr = new M, Br = new M, Fr = new T, zr = new et; function Ur(t, e) { t && t.isGeometry && console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."), He.call(this, t, e), this.type = "SkinnedMesh", this.bindMode = "attached", this.bindMatrix = new et, this.bindMatrixInverse = new et } function Hr() { St.call(this), this.type = "Bone" } Ur.prototype = Object.assign(Object.create(He.prototype), { constructor: Ur, isSkinnedMesh: !0, copy: function(t) { return He.prototype.copy.call(this, t), this.bindMode = t.bindMode, this.bindMatrix.copy(t.bindMatrix), this.bindMatrixInverse.copy(t.bindMatrixInverse), this.skeleton = t.skeleton, this }, bind: function(t, e) { this.skeleton = t, void 0 === e && (this.updateMatrixWorld(!0), this.skeleton.calculateInverses(), e = this.matrixWorld), this.bindMatrix.copy(e), this.bindMatrixInverse.copy(e).invert() }, pose: function() { this.skeleton.pose() }, normalizeSkinWeights: function() { const t = new M, e = this.geometry.attributes.skinWeight; for (let n = 0, i = e.count; n < i; n++) { t.x = e.getX(n), t.y = e.getY(n), t.z = e.getZ(n), t.w = e.getW(n); const i = 1 / t.manhattanLength(); i !== 1 / 0 ? t.multiplyScalar(i) : t.set(1, 0, 0, 0), e.setXYZW(n, t.x, t.y, t.z, t.w) } }, updateMatrixWorld: function(t) { He.prototype.updateMatrixWorld.call(this, t), "attached" === this.bindMode ? this.bindMatrixInverse.copy(this.matrixWorld).invert() : "detached" === this.bindMode ? this.bindMatrixInverse.copy(this.bindMatrix).invert() : console.warn("THREE.SkinnedMesh: Unrecognized bindMode: " + this.bindMode) }, boneTransform: function(t, e) { const n = this.skeleton, i = this.geometry; Nr.fromBufferAttribute(i.attributes.skinIndex, t), Br.fromBufferAttribute(i.attributes.skinWeight, t), Or.fromBufferAttribute(i.attributes.position, t).applyMatrix4(this.bindMatrix), e.set(0, 0, 0); for (let t = 0; t < 4; t++) { const i = Br.getComponent(t); if (0 !== i) { const r = Nr.getComponent(t); zr.multiplyMatrices(n.bones[r].matrixWorld, n.boneInverses[r]), e.addScaledVector(Fr.copy(Or).applyMatrix4(zr), i) } } return e.applyMatrix4(this.bindMatrixInverse) } }), Hr.prototype = Object.assign(Object.create(St.prototype), { constructor: Hr, isBone: !0 }); const Gr = new et, Vr = new et; function kr(t = [], e = []) { this.uuid = g.generateUUID(), this.bones = t.slice(0), this.boneInverses = e, this.boneMatrices = null, this.boneTexture = null, this.boneTextureSize = 0, this.frame = -1, this.init() } Object.assign(kr.prototype, { init: function() { const t = this.bones, e = this.boneInverses; if (this.boneMatrices = new Float32Array(16 * t.length), 0 === e.length) this.calculateInverses(); else if (t.length !== e.length) { console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."), this.boneInverses = []; for (let t = 0, e = this.bones.length; t < e; t++) this.boneInverses.push(new et) } }, calculateInverses: function() { this.boneInverses.length = 0; for (let t = 0, e = this.bones.length; t < e; t++) { const e = new et; this.bones[t] && e.copy(this.bones[t].matrixWorld).invert(), this.boneInverses.push(e) } }, pose: function() { for (let t = 0, e = this.bones.length; t < e; t++) { const e = this.bones[t]; e && e.matrixWorld.copy(this.boneInverses[t]).invert() } for (let t = 0, e = this.bones.length; t < e; t++) { const e = this.bones[t]; e && (e.parent && e.parent.isBone ? (e.matrix.copy(e.parent.matrixWorld).invert(), e.matrix.multiply(e.matrixWorld)) : e.matrix.copy(e.matrixWorld), e.matrix.decompose(e.position, e.quaternion, e.scale)) } }, update: function() { const t = this.bones, e = this.boneInverses, n = this.boneMatrices, i = this.boneTexture; for (let i = 0, r = t.length; i < r; i++) { const r = t[i] ? t[i].matrixWorld : Vr; Gr.multiplyMatrices(r, e[i]), Gr.toArray(n, 16 * i) } null !== i && (i.needsUpdate = !0) }, clone: function() { return new kr(this.bones, this.boneInverses) }, getBoneByName: function(t) { for (let e = 0, n = this.bones.length; e < n; e++) { const n = this.bones[e]; if (n.name === t) return n } }, dispose: function() { null !== this.boneTexture && (this.boneTexture.dispose(), this.boneTexture = null) }, fromJSON: function(t, e) { this.uuid = t.uuid; for (let n = 0, i = t.bones.length; n < i; n++) { const i = t.bones[n]; let r = e[i]; void 0 === r && (console.warn("THREE.Skeleton: No bone found with UUID:", i), r = new Hr), this.bones.push(r), this.boneInverses.push((new et).fromArray(t.boneInverses[n])) } return this.init(), this }, toJSON: function() { const t = { metadata: { version: 4.5, type: "Skeleton", generator: "Skeleton.toJSON" }, bones: [], boneInverses: [] }; t.uuid = this.uuid; const e = this.bones, n = this.boneInverses; for (let i = 0, r = e.length; i < r; i++) { const r = e[i]; t.bones.push(r.uuid); const o = n[i]; t.boneInverses.push(o.toArray()) } return t } }); const Wr = new et, jr = new et, Xr = [], qr = new He; function Yr(t, e, n) { He.call(this, t, e), this.instanceMatrix = new ee(new Float32Array(16 * n), 16), this.instanceColor = null, this.count = n, this.frustumCulled = !1 } function Qr(t) { Jt.call(this), this.type = "LineBasicMaterial", this.color = new Yt(16777215), this.linewidth = 1, this.linecap = "round", this.linejoin = "round", this.morphTargets = !1, this.setValues(t) } Yr.prototype = Object.assign(Object.create(He.prototype), { constructor: Yr, isInstancedMesh: !0, copy: function(t) { return He.prototype.copy.call(this, t), this.instanceMatrix.copy(t.instanceMatrix), null !== t.instanceColor && (this.instanceColor = t.instanceColor.clone()), this.count = t.count, this }, getColorAt: function(t, e) { e.fromArray(this.instanceColor.array, 3 * t) }, getMatrixAt: function(t, e) { e.fromArray(this.instanceMatrix.array, 16 * t) }, raycast: function(t, e) { const n = this.matrixWorld, i = this.count; if (qr.geometry = this.geometry, qr.material = this.material, void 0 !== qr.material) for (let r = 0; r < i; r++) { this.getMatrixAt(r, Wr), jr.multiplyMatrices(n, Wr), qr.matrixWorld = jr, qr.raycast(t, Xr); for (let t = 0, n = Xr.length; t < n; t++) { const n = Xr[t]; n.instanceId = r, n.object = this, e.push(n) } Xr.length = 0 } }, setColorAt: function(t, e) { null === this.instanceColor && (this.instanceColor = new ee(new Float32Array(3 * this.count), 3)), e.toArray(this.instanceColor.array, 3 * t) }, setMatrixAt: function(t, e) { e.toArray(this.instanceMatrix.array, 16 * t) }, updateMorphTargets: function() {}, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }), Qr.prototype = Object.create(Jt.prototype), Qr.prototype.constructor = Qr, Qr.prototype.isLineBasicMaterial = !0, Qr.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.color.copy(t.color), this.linewidth = t.linewidth, this.linecap = t.linecap, this.linejoin = t.linejoin, this.morphTargets = t.morphTargets, this }; const Zr = new T, Jr = new T, Kr = new et, $r = new tt, to = new X; function eo(t = new be, e = new Qr) { St.call(this), this.type = "Line", this.geometry = t, this.material = e, this.updateMorphTargets() } eo.prototype = Object.assign(Object.create(St.prototype), { constructor: eo, isLine: !0, copy: function(t) { return St.prototype.copy.call(this, t), this.material = t.material, this.geometry = t.geometry, this }, computeLineDistances: function() { const t = this.geometry; if (t.isBufferGeometry) if (null === t.index) { const e = t.attributes.position, n = [0]; for (let t = 1, i = e.count; t < i; t++) Zr.fromBufferAttribute(e, t - 1), Jr.fromBufferAttribute(e, t), n[t] = n[t - 1], n[t] += Zr.distanceTo(Jr); t.setAttribute("lineDistance", new he(n, 1)) } else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); else t.isGeometry && console.error("THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."); return this }, raycast: function(t, e) { const n = this.geometry, i = this.matrixWorld, r = t.params.Line.threshold; if (null === n.boundingSphere && n.computeBoundingSphere(), to.copy(n.boundingSphere), to.applyMatrix4(i), to.radius += r, !1 === t.ray.intersectsSphere(to)) return; Kr.copy(i).invert(), $r.copy(t.ray).applyMatrix4(Kr); const o = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), s = o * o, a = new T, l = new T, c = new T, h = new T, u = this.isLineSegments ? 2 : 1; if (n.isBufferGeometry) { const i = n.index, r = n.attributes.position; if (null !== i) { const n = i.array; for (let i = 0, o = n.length - 1; i < o; i += u) { const o = n[i], u = n[i + 1]; a.fromBufferAttribute(r, o), l.fromBufferAttribute(r, u); if ($r.distanceSqToSegment(a, l, h, c) > s) continue; h.applyMatrix4(this.matrixWorld); const d = t.ray.origin.distanceTo(h); d < t.near || d > t.far || e.push({ distance: d, point: c.clone().applyMatrix4(this.matrixWorld), index: i, face: null, faceIndex: null, object: this }) } } else for (let n = 0, i = r.count - 1; n < i; n += u) { a.fromBufferAttribute(r, n), l.fromBufferAttribute(r, n + 1); if ($r.distanceSqToSegment(a, l, h, c) > s) continue; h.applyMatrix4(this.matrixWorld); const i = t.ray.origin.distanceTo(h); i < t.near || i > t.far || e.push({ distance: i, point: c.clone().applyMatrix4(this.matrixWorld), index: n, face: null, faceIndex: null, object: this }) } } else n.isGeometry && console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.") }, updateMorphTargets: function() { 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.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.") } } }); const no = new T, io = new T; function ro(t, e) { eo.call(this, t, e), this.type = "LineSegments" } function oo(t, e) { eo.call(this, t, e), this.type = "LineLoop" } function so(t) { Jt.call(this), this.type = "PointsMaterial", this.color = new Yt(16777215), this.map = null, this.alphaMap = null, this.size = 1, this.sizeAttenuation = !0, this.morphTargets = !1, this.setValues(t) } ro.prototype = Object.assign(Object.create(eo.prototype), { constructor: ro, isLineSegments: !0, computeLineDistances: function() { const t = this.geometry; if (t.isBufferGeometry) if (null === t.index) { const e = t.attributes.position, n = []; for (let t = 0, i = e.count; t < i; t += 2) no.fromBufferAttribute(e, t), io.fromBufferAttribute(e, t + 1), n[t] = 0 === t ? 0 : n[t - 1], n[t + 1] = n[t] + no.distanceTo(io); t.setAttribute("lineDistance", new he(n, 1)) } else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); else t.isGeometry && console.error("THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."); return this } }), oo.prototype = Object.assign(Object.create(eo.prototype), { constructor: oo, isLineLoop: !0 }), so.prototype = Object.create(Jt.prototype), so.prototype.constructor = so, so.prototype.isPointsMaterial = !0, so.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.color.copy(t.color), this.map = t.map, this.alphaMap = t.alphaMap, this.size = t.size, this.sizeAttenuation = t.sizeAttenuation, this.morphTargets = t.morphTargets, this }; const ao = new et, lo = new tt, co = new X, ho = new T; function uo(t = new be, e = new so) { St.call(this), this.type = "Points", this.geometry = t, this.material = e, this.updateMorphTargets() } function po(t, e, n, i, r, o, s) { const a = lo.distanceSqToPoint(t); if (a < n) { const n = new T; lo.closestPointToPoint(t, n), n.applyMatrix4(i); const l = r.ray.origin.distanceTo(n); if (l < r.near || l > r.far) return; o.push({ distance: l, distanceToRay: Math.sqrt(a), point: n, index: e, face: null, object: s }) } } function fo(t, e, n, i, r, o, s, a, l) { b.call(this, t, e, n, i, r, o, s, a, l), this.format = void 0 !== s ? s : 1022, this.minFilter = void 0 !== o ? o : 1006, this.magFilter = void 0 !== r ? r : 1006, this.generateMipmaps = !1; const c = this; "requestVideoFrameCallback" in t && t.requestVideoFrameCallback((function e() { c.needsUpdate = !0, t.requestVideoFrameCallback(e) })) } function mo(t, e, n, i, r, o, s, a, l, c, h, u) { b.call(this, null, o, s, a, l, c, i, r, h, u), this.image = { width: e, height: n }, this.mipmaps = t, this.flipY = !1, this.generateMipmaps = !1 } function go(t, e, n, i, r, o, s, a, l) { b.call(this, t, e, n, i, r, o, s, a, l), this.needsUpdate = !0 } function vo(t, e, n, i, r, o, s, a, l, c) { if (1026 !== (c = void 0 !== c ? c : 1026) && 1027 !== c) throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat"); void 0 === n && 1026 === c && (n = 1012), void 0 === n && 1027 === c && (n = 1020), b.call(this, null, i, r, o, s, a, c, n, l), this.image = { width: t, height: e }, this.magFilter = void 0 !== s ? s : 1003, this.minFilter = void 0 !== a ? a : 1003, this.flipY = !1, this.generateMipmaps = !1 } uo.prototype = Object.assign(Object.create(St.prototype), { constructor: uo, isPoints: !0, copy: function(t) { return St.prototype.copy.call(this, t), this.material = t.material, this.geometry = t.geometry, this }, raycast: function(t, e) { const n = this.geometry, i = this.matrixWorld, r = t.params.Points.threshold; if (null === n.boundingSphere && n.computeBoundingSphere(), co.copy(n.boundingSphere), co.applyMatrix4(i), co.radius += r, !1 === t.ray.intersectsSphere(co)) return; ao.copy(i).invert(), lo.copy(t.ray).applyMatrix4(ao); const o = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), s = o * o; if (n.isBufferGeometry) { const r = n.index, o = n.attributes.position; if (null !== r) { const n = r.array; for (let r = 0, a = n.length; r < a; r++) { const a = n[r]; ho.fromBufferAttribute(o, a), po(ho, a, s, i, t, e, this) } } else for (let n = 0, r = o.count; n < r; n++) ho.fromBufferAttribute(o, n), po(ho, n, s, i, t, e, this) } else console.error("THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.") }, updateMorphTargets: function() { 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.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.") } } }), fo.prototype = Object.assign(Object.create(b.prototype), { constructor: fo, clone: function() { return new this.constructor(this.image).copy(this) }, isVideoTexture: !0, update: function() { const t = this.image; !1 === "requestVideoFrameCallback" in t && t.readyState >= t.HAVE_CURRENT_DATA && (this.needsUpdate = !0) } }), mo.prototype = Object.create(b.prototype), mo.prototype.constructor = mo, mo.prototype.isCompressedTexture = !0, go.prototype = Object.create(b.prototype), go.prototype.constructor = go, go.prototype.isCanvasTexture = !0, vo.prototype = Object.create(b.prototype), vo.prototype.constructor = vo, vo.prototype.isDepthTexture = !0; new T, new T, new T, new Gt; const yo = function(t, e, n) { n = n || 2; const i = e && e.length, r = i ? e[0] * n : t.length; let o = Ao(t, 0, r, n, !0); const s = []; if (!o || o.next === o.prev) return s; let a, l, c, h, u, d, p; if (i && (o = function(t, e, n, i) { const r = []; let o, s, a, l, c; for (o = 0, s = e.length; o < s; o++) a = e[o] * i, l = o < s - 1 ? e[o + 1] * i : t.length, c = Ao(t, a, l, i, !1), c === c.next && (c.steiner = !0), r.push(Co(c)); for (r.sort(So), o = 0; o < r.length; o++) To(r[o], n), n = xo(n, n.next); return n }(t, e, o, n)), t.length > 80 * n) { a = c = t[0], l = h = t[1]; for (let e = n; e < r; e += n) u = t[e], d = t[e + 1], u < a && (a = u), d < l && (l = d), u > c && (c = u), d > h && (h = d); p = Math.max(c - a, h - l), p = 0 !== p ? 1 / p : 0 } return _o(o, s, n, a, l, p), s }; function Ao(t, e, n, i, r) { let o, s; if (r === function(t, e, n, i) { let r = 0; for (let o = e, s = n - i; o < n; o += i) r += (t[s] - t[o]) * (t[o + 1] + t[s + 1]), s = o; return r }(t, e, n, i) > 0) for (o = e; o < n; o += i) s = Ho(o, t[o], t[o + 1], s); else for (o = n - i; o >= e; o -= i) s = Ho(o, t[o], t[o + 1], s); return s && Oo(s, s.next) && (Go(s), s = s.next), s } function xo(t, e) { if (!t) return t; e || (e = t); let n, i = t; do { if (n = !1, i.steiner || !Oo(i, i.next) && 0 !== Io(i.prev, i, i.next)) i = i.next; else { if (Go(i), i = e = i.prev, i === i.next) break; n = !0 } } while (n || i !== e); return e } function _o(t, e, n, i, r, o, s) { if (!t) return; !s && o && function(t, e, n, i) { let r = t; do { null === r.z && (r.z = Ro(r.x, r.y, e, n, i)), r.prevZ = r.prev, r.nextZ = r.next, r = r.next } while (r !== t); r.prevZ.nextZ = null, r.prevZ = null, function(t) { let e, n, i, r, o, s, a, l, c = 1; do { for (n = t, t = null, o = null, s = 0; n;) { for (s++, i = n, a = 0, e = 0; e < c && (a++, i = i.nextZ, i); e++); for (l = c; a > 0 || l > 0 && i;) 0 !== a && (0 === l || !i || n.z <= i.z) ? (r = n, n = n.nextZ, a--) : (r = i, i = i.nextZ, l--), o ? o.nextZ = r : t = r, r.prevZ = o, o = r; n = i } o.nextZ = null, c *= 2 } while (s > 1) }(r) }(t, i, r, o); let a, l, c = t; for (; t.prev !== t.next;) if (a = t.prev, l = t.next, o ? wo(t, i, r, o) : bo(t)) e.push(a.i / n), e.push(t.i / n), e.push(l.i / n), Go(t), t = l.next, c = l.next; else if ((t = l) === c) { s ? 1 === s ? _o(t = Mo(xo(t), e, n), e, n, i, r, o, 2) : 2 === s && Eo(t, e, n, i, r, o) : _o(xo(t), e, n, i, r, o, 1); break } } function bo(t) { const e = t.prev, n = t, i = t.next; if (Io(e, n, i) >= 0) return !1; let r = t.next.next; for (; r !== t.prev;) { if (Po(e.x, e.y, n.x, n.y, i.x, i.y, r.x, r.y) && Io(r.prev, r, r.next) >= 0) return !1; r = r.next } return !0 } function wo(t, e, n, i) { const r = t.prev, o = t, s = t.next; if (Io(r, o, s) >= 0) return !1; const a = r.x < o.x ? r.x < s.x ? r.x : s.x : o.x < s.x ? o.x : s.x, l = r.y < o.y ? r.y < s.y ? r.y : s.y : o.y < s.y ? o.y : s.y, c = r.x > o.x ? r.x > s.x ? r.x : s.x : o.x > s.x ? o.x : s.x, h = r.y > o.y ? r.y > s.y ? r.y : s.y : o.y > s.y ? o.y : s.y, u = Ro(a, l, e, n, i), d = Ro(c, h, e, n, i); let p = t.prevZ, f = t.nextZ; for (; p && p.z >= u && f && f.z <= d;) { if (p !== t.prev && p !== t.next && Po(r.x, r.y, o.x, o.y, s.x, s.y, p.x, p.y) && Io(p.prev, p, p.next) >= 0) return !1; if (p = p.prevZ, f !== t.prev && f !== t.next && Po(r.x, r.y, o.x, o.y, s.x, s.y, f.x, f.y) && Io(f.prev, f, f.next) >= 0) return !1; f = f.nextZ } for (; p && p.z >= u;) { if (p !== t.prev && p !== t.next && Po(r.x, r.y, o.x, o.y, s.x, s.y, p.x, p.y) && Io(p.prev, p, p.next) >= 0) return !1; p = p.prevZ } for (; f && f.z <= d;) { if (f !== t.prev && f !== t.next && Po(r.x, r.y, o.x, o.y, s.x, s.y, f.x, f.y) && Io(f.prev, f, f.next) >= 0) return !1; f = f.nextZ } return !0 } function Mo(t, e, n) { let i = t; do { const r = i.prev, o = i.next.next; !Oo(r, o) && No(r, i, i.next, o) && zo(r, o) && zo(o, r) && (e.push(r.i / n), e.push(i.i / n), e.push(o.i / n), Go(i), Go(i.next), i = t = o), i = i.next } while (i !== t); return xo(i) } function Eo(t, e, n, i, r, o) { let s = t; do { let t = s.next.next; for (; t !== s.prev;) { if (s.i !== t.i && Do(s, t)) { let a = Uo(s, t); return s = xo(s, s.next), a = xo(a, a.next), _o(s, e, n, i, r, o), void _o(a, e, n, i, r, o) } t = t.next } s = s.next } while (s !== t) } function So(t, e) { return t.x - e.x } function To(t, e) { if (e = function(t, e) { let n = e; const i = t.x, r = t.y; let o, s = -1 / 0; do { if (r <= n.y && r >= n.next.y && n.next.y !== n.y) { const t = n.x + (r - n.y) * (n.next.x - n.x) / (n.next.y - n.y); if (t <= i && t > s) { if (s = t, t === i) { if (r === n.y) return n; if (r === n.next.y) return n.next } o = n.x < n.next.x ? n : n.next } } n = n.next } while (n !== e); if (!o) return null; if (i === s) return o; const a = o, l = o.x, c = o.y; let h, u = 1 / 0; n = o; do { i >= n.x && n.x >= l && i !== n.x && Po(r < c ? i : s, r, l, c, r < c ? s : i, r, n.x, n.y) && (h = Math.abs(r - n.y) / (i - n.x), zo(n, t) && (h < u || h === u && (n.x > o.x || n.x === o.x && Lo(o, n))) && (o = n, u = h)), n = n.next } while (n !== a); return o }(t, e)) { const n = Uo(e, t); xo(e, e.next), xo(n, n.next) } } function Lo(t, e) { return Io(t.prev, t, e.prev) < 0 && Io(e.next, t, t.next) < 0 } function Ro(t, e, n, i, r) { return (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - n) * r) | t << 8)) | t << 4)) | t << 2)) | t << 1)) | (e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - i) * r) | e << 8)) | e << 4)) | e << 2)) | e << 1)) << 1 } function Co(t) { let e = t, n = t; do { (e.x < n.x || e.x === n.x && e.y < n.y) && (n = e), e = e.next } while (e !== t); return n } function Po(t, e, n, i, r, o, s, a) { return (r - s) * (e - a) - (t - s) * (o - a) >= 0 && (t - s) * (i - a) - (n - s) * (e - a) >= 0 && (n - s) * (o - a) - (r - s) * (i - a) >= 0 } function Do(t, e) { return t.next.i !== e.i && t.prev.i !== e.i && ! function(t, e) { let n = t; do { if (n.i !== t.i && n.next.i !== t.i && n.i !== e.i && n.next.i !== e.i && No(n, n.next, t, e)) return !0; n = n.next } while (n !== t); return !1 }(t, e) && (zo(t, e) && zo(e, t) && function(t, e) { let n = t, i = !1; const r = (t.x + e.x) / 2, o = (t.y + e.y) / 2; do { n.y > o != n.next.y > o && n.next.y !== n.y && r < (n.next.x - n.x) * (o - n.y) / (n.next.y - n.y) + n.x && (i = !i), n = n.next } while (n !== t); return i }(t, e) && (Io(t.prev, t, e.prev) || Io(t, e.prev, e)) || Oo(t, e) && Io(t.prev, t, t.next) > 0 && Io(e.prev, e, e.next) > 0) } function Io(t, e, n) { return (e.y - t.y) * (n.x - e.x) - (e.x - t.x) * (n.y - e.y) } function Oo(t, e) { return t.x === e.x && t.y === e.y } function No(t, e, n, i) { const r = Fo(Io(t, e, n)), o = Fo(Io(t, e, i)), s = Fo(Io(n, i, t)), a = Fo(Io(n, i, e)); return r !== o && s !== a || (!(0 !== r || !Bo(t, n, e)) || (!(0 !== o || !Bo(t, i, e)) || (!(0 !== s || !Bo(n, t, i)) || !(0 !== a || !Bo(n, e, i))))) } function Bo(t, e, n) { return e.x <= Math.max(t.x, n.x) && e.x >= Math.min(t.x, n.x) && e.y <= Math.max(t.y, n.y) && e.y >= Math.min(t.y, n.y) } function Fo(t) { return t > 0 ? 1 : t < 0 ? -1 : 0 } function zo(t, e) { return Io(t.prev, t, t.next) < 0 ? Io(t, e, t.next) >= 0 && Io(t, t.prev, e) >= 0 : Io(t, e, t.prev) < 0 || Io(t, t.next, e) < 0 } function Uo(t, e) { const n = new Vo(t.i, t.x, t.y), i = new Vo(e.i, e.x, e.y), r = t.next, o = e.prev; return t.next = e, e.prev = t, n.next = r, r.prev = n, i.next = n, n.prev = i, o.next = i, i.prev = o, i } function Ho(t, e, n, i) { const r = new Vo(t, e, n); return i ? (r.next = i.next, r.prev = i, i.next.prev = r, i.next = r) : (r.prev = r, r.next = r), r } function Go(t) { t.next.prev = t.prev, t.prev.next = t.next, t.prevZ && (t.prevZ.nextZ = t.nextZ), t.nextZ && (t.nextZ.prevZ = t.prevZ) } function Vo(t, e, n) { this.i = t, this.x = e, this.y = n, this.prev = null, this.next = null, this.z = null, this.prevZ = null, this.nextZ = null, this.steiner = !1 } const ko = { area: function(t) { const e = t.length; let n = 0; for (let i = e - 1, r = 0; r < e; i = r++) n += t[i].x * t[r].y - t[r].x * t[i].y; return .5 * n }, isClockWise: function(t) { return ko.area(t) < 0 }, triangulateShape: function(t, e) { const n = [], i = [], r = []; Wo(t), jo(n, t); let o = t.length; e.forEach(Wo); for (let t = 0; t < e.length; t++) i.push(o), o += e[t].length, jo(n, e[t]); const s = yo(n, i); for (let t = 0; t < s.length; t += 3) r.push(s.slice(t, t + 3)); return r } }; function Wo(t) { const e = t.length; e > 2 && t[e - 1].equals(t[0]) && t.pop() } function jo(t, e) { for (let n = 0; n < e.length; n++) t.push(e[n].x), t.push(e[n].y) } class Xo extends be { constructor(t, e) { super(), this.type = "ExtrudeGeometry", this.parameters = { shapes: t, options: e }, t = Array.isArray(t) ? t : [t]; const n = this, i = [], r = []; for (let e = 0, n = t.length; e < n; e++) { o(t[e]) } function o(t) { const o = [], s = void 0 !== e.curveSegments ? e.curveSegments : 12, a = void 0 !== e.steps ? e.steps : 1; let l = void 0 !== e.depth ? e.depth : 100, c = void 0 === e.bevelEnabled || e.bevelEnabled, h = void 0 !== e.bevelThickness ? e.bevelThickness : 6, u = void 0 !== e.bevelSize ? e.bevelSize : h - 2, d = void 0 !== e.bevelOffset ? e.bevelOffset : 0, p = void 0 !== e.bevelSegments ? e.bevelSegments : 3; const f = e.extrudePath, m = void 0 !== e.UVGenerator ? e.UVGenerator : qo; void 0 !== e.amount && (console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."), l = e.amount); let g, y, A, x, _, b = !1; f && (g = f.getSpacedPoints(a), b = !0, c = !1, y = f.computeFrenetFrames(a, !1), A = new T, x = new T, _ = new T), c || (p = 0, h = 0, u = 0, d = 0); const w = t.extractPoints(s); let M = w.shape; const E = w.holes; if (!ko.isClockWise(M)) { M = M.reverse(); for (let t = 0, e = E.length; t < e; t++) { const e = E[t]; ko.isClockWise(e) && (E[t] = e.reverse()) } } const S = ko.triangulateShape(M, E), L = M; for (let t = 0, e = E.length; t < e; t++) { const e = E[t]; M = M.concat(e) } function R(t, e, n) { return e || console.error("THREE.ExtrudeGeometry: vec does not exist"), e.clone().multiplyScalar(n).add(t) } const C = M.length, P = S.length; function D(t, e, n) { let i, r, o; const s = t.x - e.x, a = t.y - e.y, l = n.x - t.x, c = n.y - t.y, h = s * s + a * a, u = s * c - a * l; if (Math.abs(u) > Number.EPSILON) { const u = Math.sqrt(h), d = Math.sqrt(l * l + c * c), p = e.x - a / u, f = e.y + s / u, m = ((n.x - c / d - p) * c - (n.y + l / d - f) * l) / (s * c - a * l); i = p + s * m - t.x, r = f + a * m - t.y; const g = i * i + r * r; if (g <= 2) return new v(i, r); o = Math.sqrt(g / 2) } else { let t = !1; s > Number.EPSILON ? l > Number.EPSILON && (t = !0) : s < -Number.EPSILON ? l < -Number.EPSILON && (t = !0) : Math.sign(a) === Math.sign(c) && (t = !0), t ? (i = -a, r = s, o = Math.sqrt(h)) : (i = s, r = a, o = Math.sqrt(h / 2)) } return new v(i / o, r / o) } const I = []; for (let t = 0, e = L.length, n = e - 1, i = t + 1; t < e; t++, n++, i++) n === e && (n = 0), i === e && (i = 0), I[t] = D(L[t], L[n], L[i]); const O = []; let N, B = I.concat(); for (let t = 0, e = E.length; t < e; t++) { const e = E[t]; N = []; for (let t = 0, n = e.length, i = n - 1, r = t + 1; t < n; t++, i++, r++) i === n && (i = 0), r === n && (r = 0), N[t] = D(e[t], e[i], e[r]); O.push(N), B = B.concat(N) } for (let t = 0; t < p; t++) { const e = t / p, n = h * Math.cos(e * Math.PI / 2), i = u * Math.sin(e * Math.PI / 2) + d; for (let t = 0, e = L.length; t < e; t++) { const e = R(L[t], I[t], i); U(e.x, e.y, -n) } for (let t = 0, e = E.length; t < e; t++) { const e = E[t]; N = O[t]; for (let t = 0, r = e.length; t < r; t++) { const r = R(e[t], N[t], i); U(r.x, r.y, -n) } } } const F = u + d; for (let t = 0; t < C; t++) { const e = c ? R(M[t], B[t], F) : M[t]; b ? (x.copy(y.normals[0]).multiplyScalar(e.x), A.copy(y.binormals[0]).multiplyScalar(e.y), _.copy(g[0]).add(x).add(A), U(_.x, _.y, _.z)) : U(e.x, e.y, 0) } for (let t = 1; t <= a; t++) for (let e = 0; e < C; e++) { const n = c ? R(M[e], B[e], F) : M[e]; b ? (x.copy(y.normals[t]).multiplyScalar(n.x), A.copy(y.binormals[t]).multiplyScalar(n.y), _.copy(g[t]).add(x).add(A), U(_.x, _.y, _.z)) : U(n.x, n.y, l / a * t) } for (let t = p - 1; t >= 0; t--) { const e = t / p, n = h * Math.cos(e * Math.PI / 2), i = u * Math.sin(e * Math.PI / 2) + d; for (let t = 0, e = L.length; t < e; t++) { const e = R(L[t], I[t], i); U(e.x, e.y, l + n) } for (let t = 0, e = E.length; t < e; t++) { const e = E[t]; N = O[t]; for (let t = 0, r = e.length; t < r; t++) { const r = R(e[t], N[t], i); b ? U(r.x, r.y + g[a - 1].y, g[a - 1].x + n) : U(r.x, r.y, l + n) } } } function z(t, e) { let n = t.length; for (; --n >= 0;) { const i = n; let r = n - 1; r < 0 && (r = t.length - 1); for (let t = 0, n = a + 2 * p; t < n; t++) { const n = C * t, o = C * (t + 1); G(e + i + n, e + r + n, e + r + o, e + i + o) } } } function U(t, e, n) { o.push(t), o.push(e), o.push(n) } function H(t, e, r) { V(t), V(e), V(r); const o = i.length / 3, s = m.generateTopUV(n, i, o - 3, o - 2, o - 1); k(s[0]), k(s[1]), k(s[2]) } function G(t, e, r, o) { V(t), V(e), V(o), V(e), V(r), V(o); const s = i.length / 3, a = m.generateSideWallUV(n, i, s - 6, s - 3, s - 2, s - 1); k(a[0]), k(a[1]), k(a[3]), k(a[1]), k(a[2]), k(a[3]) } function V(t) { i.push(o[3 * t + 0]), i.push(o[3 * t + 1]), i.push(o[3 * t + 2]) } function k(t) { r.push(t.x), r.push(t.y) }! function() { const t = i.length / 3; if (c) { let t = 0, e = C * t; for (let t = 0; t < P; t++) { const n = S[t]; H(n[2] + e, n[1] + e, n[0] + e) } t = a + 2 * p, e = C * t; for (let t = 0; t < P; t++) { const n = S[t]; H(n[0] + e, n[1] + e, n[2] + e) } } else { for (let t = 0; t < P; t++) { const e = S[t]; H(e[2], e[1], e[0]) } for (let t = 0; t < P; t++) { const e = S[t]; H(e[0] + C * a, e[1] + C * a, e[2] + C * a) } } n.addGroup(t, i.length / 3 - t, 0) }(), function() { const t = i.length / 3; let e = 0; z(L, e), e += L.length; for (let t = 0, n = E.length; t < n; t++) { const n = E[t]; z(n, e), e += n.length } n.addGroup(t, i.length / 3 - t, 1) }() } this.setAttribute("position", new he(i, 3)), this.setAttribute("uv", new he(r, 2)), this.computeVertexNormals() } toJSON() { const t = be.prototype.toJSON.call(this); return function(t, e, n) { if (n.shapes = [], Array.isArray(t)) for (let e = 0, i = t.length; e < i; e++) { const i = t[e]; n.shapes.push(i.uuid) } else n.shapes.push(t.uuid); void 0 !== e.extrudePath && (n.options.extrudePath = e.extrudePath.toJSON()); return n }(this.parameters.shapes, this.parameters.options, t) } } const qo = { generateTopUV: function(t, e, n, i, r) { const o = e[3 * n], s = e[3 * n + 1], a = e[3 * i], l = e[3 * i + 1], c = e[3 * r], h = e[3 * r + 1]; return [new v(o, s), new v(a, l), new v(c, h)] }, generateSideWallUV: function(t, e, n, i, r, o) { const s = e[3 * n], a = e[3 * n + 1], l = e[3 * n + 2], c = e[3 * i], h = e[3 * i + 1], u = e[3 * i + 2], d = e[3 * r], p = e[3 * r + 1], f = e[3 * r + 2], m = e[3 * o], g = e[3 * o + 1], y = e[3 * o + 2]; return Math.abs(a - h) < .01 ? [new v(s, 1 - l), new v(c, 1 - u), new v(d, 1 - f), new v(m, 1 - y)] : [new v(a, 1 - l), new v(h, 1 - u), new v(p, 1 - f), new v(g, 1 - y)] } }; function Yo(t, e, n) { be.call(this), this.type = "ParametricGeometry", this.parameters = { func: t, slices: e, stacks: n }; const i = [], r = [], o = [], s = [], a = 1e-5, l = new T, c = new T, h = new T, u = new T, d = new T; t.length < 3 && console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter."); const p = e + 1; for (let i = 0; i <= n; i++) { const p = i / n; for (let n = 0; n <= e; n++) { const i = n / e; t(i, p, c), r.push(c.x, c.y, c.z), i - a >= 0 ? (t(i - a, p, h), u.subVectors(c, h)) : (t(i + a, p, h), u.subVectors(h, c)), p - a >= 0 ? (t(i, p - a, h), d.subVectors(c, h)) : (t(i, p + a, h), d.subVectors(h, c)), l.crossVectors(u, d).normalize(), o.push(l.x, l.y, l.z), s.push(i, p) } } for (let t = 0; t < n; t++) for (let n = 0; n < e; n++) { const e = t * p + n, r = t * p + n + 1, o = (t + 1) * p + n + 1, s = (t + 1) * p + n; i.push(e, r, s), i.push(r, o, s) } this.setIndex(i), this.setAttribute("position", new he(r, 3)), this.setAttribute("normal", new he(o, 3)), this.setAttribute("uv", new he(s, 2)) } Yo.prototype = Object.create(be.prototype), Yo.prototype.constructor = Yo; class Qo extends be { constructor(t, e = 12) { super(), this.type = "ShapeGeometry", this.parameters = { shapes: t, curveSegments: e }; const n = [], i = [], r = [], o = []; let s = 0, a = 0; if (!1 === Array.isArray(t)) l(t); else for (let e = 0; e < t.length; e++) l(t[e]), this.addGroup(s, a, e), s += a, a = 0; function l(t) { const s = i.length / 3, l = t.extractPoints(e); let c = l.shape; const h = l.holes; !1 === ko.isClockWise(c) && (c = c.reverse()); for (let t = 0, e = h.length; t < e; t++) { const e = h[t]; !0 === ko.isClockWise(e) && (h[t] = e.reverse()) } const u = ko.triangulateShape(c, h); for (let t = 0, e = h.length; t < e; t++) { const e = h[t]; c = c.concat(e) } for (let t = 0, e = c.length; t < e; t++) { const e = c[t]; i.push(e.x, e.y, 0), r.push(0, 0, 1), o.push(e.x, e.y) } for (let t = 0, e = u.length; t < e; t++) { const e = u[t], i = e[0] + s, r = e[1] + s, o = e[2] + s; n.push(i, r, o), a += 3 } } this.setIndex(n), this.setAttribute("position", new he(i, 3)), this.setAttribute("normal", new he(r, 3)), this.setAttribute("uv", new he(o, 2)) } toJSON() { const t = be.prototype.toJSON.call(this); return function(t, e) { if (e.shapes = [], Array.isArray(t)) for (let n = 0, i = t.length; n < i; n++) { const i = t[n]; e.shapes.push(i.uuid) } else e.shapes.push(t.uuid); return e }(this.parameters.shapes, t) } } class Zo extends be { constructor(t = 1, e = 8, n = 6, i = 0, r = 2 * Math.PI, o = 0, s = Math.PI) { super(), this.type = "SphereGeometry", this.parameters = { radius: t, widthSegments: e, heightSegments: n, phiStart: i, phiLength: r, thetaStart: o, thetaLength: s }, e = Math.max(3, Math.floor(e)), n = Math.max(2, Math.floor(n)); const a = Math.min(o + s, Math.PI); let l = 0; const c = [], h = new T, u = new T, d = [], p = [], f = [], m = []; for (let d = 0; d <= n; d++) { const g = [], v = d / n; let y = 0; 0 == d && 0 == o ? y = .5 / e : d == n && a == Math.PI && (y = -.5 / e); for (let n = 0; n <= e; n++) { const a = n / e; h.x = -t * Math.cos(i + a * r) * Math.sin(o + v * s), h.y = t * Math.cos(o + v * s), h.z = t * Math.sin(i + a * r) * Math.sin(o + v * s), p.push(h.x, h.y, h.z), u.copy(h).normalize(), f.push(u.x, u.y, u.z), m.push(a + y, 1 - v), g.push(l++) } c.push(g) } for (let t = 0; t < n; t++) for (let i = 0; i < e; i++) { const e = c[t][i + 1], r = c[t][i], s = c[t + 1][i], l = c[t + 1][i + 1]; (0 !== t || o > 0) && d.push(e, r, l), (t !== n - 1 || a < Math.PI) && d.push(r, s, l) } this.setIndex(d), this.setAttribute("position", new he(p, 3)), this.setAttribute("normal", new he(f, 3)), this.setAttribute("uv", new he(m, 2)) } } function Jo(t) { Jt.call(this), this.type = "ShadowMaterial", this.color = new Yt(0), this.transparent = !0, this.setValues(t) } function Ko(t) { Xe.call(this, t), this.type = "RawShaderMaterial" } function $o(t) { Jt.call(this), this.defines = { STANDARD: "" }, this.type = "MeshStandardMaterial", this.color = new Yt(16777215), this.roughness = 1, this.metalness = 0, this.map = null, this.lightMap = null, this.lightMapIntensity = 1, this.aoMap = null, this.aoMapIntensity = 1, this.emissive = new Yt(0), this.emissiveIntensity = 1, this.emissiveMap = null, this.bumpMap = null, this.bumpScale = 1, this.normalMap = null, this.normalMapType = 0, this.normalScale = new v(1, 1), this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.roughnessMap = null, this.metalnessMap = null, this.alphaMap = null, this.envMap = null, this.envMapIntensity = 1, this.refractionRatio = .98, this.wireframe = !1, this.wireframeLinewidth = 1, this.wireframeLinecap = "round", this.wireframeLinejoin = "round", this.skinning = !1, this.morphTargets = !1, this.morphNormals = !1, this.vertexTangents = !1, this.setValues(t) } function ts(t) { $o.call(this), this.defines = { STANDARD: "", PHYSICAL: "" }, this.type = "MeshPhysicalMaterial", this.clearcoat = 0, this.clearcoatMap = null, this.clearcoatRoughness = 0, this.clearcoatRoughnessMap = null, this.clearcoatNormalScale = new v(1, 1), this.clearcoatNormalMap = null, this.reflectivity = .5, Object.defineProperty(this, "ior", { get: function() { return (1 + .4 * this.reflectivity) / (1 - .4 * this.reflectivity) }, set: function(t) { this.reflectivity = g.clamp(2.5 * (t - 1) / (t + 1), 0, 1) } }), this.sheen = null, this.transmission = 0, this.transmissionMap = null, this.setValues(t) } function es(t) { Jt.call(this), this.type = "MeshPhongMaterial", this.color = new Yt(16777215), this.specular = new Yt(1118481), this.shininess = 30, this.map = null, this.lightMap = null, this.lightMapIntensity = 1, this.aoMap = null, this.aoMapIntensity = 1, this.emissive = new Yt(0), this.emissiveIntensity = 1, this.emissiveMap = null, this.bumpMap = null, this.bumpScale = 1, this.normalMap = null, this.normalMapType = 0, this.normalScale = new v(1, 1), this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, 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.skinning = !1, this.morphTargets = !1, this.morphNormals = !1, this.setValues(t) } function ns(t) { Jt.call(this), this.defines = { TOON: "" }, this.type = "MeshToonMaterial", this.color = new Yt(16777215), this.map = null, this.gradientMap = null, this.lightMap = null, this.lightMapIntensity = 1, this.aoMap = null, this.aoMapIntensity = 1, this.emissive = new Yt(0), this.emissiveIntensity = 1, this.emissiveMap = null, this.bumpMap = null, this.bumpScale = 1, this.normalMap = null, this.normalMapType = 0, this.normalScale = new v(1, 1), this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.alphaMap = null, this.wireframe = !1, this.wireframeLinewidth = 1, this.wireframeLinecap = "round", this.wireframeLinejoin = "round", this.skinning = !1, this.morphTargets = !1, this.morphNormals = !1, this.setValues(t) } function is(t) { Jt.call(this), this.type = "MeshNormalMaterial", this.bumpMap = null, this.bumpScale = 1, this.normalMap = null, this.normalMapType = 0, this.normalScale = new v(1, 1), this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.wireframe = !1, this.wireframeLinewidth = 1, this.fog = !1, this.skinning = !1, this.morphTargets = !1, this.morphNormals = !1, this.setValues(t) } function rs(t) { Jt.call(this), this.type = "MeshLambertMaterial", this.color = new Yt(16777215), this.map = null, this.lightMap = null, this.lightMapIntensity = 1, this.aoMap = null, this.aoMapIntensity = 1, this.emissive = new Yt(0), this.emissiveIntensity = 1, this.emissiveMap = null, 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.skinning = !1, this.morphTargets = !1, this.morphNormals = !1, this.setValues(t) } function os(t) { Jt.call(this), this.defines = { MATCAP: "" }, this.type = "MeshMatcapMaterial", this.color = new Yt(16777215), this.matcap = null, this.map = null, this.bumpMap = null, this.bumpScale = 1, this.normalMap = null, this.normalMapType = 0, this.normalScale = new v(1, 1), this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.alphaMap = null, this.skinning = !1, this.morphTargets = !1, this.morphNormals = !1, this.setValues(t) } function ss(t) { Qr.call(this), this.type = "LineDashedMaterial", this.scale = 1, this.dashSize = 3, this.gapSize = 1, this.setValues(t) } Jo.prototype = Object.create(Jt.prototype), Jo.prototype.constructor = Jo, Jo.prototype.isShadowMaterial = !0, Jo.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.color.copy(t.color), this }, Ko.prototype = Object.create(Xe.prototype), Ko.prototype.constructor = Ko, Ko.prototype.isRawShaderMaterial = !0, $o.prototype = Object.create(Jt.prototype), $o.prototype.constructor = $o, $o.prototype.isMeshStandardMaterial = !0, $o.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.defines = { STANDARD: "" }, this.color.copy(t.color), this.roughness = t.roughness, this.metalness = t.metalness, this.map = t.map, this.lightMap = t.lightMap, this.lightMapIntensity = t.lightMapIntensity, this.aoMap = t.aoMap, this.aoMapIntensity = t.aoMapIntensity, this.emissive.copy(t.emissive), this.emissiveMap = t.emissiveMap, this.emissiveIntensity = t.emissiveIntensity, this.bumpMap = t.bumpMap, this.bumpScale = t.bumpScale, this.normalMap = t.normalMap, this.normalMapType = t.normalMapType, this.normalScale.copy(t.normalScale), this.displacementMap = t.displacementMap, this.displacementScale = t.displacementScale, this.displacementBias = t.displacementBias, this.roughnessMap = t.roughnessMap, this.metalnessMap = t.metalnessMap, this.alphaMap = t.alphaMap, this.envMap = t.envMap, this.envMapIntensity = t.envMapIntensity, this.refractionRatio = t.refractionRatio, this.wireframe = t.wireframe, this.wireframeLinewidth = t.wireframeLinewidth, this.wireframeLinecap = t.wireframeLinecap, this.wireframeLinejoin = t.wireframeLinejoin, this.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this.vertexTangents = t.vertexTangents, this }, ts.prototype = Object.create($o.prototype), ts.prototype.constructor = ts, ts.prototype.isMeshPhysicalMaterial = !0, ts.prototype.copy = function(t) { return $o.prototype.copy.call(this, t), this.defines = { STANDARD: "", PHYSICAL: "" }, this.clearcoat = t.clearcoat, this.clearcoatMap = t.clearcoatMap, this.clearcoatRoughness = t.clearcoatRoughness, this.clearcoatRoughnessMap = t.clearcoatRoughnessMap, this.clearcoatNormalMap = t.clearcoatNormalMap, this.clearcoatNormalScale.copy(t.clearcoatNormalScale), this.reflectivity = t.reflectivity, t.sheen ? this.sheen = (this.sheen || new Yt).copy(t.sheen) : this.sheen = null, this.transmission = t.transmission, this.transmissionMap = t.transmissionMap, this }, es.prototype = Object.create(Jt.prototype), es.prototype.constructor = es, es.prototype.isMeshPhongMaterial = !0, es.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.color.copy(t.color), this.specular.copy(t.specular), this.shininess = t.shininess, this.map = t.map, this.lightMap = t.lightMap, this.lightMapIntensity = t.lightMapIntensity, this.aoMap = t.aoMap, this.aoMapIntensity = t.aoMapIntensity, this.emissive.copy(t.emissive), this.emissiveMap = t.emissiveMap, this.emissiveIntensity = t.emissiveIntensity, this.bumpMap = t.bumpMap, this.bumpScale = t.bumpScale, this.normalMap = t.normalMap, this.normalMapType = t.normalMapType, this.normalScale.copy(t.normalScale), this.displacementMap = t.displacementMap, this.displacementScale = t.displacementScale, this.displacementBias = t.displacementBias, 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.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this }, ns.prototype = Object.create(Jt.prototype), ns.prototype.constructor = ns, ns.prototype.isMeshToonMaterial = !0, ns.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.color.copy(t.color), this.map = t.map, this.gradientMap = t.gradientMap, this.lightMap = t.lightMap, this.lightMapIntensity = t.lightMapIntensity, this.aoMap = t.aoMap, this.aoMapIntensity = t.aoMapIntensity, this.emissive.copy(t.emissive), this.emissiveMap = t.emissiveMap, this.emissiveIntensity = t.emissiveIntensity, this.bumpMap = t.bumpMap, this.bumpScale = t.bumpScale, this.normalMap = t.normalMap, this.normalMapType = t.normalMapType, this.normalScale.copy(t.normalScale), this.displacementMap = t.displacementMap, this.displacementScale = t.displacementScale, this.displacementBias = t.displacementBias, this.alphaMap = t.alphaMap, this.wireframe = t.wireframe, this.wireframeLinewidth = t.wireframeLinewidth, this.wireframeLinecap = t.wireframeLinecap, this.wireframeLinejoin = t.wireframeLinejoin, this.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this }, is.prototype = Object.create(Jt.prototype), is.prototype.constructor = is, is.prototype.isMeshNormalMaterial = !0, is.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.bumpMap = t.bumpMap, this.bumpScale = t.bumpScale, this.normalMap = t.normalMap, this.normalMapType = t.normalMapType, this.normalScale.copy(t.normalScale), this.displacementMap = t.displacementMap, this.displacementScale = t.displacementScale, this.displacementBias = t.displacementBias, this.wireframe = t.wireframe, this.wireframeLinewidth = t.wireframeLinewidth, this.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this }, rs.prototype = Object.create(Jt.prototype), rs.prototype.constructor = rs, rs.prototype.isMeshLambertMaterial = !0, rs.prototype.copy = function(t) { return Jt.prototype.copy.call(this, 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.emissive.copy(t.emissive), this.emissiveMap = t.emissiveMap, this.emissiveIntensity = t.emissiveIntensity, 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.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this }, os.prototype = Object.create(Jt.prototype), os.prototype.constructor = os, os.prototype.isMeshMatcapMaterial = !0, os.prototype.copy = function(t) { return Jt.prototype.copy.call(this, t), this.defines = { MATCAP: "" }, this.color.copy(t.color), this.matcap = t.matcap, this.map = t.map, this.bumpMap = t.bumpMap, this.bumpScale = t.bumpScale, this.normalMap = t.normalMap, this.normalMapType = t.normalMapType, this.normalScale.copy(t.normalScale), this.displacementMap = t.displacementMap, this.displacementScale = t.displacementScale, this.displacementBias = t.displacementBias, this.alphaMap = t.alphaMap, this.skinning = t.skinning, this.morphTargets = t.morphTargets, this.morphNormals = t.morphNormals, this }, ss.prototype = Object.create(Qr.prototype), ss.prototype.constructor = ss, ss.prototype.isLineDashedMaterial = !0, ss.prototype.copy = function(t) { return Qr.prototype.copy.call(this, t), this.scale = t.scale, this.dashSize = t.dashSize, this.gapSize = t.gapSize, this }; var as = Object.freeze({ __proto__: null, ShadowMaterial: Jo, SpriteMaterial: mr, RawShaderMaterial: Ko, ShaderMaterial: Xe, PointsMaterial: so, MeshPhysicalMaterial: ts, MeshStandardMaterial: $o, MeshPhongMaterial: es, MeshToonMaterial: ns, MeshNormalMaterial: is, MeshLambertMaterial: rs, MeshDepthMaterial: Ki, MeshDistanceMaterial: $i, MeshBasicMaterial: Kt, MeshMatcapMaterial: os, LineDashedMaterial: ss, LineBasicMaterial: Qr, Material: Jt }); const ls = { arraySlice: function(t, e, n) { return ls.isTypedArray(t) ? new t.constructor(t.subarray(e, void 0 !== n ? n : t.length)) : t.slice(e, n) }, convertArray: function(t, e, n) { return !t || !n && t.constructor === e ? t : "number" == typeof e.BYTES_PER_ELEMENT ? new e(t) : Array.prototype.slice.call(t) }, isTypedArray: function(t) { return ArrayBuffer.isView(t) && !(t instanceof DataView) }, getKeyframeOrder: function(t) { const e = t.length, n = new Array(e); for (let t = 0; t !== e; ++t) n[t] = t; return n.sort((function(e, n) { return t[e] - t[n] })), n }, sortedArray: function(t, e, n) { const i = t.length, r = new t.constructor(i); for (let o = 0, s = 0; s !== i; ++o) { const i = n[o] * e; for (let n = 0; n !== e; ++n) r[s++] = t[i + n] } return r }, flattenJSON: function(t, e, n, i) { let r = 1, o = t[0]; for (; void 0 !== o && void 0 === o[i];) o = t[r++]; if (void 0 === o) return; let s = o[i]; if (void 0 !== s) if (Array.isArray(s)) do { s = o[i], void 0 !== s && (e.push(o.time), n.push.apply(n, s)), o = t[r++] } while (void 0 !== o); else if (void 0 !== s.toArray) do { s = o[i], void 0 !== s && (e.push(o.time), s.toArray(n, n.length)), o = t[r++] } while (void 0 !== o); else do { s = o[i], void 0 !== s && (e.push(o.time), n.push(s)), o = t[r++] } while (void 0 !== o) }, subclip: function(t, e, n, i, r = 30) { const o = t.clone(); o.name = e; const s = []; for (let t = 0; t < o.tracks.length; ++t) { const e = o.tracks[t], a = e.getValueSize(), l = [], c = []; for (let t = 0; t < e.times.length; ++t) { const o = e.times[t] * r; if (!(o < n || o >= i)) { l.push(e.times[t]); for (let n = 0; n < a; ++n) c.push(e.values[t * a + n]) } } 0 !== l.length && (e.times = ls.convertArray(l, e.times.constructor), e.values = ls.convertArray(c, e.values.constructor), s.push(e)) } o.tracks = s; let a = 1 / 0; for (let t = 0; t < o.tracks.length; ++t) a > o.tracks[t].times[0] && (a = o.tracks[t].times[0]); for (let t = 0; t < o.tracks.length; ++t) o.tracks[t].shift(-1 * a); return o.resetDuration(), o }, makeClipAdditive: function(t, e = 0, n = t, i = 30) { i <= 0 && (i = 30); const r = n.tracks.length, o = e / i; for (let e = 0; e < r; ++e) { const i = n.tracks[e], r = i.ValueTypeName; if ("bool" === r || "string" === r) continue; const s = t.tracks.find((function(t) { return t.name === i.name && t.ValueTypeName === r })); if (void 0 === s) continue; let a = 0; const l = i.getValueSize(); i.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline && (a = l / 3); let c = 0; const h = s.getValueSize(); s.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline && (c = h / 3); const u = i.times.length - 1; let d; if (o <= i.times[0]) { const t = a, e = l - a; d = ls.arraySlice(i.values, t, e) } else if (o >= i.times[u]) { const t = u * l + a, e = t + l - a; d = ls.arraySlice(i.values, t, e) } else { const t = i.createInterpolant(), e = a, n = l - a; t.evaluate(o), d = ls.arraySlice(t.resultBuffer, e, n) } if ("quaternion" === r) { (new S).fromArray(d).normalize().conjugate().toArray(d) } const p = s.times.length; for (let t = 0; t < p; ++t) { const e = t * h + c; if ("quaternion" === r) S.multiplyQuaternionsFlat(s.values, e, d, 0, s.values, e); else { const t = h - 2 * c; for (let n = 0; n < t; ++n) s.values[e + n] -= d[n] } } } return t.blendMode = 2501, t } }; function cs(t, e, n, i) { this.parameterPositions = t, this._cachedIndex = 0, this.resultBuffer = void 0 !== i ? i : new e.constructor(n), this.sampleValues = e, this.valueSize = n } function hs(t, e, n, i) { cs.call(this, t, e, n, i), this._weightPrev = -0, this._offsetPrev = -0, this._weightNext = -0, this._offsetNext = -0 } function us(t, e, n, i) { cs.call(this, t, e, n, i) } function ds(t, e, n, i) { cs.call(this, t, e, n, i) } function ps(t, e, n, i) { if (void 0 === t) throw new Error("THREE.KeyframeTrack: track name is undefined"); if (void 0 === e || 0 === e.length) throw new Error("THREE.KeyframeTrack: no keyframes in track named " + t); this.name = t, this.times = ls.convertArray(e, this.TimeBufferType), this.values = ls.convertArray(n, this.ValueBufferType), this.setInterpolation(i || this.DefaultInterpolation) } function fs(t, e, n) { ps.call(this, t, e, n) } function ms(t, e, n, i) { ps.call(this, t, e, n, i) } function gs(t, e, n, i) { ps.call(this, t, e, n, i) } function vs(t, e, n, i) { cs.call(this, t, e, n, i) } function ys(t, e, n, i) { ps.call(this, t, e, n, i) } function As(t, e, n, i) { ps.call(this, t, e, n, i) } function xs(t, e, n, i) { ps.call(this, t, e, n, i) } function _s(t, e = -1, n, i = 2500) { this.name = t, this.tracks = n, this.duration = e, this.blendMode = i, this.uuid = g.generateUUID(), this.duration < 0 && this.resetDuration() } function bs(t) { if (void 0 === t.type) throw new Error("THREE.KeyframeTrack: track type undefined, can not parse"); const e = function(t) { switch (t.toLowerCase()) { case "scalar": case "double": case "float": case "number": case "integer": return gs; case "vector": case "vector2": case "vector3": case "vector4": return xs; case "color": return ms; case "quaternion": return ys; case "bool": case "boolean": return fs; case "string": return As } throw new Error("THREE.KeyframeTrack: Unsupported typeName: " + t) }(t.type); if (void 0 === t.times) { const e = [], n = []; ls.flattenJSON(t.keys, e, n, "value"), t.times = e, t.values = n } return void 0 !== e.parse ? e.parse(t) : new e(t.name, t.times, t.values, t.interpolation) } Object.assign(cs.prototype, { evaluate: function(t) { const e = this.parameterPositions; let n = this._cachedIndex, i = e[n], r = e[n - 1]; t: { e: { let o;n: { i: if (!(t < i)) { for (let o = n + 2;;) { if (void 0 === i) { if (t < r) break i; return n = e.length, this._cachedIndex = n, this.afterEnd_(n - 1, t, r) } if (n === o) break; if (r = i, i = e[++n], t < i) break e } o = e.length; break n }if (t >= r) break t; { const s = e[1]; t < s && (n = 2, r = s); for (let o = n - 2;;) { if (void 0 === r) return this._cachedIndex = 0, this.beforeStart_(0, t, i); if (n === o) break; if (i = r, r = e[--n - 1], t >= r) break e } o = n, n = 0 } } for (; n < o;) { const i = n + o >>> 1; t < e[i] ? o = i : n = i + 1 } if (i = e[n], r = e[n - 1], void 0 === r) return this._cachedIndex = 0, this.beforeStart_(0, t, i); if (void 0 === i) return n = e.length, this._cachedIndex = n, this.afterEnd_(n - 1, r, t) } this._cachedIndex = n, this.intervalChanged_(n, r, i) } return this.interpolate_(n, r, t, i) }, settings: null, DefaultSettings_: {}, getSettings_: function() { return this.settings || this.DefaultSettings_ }, copySampleValue_: function(t) { const e = this.resultBuffer, n = this.sampleValues, i = this.valueSize, r = t * i; for (let t = 0; t !== i; ++t) e[t] = n[r + t]; return e }, interpolate_: function() { throw new Error("call to abstract method") }, intervalChanged_: function() {} }), Object.assign(cs.prototype, { beforeStart_: cs.prototype.copySampleValue_, afterEnd_: cs.prototype.copySampleValue_ }), hs.prototype = Object.assign(Object.create(cs.prototype), { constructor: hs, DefaultSettings_: { endingStart: 2400, endingEnd: 2400 }, intervalChanged_: function(t, e, n) { const i = this.parameterPositions; let r = t - 2, o = t + 1, s = i[r], a = i[o]; if (void 0 === s) switch (this.getSettings_().endingStart) { case 2401: r = t, s = 2 * e - n; break; case 2402: r = i.length - 2, s = e + i[r] - i[r + 1]; break; default: r = t, s = n } if (void 0 === a) switch (this.getSettings_().endingEnd) { case 2401: o = t, a = 2 * n - e; break; case 2402: o = 1, a = n + i[1] - i[0]; break; default: o = t - 1, a = e } const l = .5 * (n - e), c = this.valueSize; this._weightPrev = l / (e - s), this._weightNext = l / (a - n), this._offsetPrev = r * c, this._offsetNext = o * c }, interpolate_: function(t, e, n, i) { const r = this.resultBuffer, o = this.sampleValues, s = this.valueSize, a = t * s, l = a - s, c = this._offsetPrev, h = this._offsetNext, u = this._weightPrev, d = this._weightNext, p = (n - e) / (i - e), f = p * p, m = f * p, g = -u * m + 2 * u * f - u * p, v = (1 + u) * m + (-1.5 - 2 * u) * f + (-.5 + u) * p + 1, y = (-1 - d) * m + (1.5 + d) * f + .5 * p, A = d * m - d * f; for (let t = 0; t !== s; ++t) r[t] = g * o[c + t] + v * o[l + t] + y * o[a + t] + A * o[h + t]; return r } }), us.prototype = Object.assign(Object.create(cs.prototype), { constructor: us, interpolate_: function(t, e, n, i) { const r = this.resultBuffer, o = this.sampleValues, s = this.valueSize, a = t * s, l = a - s, c = (n - e) / (i - e), h = 1 - c; for (let t = 0; t !== s; ++t) r[t] = o[l + t] * h + o[a + t] * c; return r } }), ds.prototype = Object.assign(Object.create(cs.prototype), { constructor: ds, interpolate_: function(t) { return this.copySampleValue_(t - 1) } }), Object.assign(ps, { toJSON: function(t) { const e = t.constructor; let n; if (void 0 !== e.toJSON) n = e.toJSON(t); else { n = { name: t.name, times: ls.convertArray(t.times, Array), values: ls.convertArray(t.values, Array) }; const e = t.getInterpolation(); e !== t.DefaultInterpolation && (n.interpolation = e) } return n.type = t.ValueTypeName, n } }), Object.assign(ps.prototype, { constructor: ps, TimeBufferType: Float32Array, ValueBufferType: Float32Array, DefaultInterpolation: 2301, InterpolantFactoryMethodDiscrete: function(t) { return new ds(this.times, this.values, this.getValueSize(), t) }, InterpolantFactoryMethodLinear: function(t) { return new us(this.times, this.values, this.getValueSize(), t) }, InterpolantFactoryMethodSmooth: function(t) { return new hs(this.times, this.values, this.getValueSize(), t) }, setInterpolation: function(t) { let e; switch (t) { case 2300: e = this.InterpolantFactoryMethodDiscrete; break; case 2301: e = this.InterpolantFactoryMethodLinear; break; case 2302: e = this.InterpolantFactoryMethodSmooth } if (void 0 === e) { const e = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name; if (void 0 === this.createInterpolant) { if (t === this.DefaultInterpolation) throw new Error(e); this.setInterpolation(this.DefaultInterpolation) } return console.warn("THREE.KeyframeTrack:", e), this } return this.createInterpolant = e, this }, getInterpolation: function() { switch (this.createInterpolant) { case this.InterpolantFactoryMethodDiscrete: return 2300; case this.InterpolantFactoryMethodLinear: return 2301; case this.InterpolantFactoryMethodSmooth: return 2302 } }, getValueSize: function() { return this.values.length / this.times.length }, shift: function(t) { if (0 !== t) { const e = this.times; for (let n = 0, i = e.length; n !== i; ++n) e[n] += t } return this }, scale: function(t) { if (1 !== t) { const e = this.times; for (let n = 0, i = e.length; n !== i; ++n) e[n] *= t } return this }, trim: function(t, e) { const n = this.times, i = n.length; let r = 0, o = i - 1; for (; r !== i && n[r] < t;) ++r; for (; - 1 !== o && n[o] > e;) --o; if (++o, 0 !== r || o !== i) { r >= o && (o = Math.max(o, 1), r = o - 1); const t = this.getValueSize(); this.times = ls.arraySlice(n, r, o), this.values = ls.arraySlice(this.values, r * t, o * t) } return this }, validate: function() { let t = !0; const e = this.getValueSize(); e - Math.floor(e) != 0 && (console.error("THREE.KeyframeTrack: Invalid value size in track.", this), t = !1); const n = this.times, i = this.values, r = n.length; 0 === r && (console.error("THREE.KeyframeTrack: Track is empty.", this), t = !1); let o = null; for (let e = 0; e !== r; e++) { const i = n[e]; if ("number" == typeof i && isNaN(i)) { console.error("THREE.KeyframeTrack: Time is not a valid number.", this, e, i), t = !1; break } if (null !== o && o > i) { console.error("THREE.KeyframeTrack: Out of order keys.", this, e, i, o), t = !1; break } o = i } if (void 0 !== i && ls.isTypedArray(i)) for (let e = 0, n = i.length; e !== n; ++e) { const n = i[e]; if (isNaN(n)) { console.error("THREE.KeyframeTrack: Value is not a valid number.", this, e, n), t = !1; break } } return t }, optimize: function() { const t = ls.arraySlice(this.times), e = ls.arraySlice(this.values), n = this.getValueSize(), i = 2302 === this.getInterpolation(), r = t.length - 1; let o = 1; for (let s = 1; s < r; ++s) { let r = !1; const a = t[s]; if (a !== t[s + 1] && (1 !== s || a !== t[0])) if (i) r = !0; else { const t = s * n, i = t - n, o = t + n; for (let s = 0; s !== n; ++s) { const n = e[t + s]; if (n !== e[i + s] || n !== e[o + s]) { r = !0; break } } } if (r) { if (s !== o) { t[o] = t[s]; const i = s * n, r = o * n; for (let t = 0; t !== n; ++t) e[r + t] = e[i + t] }++o } } if (r > 0) { t[o] = t[r]; for (let t = r * n, i = o * n, s = 0; s !== n; ++s) e[i + s] = e[t + s]; ++o } return o !== t.length ? (this.times = ls.arraySlice(t, 0, o), this.values = ls.arraySlice(e, 0, o * n)) : (this.times = t, this.values = e), this }, clone: function() { const t = ls.arraySlice(this.times, 0), e = ls.arraySlice(this.values, 0), n = new(0, this.constructor)(this.name, t, e); return n.createInterpolant = this.createInterpolant, n } }), fs.prototype = Object.assign(Object.create(ps.prototype), { constructor: fs, ValueTypeName: "bool", ValueBufferType: Array, DefaultInterpolation: 2300, InterpolantFactoryMethodLinear: void 0, InterpolantFactoryMethodSmooth: void 0 }), ms.prototype = Object.assign(Object.create(ps.prototype), { constructor: ms, ValueTypeName: "color" }), gs.prototype = Object.assign(Object.create(ps.prototype), { constructor: gs, ValueTypeName: "number" }), vs.prototype = Object.assign(Object.create(cs.prototype), { constructor: vs, interpolate_: function(t, e, n, i) { const r = this.resultBuffer, o = this.sampleValues, s = this.valueSize, a = (n - e) / (i - e); let l = t * s; for (let t = l + s; l !== t; l += 4) S.slerpFlat(r, 0, o, l - s, o, l, a); return r } }), ys.prototype = Object.assign(Object.create(ps.prototype), { constructor: ys, ValueTypeName: "quaternion", DefaultInterpolation: 2301, InterpolantFactoryMethodLinear: function(t) { return new vs(this.times, this.values, this.getValueSize(), t) }, InterpolantFactoryMethodSmooth: void 0 }), As.prototype = Object.assign(Object.create(ps.prototype), { constructor: As, ValueTypeName: "string", ValueBufferType: Array, DefaultInterpolation: 2300, InterpolantFactoryMethodLinear: void 0, InterpolantFactoryMethodSmooth: void 0 }), xs.prototype = Object.assign(Object.create(ps.prototype), { constructor: xs, ValueTypeName: "vector" }), Object.assign(_s, { parse: function(t) { const e = [], n = t.tracks, i = 1 / (t.fps || 1); for (let t = 0, r = n.length; t !== r; ++t) e.push(bs(n[t]).scale(i)); const r = new _s(t.name, t.duration, e, t.blendMode); return r.uuid = t.uuid, r }, toJSON: function(t) { const e = [], n = t.tracks, i = { name: t.name, duration: t.duration, tracks: e, uuid: t.uuid, blendMode: t.blendMode }; for (let t = 0, i = n.length; t !== i; ++t) e.push(ps.toJSON(n[t])); return i }, CreateFromMorphTargetSequence: function(t, e, n, i) { const r = e.length, o = []; for (let t = 0; t < r; t++) { let s = [], a = []; s.push((t + r - 1) % r, t, (t + 1) % r), a.push(0, 1, 0); const l = ls.getKeyframeOrder(s); s = ls.sortedArray(s, 1, l), a = ls.sortedArray(a, 1, l), i || 0 !== s[0] || (s.push(r), a.push(a[0])), o.push(new gs(".morphTargetInfluences[" + e[t].name + "]", s, a).scale(1 / n)) } return new _s(t, -1, o) }, findByName: function(t, e) { let n = t; if (!Array.isArray(t)) { const e = t; n = e.geometry && e.geometry.animations || e.animations } for (let t = 0; t < n.length; t++) if (n[t].name === e) return n[t]; return null }, CreateClipsFromMorphTargetSequences: function(t, e, n) { const i = {}, r = /^([\w-]*?)([\d]+)$/; for (let e = 0, n = t.length; e < n; e++) { const n = t[e], o = n.name.match(r); if (o && o.length > 1) { const t = o[1]; let e = i[t]; e || (i[t] = e = []), e.push(n) } } const o = []; for (const t in i) o.push(_s.CreateFromMorphTargetSequence(t, i[t], e, n)); return o }, parseAnimation: function(t, e) { if (!t) return console.error("THREE.AnimationClip: No animation in JSONLoader data."), null; const n = function(t, e, n, i, r) { if (0 !== n.length) { const o = [], s = []; ls.flattenJSON(n, o, s, i), 0 !== o.length && r.push(new t(e, o, s)) } }, i = [], r = t.name || "default", o = t.fps || 30, s = t.blendMode; let a = t.length || -1; const l = t.hierarchy || []; for (let t = 0; t < l.length; t++) { const r = l[t].keys; if (r && 0 !== r.length) if (r[0].morphTargets) { const t = {}; let e; for (e = 0; e < r.length; e++) if (r[e].morphTargets) for (let n = 0; n < r[e].morphTargets.length; n++) t[r[e].morphTargets[n]] = -1; for (const n in t) { const t = [], o = []; for (let i = 0; i !== r[e].morphTargets.length; ++i) { const i = r[e]; t.push(i.time), o.push(i.morphTarget === n ? 1 : 0) } i.push(new gs(".morphTargetInfluence[" + n + "]", t, o)) } a = t.length * (o || 1) } else { const o = ".bones[" + e[t].name + "]"; n(xs, o + ".position", r, "pos", i), n(ys, o + ".quaternion", r, "rot", i), n(xs, o + ".scale", r, "scl", i) } } if (0 === i.length) return null; return new _s(r, a, i, s) } }), Object.assign(_s.prototype, { resetDuration: function() { let t = 0; for (let e = 0, n = this.tracks.length; e !== n; ++e) { const n = this.tracks[e]; t = Math.max(t, n.times[n.times.length - 1]) } return this.duration = t, this }, trim: function() { for (let t = 0; t < this.tracks.length; t++) this.tracks[t].trim(0, this.duration); return this }, validate: function() { let t = !0; for (let e = 0; e < this.tracks.length; e++) t = t && this.tracks[e].validate(); return t }, optimize: function() { for (let t = 0; t < this.tracks.length; t++) this.tracks[t].optimize(); return this }, clone: function() { const t = []; for (let e = 0; e < this.tracks.length; e++) t.push(this.tracks[e].clone()); return new _s(this.name, this.duration, t, this.blendMode) }, toJSON: function() { return _s.toJSON(this) } }); const ws = { enabled: !1, files: {}, add: function(t, e) { !1 !== this.enabled && (this.files[t] = e) }, get: function(t) { if (!1 !== this.enabled) return this.files[t] }, remove: function(t) { delete this.files[t] }, clear: function() { this.files = {} } }; const Ms = new function(t, e, n) { const i = this; let r = !1, o = 0, s = 0, a = void 0; const l = []; this.onStart = void 0, this.onLoad = t, this.onProgress = e, this.onError = n, this.itemStart = function(t) { s++, !1 === r && void 0 !== i.onStart && i.onStart(t, o, s), r = !0 }, this.itemEnd = function(t) { o++, void 0 !== i.onProgress && i.onProgress(t, o, s), o === s && (r = !1, void 0 !== i.onLoad && i.onLoad()) }, this.itemError = function(t) { void 0 !== i.onError && i.onError(t) }, this.resolveURL = function(t) { return a ? a(t) : t }, this.setURLModifier = function(t) { return a = t, this }, this.addHandler = function(t, e) { return l.push(t, e), this }, this.removeHandler = function(t) { const e = l.indexOf(t); return -1 !== e && l.splice(e, 2), this }, this.getHandler = function(t) { for (let e = 0, n = l.length; e < n; e += 2) { const n = l[e], i = l[e + 1]; if (n.global && (n.lastIndex = 0), n.test(t)) return i } return null } }; function Es(t) { this.manager = void 0 !== t ? t : Ms, this.crossOrigin = "anonymous", this.withCredentials = !1, this.path = "", this.resourcePath = "", this.requestHeader = {} } Object.assign(Es.prototype, { load: function() {}, loadAsync: function(t, e) { const n = this; return new Promise((function(i, r) { n.load(t, i, e, r) })) }, parse: function() {}, setCrossOrigin: function(t) { return this.crossOrigin = t, this }, setWithCredentials: function(t) { return this.withCredentials = t, this }, setPath: function(t) { return this.path = t, this }, setResourcePath: function(t) { return this.resourcePath = t, this }, setRequestHeader: function(t) { return this.requestHeader = t, this } }); const Ss = {}; function Ts(t) { Es.call(this, t) } function Ls(t) { Es.call(this, t) } function Rs(t) { Es.call(this, t) } function Cs(t) { Es.call(this, t) } function Ps(t) { Es.call(this, t) } function Ds(t) { Es.call(this, t) } function Is(t) { Es.call(this, t) } function Os() { this.type = "Curve", this.arcLengthDivisions = 200 } function Ns(t, e, n, i, r, o, s, a) { Os.call(this), this.type = "EllipseCurve", this.aX = t || 0, this.aY = e || 0, this.xRadius = n || 1, this.yRadius = i || 1, this.aStartAngle = r || 0, this.aEndAngle = o || 2 * Math.PI, this.aClockwise = s || !1, this.aRotation = a || 0 } function Bs(t, e, n, i, r, o) { Ns.call(this, t, e, n, n, i, r, o), this.type = "ArcCurve" } function Fs() { let t = 0, e = 0, n = 0, i = 0; function r(r, o, s, a) { t = r, e = s, n = -3 * r + 3 * o - 2 * s - a, i = 2 * r - 2 * o + s + a } return { initCatmullRom: function(t, e, n, i, o) { r(e, n, o * (n - t), o * (i - e)) }, initNonuniformCatmullRom: function(t, e, n, i, o, s, a) { let l = (e - t) / o - (n - t) / (o + s) + (n - e) / s, c = (n - e) / s - (i - e) / (s + a) + (i - n) / a; l *= s, c *= s, r(e, n, l, c) }, calc: function(r) { const o = r * r; return t + e * r + n * o + i * (o * r) } } } Ts.prototype = Object.assign(Object.create(Es.prototype), { constructor: Ts, load: function(t, e, n, i) { void 0 === t && (t = ""), void 0 !== this.path && (t = this.path + t), t = this.manager.resolveURL(t); const r = this, o = ws.get(t); if (void 0 !== o) return r.manager.itemStart(t), setTimeout((function() { e && e(o), r.manager.itemEnd(t) }), 0), o; if (void 0 !== Ss[t]) return void Ss[t].push({ onLoad: e, onProgress: n, onError: i }); const s = t.match(/^data:(.*?)(;base64)?,(.*)$/); let a; if (s) { const n = s[1], o = !!s[2]; let a = s[3]; a = decodeURIComponent(a), o && (a = atob(a)); try { let i; const o = (this.responseType || "").toLowerCase(); switch (o) { case "arraybuffer": case "blob": const t = new Uint8Array(a.length); for (let e = 0; e < a.length; e++) t[e] = a.charCodeAt(e); i = "blob" === o ? new Blob([t.buffer], { type: n }) : t.buffer; break; case "document": const e = new DOMParser; i = e.parseFromString(a, n); break; case "json": i = JSON.parse(a); break; default: i = a } setTimeout((function() { e && e(i), r.manager.itemEnd(t) }), 0) } catch (e) { setTimeout((function() { i && i(e), r.manager.itemError(t), r.manager.itemEnd(t) }), 0) } } else { Ss[t] = [], Ss[t].push({ onLoad: e, onProgress: n, onError: i }), a = new XMLHttpRequest, a.open("GET", t, !0), a.addEventListener("load", (function(e) { const n = this.response, i = Ss[t]; if (delete Ss[t], 200 === this.status || 0 === this.status) { 0 === this.status && console.warn("THREE.FileLoader: HTTP Status 0 received."), ws.add(t, n); for (let t = 0, e = i.length; t < e; t++) { const e = i[t]; e.onLoad && e.onLoad(n) } r.manager.itemEnd(t) } else { for (let t = 0, n = i.length; t < n; t++) { const n = i[t]; n.onError && n.onError(e) } r.manager.itemError(t), r.manager.itemEnd(t) } }), !1), a.addEventListener("progress", (function(e) { const n = Ss[t]; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; i.onProgress && i.onProgress(e) } }), !1), a.addEventListener("error", (function(e) { const n = Ss[t]; delete Ss[t]; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; i.onError && i.onError(e) } r.manager.itemError(t), r.manager.itemEnd(t) }), !1), a.addEventListener("abort", (function(e) { const n = Ss[t]; delete Ss[t]; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; i.onError && i.onError(e) } r.manager.itemError(t), r.manager.itemEnd(t) }), !1), void 0 !== this.responseType && (a.responseType = this.responseType), void 0 !== this.withCredentials && (a.withCredentials = this.withCredentials), a.overrideMimeType && a.overrideMimeType(void 0 !== this.mimeType ? this.mimeType : "text/plain"); for (const t in this.requestHeader) a.setRequestHeader(t, this.requestHeader[t]); a.send(null) } return r.manager.itemStart(t), a }, setResponseType: function(t) { return this.responseType = t, this }, setMimeType: function(t) { return this.mimeType = t, this } }), Ls.prototype = Object.assign(Object.create(Es.prototype), { constructor: Ls, load: function(t, e, n, i) { const r = this, o = new Ts(r.manager); o.setPath(r.path), o.setRequestHeader(r.requestHeader), o.setWithCredentials(r.withCredentials), o.load(t, (function(n) { try { e(r.parse(JSON.parse(n))) } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t) } }), n, i) }, parse: function(t) { const e = []; for (let n = 0; n < t.length; n++) { const i = _s.parse(t[n]); e.push(i) } return e } }), Rs.prototype = Object.assign(Object.create(Es.prototype), { constructor: Rs, load: function(t, e, n, i) { const r = this, o = [], s = new mo, a = new Ts(this.manager); a.setPath(this.path), a.setResponseType("arraybuffer"), a.setRequestHeader(this.requestHeader), a.setWithCredentials(r.withCredentials); let l = 0; function c(c) { a.load(t[c], (function(t) { const n = r.parse(t, !0); o[c] = { width: n.width, height: n.height, format: n.format, mipmaps: n.mipmaps }, l += 1, 6 === l && (1 === n.mipmapCount && (s.minFilter = 1006), s.image = o, s.format = n.format, s.needsUpdate = !0, e && e(s)) }), n, i) } if (Array.isArray(t)) for (let e = 0, n = t.length; e < n; ++e) c(e); else a.load(t, (function(t) { const n = r.parse(t, !0); if (n.isCubemap) { const t = n.mipmaps.length / n.mipmapCount; for (let e = 0; e < t; e++) { o[e] = { mipmaps: [] }; for (let t = 0; t < n.mipmapCount; t++) o[e].mipmaps.push(n.mipmaps[e * n.mipmapCount + t]), o[e].format = n.format, o[e].width = n.width, o[e].height = n.height } s.image = o } else s.image.width = n.width, s.image.height = n.height, s.mipmaps = n.mipmaps; 1 === n.mipmapCount && (s.minFilter = 1006), s.format = n.format, s.needsUpdate = !0, e && e(s) }), n, i); return s } }), Cs.prototype = Object.assign(Object.create(Es.prototype), { constructor: Cs, load: function(t, e, n, i) { void 0 !== this.path && (t = this.path + t), t = this.manager.resolveURL(t); const r = this, o = ws.get(t); if (void 0 !== o) return r.manager.itemStart(t), setTimeout((function() { e && e(o), r.manager.itemEnd(t) }), 0), o; const s = document.createElementNS("http://www.w3.org/1999/xhtml", "img"); function a() { s.removeEventListener("load", a, !1), s.removeEventListener("error", l, !1), ws.add(t, this), e && e(this), r.manager.itemEnd(t) } function l(e) { s.removeEventListener("load", a, !1), s.removeEventListener("error", l, !1), i && i(e), r.manager.itemError(t), r.manager.itemEnd(t) } return s.addEventListener("load", a, !1), s.addEventListener("error", l, !1), "data:" !== t.substr(0, 5) && void 0 !== this.crossOrigin && (s.crossOrigin = this.crossOrigin), r.manager.itemStart(t), s.src = t, s } }), Ps.prototype = Object.assign(Object.create(Es.prototype), { constructor: Ps, load: function(t, e, n, i) { const r = new Ze, o = new Cs(this.manager); o.setCrossOrigin(this.crossOrigin), o.setPath(this.path); let s = 0; function a(n) { o.load(t[n], (function(t) { r.images[n] = t, s++, 6 === s && (r.needsUpdate = !0, e && e(r)) }), void 0, i) } for (let e = 0; e < t.length; ++e) a(e); return r } }), Ds.prototype = Object.assign(Object.create(Es.prototype), { constructor: Ds, load: function(t, e, n, i) { const r = this, o = new Ke, s = new Ts(this.manager); return s.setResponseType("arraybuffer"), s.setRequestHeader(this.requestHeader), s.setPath(this.path), s.setWithCredentials(r.withCredentials), s.load(t, (function(t) { const n = r.parse(t); n && (void 0 !== n.image ? o.image = n.image : void 0 !== n.data && (o.image.width = n.width, o.image.height = n.height, o.image.data = n.data), o.wrapS = void 0 !== n.wrapS ? n.wrapS : 1001, o.wrapT = void 0 !== n.wrapT ? n.wrapT : 1001, o.magFilter = void 0 !== n.magFilter ? n.magFilter : 1006, o.minFilter = void 0 !== n.minFilter ? n.minFilter : 1006, o.anisotropy = void 0 !== n.anisotropy ? n.anisotropy : 1, void 0 !== n.encoding && (o.encoding = n.encoding), void 0 !== n.flipY && (o.flipY = n.flipY), void 0 !== n.format && (o.format = n.format), void 0 !== n.type && (o.type = n.type), void 0 !== n.mipmaps && (o.mipmaps = n.mipmaps, o.minFilter = 1008), 1 === n.mipmapCount && (o.minFilter = 1006), o.needsUpdate = !0, e && e(o, n)) }), n, i), o } }), Is.prototype = Object.assign(Object.create(Es.prototype), { constructor: Is, load: function(t, e, n, i) { const r = new b, o = new Cs(this.manager); return o.setCrossOrigin(this.crossOrigin), o.setPath(this.path), o.load(t, (function(n) { r.image = n; const i = t.search(/\.jpe?g($|\?)/i) > 0 || 0 === t.search(/^data\:image\/jpeg/); r.format = i ? 1022 : 1023, r.needsUpdate = !0, void 0 !== e && e(r) }), n, i), r } }), Object.assign(Os.prototype, { getPoint: function() { return console.warn("THREE.Curve: .getPoint() not implemented."), null }, getPointAt: function(t, e) { const n = this.getUtoTmapping(t); return this.getPoint(n, e) }, getPoints: function(t = 5) { const e = []; for (let n = 0; n <= t; n++) e.push(this.getPoint(n / t)); return e }, getSpacedPoints: function(t = 5) { const e = []; for (let n = 0; n <= t; n++) e.push(this.getPointAt(n / t)); return e }, getLength: function() { const t = this.getLengths(); return t[t.length - 1] }, getLengths: function(t) { if (void 0 === t && (t = this.arcLengthDivisions), this.cacheArcLengths && this.cacheArcLengths.length === t + 1 && !this.needsUpdate) return this.cacheArcLengths; this.needsUpdate = !1; const e = []; let n, i = this.getPoint(0), r = 0; e.push(0); for (let o = 1; o <= t; o++) n = this.getPoint(o / t), r += n.distanceTo(i), e.push(r), i = n; return this.cacheArcLengths = e, e }, updateArcLengths: function() { this.needsUpdate = !0, this.getLengths() }, getUtoTmapping: function(t, e) { const n = this.getLengths(); let i = 0; const r = n.length; let o; o = e || t * n[r - 1]; let s, a = 0, l = r - 1; for (; a <= l;) if (i = Math.floor(a + (l - a) / 2), s = n[i] - o, s < 0) a = i + 1; else { if (!(s > 0)) { l = i; break } l = i - 1 } if (i = l, n[i] === o) return i / (r - 1); const c = n[i]; return (i + (o - c) / (n[i + 1] - c)) / (r - 1) }, getTangent: function(t, e) { let n = t - 1e-4, i = t + 1e-4; n < 0 && (n = 0), i > 1 && (i = 1); const r = this.getPoint(n), o = this.getPoint(i), s = e || (r.isVector2 ? new v : new T); return s.copy(o).sub(r).normalize(), s }, getTangentAt: function(t, e) { const n = this.getUtoTmapping(t); return this.getTangent(n, e) }, computeFrenetFrames: function(t, e) { const n = new T, i = [], r = [], o = [], s = new T, a = new et; for (let e = 0; e <= t; e++) { const n = e / t; i[e] = this.getTangentAt(n, new T), i[e].normalize() } r[0] = new T, o[0] = new T; let l = Number.MAX_VALUE; const c = Math.abs(i[0].x), h = Math.abs(i[0].y), u = Math.abs(i[0].z); c <= l && (l = c, n.set(1, 0, 0)), h <= l && (l = h, n.set(0, 1, 0)), u <= l && n.set(0, 0, 1), s.crossVectors(i[0], n).normalize(), r[0].crossVectors(i[0], s), o[0].crossVectors(i[0], r[0]); for (let e = 1; e <= t; e++) { if (r[e] = r[e - 1].clone(), o[e] = o[e - 1].clone(), s.crossVectors(i[e - 1], i[e]), s.length() > Number.EPSILON) { s.normalize(); const t = Math.acos(g.clamp(i[e - 1].dot(i[e]), -1, 1)); r[e].applyMatrix4(a.makeRotationAxis(s, t)) } o[e].crossVectors(i[e], r[e]) } if (!0 === e) { let e = Math.acos(g.clamp(r[0].dot(r[t]), -1, 1)); e /= t, i[0].dot(s.crossVectors(r[0], r[t])) > 0 && (e = -e); for (let n = 1; n <= t; n++) r[n].applyMatrix4(a.makeRotationAxis(i[n], e * n)), o[n].crossVectors(i[n], r[n]) } return { tangents: i, normals: r, binormals: o } }, clone: function() { return (new this.constructor).copy(this) }, copy: function(t) { return this.arcLengthDivisions = t.arcLengthDivisions, this }, toJSON: function() { const t = { metadata: { version: 4.5, type: "Curve", generator: "Curve.toJSON" } }; return t.arcLengthDivisions = this.arcLengthDivisions, t.type = this.type, t }, fromJSON: function(t) { return this.arcLengthDivisions = t.arcLengthDivisions, this } }), Ns.prototype = Object.create(Os.prototype), Ns.prototype.constructor = Ns, Ns.prototype.isEllipseCurve = !0, Ns.prototype.getPoint = function(t, e) { const n = e || new v, i = 2 * Math.PI; let r = this.aEndAngle - this.aStartAngle; const o = Math.abs(r) < Number.EPSILON; for (; r < 0;) r += i; for (; r > i;) r -= i; r < Number.EPSILON && (r = o ? 0 : i), !0 !== this.aClockwise || o || (r === i ? r = -i : r -= i); const s = this.aStartAngle + t * r; let a = this.aX + this.xRadius * Math.cos(s), l = this.aY + this.yRadius * Math.sin(s); if (0 !== this.aRotation) { const t = Math.cos(this.aRotation), e = Math.sin(this.aRotation), n = a - this.aX, i = l - this.aY; a = n * t - i * e + this.aX, l = n * e + i * t + this.aY } return n.set(a, l) }, Ns.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.aX = t.aX, this.aY = t.aY, this.xRadius = t.xRadius, this.yRadius = t.yRadius, this.aStartAngle = t.aStartAngle, this.aEndAngle = t.aEndAngle, this.aClockwise = t.aClockwise, this.aRotation = t.aRotation, this }, Ns.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.aX = this.aX, t.aY = this.aY, t.xRadius = this.xRadius, t.yRadius = this.yRadius, t.aStartAngle = this.aStartAngle, t.aEndAngle = this.aEndAngle, t.aClockwise = this.aClockwise, t.aRotation = this.aRotation, t }, Ns.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.aX = t.aX, this.aY = t.aY, this.xRadius = t.xRadius, this.yRadius = t.yRadius, this.aStartAngle = t.aStartAngle, this.aEndAngle = t.aEndAngle, this.aClockwise = t.aClockwise, this.aRotation = t.aRotation, this }, Bs.prototype = Object.create(Ns.prototype), Bs.prototype.constructor = Bs, Bs.prototype.isArcCurve = !0; const zs = new T, Us = new Fs, Hs = new Fs, Gs = new Fs; function Vs(t = [], e = !1, n = "centripetal", i = .5) { Os.call(this), this.type = "CatmullRomCurve3", this.points = t, this.closed = e, this.curveType = n, this.tension = i } function ks(t, e, n, i, r) { const o = .5 * (i - e), s = .5 * (r - n), a = t * t; return (2 * n - 2 * i + o + s) * (t * a) + (-3 * n + 3 * i - 2 * o - s) * a + o * t + n } function Ws(t, e, n, i) { return function(t, e) { const n = 1 - t; return n * n * e }(t, e) + function(t, e) { return 2 * (1 - t) * t * e }(t, n) + function(t, e) { return t * t * e }(t, i) } function js(t, e, n, i, r) { return function(t, e) { const n = 1 - t; return n * n * n * e }(t, e) + function(t, e) { const n = 1 - t; return 3 * n * n * t * e }(t, n) + function(t, e) { return 3 * (1 - t) * t * t * e }(t, i) + function(t, e) { return t * t * t * e }(t, r) } function Xs(t = new v, e = new v, n = new v, i = new v) { Os.call(this), this.type = "CubicBezierCurve", this.v0 = t, this.v1 = e, this.v2 = n, this.v3 = i } function qs(t = new T, e = new T, n = new T, i = new T) { Os.call(this), this.type = "CubicBezierCurve3", this.v0 = t, this.v1 = e, this.v2 = n, this.v3 = i } function Ys(t = new v, e = new v) { Os.call(this), this.type = "LineCurve", this.v1 = t, this.v2 = e } function Qs(t = new T, e = new T) { Os.call(this), this.type = "LineCurve3", this.v1 = t, this.v2 = e } function Zs(t = new v, e = new v, n = new v) { Os.call(this), this.type = "QuadraticBezierCurve", this.v0 = t, this.v1 = e, this.v2 = n } function Js(t = new T, e = new T, n = new T) { Os.call(this), this.type = "QuadraticBezierCurve3", this.v0 = t, this.v1 = e, this.v2 = n } function Ks(t = []) { Os.call(this), this.type = "SplineCurve", this.points = t } Vs.prototype = Object.create(Os.prototype), Vs.prototype.constructor = Vs, Vs.prototype.isCatmullRomCurve3 = !0, Vs.prototype.getPoint = function(t, e = new T) { const n = e, i = this.points, r = i.length, o = (r - (this.closed ? 0 : 1)) * t; let s, a, l = Math.floor(o), c = o - l; this.closed ? l += l > 0 ? 0 : (Math.floor(Math.abs(l) / r) + 1) * r : 0 === c && l === r - 1 && (l = r - 2, c = 1), this.closed || l > 0 ? s = i[(l - 1) % r] : (zs.subVectors(i[0], i[1]).add(i[0]), s = zs); const h = i[l % r], u = i[(l + 1) % r]; if (this.closed || l + 2 < r ? a = i[(l + 2) % r] : (zs.subVectors(i[r - 1], i[r - 2]).add(i[r - 1]), a = zs), "centripetal" === this.curveType || "chordal" === this.curveType) { const t = "chordal" === this.curveType ? .5 : .25; let e = Math.pow(s.distanceToSquared(h), t), n = Math.pow(h.distanceToSquared(u), t), i = Math.pow(u.distanceToSquared(a), t); n < 1e-4 && (n = 1), e < 1e-4 && (e = n), i < 1e-4 && (i = n), Us.initNonuniformCatmullRom(s.x, h.x, u.x, a.x, e, n, i), Hs.initNonuniformCatmullRom(s.y, h.y, u.y, a.y, e, n, i), Gs.initNonuniformCatmullRom(s.z, h.z, u.z, a.z, e, n, i) } else "catmullrom" === this.curveType && (Us.initCatmullRom(s.x, h.x, u.x, a.x, this.tension), Hs.initCatmullRom(s.y, h.y, u.y, a.y, this.tension), Gs.initCatmullRom(s.z, h.z, u.z, a.z, this.tension)); return n.set(Us.calc(c), Hs.calc(c), Gs.calc(c)), n }, Vs.prototype.copy = function(t) { Os.prototype.copy.call(this, t), this.points = []; for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push(n.clone()) } return this.closed = t.closed, this.curveType = t.curveType, this.tension = t.tension, this }, Vs.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); t.points = []; for (let e = 0, n = this.points.length; e < n; e++) { const n = this.points[e]; t.points.push(n.toArray()) } return t.closed = this.closed, t.curveType = this.curveType, t.tension = this.tension, t }, Vs.prototype.fromJSON = function(t) { Os.prototype.fromJSON.call(this, t), this.points = []; for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push((new T).fromArray(n)) } return this.closed = t.closed, this.curveType = t.curveType, this.tension = t.tension, this }, Xs.prototype = Object.create(Os.prototype), Xs.prototype.constructor = Xs, Xs.prototype.isCubicBezierCurve = !0, Xs.prototype.getPoint = function(t, e = new v) { const n = e, i = this.v0, r = this.v1, o = this.v2, s = this.v3; return n.set(js(t, i.x, r.x, o.x, s.x), js(t, i.y, r.y, o.y, s.y)), n }, Xs.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this.v3.copy(t.v3), this }, Xs.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.v0 = this.v0.toArray(), t.v1 = this.v1.toArray(), t.v2 = this.v2.toArray(), t.v3 = this.v3.toArray(), t }, Xs.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this.v3.fromArray(t.v3), this }, qs.prototype = Object.create(Os.prototype), qs.prototype.constructor = qs, qs.prototype.isCubicBezierCurve3 = !0, qs.prototype.getPoint = function(t, e = new T) { const n = e, i = this.v0, r = this.v1, o = this.v2, s = this.v3; return n.set(js(t, i.x, r.x, o.x, s.x), js(t, i.y, r.y, o.y, s.y), js(t, i.z, r.z, o.z, s.z)), n }, qs.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this.v3.copy(t.v3), this }, qs.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.v0 = this.v0.toArray(), t.v1 = this.v1.toArray(), t.v2 = this.v2.toArray(), t.v3 = this.v3.toArray(), t }, qs.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this.v3.fromArray(t.v3), this }, Ys.prototype = Object.create(Os.prototype), Ys.prototype.constructor = Ys, Ys.prototype.isLineCurve = !0, Ys.prototype.getPoint = function(t, e = new v) { const n = e; return 1 === t ? n.copy(this.v2) : (n.copy(this.v2).sub(this.v1), n.multiplyScalar(t).add(this.v1)), n }, Ys.prototype.getPointAt = function(t, e) { return this.getPoint(t, e) }, Ys.prototype.getTangent = function(t, e) { const n = e || new v; return n.copy(this.v2).sub(this.v1).normalize(), n }, Ys.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.v1.copy(t.v1), this.v2.copy(t.v2), this }, Ys.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.v1 = this.v1.toArray(), t.v2 = this.v2.toArray(), t }, Ys.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this }, Qs.prototype = Object.create(Os.prototype), Qs.prototype.constructor = Qs, Qs.prototype.isLineCurve3 = !0, Qs.prototype.getPoint = function(t, e = new T) { const n = e; return 1 === t ? n.copy(this.v2) : (n.copy(this.v2).sub(this.v1), n.multiplyScalar(t).add(this.v1)), n }, Qs.prototype.getPointAt = function(t, e) { return this.getPoint(t, e) }, Qs.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.v1.copy(t.v1), this.v2.copy(t.v2), this }, Qs.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.v1 = this.v1.toArray(), t.v2 = this.v2.toArray(), t }, Qs.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this }, Zs.prototype = Object.create(Os.prototype), Zs.prototype.constructor = Zs, Zs.prototype.isQuadraticBezierCurve = !0, Zs.prototype.getPoint = function(t, e = new v) { const n = e, i = this.v0, r = this.v1, o = this.v2; return n.set(Ws(t, i.x, r.x, o.x), Ws(t, i.y, r.y, o.y)), n }, Zs.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this }, Zs.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.v0 = this.v0.toArray(), t.v1 = this.v1.toArray(), t.v2 = this.v2.toArray(), t }, Zs.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this }, Js.prototype = Object.create(Os.prototype), Js.prototype.constructor = Js, Js.prototype.isQuadraticBezierCurve3 = !0, Js.prototype.getPoint = function(t, e = new T) { const n = e, i = this.v0, r = this.v1, o = this.v2; return n.set(Ws(t, i.x, r.x, o.x), Ws(t, i.y, r.y, o.y), Ws(t, i.z, r.z, o.z)), n }, Js.prototype.copy = function(t) { return Os.prototype.copy.call(this, t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this }, Js.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); return t.v0 = this.v0.toArray(), t.v1 = this.v1.toArray(), t.v2 = this.v2.toArray(), t }, Js.prototype.fromJSON = function(t) { return Os.prototype.fromJSON.call(this, t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this }, Ks.prototype = Object.create(Os.prototype), Ks.prototype.constructor = Ks, Ks.prototype.isSplineCurve = !0, Ks.prototype.getPoint = function(t, e = new v) { const n = e, i = this.points, r = (i.length - 1) * t, o = Math.floor(r), s = r - o, a = i[0 === o ? o : o - 1], l = i[o], c = i[o > i.length - 2 ? i.length - 1 : o + 1], h = i[o > i.length - 3 ? i.length - 1 : o + 2]; return n.set(ks(s, a.x, l.x, c.x, h.x), ks(s, a.y, l.y, c.y, h.y)), n }, Ks.prototype.copy = function(t) { Os.prototype.copy.call(this, t), this.points = []; for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push(n.clone()) } return this }, Ks.prototype.toJSON = function() { const t = Os.prototype.toJSON.call(this); t.points = []; for (let e = 0, n = this.points.length; e < n; e++) { const n = this.points[e]; t.points.push(n.toArray()) } return t }, Ks.prototype.fromJSON = function(t) { Os.prototype.fromJSON.call(this, t), this.points = []; for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push((new v).fromArray(n)) } return this }; var $s = Object.freeze({ __proto__: null, ArcCurve: Bs, CatmullRomCurve3: Vs, CubicBezierCurve: Xs, CubicBezierCurve3: qs, EllipseCurve: Ns, LineCurve: Ys, LineCurve3: Qs, QuadraticBezierCurve: Zs, QuadraticBezierCurve3: Js, SplineCurve: Ks }); function ta() { Os.call(this), this.type = "CurvePath", this.curves = [], this.autoClose = !1 } function ea(t) { ta.call(this), this.type = "Path", this.currentPoint = new v, t && this.setFromPoints(t) } function na(t) { ea.call(this, t), this.uuid = g.generateUUID(), this.type = "Shape", this.holes = [] } function ia(t, e = 1) { St.call(this), this.type = "Light", this.color = new Yt(t), this.intensity = e } function ra(t, e, n) { ia.call(this, t, n), this.type = "HemisphereLight", this.position.copy(St.DefaultUp), this.updateMatrix(), this.groundColor = new Yt(e) } function oa(t) { this.camera = t, this.bias = 0, this.normalBias = 0, this.radius = 1, this.mapSize = new v(512, 512), this.map = null, this.mapPass = null, this.matrix = new et, this.autoUpdate = !0, this.needsUpdate = !1, this._frustum = new en, this._frameExtents = new v(1, 1), this._viewportCount = 1, this._viewports = [new M(0, 0, 1, 1)] } function sa() { oa.call(this, new Ye(50, 1, .5, 500)), this.focus = 1 } function aa(t, e, n, i, r, o) { ia.call(this, t, e), this.type = "SpotLight", this.position.copy(St.DefaultUp), this.updateMatrix(), this.target = new St, Object.defineProperty(this, "power", { get: function() { return this.intensity * Math.PI }, set: function(t) { this.intensity = t / Math.PI } }), this.distance = void 0 !== n ? n : 0, this.angle = void 0 !== i ? i : Math.PI / 3, this.penumbra = void 0 !== r ? r : 0, this.decay = void 0 !== o ? o : 1, this.shadow = new sa } function la() { oa.call(this, new Ye(90, 1, .5, 500)), this._frameExtents = new v(4, 2), this._viewportCount = 6, this._viewports = [new M(2, 1, 1, 1), new M(0, 1, 1, 1), new M(3, 1, 1, 1), new M(1, 1, 1, 1), new M(3, 0, 1, 1), new M(1, 0, 1, 1)], this._cubeDirections = [new T(1, 0, 0), new T(-1, 0, 0), new T(0, 0, 1), new T(0, 0, -1), new T(0, 1, 0), new T(0, -1, 0)], this._cubeUps = [new T(0, 1, 0), new T(0, 1, 0), new T(0, 1, 0), new T(0, 1, 0), new T(0, 0, 1), new T(0, 0, -1)] } function ca(t, e, n, i) { ia.call(this, t, e), this.type = "PointLight", Object.defineProperty(this, "power", { get: function() { return 4 * this.intensity * Math.PI }, set: function(t) { this.intensity = t / (4 * Math.PI) } }), this.distance = void 0 !== n ? n : 0, this.decay = void 0 !== i ? i : 1, this.shadow = new la } function ha(t = -1, e = 1, n = 1, i = -1, r = .1, o = 2e3) { qe.call(this), 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 = o, this.updateProjectionMatrix() } function ua() { oa.call(this, new ha(-5, 5, 5, -5, .5, 500)) } function da(t, e) { ia.call(this, t, e), this.type = "DirectionalLight", this.position.copy(St.DefaultUp), this.updateMatrix(), this.target = new St, this.shadow = new ua } function pa(t, e) { ia.call(this, t, e), this.type = "AmbientLight" } function fa(t, e, n, i) { ia.call(this, t, e), this.type = "RectAreaLight", this.width = void 0 !== n ? n : 10, this.height = void 0 !== i ? i : 10 } ta.prototype = Object.assign(Object.create(Os.prototype), { constructor: ta, add: function(t) { this.curves.push(t) }, closePath: function() { const t = this.curves[0].getPoint(0), e = this.curves[this.curves.length - 1].getPoint(1); t.equals(e) || this.curves.push(new Ys(e, t)) }, getPoint: function(t) { const e = t * this.getLength(), n = this.getCurveLengths(); let i = 0; for (; i < n.length;) { if (n[i] >= e) { const t = n[i] - e, r = this.curves[i], o = r.getLength(), s = 0 === o ? 0 : 1 - t / o; return r.getPointAt(s) } i++ } return null }, getLength: function() { const t = this.getCurveLengths(); return t[t.length - 1] }, updateArcLengths: function() { this.needsUpdate = !0, this.cacheLengths = null, this.getCurveLengths() }, getCurveLengths: function() { if (this.cacheLengths && this.cacheLengths.length === this.curves.length) return this.cacheLengths; const t = []; let e = 0; for (let n = 0, i = this.curves.length; n < i; n++) e += this.curves[n].getLength(), t.push(e); return this.cacheLengths = t, t }, getSpacedPoints: function(t = 40) { const e = []; for (let n = 0; n <= t; n++) e.push(this.getPoint(n / t)); return this.autoClose && e.push(e[0]), e }, getPoints: function(t = 12) { const e = []; let n; for (let i = 0, r = this.curves; i < r.length; i++) { const o = r[i], s = o && o.isEllipseCurve ? 2 * t : o && (o.isLineCurve || o.isLineCurve3) ? 1 : o && o.isSplineCurve ? t * o.points.length : t, a = o.getPoints(s); for (let t = 0; t < a.length; t++) { const i = a[t]; n && n.equals(i) || (e.push(i), n = i) } } return this.autoClose && e.length > 1 && !e[e.length - 1].equals(e[0]) && e.push(e[0]), e }, copy: function(t) { Os.prototype.copy.call(this, t), this.curves = []; for (let e = 0, n = t.curves.length; e < n; e++) { const n = t.curves[e]; this.curves.push(n.clone()) } return this.autoClose = t.autoClose, this }, toJSON: function() { const t = Os.prototype.toJSON.call(this); t.autoClose = this.autoClose, t.curves = []; for (let e = 0, n = this.curves.length; e < n; e++) { const n = this.curves[e]; t.curves.push(n.toJSON()) } return t }, fromJSON: function(t) { Os.prototype.fromJSON.call(this, t), this.autoClose = t.autoClose, this.curves = []; for (let e = 0, n = t.curves.length; e < n; e++) { const n = t.curves[e]; this.curves.push((new $s[n.type]).fromJSON(n)) } return this } }), ea.prototype = Object.assign(Object.create(ta.prototype), { constructor: ea, setFromPoints: function(t) { this.moveTo(t[0].x, t[0].y); for (let e = 1, n = t.length; e < n; e++) this.lineTo(t[e].x, t[e].y); return this }, moveTo: function(t, e) { return this.currentPoint.set(t, e), this }, lineTo: function(t, e) { const n = new Ys(this.currentPoint.clone(), new v(t, e)); return this.curves.push(n), this.currentPoint.set(t, e), this }, quadraticCurveTo: function(t, e, n, i) { const r = new Zs(this.currentPoint.clone(), new v(t, e), new v(n, i)); return this.curves.push(r), this.currentPoint.set(n, i), this }, bezierCurveTo: function(t, e, n, i, r, o) { const s = new Xs(this.currentPoint.clone(), new v(t, e), new v(n, i), new v(r, o)); return this.curves.push(s), this.currentPoint.set(r, o), this }, splineThru: function(t) { const e = new Ks([this.currentPoint.clone()].concat(t)); return this.curves.push(e), this.currentPoint.copy(t[t.length - 1]), this }, arc: function(t, e, n, i, r, o) { const s = this.currentPoint.x, a = this.currentPoint.y; return this.absarc(t + s, e + a, n, i, r, o), this }, absarc: function(t, e, n, i, r, o) { return this.absellipse(t, e, n, n, i, r, o), this }, ellipse: function(t, e, n, i, r, o, s, a) { const l = this.currentPoint.x, c = this.currentPoint.y; return this.absellipse(t + l, e + c, n, i, r, o, s, a), this }, absellipse: function(t, e, n, i, r, o, s, a) { const l = new Ns(t, e, n, i, r, o, s, a); if (this.curves.length > 0) { const t = l.getPoint(0); t.equals(this.currentPoint) || this.lineTo(t.x, t.y) } this.curves.push(l); const c = l.getPoint(1); return this.currentPoint.copy(c), this }, copy: function(t) { return ta.prototype.copy.call(this, t), this.currentPoint.copy(t.currentPoint), this }, toJSON: function() { const t = ta.prototype.toJSON.call(this); return t.currentPoint = this.currentPoint.toArray(), t }, fromJSON: function(t) { return ta.prototype.fromJSON.call(this, t), this.currentPoint.fromArray(t.currentPoint), this } }), na.prototype = Object.assign(Object.create(ea.prototype), { constructor: na, getPointsHoles: function(t) { const e = []; for (let n = 0, i = this.holes.length; n < i; n++) e[n] = this.holes[n].getPoints(t); return e }, extractPoints: function(t) { return { shape: this.getPoints(t), holes: this.getPointsHoles(t) } }, copy: function(t) { ea.prototype.copy.call(this, t), this.holes = []; for (let e = 0, n = t.holes.length; e < n; e++) { const n = t.holes[e]; this.holes.push(n.clone()) } return this }, toJSON: function() { const t = ea.prototype.toJSON.call(this); t.uuid = this.uuid, t.holes = []; for (let e = 0, n = this.holes.length; e < n; e++) { const n = this.holes[e]; t.holes.push(n.toJSON()) } return t }, fromJSON: function(t) { ea.prototype.fromJSON.call(this, t), this.uuid = t.uuid, this.holes = []; for (let e = 0, n = t.holes.length; e < n; e++) { const n = t.holes[e]; this.holes.push((new ea).fromJSON(n)) } return this } }), ia.prototype = Object.assign(Object.create(St.prototype), { constructor: ia, isLight: !0, copy: function(t) { return St.prototype.copy.call(this, t), this.color.copy(t.color), this.intensity = t.intensity, this }, toJSON: function(t) { const e = St.prototype.toJSON.call(this, t); return e.object.color = this.color.getHex(), e.object.intensity = this.intensity, void 0 !== this.groundColor && (e.object.groundColor = this.groundColor.getHex()), void 0 !== this.distance && (e.object.distance = this.distance), void 0 !== this.angle && (e.object.angle = this.angle), void 0 !== this.decay && (e.object.decay = this.decay), void 0 !== this.penumbra && (e.object.penumbra = this.penumbra), void 0 !== this.shadow && (e.object.shadow = this.shadow.toJSON()), e } }), ra.prototype = Object.assign(Object.create(ia.prototype), { constructor: ra, isHemisphereLight: !0, copy: function(t) { return ia.prototype.copy.call(this, t), this.groundColor.copy(t.groundColor), this } }), Object.assign(oa.prototype, { _projScreenMatrix: new et, _lightPositionWorld: new T, _lookTarget: new T, getViewportCount: function() { return this._viewportCount }, getFrustum: function() { return this._frustum }, updateMatrices: function(t) { const e = this.camera, n = this.matrix, i = this._projScreenMatrix, r = this._lookTarget, o = this._lightPositionWorld; o.setFromMatrixPosition(t.matrixWorld), e.position.copy(o), r.setFromMatrixPosition(t.target.matrixWorld), e.lookAt(r), e.updateMatrixWorld(), i.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse), this._frustum.setFromProjectionMatrix(i), n.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1), n.multiply(e.projectionMatrix), n.multiply(e.matrixWorldInverse) }, getViewport: function(t) { return this._viewports[t] }, getFrameExtents: function() { return this._frameExtents }, copy: function(t) { return this.camera = t.camera.clone(), this.bias = t.bias, this.radius = t.radius, this.mapSize.copy(t.mapSize), this }, clone: function() { return (new this.constructor).copy(this) }, toJSON: function() { const t = {}; return 0 !== this.bias && (t.bias = this.bias), 0 !== this.normalBias && (t.normalBias = this.normalBias), 1 !== this.radius && (t.radius = this.radius), 512 === this.mapSize.x && 512 === this.mapSize.y || (t.mapSize = this.mapSize.toArray()), t.camera = this.camera.toJSON(!1).object, delete t.camera.matrix, t } }), sa.prototype = Object.assign(Object.create(oa.prototype), { constructor: sa, isSpotLightShadow: !0, updateMatrices: function(t) { const e = this.camera, n = 2 * g.RAD2DEG * t.angle * this.focus, i = this.mapSize.width / this.mapSize.height, r = t.distance || e.far; n === e.fov && i === e.aspect && r === e.far || (e.fov = n, e.aspect = i, e.far = r, e.updateProjectionMatrix()), oa.prototype.updateMatrices.call(this, t) } }), aa.prototype = Object.assign(Object.create(ia.prototype), { constructor: aa, isSpotLight: !0, copy: function(t) { return ia.prototype.copy.call(this, t), this.distance = t.distance, this.angle = t.angle, this.penumbra = t.penumbra, this.decay = t.decay, this.target = t.target.clone(), this.shadow = t.shadow.clone(), this } }), la.prototype = Object.assign(Object.create(oa.prototype), { constructor: la, isPointLightShadow: !0, updateMatrices: function(t, e = 0) { const n = this.camera, i = this.matrix, r = this._lightPositionWorld, o = this._lookTarget, s = this._projScreenMatrix; r.setFromMatrixPosition(t.matrixWorld), n.position.copy(r), o.copy(n.position), o.add(this._cubeDirections[e]), n.up.copy(this._cubeUps[e]), n.lookAt(o), n.updateMatrixWorld(), i.makeTranslation(-r.x, -r.y, -r.z), s.multiplyMatrices(n.projectionMatrix, n.matrixWorldInverse), this._frustum.setFromProjectionMatrix(s) } }), ca.prototype = Object.assign(Object.create(ia.prototype), { constructor: ca, isPointLight: !0, copy: function(t) { return ia.prototype.copy.call(this, t), this.distance = t.distance, this.decay = t.decay, this.shadow = t.shadow.clone(), this } }), ha.prototype = Object.assign(Object.create(qe.prototype), { constructor: ha, isOrthographicCamera: !0, copy: function(t, e) { return qe.prototype.copy.call(this, 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: function(t, e, n, i, r, o) { 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 = o, this.updateProjectionMatrix() }, clearViewOffset: function() { null !== this.view && (this.view.enabled = !1), this.updateProjectionMatrix() }, updateProjectionMatrix: function() { 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, o = n + t, s = i + e, a = 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, o = r + t * this.view.width, s -= e * this.view.offsetY, a = s - e * this.view.height } this.projectionMatrix.makeOrthographic(r, o, s, a, this.near, this.far), this.projectionMatrixInverse.copy(this.projectionMatrix).invert() }, toJSON: function(t) { const e = St.prototype.toJSON.call(this, 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 } }), ua.prototype = Object.assign(Object.create(oa.prototype), { constructor: ua, isDirectionalLightShadow: !0, updateMatrices: function(t) { oa.prototype.updateMatrices.call(this, t) } }), da.prototype = Object.assign(Object.create(ia.prototype), { constructor: da, isDirectionalLight: !0, copy: function(t) { return ia.prototype.copy.call(this, t), this.target = t.target.clone(), this.shadow = t.shadow.clone(), this } }), pa.prototype = Object.assign(Object.create(ia.prototype), { constructor: pa, isAmbientLight: !0 }), fa.prototype = Object.assign(Object.create(ia.prototype), { constructor: fa, isRectAreaLight: !0, copy: function(t) { return ia.prototype.copy.call(this, t), this.width = t.width, this.height = t.height, this }, toJSON: function(t) { const e = ia.prototype.toJSON.call(this, t); return e.object.width = this.width, e.object.height = this.height, e } }); class ma { constructor() { Object.defineProperty(this, "isSphericalHarmonics3", { value: !0 }), this.coefficients = []; for (let t = 0; t < 9; t++) this.coefficients.push(new T) } set(t) { for (let e = 0; e < 9; e++) this.coefficients[e].copy(t[e]); return this } zero() { for (let t = 0; t < 9; t++) this.coefficients[t].set(0, 0, 0); return this } getAt(t, e) { const n = t.x, i = t.y, r = t.z, o = this.coefficients; return e.copy(o[0]).multiplyScalar(.282095), e.addScaledVector(o[1], .488603 * i), e.addScaledVector(o[2], .488603 * r), e.addScaledVector(o[3], .488603 * n), e.addScaledVector(o[4], n * i * 1.092548), e.addScaledVector(o[5], i * r * 1.092548), e.addScaledVector(o[6], .315392 * (3 * r * r - 1)), e.addScaledVector(o[7], n * r * 1.092548), e.addScaledVector(o[8], .546274 * (n * n - i * i)), e } getIrradianceAt(t, e) { const n = t.x, i = t.y, r = t.z, o = this.coefficients; return e.copy(o[0]).multiplyScalar(.886227), e.addScaledVector(o[1], 1.023328 * i), e.addScaledVector(o[2], 1.023328 * r), e.addScaledVector(o[3], 1.023328 * n), e.addScaledVector(o[4], .858086 * n * i), e.addScaledVector(o[5], .858086 * i * r), e.addScaledVector(o[6], .743125 * r * r - .247708), e.addScaledVector(o[7], .858086 * n * r), e.addScaledVector(o[8], .429043 * (n * n - i * i)), e } add(t) { for (let e = 0; e < 9; e++) this.coefficients[e].add(t.coefficients[e]); return this } addScaledSH(t, e) { for (let n = 0; n < 9; n++) this.coefficients[n].addScaledVector(t.coefficients[n], e); return this } scale(t) { for (let e = 0; e < 9; e++) this.coefficients[e].multiplyScalar(t); return this } lerp(t, e) { for (let n = 0; n < 9; n++) this.coefficients[n].lerp(t.coefficients[n], e); return this } equals(t) { for (let e = 0; e < 9; e++) if (!this.coefficients[e].equals(t.coefficients[e])) return !1; return !0 } copy(t) { return this.set(t.coefficients) } clone() { return (new this.constructor).copy(this) } fromArray(t, e = 0) { const n = this.coefficients; for (let i = 0; i < 9; i++) n[i].fromArray(t, e + 3 * i); return this } toArray(t = [], e = 0) { const n = this.coefficients; for (let i = 0; i < 9; i++) n[i].toArray(t, e + 3 * i); return t } static getBasisAt(t, e) { const n = t.x, i = t.y, r = t.z; e[0] = .282095, e[1] = .488603 * i, e[2] = .488603 * r, e[3] = .488603 * n, e[4] = 1.092548 * n * i, e[5] = 1.092548 * i * r, e[6] = .315392 * (3 * r * r - 1), e[7] = 1.092548 * n * r, e[8] = .546274 * (n * n - i * i) } } function ga(t, e) { ia.call(this, void 0, e), this.type = "LightProbe", this.sh = void 0 !== t ? t : new ma } function va(t) { Es.call(this, t), this.textures = {} } ga.prototype = Object.assign(Object.create(ia.prototype), { constructor: ga, isLightProbe: !0, copy: function(t) { return ia.prototype.copy.call(this, t), this.sh.copy(t.sh), this }, fromJSON: function(t) { return this.intensity = t.intensity, this.sh.fromArray(t.sh), this }, toJSON: function(t) { const e = ia.prototype.toJSON.call(this, t); return e.object.sh = this.sh.toArray(), e } }), va.prototype = Object.assign(Object.create(Es.prototype), { constructor: va, load: function(t, e, n, i) { const r = this, o = new Ts(r.manager); o.setPath(r.path), o.setRequestHeader(r.requestHeader), o.setWithCredentials(r.withCredentials), o.load(t, (function(n) { try { e(r.parse(JSON.parse(n))) } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t) } }), n, i) }, parse: function(t) { const e = this.textures; function n(t) { return void 0 === e[t] && console.warn("THREE.MaterialLoader: Undefined texture", t), e[t] } const i = new as[t.type]; if (void 0 !== t.uuid && (i.uuid = t.uuid), void 0 !== t.name && (i.name = t.name), void 0 !== t.color && void 0 !== i.color && i.color.setHex(t.color), void 0 !== t.roughness && (i.roughness = t.roughness), void 0 !== t.metalness && (i.metalness = t.metalness), void 0 !== t.sheen && (i.sheen = (new Yt).setHex(t.sheen)), void 0 !== t.emissive && void 0 !== i.emissive && i.emissive.setHex(t.emissive), void 0 !== t.specular && void 0 !== i.specular && i.specular.setHex(t.specular), void 0 !== t.shininess && (i.shininess = t.shininess), void 0 !== t.clearcoat && (i.clearcoat = t.clearcoat), void 0 !== t.clearcoatRoughness && (i.clearcoatRoughness = t.clearcoatRoughness), void 0 !== t.fog && (i.fog = t.fog), void 0 !== t.flatShading && (i.flatShading = t.flatShading), void 0 !== t.blending && (i.blending = t.blending), void 0 !== t.combine && (i.combine = t.combine), void 0 !== t.side && (i.side = t.side), void 0 !== t.opacity && (i.opacity = t.opacity), void 0 !== t.transparent && (i.transparent = t.transparent), void 0 !== t.alphaTest && (i.alphaTest = t.alphaTest), void 0 !== t.depthTest && (i.depthTest = t.depthTest), void 0 !== t.depthWrite && (i.depthWrite = t.depthWrite), void 0 !== t.colorWrite && (i.colorWrite = t.colorWrite), void 0 !== t.stencilWrite && (i.stencilWrite = t.stencilWrite), void 0 !== t.stencilWriteMask && (i.stencilWriteMask = t.stencilWriteMask), void 0 !== t.stencilFunc && (i.stencilFunc = t.stencilFunc), void 0 !== t.stencilRef && (i.stencilRef = t.stencilRef), void 0 !== t.stencilFuncMask && (i.stencilFuncMask = t.stencilFuncMask), void 0 !== t.stencilFail && (i.stencilFail = t.stencilFail), void 0 !== t.stencilZFail && (i.stencilZFail = t.stencilZFail), void 0 !== t.stencilZPass && (i.stencilZPass = t.stencilZPass), void 0 !== t.wireframe && (i.wireframe = t.wireframe), void 0 !== t.wireframeLinewidth && (i.wireframeLinewidth = t.wireframeLinewidth), void 0 !== t.wireframeLinecap && (i.wireframeLinecap = t.wireframeLinecap), void 0 !== t.wireframeLinejoin && (i.wireframeLinejoin = t.wireframeLinejoin), void 0 !== t.rotation && (i.rotation = t.rotation), 1 !== t.linewidth && (i.linewidth = t.linewidth), void 0 !== t.dashSize && (i.dashSize = t.dashSize), void 0 !== t.gapSize && (i.gapSize = t.gapSize), void 0 !== t.scale && (i.scale = t.scale), void 0 !== t.polygonOffset && (i.polygonOffset = t.polygonOffset), void 0 !== t.polygonOffsetFactor && (i.polygonOffsetFactor = t.polygonOffsetFactor), void 0 !== t.polygonOffsetUnits && (i.polygonOffsetUnits = t.polygonOffsetUnits), void 0 !== t.skinning && (i.skinning = t.skinning), void 0 !== t.morphTargets && (i.morphTargets = t.morphTargets), void 0 !== t.morphNormals && (i.morphNormals = t.morphNormals), void 0 !== t.dithering && (i.dithering = t.dithering), void 0 !== t.vertexTangents && (i.vertexTangents = t.vertexTangents), void 0 !== t.visible && (i.visible = t.visible), void 0 !== t.toneMapped && (i.toneMapped = t.toneMapped), void 0 !== t.userData && (i.userData = t.userData), void 0 !== t.vertexColors && ("number" == typeof t.vertexColors ? i.vertexColors = t.vertexColors > 0 : i.vertexColors = t.vertexColors), void 0 !== t.uniforms) for (const e in t.uniforms) { const r = t.uniforms[e]; switch (i.uniforms[e] = {}, r.type) { case "t": i.uniforms[e].value = n(r.value); break; case "c": i.uniforms[e].value = (new Yt).setHex(r.value); break; case "v2": i.uniforms[e].value = (new v).fromArray(r.value); break; case "v3": i.uniforms[e].value = (new T).fromArray(r.value); break; case "v4": i.uniforms[e].value = (new M).fromArray(r.value); break; case "m3": i.uniforms[e].value = (new y).fromArray(r.value); break; case "m4": i.uniforms[e].value = (new et).fromArray(r.value); break; default: i.uniforms[e].value = r.value } } if (void 0 !== t.defines && (i.defines = t.defines), void 0 !== t.vertexShader && (i.vertexShader = t.vertexShader), void 0 !== t.fragmentShader && (i.fragmentShader = t.fragmentShader), void 0 !== t.extensions) for (const e in t.extensions) i.extensions[e] = t.extensions[e]; if (void 0 !== t.shading && (i.flatShading = 1 === t.shading), void 0 !== t.size && (i.size = t.size), void 0 !== t.sizeAttenuation && (i.sizeAttenuation = t.sizeAttenuation), void 0 !== t.map && (i.map = n(t.map)), void 0 !== t.matcap && (i.matcap = n(t.matcap)), void 0 !== t.alphaMap && (i.alphaMap = n(t.alphaMap)), void 0 !== t.bumpMap && (i.bumpMap = n(t.bumpMap)), void 0 !== t.bumpScale && (i.bumpScale = t.bumpScale), void 0 !== t.normalMap && (i.normalMap = n(t.normalMap)), void 0 !== t.normalMapType && (i.normalMapType = t.normalMapType), void 0 !== t.normalScale) { let e = t.normalScale; !1 === Array.isArray(e) && (e = [e, e]), i.normalScale = (new v).fromArray(e) } return void 0 !== t.displacementMap && (i.displacementMap = n(t.displacementMap)), void 0 !== t.displacementScale && (i.displacementScale = t.displacementScale), void 0 !== t.displacementBias && (i.displacementBias = t.displacementBias), void 0 !== t.roughnessMap && (i.roughnessMap = n(t.roughnessMap)), void 0 !== t.metalnessMap && (i.metalnessMap = n(t.metalnessMap)), void 0 !== t.emissiveMap && (i.emissiveMap = n(t.emissiveMap)), void 0 !== t.emissiveIntensity && (i.emissiveIntensity = t.emissiveIntensity), void 0 !== t.specularMap && (i.specularMap = n(t.specularMap)), void 0 !== t.envMap && (i.envMap = n(t.envMap)), void 0 !== t.envMapIntensity && (i.envMapIntensity = t.envMapIntensity), void 0 !== t.reflectivity && (i.reflectivity = t.reflectivity), void 0 !== t.refractionRatio && (i.refractionRatio = t.refractionRatio), void 0 !== t.lightMap && (i.lightMap = n(t.lightMap)), void 0 !== t.lightMapIntensity && (i.lightMapIntensity = t.lightMapIntensity), void 0 !== t.aoMap && (i.aoMap = n(t.aoMap)), void 0 !== t.aoMapIntensity && (i.aoMapIntensity = t.aoMapIntensity), void 0 !== t.gradientMap && (i.gradientMap = n(t.gradientMap)), void 0 !== t.clearcoatMap && (i.clearcoatMap = n(t.clearcoatMap)), void 0 !== t.clearcoatRoughnessMap && (i.clearcoatRoughnessMap = n(t.clearcoatRoughnessMap)), void 0 !== t.clearcoatNormalMap && (i.clearcoatNormalMap = n(t.clearcoatNormalMap)), void 0 !== t.clearcoatNormalScale && (i.clearcoatNormalScale = (new v).fromArray(t.clearcoatNormalScale)), void 0 !== t.transmission && (i.transmission = t.transmission), void 0 !== t.transmissionMap && (i.transmissionMap = n(t.transmissionMap)), i }, setTextures: function(t) { return this.textures = t, this } }); const ya = function(t) { const e = t.lastIndexOf("/"); return -1 === e ? "./" : t.substr(0, e + 1) }; function Aa() { be.call(this), this.type = "InstancedBufferGeometry", this.instanceCount = 1 / 0 } function xa(t, e, n, i) { "number" == typeof n && (i = n, n = !1, console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")), ee.call(this, t, e, n), this.meshPerAttribute = i || 1 } function _a(t) { Es.call(this, t) } function ba(t) { "undefined" == typeof createImageBitmap && console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."), "undefined" == typeof fetch && console.warn("THREE.ImageBitmapLoader: fetch() not supported."), Es.call(this, t), this.options = { premultiplyAlpha: "none" } } function wa() { this.type = "ShapePath", this.color = new Yt, this.subPaths = [], this.currentPath = null } Aa.prototype = Object.assign(Object.create(be.prototype), { constructor: Aa, isInstancedBufferGeometry: !0, copy: function(t) { return be.prototype.copy.call(this, t), this.instanceCount = t.instanceCount, this }, clone: function() { return (new this.constructor).copy(this) }, toJSON: function() { const t = be.prototype.toJSON.call(this); return t.instanceCount = this.instanceCount, t.isInstancedBufferGeometry = !0, t } }), xa.prototype = Object.assign(Object.create(ee.prototype), { constructor: xa, isInstancedBufferAttribute: !0, copy: function(t) { return ee.prototype.copy.call(this, t), this.meshPerAttribute = t.meshPerAttribute, this }, toJSON: function() { const t = ee.prototype.toJSON.call(this); return t.meshPerAttribute = this.meshPerAttribute, t.isInstancedBufferAttribute = !0, t } }), _a.prototype = Object.assign(Object.create(Es.prototype), { constructor: _a, load: function(t, e, n, i) { const r = this, o = new Ts(r.manager); o.setPath(r.path), o.setRequestHeader(r.requestHeader), o.setWithCredentials(r.withCredentials), o.load(t, (function(n) { try { e(r.parse(JSON.parse(n))) } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t) } }), n, i) }, parse: function(t) { const e = {}, n = {}; function i(t, i) { if (void 0 !== e[i]) return e[i]; const r = t.interleavedBuffers[i], o = function(t, e) { if (void 0 !== n[e]) return n[e]; const i = t.arrayBuffers[e], r = new Uint32Array(i).buffer; return n[e] = r, r }(t, r.buffer), s = new dr(fe(r.type, o), r.stride); return s.uuid = r.uuid, e[i] = s, s } const r = t.isInstancedBufferGeometry ? new Aa : new be, o = t.data.index; if (void 0 !== o) { const t = fe(o.type, o.array); r.setIndex(new ee(t, 1)) } const s = t.data.attributes; for (const e in s) { const n = s[e]; let o; if (n.isInterleavedBufferAttribute) { o = new fr(i(t.data, n.data), n.itemSize, n.offset, n.normalized) } else { const t = fe(n.type, n.array); o = new(n.isInstancedBufferAttribute ? xa : ee)(t, n.itemSize, n.normalized) } void 0 !== n.name && (o.name = n.name), r.setAttribute(e, o) } const a = t.data.morphAttributes; if (a) for (const e in a) { const n = a[e], o = []; for (let e = 0, r = n.length; e < r; e++) { const r = n[e]; let s; if (r.isInterleavedBufferAttribute) { s = new fr(i(t.data, r.data), r.itemSize, r.offset, r.normalized) } else { s = new ee(fe(r.type, r.array), r.itemSize, r.normalized) } void 0 !== r.name && (s.name = r.name), o.push(s) } r.morphAttributes[e] = o } t.data.morphTargetsRelative && (r.morphTargetsRelative = !0); const l = t.data.groups || t.data.drawcalls || t.data.offsets; if (void 0 !== l) for (let t = 0, e = l.length; t !== e; ++t) { const e = l[t]; r.addGroup(e.start, e.count, e.materialIndex) } const c = t.data.boundingSphere; if (void 0 !== c) { const t = new T; void 0 !== c.center && t.fromArray(c.center), r.boundingSphere = new X(t, c.radius) } return t.name && (r.name = t.name), t.userData && (r.userData = t.userData), r } }), ba.prototype = Object.assign(Object.create(Es.prototype), { constructor: ba, isImageBitmapLoader: !0, setOptions: function(t) { return this.options = t, this }, load: function(t, e, n, i) { void 0 === t && (t = ""), void 0 !== this.path && (t = this.path + t), t = this.manager.resolveURL(t); const r = this, o = ws.get(t); if (void 0 !== o) return r.manager.itemStart(t), setTimeout((function() { e && e(o), r.manager.itemEnd(t) }), 0), o; const s = {}; s.credentials = "anonymous" === this.crossOrigin ? "same-origin" : "include", fetch(t, s).then((function(t) { return t.blob() })).then((function(t) { return createImageBitmap(t, r.options) })).then((function(n) { ws.add(t, n), e && e(n), r.manager.itemEnd(t) })).catch((function(e) { i && i(e), r.manager.itemError(t), r.manager.itemEnd(t) })), r.manager.itemStart(t) } }), Object.assign(wa.prototype, { moveTo: function(t, e) { return this.currentPath = new ea, this.subPaths.push(this.currentPath), this.currentPath.moveTo(t, e), this }, lineTo: function(t, e) { return this.currentPath.lineTo(t, e), this }, quadraticCurveTo: function(t, e, n, i) { return this.currentPath.quadraticCurveTo(t, e, n, i), this }, bezierCurveTo: function(t, e, n, i, r, o) { return this.currentPath.bezierCurveTo(t, e, n, i, r, o), this }, splineThru: function(t) { return this.currentPath.splineThru(t), this }, toShapes: function(t, e) { function n(t) { const e = []; for (let n = 0, i = t.length; n < i; n++) { const i = t[n], r = new na; r.curves = i.curves, e.push(r) } return e } function i(t, e) { const n = e.length; let i = !1; for (let r = n - 1, o = 0; o < n; r = o++) { let n = e[r], s = e[o], a = s.x - n.x, l = s.y - n.y; if (Math.abs(l) > Number.EPSILON) { if (l < 0 && (n = e[o], a = -a, s = e[r], l = -l), t.y < n.y || t.y > s.y) continue; if (t.y === n.y) { if (t.x === n.x) return !0 } else { const e = l * (t.x - n.x) - a * (t.y - n.y); if (0 === e) return !0; if (e < 0) continue; i = !i } } else { if (t.y !== n.y) continue; if (s.x <= t.x && t.x <= n.x || n.x <= t.x && t.x <= s.x) return !0 } } return i } const r = ko.isClockWise, o = this.subPaths; if (0 === o.length) return []; if (!0 === e) return n(o); let s, a, l; const c = []; if (1 === o.length) return a = o[0], l = new na, l.curves = a.curves, c.push(l), c; let h = !r(o[0].getPoints()); h = t ? !h : h; const u = [], d = []; let p, f, m = [], g = 0; d[g] = void 0, m[g] = []; for (let e = 0, n = o.length; e < n; e++) a = o[e], p = a.getPoints(), s = r(p), s = t ? !s : s, s ? (!h && d[g] && g++, d[g] = { s: new na, p: p }, d[g].s.curves = a.curves, h && g++, m[g] = []) : m[g].push({ h: a, p: p[0] }); if (!d[0]) return n(o); if (d.length > 1) { let t = !1; const e = []; for (let t = 0, e = d.length; t < e; t++) u[t] = []; for (let n = 0, r = d.length; n < r; n++) { const r = m[n]; for (let o = 0; o < r.length; o++) { const s = r[o]; let a = !0; for (let r = 0; r < d.length; r++) i(s.p, d[r].p) && (n !== r && e.push({ froms: n, tos: r, hole: o }), a ? (a = !1, u[r].push(s)) : t = !0); a && u[n].push(s) } } e.length > 0 && (t || (m = u)) } for (let t = 0, e = d.length; t < e; t++) { l = d[t].s, c.push(l), f = m[t]; for (let t = 0, e = f.length; t < e; t++) l.holes.push(f[t].h) } return c } }); class Ma { constructor(t) { Object.defineProperty(this, "isFont", { value: !0 }), this.type = "Font", this.data = t } generateShapes(t, e = 100) { const n = [], i = function(t, e, n) { const i = Array.from ? Array.from(t) : String(t).split(""), r = e / n.resolution, o = (n.boundingBox.yMax - n.boundingBox.yMin + n.underlineThickness) * r, s = []; let a = 0, l = 0; for (let t = 0; t < i.length; t++) { const e = i[t]; if ("\n" === e) a = 0, l -= o; else { const t = Ea(e, r, a, l, n); a += t.offsetX, s.push(t.path) } } return s }(t, e, this.data); for (let t = 0, e = i.length; t < e; t++) Array.prototype.push.apply(n, i[t].toShapes()); return n } } function Ea(t, e, n, i, r) { const o = r.glyphs[t] || r.glyphs["?"]; if (!o) return void console.error('THREE.Font: character "' + t + '" does not exists in font family ' + r.familyName + "."); const s = new wa; let a, l, c, h, u, d, p, f; if (o.o) { const t = o._cachedOutline || (o._cachedOutline = o.o.split(" ")); for (let r = 0, o = t.length; r < o;) { switch (t[r++]) { case "m": a = t[r++] * e + n, l = t[r++] * e + i, s.moveTo(a, l); break; case "l": a = t[r++] * e + n, l = t[r++] * e + i, s.lineTo(a, l); break; case "q": c = t[r++] * e + n, h = t[r++] * e + i, u = t[r++] * e + n, d = t[r++] * e + i, s.quadraticCurveTo(u, d, c, h); break; case "b": c = t[r++] * e + n, h = t[r++] * e + i, u = t[r++] * e + n, d = t[r++] * e + i, p = t[r++] * e + n, f = t[r++] * e + i, s.bezierCurveTo(u, d, p, f, c, h) } } } return { offsetX: o.ha * e, path: s } } function Sa(t) { Es.call(this, t) } let Ta; Sa.prototype = Object.assign(Object.create(Es.prototype), { constructor: Sa, load: function(t, e, n, i) { const r = this, o = new Ts(this.manager); o.setPath(this.path), o.setRequestHeader(this.requestHeader), o.setWithCredentials(r.withCredentials), o.load(t, (function(t) { let n; try { n = JSON.parse(t) } catch (e) { console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."), n = JSON.parse(t.substring(65, t.length - 2)) } const i = r.parse(n); e && e(i) }), n, i) }, parse: function(t) { return new Ma(t) } }); const La = function() { return void 0 === Ta && (Ta = new(window.AudioContext || window.webkitAudioContext)), Ta }; function Ra(t) { Es.call(this, t) } function Ca(t, e, n) { ga.call(this, void 0, n); const i = (new Yt).set(t), r = (new Yt).set(e), o = new T(i.r, i.g, i.b), s = new T(r.r, r.g, r.b), a = Math.sqrt(Math.PI), l = a * Math.sqrt(.75); this.sh.coefficients[0].copy(o).add(s).multiplyScalar(a), this.sh.coefficients[1].copy(o).sub(s).multiplyScalar(l) } function Pa(t, e) { ga.call(this, void 0, e); const n = (new Yt).set(t); this.sh.coefficients[0].set(n.r, n.g, n.b).multiplyScalar(2 * Math.sqrt(Math.PI)) } Ra.prototype = Object.assign(Object.create(Es.prototype), { constructor: Ra, load: function(t, e, n, i) { const r = this, o = new Ts(r.manager); o.setResponseType("arraybuffer"), o.setPath(r.path), o.setRequestHeader(r.requestHeader), o.setWithCredentials(r.withCredentials), o.load(t, (function(n) { try { const t = n.slice(0); La().decodeAudioData(t, (function(t) { e(t) })) } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t) } }), n, i) } }), Ca.prototype = Object.assign(Object.create(ga.prototype), { constructor: Ca, isHemisphereLightProbe: !0, copy: function(t) { return ga.prototype.copy.call(this, t), this }, toJSON: function(t) { return ga.prototype.toJSON.call(this, t) } }), Pa.prototype = Object.assign(Object.create(ga.prototype), { constructor: Pa, isAmbientLightProbe: !0, copy: function(t) { return ga.prototype.copy.call(this, t), this }, toJSON: function(t) { return ga.prototype.toJSON.call(this, t) } }); const Da = new et, Ia = new et; Object.assign(function() { this.type = "StereoCamera", this.aspect = 1, this.eyeSep = .064, this.cameraL = new Ye, this.cameraL.layers.enable(1), this.cameraL.matrixAutoUpdate = !1, this.cameraR = new Ye, this.cameraR.layers.enable(2), this.cameraR.matrixAutoUpdate = !1, this._cache = { focus: null, fov: null, aspect: null, near: null, far: null, zoom: null, eyeSep: null } }.prototype, { update: function(t) { const e = this._cache; if (e.focus !== t.focus || e.fov !== t.fov || e.aspect !== t.aspect * this.aspect || e.near !== t.near || e.far !== t.far || e.zoom !== t.zoom || e.eyeSep !== this.eyeSep) { e.focus = t.focus, e.fov = t.fov, e.aspect = t.aspect * this.aspect, e.near = t.near, e.far = t.far, e.zoom = t.zoom, e.eyeSep = this.eyeSep; const n = t.projectionMatrix.clone(), i = e.eyeSep / 2, r = i * e.near / e.focus, o = e.near * Math.tan(g.DEG2RAD * e.fov * .5) / e.zoom; let s, a; Ia.elements[12] = -i, Da.elements[12] = i, s = -o * e.aspect + r, a = o * e.aspect + r, n.elements[0] = 2 * e.near / (a - s), n.elements[8] = (a + s) / (a - s), this.cameraL.projectionMatrix.copy(n), s = -o * e.aspect - r, a = o * e.aspect - r, n.elements[0] = 2 * e.near / (a - s), n.elements[8] = (a + s) / (a - s), this.cameraR.projectionMatrix.copy(n) } this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Ia), this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(Da) } }); function Oa(t, e, n) { let i, r, o; switch (this.binding = t, this.valueSize = n, e) { case "quaternion": i = this._slerp, r = this._slerpAdditive, o = this._setAdditiveIdentityQuaternion, this.buffer = new Float64Array(6 * n), this._workIndex = 5; break; case "string": case "bool": i = this._select, r = this._select, o = this._setAdditiveIdentityOther, this.buffer = new Array(5 * n); break; default: i = this._lerp, r = this._lerpAdditive, o = this._setAdditiveIdentityNumeric, this.buffer = new Float64Array(5 * n) } this._mixBufferRegion = i, this._mixBufferRegionAdditive = r, this._setIdentity = o, this._origIndex = 3, this._addIndex = 4, this.cumulativeWeight = 0, this.cumulativeWeightAdditive = 0, this.useCount = 0, this.referenceCount = 0 } Object.assign(Oa.prototype, { accumulate: function(t, e) { const n = this.buffer, i = this.valueSize, r = t * i + i; let o = this.cumulativeWeight; if (0 === o) { for (let t = 0; t !== i; ++t) n[r + t] = n[t]; o = e } else { o += e; const t = e / o; this._mixBufferRegion(n, r, 0, t, i) } this.cumulativeWeight = o }, accumulateAdditive: function(t) { const e = this.buffer, n = this.valueSize, i = n * this._addIndex; 0 === this.cumulativeWeightAdditive && this._setIdentity(), this._mixBufferRegionAdditive(e, i, 0, t, n), this.cumulativeWeightAdditive += t }, apply: function(t) { const e = this.valueSize, n = this.buffer, i = t * e + e, r = this.cumulativeWeight, o = this.cumulativeWeightAdditive, s = this.binding; if (this.cumulativeWeight = 0, this.cumulativeWeightAdditive = 0, r < 1) { const t = e * this._origIndex; this._mixBufferRegion(n, i, t, 1 - r, e) } o > 0 && this._mixBufferRegionAdditive(n, i, this._addIndex * e, 1, e); for (let t = e, r = e + e; t !== r; ++t) if (n[t] !== n[t + e]) { s.setValue(n, i); break } }, saveOriginalState: function() { const t = this.binding, e = this.buffer, n = this.valueSize, i = n * this._origIndex; t.getValue(e, i); for (let t = n, r = i; t !== r; ++t) e[t] = e[i + t % n]; this._setIdentity(), this.cumulativeWeight = 0, this.cumulativeWeightAdditive = 0 }, restoreOriginalState: function() { const t = 3 * this.valueSize; this.binding.setValue(this.buffer, t) }, _setAdditiveIdentityNumeric: function() { const t = this._addIndex * this.valueSize, e = t + this.valueSize; for (let n = t; n < e; n++) this.buffer[n] = 0 }, _setAdditiveIdentityQuaternion: function() { this._setAdditiveIdentityNumeric(), this.buffer[this._addIndex * this.valueSize + 3] = 1 }, _setAdditiveIdentityOther: function() { const t = this._origIndex * this.valueSize, e = this._addIndex * this.valueSize; for (let n = 0; n < this.valueSize; n++) this.buffer[e + n] = this.buffer[t + n] }, _select: function(t, e, n, i, r) { if (i >= .5) for (let i = 0; i !== r; ++i) t[e + i] = t[n + i] }, _slerp: function(t, e, n, i) { S.slerpFlat(t, e, t, e, t, n, i) }, _slerpAdditive: function(t, e, n, i, r) { const o = this._workIndex * r; S.multiplyQuaternionsFlat(t, o, t, e, t, n), S.slerpFlat(t, e, t, e, t, o, i) }, _lerp: function(t, e, n, i, r) { const o = 1 - i; for (let s = 0; s !== r; ++s) { const r = e + s; t[r] = t[r] * o + t[n + s] * i } }, _lerpAdditive: function(t, e, n, i, r) { for (let o = 0; o !== r; ++o) { const r = e + o; t[r] = t[r] + t[n + o] * i } } }); const Na = new RegExp("[\\[\\]\\.:\\/]", "g"), Ba = "[^" + "\\[\\]\\.:\\/".replace("\\.", "") + "]", Fa = /((?:WC+[\/:])*)/.source.replace("WC", "[^\\[\\]\\.:\\/]"), za = /(WCOD+)?/.source.replace("WCOD", Ba), Ua = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", "[^\\[\\]\\.:\\/]"), Ha = /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", "[^\\[\\]\\.:\\/]"), Ga = new RegExp("^" + Fa + za + Ua + Ha + "$"), Va = ["material", "materials", "bones"]; function ka(t, e, n) { const i = n || Wa.parseTrackName(e); this._targetGroup = t, this._bindings = t.subscribe_(e, i) } function Wa(t, e, n) { this.path = e, this.parsedPath = n || Wa.parseTrackName(e), this.node = Wa.findNode(t, this.parsedPath.nodeName) || t, this.rootNode = t } Object.assign(ka.prototype, { getValue: function(t, e) { this.bind(); const n = this._targetGroup.nCachedObjects_, i = this._bindings[n]; void 0 !== i && i.getValue(t, e) }, setValue: function(t, e) { const n = this._bindings; for (let i = this._targetGroup.nCachedObjects_, r = n.length; i !== r; ++i) n[i].setValue(t, e) }, bind: function() { const t = this._bindings; for (let e = this._targetGroup.nCachedObjects_, n = t.length; e !== n; ++e) t[e].bind() }, unbind: function() { const t = this._bindings; for (let e = this._targetGroup.nCachedObjects_, n = t.length; e !== n; ++e) t[e].unbind() } }), Object.assign(Wa, { Composite: ka, create: function(t, e, n) { return t && t.isAnimationObjectGroup ? new Wa.Composite(t, e, n) : new Wa(t, e, n) }, sanitizeNodeName: function(t) { return t.replace(/\s/g, "_").replace(Na, "") }, parseTrackName: function(t) { const e = Ga.exec(t); if (!e) throw new Error("PropertyBinding: Cannot parse trackName: " + t); const n = { nodeName: e[2], objectName: e[3], objectIndex: e[4], propertyName: e[5], propertyIndex: e[6] }, i = n.nodeName && n.nodeName.lastIndexOf("."); if (void 0 !== i && -1 !== i) { const t = n.nodeName.substring(i + 1); - 1 !== Va.indexOf(t) && (n.nodeName = n.nodeName.substring(0, i), n.objectName = t) } if (null === n.propertyName || 0 === n.propertyName.length) throw new Error("PropertyBinding: can not parse propertyName from trackName: " + t); return n }, findNode: function(t, e) { if (!e || "" === e || "." === e || -1 === e || e === t.name || e === t.uuid) return t; if (t.skeleton) { const n = t.skeleton.getBoneByName(e); if (void 0 !== n) return n } if (t.children) { const n = function(t) { for (let i = 0; i < t.length; i++) { const r = t[i]; if (r.name === e || r.uuid === e) return r; const o = n(r.children); if (o) return o } return null }, i = n(t.children); if (i) return i } return null } }), Object.assign(Wa.prototype, { _getValue_unavailable: function() {}, _setValue_unavailable: function() {}, BindingType: { Direct: 0, EntireArray: 1, ArrayElement: 2, HasFromToArray: 3 }, Versioning: { None: 0, NeedsUpdate: 1, MatrixWorldNeedsUpdate: 2 }, GetterByBindingType: [function(t, e) { t[e] = this.node[this.propertyName] }, function(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) t[e++] = n[i] }, function(t, e) { t[e] = this.resolvedProperty[this.propertyIndex] }, function(t, e) { this.resolvedProperty.toArray(t, e) }], SetterByBindingTypeAndVersioning: [ [function(t, e) { this.targetObject[this.propertyName] = t[e] }, function(t, e) { this.targetObject[this.propertyName] = t[e], this.targetObject.needsUpdate = !0 }, function(t, e) { this.targetObject[this.propertyName] = t[e], this.targetObject.matrixWorldNeedsUpdate = !0 }], [function(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++] }, function(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++]; this.targetObject.needsUpdate = !0 }, function(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++]; this.targetObject.matrixWorldNeedsUpdate = !0 }], [function(t, e) { this.resolvedProperty[this.propertyIndex] = t[e] }, function(t, e) { this.resolvedProperty[this.propertyIndex] = t[e], this.targetObject.needsUpdate = !0 }, function(t, e) { this.resolvedProperty[this.propertyIndex] = t[e], this.targetObject.matrixWorldNeedsUpdate = !0 }], [function(t, e) { this.resolvedProperty.fromArray(t, e) }, function(t, e) { this.resolvedProperty.fromArray(t, e), this.targetObject.needsUpdate = !0 }, function(t, e) { this.resolvedProperty.fromArray(t, e), this.targetObject.matrixWorldNeedsUpdate = !0 }] ], getValue: function(t, e) { this.bind(), this.getValue(t, e) }, setValue: function(t, e) { this.bind(), this.setValue(t, e) }, bind: function() { let t = this.node; const e = this.parsedPath, n = e.objectName, i = e.propertyName; let r = e.propertyIndex; if (t || (t = Wa.findNode(this.rootNode, e.nodeName) || this.rootNode, this.node = t), this.getValue = this._getValue_unavailable, this.setValue = this._setValue_unavailable, !t) return void console.error("THREE.PropertyBinding: Trying to update node for track: " + this.path + " but it wasn't found."); if (n) { let i = e.objectIndex; switch (n) { case "materials": if (!t.material) return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.", this); if (!t.material.materials) return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.", this); t = t.material.materials; break; case "bones": if (!t.skeleton) return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.", this); t = t.skeleton.bones; for (let e = 0; e < t.length; e++) if (t[e].name === i) { i = e; break } break; default: if (void 0 === t[n]) return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.", this); t = t[n] } if (void 0 !== i) { if (void 0 === t[i]) return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.", this, t); t = t[i] } } const o = t[i]; if (void 0 === o) { const n = e.nodeName; return void console.error("THREE.PropertyBinding: Trying to update property for track: " + n + "." + i + " but it wasn't found.", t) } let s = this.Versioning.None; this.targetObject = t, void 0 !== t.needsUpdate ? s = this.Versioning.NeedsUpdate : void 0 !== t.matrixWorldNeedsUpdate && (s = this.Versioning.MatrixWorldNeedsUpdate); let a = this.BindingType.Direct; if (void 0 !== r) { if ("morphTargetInfluences" === i) { if (!t.geometry) return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.", this); if (!t.geometry.isBufferGeometry) return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.", this); if (!t.geometry.morphAttributes) return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.", this); void 0 !== t.morphTargetDictionary[r] && (r = t.morphTargetDictionary[r]) } a = this.BindingType.ArrayElement, this.resolvedProperty = o, this.propertyIndex = r } else void 0 !== o.fromArray && void 0 !== o.toArray ? (a = this.BindingType.HasFromToArray, this.resolvedProperty = o) : Array.isArray(o) ? (a = this.BindingType.EntireArray, this.resolvedProperty = o) : this.propertyName = i; this.getValue = this.GetterByBindingType[a], this.setValue = this.SetterByBindingTypeAndVersioning[a][s] }, unbind: function() { this.node = null, this.getValue = this._getValue_unbound, this.setValue = this._setValue_unbound } }), Object.assign(Wa.prototype, { _getValue_unbound: Wa.prototype.getValue, _setValue_unbound: Wa.prototype.setValue }), Object.assign(function() { this.uuid = g.generateUUID(), this._objects = Array.prototype.slice.call(arguments), this.nCachedObjects_ = 0; const t = {}; this._indicesByUUID = t; for (let e = 0, n = arguments.length; e !== n; ++e) t[arguments[e].uuid] = e; this._paths = [], this._parsedPaths = [], this._bindings = [], this._bindingsIndicesByPath = {}; const e = this; this.stats = { objects: { get total() { return e._objects.length }, get inUse() { return this.total - e.nCachedObjects_ } }, get bindingsPerObject() { return e._bindings.length } } }.prototype, { isAnimationObjectGroup: !0, add: function() { const t = this._objects, e = this._indicesByUUID, n = this._paths, i = this._parsedPaths, r = this._bindings, o = r.length; let s = void 0, a = t.length, l = this.nCachedObjects_; for (let c = 0, h = arguments.length; c !== h; ++c) { const h = arguments[c], u = h.uuid; let d = e[u]; if (void 0 === d) { d = a++, e[u] = d, t.push(h); for (let t = 0, e = o; t !== e; ++t) r[t].push(new Wa(h, n[t], i[t])) } else if (d < l) { s = t[d]; const a = --l, c = t[a]; e[c.uuid] = d, t[d] = c, e[u] = a, t[a] = h; for (let t = 0, e = o; t !== e; ++t) { const e = r[t], o = e[a]; let s = e[d]; e[d] = o, void 0 === s && (s = new Wa(h, n[t], i[t])), e[a] = s } } else t[d] !== s && console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.") } this.nCachedObjects_ = l }, remove: function() { const t = this._objects, e = this._indicesByUUID, n = this._bindings, i = n.length; let r = this.nCachedObjects_; for (let o = 0, s = arguments.length; o !== s; ++o) { const s = arguments[o], a = s.uuid, l = e[a]; if (void 0 !== l && l >= r) { const o = r++, c = t[o]; e[c.uuid] = l, t[l] = c, e[a] = o, t[o] = s; for (let t = 0, e = i; t !== e; ++t) { const e = n[t], i = e[o], r = e[l]; e[l] = i, e[o] = r } } } this.nCachedObjects_ = r }, uncache: function() { const t = this._objects, e = this._indicesByUUID, n = this._bindings, i = n.length; let r = this.nCachedObjects_, o = t.length; for (let s = 0, a = arguments.length; s !== a; ++s) { const a = arguments[s].uuid, l = e[a]; if (void 0 !== l) if (delete e[a], l < r) { const s = --r, a = t[s], c = --o, h = t[c]; e[a.uuid] = l, t[l] = a, e[h.uuid] = s, t[s] = h, t.pop(); for (let t = 0, e = i; t !== e; ++t) { const e = n[t], i = e[s], r = e[c]; e[l] = i, e[s] = r, e.pop() } } else { const r = --o, s = t[r]; r > 0 && (e[s.uuid] = l), t[l] = s, t.pop(); for (let t = 0, e = i; t !== e; ++t) { const e = n[t]; e[l] = e[r], e.pop() } } } this.nCachedObjects_ = r }, subscribe_: function(t, e) { const n = this._bindingsIndicesByPath; let i = n[t]; const r = this._bindings; if (void 0 !== i) return r[i]; const o = this._paths, s = this._parsedPaths, a = this._objects, l = a.length, c = this.nCachedObjects_, h = new Array(l); i = r.length, n[t] = i, o.push(t), s.push(e), r.push(h); for (let n = c, i = a.length; n !== i; ++n) { const i = a[n]; h[n] = new Wa(i, t, e) } return h }, unsubscribe_: function(t) { const e = this._bindingsIndicesByPath, n = e[t]; if (void 0 !== n) { const i = this._paths, r = this._parsedPaths, o = this._bindings, s = o.length - 1, a = o[s]; e[t[s]] = n, o[n] = a, o.pop(), r[n] = r[s], r.pop(), i[n] = i[s], i.pop() } } }); class ja { constructor(t, e, n = null, i = e.blendMode) { this._mixer = t, this._clip = e, this._localRoot = n, this.blendMode = i; const r = e.tracks, o = r.length, s = new Array(o), a = { endingStart: 2400, endingEnd: 2400 }; for (let t = 0; t !== o; ++t) { const e = r[t].createInterpolant(null); s[t] = e, e.settings = a } this._interpolantSettings = a, this._interpolants = s, this._propertyBindings = new Array(o), this._cacheIndex = null, this._byClipCacheIndex = null, this._timeScaleInterpolant = null, this._weightInterpolant = null, this.loop = 2201, this._loopCount = -1, this._startTime = null, this.time = 0, this.timeScale = 1, this._effectiveTimeScale = 1, this.weight = 1, this._effectiveWeight = 1, this.repetitions = 1 / 0, this.paused = !1, this.enabled = !0, this.clampWhenFinished = !1, this.zeroSlopeAtStart = !0, this.zeroSlopeAtEnd = !0 } play() { return this._mixer._activateAction(this), this } stop() { return this._mixer._deactivateAction(this), this.reset() } reset() { return this.paused = !1, this.enabled = !0, this.time = 0, this._loopCount = -1, this._startTime = null, this.stopFading().stopWarping() } isRunning() { return this.enabled && !this.paused && 0 !== this.timeScale && null === this._startTime && this._mixer._isActiveAction(this) } isScheduled() { return this._mixer._isActiveAction(this) } startAt(t) { return this._startTime = t, this } setLoop(t, e) { return this.loop = t, this.repetitions = e, this } setEffectiveWeight(t) { return this.weight = t, this._effectiveWeight = this.enabled ? t : 0, this.stopFading() } getEffectiveWeight() { return this._effectiveWeight } fadeIn(t) { return this._scheduleFading(t, 0, 1) } fadeOut(t) { return this._scheduleFading(t, 1, 0) } crossFadeFrom(t, e, n) { if (t.fadeOut(e), this.fadeIn(e), n) { const n = this._clip.duration, i = t._clip.duration, r = i / n, o = n / i; t.warp(1, r, e), this.warp(o, 1, e) } return this } crossFadeTo(t, e, n) { return t.crossFadeFrom(this, e, n) } stopFading() { const t = this._weightInterpolant; return null !== t && (this._weightInterpolant = null, this._mixer._takeBackControlInterpolant(t)), this } setEffectiveTimeScale(t) { return this.timeScale = t, this._effectiveTimeScale = this.paused ? 0 : t, this.stopWarping() } getEffectiveTimeScale() { return this._effectiveTimeScale } setDuration(t) { return this.timeScale = this._clip.duration / t, this.stopWarping() } syncWith(t) { return this.time = t.time, this.timeScale = t.timeScale, this.stopWarping() } halt(t) { return this.warp(this._effectiveTimeScale, 0, t) } warp(t, e, n) { const i = this._mixer, r = i.time, o = this.timeScale; let s = this._timeScaleInterpolant; null === s && (s = i._lendControlInterpolant(), this._timeScaleInterpolant = s); const a = s.parameterPositions, l = s.sampleValues; return a[0] = r, a[1] = r + n, l[0] = t / o, l[1] = e / o, this } stopWarping() { const t = this._timeScaleInterpolant; return null !== t && (this._timeScaleInterpolant = null, this._mixer._takeBackControlInterpolant(t)), this } getMixer() { return this._mixer } getClip() { return this._clip } getRoot() { return this._localRoot || this._mixer._root } _update(t, e, n, i) { if (!this.enabled) return void this._updateWeight(t); const r = this._startTime; if (null !== r) { const i = (t - r) * n; if (i < 0 || 0 === n) return; this._startTime = null, e = n * i } e *= this._updateTimeScale(t); const o = this._updateTime(e), s = this._updateWeight(t); if (s > 0) { const t = this._interpolants, e = this._propertyBindings; switch (this.blendMode) { case 2501: for (let n = 0, i = t.length; n !== i; ++n) t[n].evaluate(o), e[n].accumulateAdditive(s); break; case 2500: default: for (let n = 0, r = t.length; n !== r; ++n) t[n].evaluate(o), e[n].accumulate(i, s) } } } _updateWeight(t) { let e = 0; if (this.enabled) { e = this.weight; const n = this._weightInterpolant; if (null !== n) { const i = n.evaluate(t)[0]; e *= i, t > n.parameterPositions[1] && (this.stopFading(), 0 === i && (this.enabled = !1)) } } return this._effectiveWeight = e, e } _updateTimeScale(t) { let e = 0; if (!this.paused) { e = this.timeScale; const n = this._timeScaleInterpolant; if (null !== n) { e *= n.evaluate(t)[0], t > n.parameterPositions[1] && (this.stopWarping(), 0 === e ? this.paused = !0 : this.timeScale = e) } } return this._effectiveTimeScale = e, e } _updateTime(t) { const e = this._clip.duration, n = this.loop; let i = this.time + t, r = this._loopCount; const o = 2202 === n; if (0 === t) return -1 === r ? i : o && 1 == (1 & r) ? e - i : i; if (2200 === n) { -1 === r && (this._loopCount = 0, this._setEndings(!0, !0, !1)); t: { if (i >= e) i = e; else { if (!(i < 0)) { this.time = i; break t } i = 0 } this.clampWhenFinished ? this.paused = !0 : this.enabled = !1, this.time = i, this._mixer.dispatchEvent({ type: "finished", action: this, direction: t < 0 ? -1 : 1 }) } } else { if (-1 === r && (t >= 0 ? (r = 0, this._setEndings(!0, 0 === this.repetitions, o)) : this._setEndings(0 === this.repetitions, !0, o)), i >= e || i < 0) { const n = Math.floor(i / e); i -= e * n, r += Math.abs(n); const s = this.repetitions - r; if (s <= 0) this.clampWhenFinished ? this.paused = !0 : this.enabled = !1, i = t > 0 ? e : 0, this.time = i, this._mixer.dispatchEvent({ type: "finished", action: this, direction: t > 0 ? 1 : -1 }); else { if (1 === s) { const e = t < 0; this._setEndings(e, !e, o) } else this._setEndings(!1, !1, o); this._loopCount = r, this.time = i, this._mixer.dispatchEvent({ type: "loop", action: this, loopDelta: n }) } } else this.time = i; if (o && 1 == (1 & r)) return e - i } return i } _setEndings(t, e, n) { const i = this._interpolantSettings; n ? (i.endingStart = 2401, i.endingEnd = 2401) : (i.endingStart = t ? this.zeroSlopeAtStart ? 2401 : 2400 : 2402, i.endingEnd = e ? this.zeroSlopeAtEnd ? 2401 : 2400 : 2402) } _scheduleFading(t, e, n) { const i = this._mixer, r = i.time; let o = this._weightInterpolant; null === o && (o = i._lendControlInterpolant(), this._weightInterpolant = o); const s = o.parameterPositions, a = o.sampleValues; return s[0] = r, a[0] = e, s[1] = r + t, a[1] = n, this } } function Xa(t) { this._root = t, this._initMemoryManager(), this._accuIndex = 0, this.time = 0, this.timeScale = 1 } Xa.prototype = Object.assign(Object.create(p.prototype), { constructor: Xa, _bindAction: function(t, e) { const n = t._localRoot || this._root, i = t._clip.tracks, r = i.length, o = t._propertyBindings, s = t._interpolants, a = n.uuid, l = this._bindingsByRootAndName; let c = l[a]; void 0 === c && (c = {}, l[a] = c); for (let t = 0; t !== r; ++t) { const r = i[t], l = r.name; let h = c[l]; if (void 0 !== h) o[t] = h; else { if (h = o[t], void 0 !== h) { null === h._cacheIndex && (++h.referenceCount, this._addInactiveBinding(h, a, l)); continue } const i = e && e._propertyBindings[t].binding.parsedPath; h = new Oa(Wa.create(n, l, i), r.ValueTypeName, r.getValueSize()), ++h.referenceCount, this._addInactiveBinding(h, a, l), o[t] = h } s[t].resultBuffer = h.buffer } }, _activateAction: function(t) { if (!this._isActiveAction(t)) { if (null === t._cacheIndex) { const e = (t._localRoot || this._root).uuid, n = t._clip.uuid, i = this._actionsByClip[n]; this._bindAction(t, i && i.knownActions[0]), this._addInactiveAction(t, n, e) } const e = t._propertyBindings; for (let t = 0, n = e.length; t !== n; ++t) { const n = e[t]; 0 == n.useCount++ && (this._lendBinding(n), n.saveOriginalState()) } this._lendAction(t) } }, _deactivateAction: function(t) { if (this._isActiveAction(t)) { const e = t._propertyBindings; for (let t = 0, n = e.length; t !== n; ++t) { const n = e[t]; 0 == --n.useCount && (n.restoreOriginalState(), this._takeBackBinding(n)) } this._takeBackAction(t) } }, _initMemoryManager: function() { this._actions = [], this._nActiveActions = 0, this._actionsByClip = {}, this._bindings = [], this._nActiveBindings = 0, this._bindingsByRootAndName = {}, this._controlInterpolants = [], this._nActiveControlInterpolants = 0; const t = this; this.stats = { actions: { get total() { return t._actions.length }, get inUse() { return t._nActiveActions } }, bindings: { get total() { return t._bindings.length }, get inUse() { return t._nActiveBindings } }, controlInterpolants: { get total() { return t._controlInterpolants.length }, get inUse() { return t._nActiveControlInterpolants } } } }, _isActiveAction: function(t) { const e = t._cacheIndex; return null !== e && e < this._nActiveActions }, _addInactiveAction: function(t, e, n) { const i = this._actions, r = this._actionsByClip; let o = r[e]; if (void 0 === o) o = { knownActions: [t], actionByRoot: {} }, t._byClipCacheIndex = 0, r[e] = o; else { const e = o.knownActions; t._byClipCacheIndex = e.length, e.push(t) } t._cacheIndex = i.length, i.push(t), o.actionByRoot[n] = t }, _removeInactiveAction: function(t) { const e = this._actions, n = e[e.length - 1], i = t._cacheIndex; n._cacheIndex = i, e[i] = n, e.pop(), t._cacheIndex = null; const r = t._clip.uuid, o = this._actionsByClip, s = o[r], a = s.knownActions, l = a[a.length - 1], c = t._byClipCacheIndex; l._byClipCacheIndex = c, a[c] = l, a.pop(), t._byClipCacheIndex = null; delete s.actionByRoot[(t._localRoot || this._root).uuid], 0 === a.length && delete o[r], this._removeInactiveBindingsForAction(t) }, _removeInactiveBindingsForAction: function(t) { const e = t._propertyBindings; for (let t = 0, n = e.length; t !== n; ++t) { const n = e[t]; 0 == --n.referenceCount && this._removeInactiveBinding(n) } }, _lendAction: function(t) { const e = this._actions, n = t._cacheIndex, i = this._nActiveActions++, r = e[i]; t._cacheIndex = i, e[i] = t, r._cacheIndex = n, e[n] = r }, _takeBackAction: function(t) { const e = this._actions, n = t._cacheIndex, i = --this._nActiveActions, r = e[i]; t._cacheIndex = i, e[i] = t, r._cacheIndex = n, e[n] = r }, _addInactiveBinding: function(t, e, n) { const i = this._bindingsByRootAndName, r = this._bindings; let o = i[e]; void 0 === o && (o = {}, i[e] = o), o[n] = t, t._cacheIndex = r.length, r.push(t) }, _removeInactiveBinding: function(t) { const e = this._bindings, n = t.binding, i = n.rootNode.uuid, r = n.path, o = this._bindingsByRootAndName, s = o[i], a = e[e.length - 1], l = t._cacheIndex; a._cacheIndex = l, e[l] = a, e.pop(), delete s[r], 0 === Object.keys(s).length && delete o[i] }, _lendBinding: function(t) { const e = this._bindings, n = t._cacheIndex, i = this._nActiveBindings++, r = e[i]; t._cacheIndex = i, e[i] = t, r._cacheIndex = n, e[n] = r }, _takeBackBinding: function(t) { const e = this._bindings, n = t._cacheIndex, i = --this._nActiveBindings, r = e[i]; t._cacheIndex = i, e[i] = t, r._cacheIndex = n, e[n] = r }, _lendControlInterpolant: function() { const t = this._controlInterpolants, e = this._nActiveControlInterpolants++; let n = t[e]; return void 0 === n && (n = new us(new Float32Array(2), new Float32Array(2), 1, this._controlInterpolantsResultBuffer), n.__cacheIndex = e, t[e] = n), n }, _takeBackControlInterpolant: function(t) { const e = this._controlInterpolants, n = t.__cacheIndex, i = --this._nActiveControlInterpolants, r = e[i]; t.__cacheIndex = i, e[i] = t, r.__cacheIndex = n, e[n] = r }, _controlInterpolantsResultBuffer: new Float32Array(1), clipAction: function(t, e, n) { const i = e || this._root, r = i.uuid; let o = "string" == typeof t ? _s.findByName(i, t) : t; const s = null !== o ? o.uuid : t, a = this._actionsByClip[s]; let l = null; if (void 0 === n && (n = null !== o ? o.blendMode : 2500), void 0 !== a) { const t = a.actionByRoot[r]; if (void 0 !== t && t.blendMode === n) return t; l = a.knownActions[0], null === o && (o = l._clip) } if (null === o) return null; const c = new ja(this, o, e, n); return this._bindAction(c, l), this._addInactiveAction(c, s, r), c }, existingAction: function(t, e) { const n = e || this._root, i = n.uuid, r = "string" == typeof t ? _s.findByName(n, t) : t, o = r ? r.uuid : t, s = this._actionsByClip[o]; return void 0 !== s && s.actionByRoot[i] || null }, stopAllAction: function() { const t = this._actions; for (let e = this._nActiveActions - 1; e >= 0; --e) t[e].stop(); return this }, update: function(t) { t *= this.timeScale; const e = this._actions, n = this._nActiveActions, i = this.time += t, r = Math.sign(t), o = this._accuIndex ^= 1; for (let s = 0; s !== n; ++s) { e[s]._update(i, t, r, o) } const s = this._bindings, a = this._nActiveBindings; for (let t = 0; t !== a; ++t) s[t].apply(o); return this }, setTime: function(t) { this.time = 0; for (let t = 0; t < this._actions.length; t++) this._actions[t].time = 0; return this.update(t) }, getRoot: function() { return this._root }, uncacheClip: function(t) { const e = this._actions, n = t.uuid, i = this._actionsByClip, r = i[n]; if (void 0 !== r) { const t = r.knownActions; for (let n = 0, i = t.length; n !== i; ++n) { const i = t[n]; this._deactivateAction(i); const r = i._cacheIndex, o = e[e.length - 1]; i._cacheIndex = null, i._byClipCacheIndex = null, o._cacheIndex = r, e[r] = o, e.pop(), this._removeInactiveBindingsForAction(i) } delete i[n] } }, uncacheRoot: function(t) { const e = t.uuid, n = this._actionsByClip; for (const t in n) { const i = n[t].actionByRoot[e]; void 0 !== i && (this._deactivateAction(i), this._removeInactiveAction(i)) } const i = this._bindingsByRootAndName[e]; if (void 0 !== i) for (const t in i) { const e = i[t]; e.restoreOriginalState(), this._removeInactiveBinding(e) } }, uncacheAction: function(t, e) { const n = this.existingAction(t, e); null !== n && (this._deactivateAction(n), this._removeInactiveAction(n)) } }); class qa { constructor(t) { "string" == typeof t && (console.warn("THREE.Uniform: Type parameter is no longer needed."), t = arguments[1]), this.value = t } clone() { return new qa(void 0 === this.value.clone ? this.value : this.value.clone()) } } function Ya(t, e, n) { dr.call(this, t, e), this.meshPerAttribute = n || 1 } function Qa(t, e, n, i, r) { this.buffer = t, this.type = e, this.itemSize = n, this.elementSize = i, this.count = r, this.version = 0 } function Za(t, e, n, i) { this.ray = new tt(t, e), this.near = n || 0, this.far = i || 1 / 0, this.camera = null, this.layers = new dt, this.params = { Mesh: {}, Line: { threshold: 1 }, LOD: {}, Points: { threshold: 1 }, Sprite: {} }, Object.defineProperties(this.params, { PointCloud: { get: function() { return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."), this.Points } } }) } function Ja(t, e) { return t.distance - e.distance } function Ka(t, e, n, i) { if (t.layers.test(e.layers) && t.raycast(e, n), !0 === i) { const i = t.children; for (let t = 0, r = i.length; t < r; t++) Ka(i[t], e, n, !0) } } Ya.prototype = Object.assign(Object.create(dr.prototype), { constructor: Ya, isInstancedInterleavedBuffer: !0, copy: function(t) { return dr.prototype.copy.call(this, t), this.meshPerAttribute = t.meshPerAttribute, this }, clone: function(t) { const e = dr.prototype.clone.call(this, t); return e.meshPerAttribute = this.meshPerAttribute, e }, toJSON: function(t) { const e = dr.prototype.toJSON.call(this, t); return e.isInstancedInterleavedBuffer = !0, e.meshPerAttribute = this.meshPerAttribute, e } }), Object.defineProperty(Qa.prototype, "needsUpdate", { set: function(t) { !0 === t && this.version++ } }), Object.assign(Qa.prototype, { isGLBufferAttribute: !0, setBuffer: function(t) { return this.buffer = t, this }, setType: function(t, e) { return this.type = t, this.elementSize = e, this }, setItemSize: function(t) { return this.itemSize = t, this }, setCount: function(t) { return this.count = t, this } }), Object.assign(Za.prototype, { set: function(t, e) { this.ray.set(t, e) }, setFromCamera: function(t, e) { e && e.isPerspectiveCamera ? (this.ray.origin.setFromMatrixPosition(e.matrixWorld), this.ray.direction.set(t.x, t.y, .5).unproject(e).sub(this.ray.origin).normalize(), this.camera = e) : e && e.isOrthographicCamera ? (this.ray.origin.set(t.x, t.y, (e.near + e.far) / (e.near - e.far)).unproject(e), this.ray.direction.set(0, 0, -1).transformDirection(e.matrixWorld), this.camera = e) : console.error("THREE.Raycaster: Unsupported camera type: " + e.type) }, intersectObject: function(t, e, n) { const i = n || []; return Ka(t, this, i, e), i.sort(Ja), i }, intersectObjects: function(t, e, n) { const i = n || []; if (!1 === Array.isArray(t)) return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."), i; for (let n = 0, r = t.length; n < r; n++) Ka(t[n], this, i, e); return i.sort(Ja), i } }); class $a { constructor(t = 1, e = 0, n = 0) { return this.radius = t, this.phi = e, this.theta = n, this } set(t, e, n) { return this.radius = t, this.phi = e, this.theta = n, this } clone() { return (new this.constructor).copy(this) } copy(t) { return this.radius = t.radius, this.phi = t.phi, this.theta = t.theta, this } makeSafe() { return this.phi = Math.max(1e-6, Math.min(Math.PI - 1e-6, this.phi)), this } setFromVector3(t) { return this.setFromCartesianCoords(t.x, t.y, t.z) } setFromCartesianCoords(t, e, n) { return this.radius = Math.sqrt(t * t + e * e + n * n), 0 === this.radius ? (this.theta = 0, this.phi = 0) : (this.theta = Math.atan2(t, n), this.phi = Math.acos(g.clamp(e / this.radius, -1, 1))), this } } const tl = new v; const el = new T, nl = new T; function il(t) { St.call(this), this.material = t, this.render = function() {}, this.hasPositions = !1, this.hasNormals = !1, this.hasColors = !1, this.hasUvs = !1, this.positionArray = null, this.normalArray = null, this.colorArray = null, this.uvArray = null, this.count = 0 } il.prototype = Object.create(St.prototype), il.prototype.constructor = il, il.prototype.isImmediateRenderObject = !0; const rl = new T, ol = new et, sl = new et; const al = new Kt({ side: 1, depthWrite: !1, depthTest: !1 }); new He(new Ve, al); function ll(t) { console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."), Vs.call(this, t), this.type = "catmullrom" } Os.create = function(t, e) { return console.log("THREE.Curve.create() has been deprecated"), t.prototype = Object.create(Os.prototype), t.prototype.constructor = t, t.prototype.getPoint = e, t }, Object.assign(ea.prototype, { fromPoints: function(t) { return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."), this.setFromPoints(t) } }), ll.prototype = Object.create(Vs.prototype), Object.assign(ll.prototype, { initFromArray: function() { console.error("THREE.Spline: .initFromArray() has been removed.") }, getControlPointsArray: function() { console.error("THREE.Spline: .getControlPointsArray() has been removed.") }, reparametrizeByArcLength: function() { console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.") } }), class extends ro { constructor(t = 10, e = 10, n = 4473924, i = 8947848) { n = new Yt(n), i = new Yt(i); const r = e / 2, o = t / e, s = t / 2, a = [], l = []; for (let t = 0, c = 0, h = -s; t <= e; t++, h += o) { a.push(-s, 0, h, s, 0, h), a.push(h, 0, -s, h, 0, s); const e = t === r ? n : i; e.toArray(l, c), c += 3, e.toArray(l, c), c += 3, e.toArray(l, c), c += 3, e.toArray(l, c), c += 3 } const c = new be; c.setAttribute("position", new he(a, 3)), c.setAttribute("color", new he(l, 3)); super(c, new Qr({ vertexColors: !0, toneMapped: !1 })), this.type = "GridHelper" } }.prototype.setColors = function() { console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.") }, class extends ro { constructor(t) { const e = function t(e) { const n = []; e && e.isBone && n.push(e); for (let i = 0; i < e.children.length; i++) n.push.apply(n, t(e.children[i])); return n }(t), n = new be, i = [], r = [], o = new Yt(0, 0, 1), s = new Yt(0, 1, 0); for (let t = 0; t < e.length; t++) { const n = e[t]; n.parent && n.parent.isBone && (i.push(0, 0, 0), i.push(0, 0, 0), r.push(o.r, o.g, o.b), r.push(s.r, s.g, s.b)) } n.setAttribute("position", new he(i, 3)), n.setAttribute("color", new he(r, 3)); super(n, new Qr({ vertexColors: !0, depthTest: !1, depthWrite: !1, toneMapped: !1, transparent: !0 })), this.type = "SkeletonHelper", this.isSkeletonHelper = !0, this.root = t, this.bones = e, this.matrix = t.matrixWorld, this.matrixAutoUpdate = !1 } updateMatrixWorld(t) { const e = this.bones, n = this.geometry, i = n.getAttribute("position"); sl.copy(this.root.matrixWorld).invert(); for (let t = 0, n = 0; t < e.length; t++) { const r = e[t]; r.parent && r.parent.isBone && (ol.multiplyMatrices(sl, r.matrixWorld), rl.setFromMatrixPosition(ol), i.setXYZ(n, rl.x, rl.y, rl.z), ol.multiplyMatrices(sl, r.parent.matrixWorld), rl.setFromMatrixPosition(ol), i.setXYZ(n + 1, rl.x, rl.y, rl.z), n += 2) } n.getAttribute("position").needsUpdate = !0, super.updateMatrixWorld(t) } }.prototype.update = function() { console.error("THREE.SkeletonHelper: update() no longer needs to be called.") }, Object.assign(Es.prototype, { extractUrlBase: function(t) { return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."), ya(t) } }), Es.Handlers = { add: function() { console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.") }, get: function() { console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.") } }, Object.assign(class { constructor(t, e) { Object.defineProperty(this, "isBox2", { value: !0 }), this.min = void 0 !== t ? t : new v(1 / 0, 1 / 0), this.max = void 0 !== e ? e : new v(-1 / 0, -1 / 0) } set(t, e) { return this.min.copy(t), this.max.copy(e), 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 = tl.copy(e).multiplyScalar(.5); return this.min.copy(t).sub(n), this.max.copy(t).add(n), this } 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 = 1 / 0, this.max.x = this.max.y = -1 / 0, this } isEmpty() { return this.max.x < this.min.x || this.max.y < this.min.y } getCenter(t) { return void 0 === t && (console.warn("THREE.Box2: .getCenter() target is now required"), t = new v), this.isEmpty() ? t.set(0, 0) : t.addVectors(this.min, this.max).multiplyScalar(.5) } getSize(t) { return void 0 === t && (console.warn("THREE.Box2: .getSize() target is now required"), t = new v), this.isEmpty() ? t.set(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 } containsPoint(t) { return !(t.x < this.min.x || t.x > this.max.x || t.y < this.min.y || t.y > this.max.y) } 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 } getParameter(t, e) { return void 0 === e && (console.warn("THREE.Box2: .getParameter() target is now required"), e = new v), e.set((t.x - this.min.x) / (this.max.x - this.min.x), (t.y - this.min.y) / (this.max.y - this.min.y)) } 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) } clampPoint(t, e) { return void 0 === e && (console.warn("THREE.Box2: .clampPoint() target is now required"), e = new v), e.copy(t).clamp(this.min, this.max) } distanceToPoint(t) { return tl.copy(t).clamp(this.min, this.max).sub(t).length() } intersect(t) { return this.min.max(t.min), this.max.min(t.max), this } union(t) { return this.min.min(t.min), this.max.max(t.max), 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) } }.prototype, { center: function(t) { return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."), this.getCenter(t) }, empty: function() { return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."), this.isEmpty() }, isIntersectionBox: function(t) { return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."), this.intersectsBox(t) }, size: function(t) { return console.warn("THREE.Box2: .size() has been renamed to .getSize()."), this.getSize(t) } }), Object.assign(C.prototype, { center: function(t) { return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."), this.getCenter(t) }, empty: function() { return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."), this.isEmpty() }, isIntersectionBox: function(t) { return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."), this.intersectsBox(t) }, isIntersectionSphere: function(t) { return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."), this.intersectsSphere(t) }, size: function(t) { return console.warn("THREE.Box3: .size() has been renamed to .getSize()."), this.getSize(t) } }), Object.assign(X.prototype, { empty: function() { return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."), this.isEmpty() } }), en.prototype.setFromMatrix = function(t) { return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."), this.setFromProjectionMatrix(t) }, class { constructor(t, e) { this.start = void 0 !== t ? t : new T, this.end = void 0 !== e ? e : new T } set(t, e) { return this.start.copy(t), this.end.copy(e), this } clone() { return (new this.constructor).copy(this) } copy(t) { return this.start.copy(t.start), this.end.copy(t.end), this } getCenter(t) { return void 0 === t && (console.warn("THREE.Line3: .getCenter() target is now required"), t = new T), t.addVectors(this.start, this.end).multiplyScalar(.5) } delta(t) { return void 0 === t && (console.warn("THREE.Line3: .delta() target is now required"), t = new T), t.subVectors(this.end, this.start) } distanceSq() { return this.start.distanceToSquared(this.end) } distance() { return this.start.distanceTo(this.end) } at(t, e) { return void 0 === e && (console.warn("THREE.Line3: .at() target is now required"), e = new T), this.delta(e).multiplyScalar(t).add(this.start) } closestPointToPointParameter(t, e) { el.subVectors(t, this.start), nl.subVectors(this.end, this.start); const n = nl.dot(nl); let i = nl.dot(el) / n; return e && (i = g.clamp(i, 0, 1)), i } closestPointToPoint(t, e, n) { const i = this.closestPointToPointParameter(t, e); return void 0 === n && (console.warn("THREE.Line3: .closestPointToPoint() target is now required"), n = new T), this.delta(n).multiplyScalar(i).add(this.start) } applyMatrix4(t) { return this.start.applyMatrix4(t), this.end.applyMatrix4(t), this } equals(t) { return t.start.equals(this.start) && t.end.equals(this.end) } }.prototype.center = function(t) { return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."), this.getCenter(t) }, Object.assign(g, { random16: function() { return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."), Math.random() }, nearestPowerOfTwo: function(t) { return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."), g.floorPowerOfTwo(t) }, nextPowerOfTwo: function(t) { return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."), g.ceilPowerOfTwo(t) } }), Object.assign(y.prototype, { flattenToArrayOffset: function(t, e) { return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."), this.toArray(t, e) }, multiplyVector3: function(t) { return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."), t.applyMatrix3(this) }, multiplyVector3Array: function() { console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.") }, applyToBufferAttribute: function(t) { return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."), t.applyMatrix3(this) }, applyToVector3Array: function() { console.error("THREE.Matrix3: .applyToVector3Array() has been removed.") }, getInverse: function(t) { return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."), this.copy(t).invert() } }), Object.assign(et.prototype, { extractPosition: function(t) { return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."), this.copyPosition(t) }, flattenToArrayOffset: function(t, e) { return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."), this.toArray(t, e) }, getPosition: function() { return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."), (new T).setFromMatrixColumn(this, 3) }, setRotationFromQuaternion: function(t) { return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."), this.makeRotationFromQuaternion(t) }, multiplyToArray: function() { console.warn("THREE.Matrix4: .multiplyToArray() has been removed.") }, multiplyVector3: function(t) { return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."), t.applyMatrix4(this) }, multiplyVector4: function(t) { return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."), t.applyMatrix4(this) }, multiplyVector3Array: function() { console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.") }, rotateAxis: function(t) { console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."), t.transformDirection(this) }, crossVector: function(t) { return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."), t.applyMatrix4(this) }, translate: function() { console.error("THREE.Matrix4: .translate() has been removed.") }, rotateX: function() { console.error("THREE.Matrix4: .rotateX() has been removed.") }, rotateY: function() { console.error("THREE.Matrix4: .rotateY() has been removed.") }, rotateZ: function() { console.error("THREE.Matrix4: .rotateZ() has been removed.") }, rotateByAxis: function() { console.error("THREE.Matrix4: .rotateByAxis() has been removed.") }, applyToBufferAttribute: function(t) { return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."), t.applyMatrix4(this) }, applyToVector3Array: function() { console.error("THREE.Matrix4: .applyToVector3Array() has been removed.") }, makeFrustum: function(t, e, n, i, r, o) { return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."), this.makePerspective(t, e, i, n, r, o) }, getInverse: function(t) { return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."), this.copy(t).invert() } }), Ct.prototype.isIntersectionLine = function(t) { return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."), this.intersectsLine(t) }, Object.assign(S.prototype, { multiplyVector3: function(t) { return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."), t.applyQuaternion(this) }, inverse: function() { return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."), this.invert() } }), Object.assign(tt.prototype, { isIntersectionBox: function(t) { return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."), this.intersectsBox(t) }, isIntersectionPlane: function(t) { return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."), this.intersectsPlane(t) }, isIntersectionSphere: function(t) { return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."), this.intersectsSphere(t) } }), Object.assign(Gt.prototype, { area: function() { return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."), this.getArea() }, barycoordFromPoint: function(t, e) { return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."), this.getBarycoord(t, e) }, midpoint: function(t) { return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."), this.getMidpoint(t) }, normal: function(t) { return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."), this.getNormal(t) }, plane: function(t) { return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."), this.getPlane(t) } }), Object.assign(Gt, { barycoordFromPoint: function(t, e, n, i, r) { return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."), Gt.getBarycoord(t, e, n, i, r) }, normal: function(t, e, n, i) { return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."), Gt.getNormal(t, e, n, i) } }), Object.assign(na.prototype, { extractAllPoints: function(t) { return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."), this.extractPoints(t) }, extrude: function(t) { return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."), new Xo(this, t) }, makeGeometry: function(t) { return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."), new Qo(this, t) } }), Object.assign(v.prototype, { fromAttribute: function(t, e, n) { return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."), this.fromBufferAttribute(t, e, n) }, distanceToManhattan: function(t) { return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."), this.manhattanDistanceTo(t) }, lengthManhattan: function() { return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."), this.manhattanLength() } }), Object.assign(T.prototype, { setEulerFromRotationMatrix: function() { console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.") }, setEulerFromQuaternion: function() { console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.") }, getPositionFromMatrix: function(t) { return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."), this.setFromMatrixPosition(t) }, getScaleFromMatrix: function(t) { return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."), this.setFromMatrixScale(t) }, getColumnFromMatrix: function(t, e) { return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."), this.setFromMatrixColumn(e, t) }, applyProjection: function(t) { return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."), this.applyMatrix4(t) }, fromAttribute: function(t, e, n) { return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."), this.fromBufferAttribute(t, e, n) }, distanceToManhattan: function(t) { return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."), this.manhattanDistanceTo(t) }, lengthManhattan: function() { return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."), this.manhattanLength() } }), Object.assign(M.prototype, { fromAttribute: function(t, e, n) { return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."), this.fromBufferAttribute(t, e, n) }, lengthManhattan: function() { return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."), this.manhattanLength() } }), Object.assign(St.prototype, { getChildByName: function(t) { return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."), this.getObjectByName(t) }, renderDepth: function() { console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.") }, translate: function(t, e) { return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."), this.translateOnAxis(e, t) }, getWorldRotation: function() { console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.") }, applyMatrix: function(t) { return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."), this.applyMatrix4(t) } }), Object.defineProperties(St.prototype, { eulerOrder: { get: function() { return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."), this.rotation.order }, set: function(t) { console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."), this.rotation.order = t } }, useQuaternion: { get: function() { console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.") }, set: function() { console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.") } } }), Object.assign(He.prototype, { setDrawMode: function() { console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.") } }), Object.defineProperties(He.prototype, { drawMode: { get: function() { return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."), 0 }, set: function() { console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.") } } }), Object.defineProperties(Ir.prototype, { objects: { get: function() { return console.warn("THREE.LOD: .objects has been renamed to .levels."), this.levels } } }), Object.defineProperty(kr.prototype, "useVertexTexture", { get: function() { console.warn("THREE.Skeleton: useVertexTexture has been removed.") }, set: function() { console.warn("THREE.Skeleton: useVertexTexture has been removed.") } }), Ur.prototype.initBones = function() { console.error("THREE.SkinnedMesh: initBones() has been removed.") }, Object.defineProperty(Os.prototype, "__arcLengthDivisions", { get: function() { return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."), this.arcLengthDivisions }, set: function(t) { console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."), this.arcLengthDivisions = t } }), Ye.prototype.setLens = function(t, e) { console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."), void 0 !== e && (this.filmGauge = e), this.setFocalLength(t) }, Object.defineProperties(ia.prototype, { onlyShadow: { set: function() { console.warn("THREE.Light: .onlyShadow has been removed.") } }, shadowCameraFov: { set: function(t) { console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."), this.shadow.camera.fov = t } }, shadowCameraLeft: { set: function(t) { console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."), this.shadow.camera.left = t } }, shadowCameraRight: { set: function(t) { console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."), this.shadow.camera.right = t } }, shadowCameraTop: { set: function(t) { console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."), this.shadow.camera.top = t } }, shadowCameraBottom: { set: function(t) { console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."), this.shadow.camera.bottom = t } }, shadowCameraNear: { set: function(t) { console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."), this.shadow.camera.near = t } }, shadowCameraFar: { set: function(t) { console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."), this.shadow.camera.far = t } }, shadowCameraVisible: { set: function() { console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.") } }, shadowBias: { set: function(t) { console.warn("THREE.Light: .shadowBias is now .shadow.bias."), this.shadow.bias = t } }, shadowDarkness: { set: function() { console.warn("THREE.Light: .shadowDarkness has been removed.") } }, shadowMapWidth: { set: function(t) { console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."), this.shadow.mapSize.width = t } }, shadowMapHeight: { set: function(t) { console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."), this.shadow.mapSize.height = t } } }), Object.defineProperties(ee.prototype, { length: { get: function() { return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."), this.array.length } }, dynamic: { get: function() { return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."), 35048 === this.usage }, set: function() { console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."), this.setUsage(35048) } } }), Object.assign(ee.prototype, { setDynamic: function(t) { return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."), this.setUsage(!0 === t ? 35048 : 35044), this }, copyIndicesArray: function() { console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.") }, setArray: function() { console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers") } }), Object.assign(be.prototype, { addIndex: function(t) { console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."), this.setIndex(t) }, addAttribute: function(t, e) { return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."), e && e.isBufferAttribute || e && e.isInterleavedBufferAttribute ? "index" === t ? (console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."), this.setIndex(e), this) : this.setAttribute(t, e) : (console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."), this.setAttribute(t, new ee(arguments[1], arguments[2]))) }, addDrawCall: function(t, e, n) { void 0 !== n && console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."), console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."), this.addGroup(t, e) }, clearDrawCalls: function() { console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."), this.clearGroups() }, computeOffsets: function() { console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.") }, removeAttribute: function(t) { return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."), this.deleteAttribute(t) }, applyMatrix: function(t) { return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."), this.applyMatrix4(t) } }), Object.defineProperties(be.prototype, { drawcalls: { get: function() { return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."), this.groups } }, offsets: { get: function() { return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."), this.groups } } }), Object.defineProperties(Aa.prototype, { maxInstancedCount: { get: function() { return console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount."), this.instanceCount }, set: function(t) { console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount."), this.instanceCount = t } } }), Object.defineProperties(Za.prototype, { linePrecision: { get: function() { return console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."), this.params.Line.threshold }, set: function(t) { console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."), this.params.Line.threshold = t } } }), Object.defineProperties(dr.prototype, { dynamic: { get: function() { return console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."), 35048 === this.usage }, set: function(t) { console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."), this.setUsage(t) } } }), Object.assign(dr.prototype, { setDynamic: function(t) { return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."), this.setUsage(!0 === t ? 35048 : 35044), this }, setArray: function() { console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers") } }), Object.assign(Xo.prototype, { getArrays: function() { console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.") }, addShapeList: function() { console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.") }, addShape: function() { console.error("THREE.ExtrudeGeometry: .addShape() has been removed.") } }), Object.assign(ur.prototype, { dispose: function() { console.error("THREE.Scene: .dispose() has been removed.") } }), Object.defineProperties(qa.prototype, { dynamic: { set: function() { console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.") } }, onUpdate: { value: function() { return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."), this } } }), Object.defineProperties(Jt.prototype, { wrapAround: { get: function() { console.warn("THREE.Material: .wrapAround has been removed.") }, set: function() { console.warn("THREE.Material: .wrapAround has been removed.") } }, overdraw: { get: function() { console.warn("THREE.Material: .overdraw has been removed.") }, set: function() { console.warn("THREE.Material: .overdraw has been removed.") } }, wrapRGB: { get: function() { return console.warn("THREE.Material: .wrapRGB has been removed."), new Yt } }, shading: { get: function() { console.error("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead.") }, set: function(t) { console.warn("THREE." + this.type + ": .shading has been removed. Use the boolean .flatShading instead."), this.flatShading = 1 === t } }, stencilMask: { get: function() { return console.warn("THREE." + this.type + ": .stencilMask has been removed. Use .stencilFuncMask instead."), this.stencilFuncMask }, set: function(t) { console.warn("THREE." + this.type + ": .stencilMask has been removed. Use .stencilFuncMask instead."), this.stencilFuncMask = t } } }), Object.defineProperties(es.prototype, { metal: { get: function() { return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."), !1 }, set: function() { console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead") } } }), Object.defineProperties(ts.prototype, { transparency: { get: function() { return console.warn("THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission."), this.transmission }, set: function(t) { console.warn("THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission."), this.transmission = t } } }), Object.defineProperties(Xe.prototype, { derivatives: { get: function() { return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."), this.extensions.derivatives }, set: function(t) { console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."), this.extensions.derivatives = t } } }), Object.assign(cr.prototype, { clearTarget: function(t, e, n, i) { console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."), this.setRenderTarget(t), this.clear(e, n, i) }, animate: function(t) { console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."), this.setAnimationLoop(t) }, getCurrentRenderTarget: function() { return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."), this.getRenderTarget() }, getMaxAnisotropy: function() { return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."), this.capabilities.getMaxAnisotropy() }, getPrecision: function() { return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."), this.capabilities.precision }, resetGLState: function() { return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."), this.state.reset() }, supportsFloatTextures: function() { return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."), this.extensions.get("OES_texture_float") }, supportsHalfFloatTextures: function() { return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."), this.extensions.get("OES_texture_half_float") }, supportsStandardDerivatives: function() { return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."), this.extensions.get("OES_standard_derivatives") }, supportsCompressedTextureS3TC: function() { return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."), this.extensions.get("WEBGL_compressed_texture_s3tc") }, supportsCompressedTexturePVRTC: function() { return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."), this.extensions.get("WEBGL_compressed_texture_pvrtc") }, supportsBlendMinMax: function() { return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."), this.extensions.get("EXT_blend_minmax") }, supportsVertexTextures: function() { return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."), this.capabilities.vertexTextures }, supportsInstancedArrays: function() { return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."), this.extensions.get("ANGLE_instanced_arrays") }, enableScissorTest: function(t) { console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."), this.setScissorTest(t) }, initMaterial: function() { console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.") }, addPrePlugin: function() { console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.") }, addPostPlugin: function() { console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.") }, updateShadowMap: function() { console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.") }, setFaceCulling: function() { console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.") }, allocTextureUnit: function() { console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.") }, setTexture: function() { console.warn("THREE.WebGLRenderer: .setTexture() has been removed.") }, setTexture2D: function() { console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.") }, setTextureCube: function() { console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.") }, getActiveMipMapLevel: function() { return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."), this.getActiveMipmapLevel() } }), Object.defineProperties(cr.prototype, { shadowMapEnabled: { get: function() { return this.shadowMap.enabled }, set: function(t) { console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."), this.shadowMap.enabled = t } }, shadowMapType: { get: function() { return this.shadowMap.type }, set: function(t) { console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."), this.shadowMap.type = t } }, shadowMapCullFace: { get: function() { console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.") }, set: function() { console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.") } }, context: { get: function() { return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."), this.getContext() } }, vr: { get: function() { return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"), this.xr } }, gammaInput: { get: function() { return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."), !1 }, set: function() { console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.") } }, gammaOutput: { get: function() { return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."), !1 }, set: function(t) { console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."), this.outputEncoding = !0 === t ? 3001 : 3e3 } }, toneMappingWhitePoint: { get: function() { return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."), 1 }, set: function() { console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.") } } }), Object.defineProperties(tr.prototype, { cullFace: { get: function() { console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.") }, set: function() { console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.") } }, renderReverseSided: { get: function() { console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.") }, set: function() { console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.") } }, renderSingleSided: { get: function() { console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.") }, set: function() { console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.") } } }), Object.defineProperties(E.prototype, { wrapS: { get: function() { return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."), this.texture.wrapS }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."), this.texture.wrapS = t } }, wrapT: { get: function() { return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."), this.texture.wrapT }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."), this.texture.wrapT = t } }, magFilter: { get: function() { return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."), this.texture.magFilter }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."), this.texture.magFilter = t } }, minFilter: { get: function() { return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."), this.texture.minFilter }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."), this.texture.minFilter = t } }, anisotropy: { get: function() { return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."), this.texture.anisotropy }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."), this.texture.anisotropy = t } }, offset: { get: function() { return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."), this.texture.offset }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."), this.texture.offset = t } }, repeat: { get: function() { return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."), this.texture.repeat }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."), this.texture.repeat = t } }, format: { get: function() { return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."), this.texture.format }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."), this.texture.format = t } }, type: { get: function() { return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."), this.texture.type }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."), this.texture.type = t } }, generateMipmaps: { get: function() { return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."), this.texture.generateMipmaps }, set: function(t) { console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."), this.texture.generateMipmaps = t } } }), Object.defineProperties(class extends St { constructor(t) { super(), this.type = "Audio", this.listener = t, this.context = t.context, this.gain = this.context.createGain(), this.gain.connect(t.getInput()), this.autoplay = !1, this.buffer = null, this.detune = 0, this.loop = !1, this.loopStart = 0, this.loopEnd = 0, this.offset = 0, this.duration = void 0, this.playbackRate = 1, this.isPlaying = !1, this.hasPlaybackControl = !0, this.source = null, this.sourceType = "empty", this._startedAt = 0, this._progress = 0, this._connected = !1, this.filters = [] } getOutput() { return this.gain } setNodeSource(t) { return this.hasPlaybackControl = !1, this.sourceType = "audioNode", this.source = t, this.connect(), this } setMediaElementSource(t) { return this.hasPlaybackControl = !1, this.sourceType = "mediaNode", this.source = this.context.createMediaElementSource(t), this.connect(), this } setMediaStreamSource(t) { return this.hasPlaybackControl = !1, this.sourceType = "mediaStreamNode", this.source = this.context.createMediaStreamSource(t), this.connect(), this } setBuffer(t) { return this.buffer = t, this.sourceType = "buffer", this.autoplay && this.play(), this } play(t = 0) { if (!0 === this.isPlaying) return void console.warn("THREE.Audio: Audio is already playing."); if (!1 === this.hasPlaybackControl) return void console.warn("THREE.Audio: this Audio has no playback control."); this._startedAt = this.context.currentTime + t; const e = this.context.createBufferSource(); return e.buffer = this.buffer, e.loop = this.loop, e.loopStart = this.loopStart, e.loopEnd = this.loopEnd, e.onended = this.onEnded.bind(this), e.start(this._startedAt, this._progress + this.offset, this.duration), this.isPlaying = !0, this.source = e, this.setDetune(this.detune), this.setPlaybackRate(this.playbackRate), this.connect() } pause() { if (!1 !== this.hasPlaybackControl) return !0 === this.isPlaying && (this._progress += Math.max(this.context.currentTime - this._startedAt, 0) * this.playbackRate, !0 === this.loop && (this._progress = this._progress % (this.duration || this.buffer.duration)), this.source.stop(), this.source.onended = null, this.isPlaying = !1), this; console.warn("THREE.Audio: this Audio has no playback control.") } stop() { if (!1 !== this.hasPlaybackControl) return this._progress = 0, this.source.stop(), this.source.onended = null, this.isPlaying = !1, this; console.warn("THREE.Audio: this Audio has no playback control.") } connect() { if (this.filters.length > 0) { this.source.connect(this.filters[0]); for (let t = 1, e = this.filters.length; t < e; t++) this.filters[t - 1].connect(this.filters[t]); this.filters[this.filters.length - 1].connect(this.getOutput()) } else this.source.connect(this.getOutput()); return this._connected = !0, this } disconnect() { if (this.filters.length > 0) { this.source.disconnect(this.filters[0]); for (let t = 1, e = this.filters.length; t < e; t++) this.filters[t - 1].disconnect(this.filters[t]); this.filters[this.filters.length - 1].disconnect(this.getOutput()) } else this.source.disconnect(this.getOutput()); return this._connected = !1, this } getFilters() { return this.filters } setFilters(t) { return t || (t = []), !0 === this._connected ? (this.disconnect(), this.filters = t.slice(), this.connect()) : this.filters = t.slice(), this } setDetune(t) { if (this.detune = t, void 0 !== this.source.detune) return !0 === this.isPlaying && this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, .01), this } getDetune() { return this.detune } getFilter() { return this.getFilters()[0] } setFilter(t) { return this.setFilters(t ? [t] : []) } setPlaybackRate(t) { if (!1 !== this.hasPlaybackControl) return this.playbackRate = t, !0 === this.isPlaying && this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, .01), this; console.warn("THREE.Audio: this Audio has no playback control.") } getPlaybackRate() { return this.playbackRate } onEnded() { this.isPlaying = !1 } getLoop() { return !1 === this.hasPlaybackControl ? (console.warn("THREE.Audio: this Audio has no playback control."), !1) : this.loop } setLoop(t) { if (!1 !== this.hasPlaybackControl) return this.loop = t, !0 === this.isPlaying && (this.source.loop = this.loop), this; console.warn("THREE.Audio: this Audio has no playback control.") } setLoopStart(t) { return this.loopStart = t, this } setLoopEnd(t) { return this.loopEnd = t, this } getVolume() { return this.gain.gain.value } setVolume(t) { return this.gain.gain.setTargetAtTime(t, this.context.currentTime, .01), this } }.prototype, { load: { value: function(t) { console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead."); const e = this; return (new Ra).load(t, (function(t) { e.setBuffer(t) })), this } }, startTime: { set: function() { console.warn("THREE.Audio: .startTime is now .play( delay ).") } } }), class { constructor(t, e = 2048) { this.analyser = t.context.createAnalyser(), this.analyser.fftSize = e, this.data = new Uint8Array(this.analyser.frequencyBinCount), t.getOutput().connect(this.analyser) } getFrequencyData() { return this.analyser.getByteFrequencyData(this.data), this.data } getAverageFrequency() { let t = 0; const e = this.getFrequencyData(); for (let n = 0; n < e.length; n++) t += e[n]; return t / e.length } }.prototype.getData = function() { return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."), this.getFrequencyData() }, Qe.prototype.updateCubeMap = function(t, e) { return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."), this.update(t, e) }, Qe.prototype.clear = function(t, e, n, i) { return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."), this.renderTarget.clear(t, e, n, i) }, x.crossOrigin = void 0, x.loadTexture = function(t, e, n, i) { console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead."); const r = new Is; r.setCrossOrigin(this.crossOrigin); const o = r.load(t, n, void 0, i); return e && (o.mapping = e), o }, x.loadTextureCube = function(t, e, n, i) { console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead."); const r = new Ps; r.setCrossOrigin(this.crossOrigin); const o = r.load(t, n, void 0, i); return e && (o.mapping = e), o }, x.loadCompressedTexture = function() { console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.") }, x.loadCompressedTextureCube = function() { console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.") }, "undefined" != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register", { detail: { revision: "125" } })), "undefined" != typeof window && (window.__THREE__ ? console.warn("WARNING: Multiple instances of Three.js being imported.") : window.__THREE__ = "125"); var cl = function(t, e) { var n, i, r = this, o = new et, s = null; "VRFrameData" in window && (s = new VRFrameData), navigator.getVRDisplays && navigator.getVRDisplays().then((function(t) { i = t, t.length > 0 ? n = t[0] : e && e("VR input not available.") })).catch((function() { console.warn("THREE.VRControls: Unable to get VR Displays") })), this.scale = 1, this.standing = !1, this.userHeight = 1.6, this.getVRDisplay = function() { return n }, this.setVRDisplay = function(t) { n = t }, this.getVRDisplays = function() { return console.warn("THREE.VRControls: getVRDisplays() is being deprecated."), i }, this.getStandingMatrix = function() { return o }, this.update = function() { var e; n && (n.getFrameData ? (n.getFrameData(s), e = s.pose) : n.getPose && (e = n.getPose()), null !== e.orientation && t.quaternion.fromArray(e.orientation), null !== e.position ? t.position.fromArray(e.position) : t.position.set(0, 0, 0), this.standing && (n.stageParameters ? (t.updateMatrix(), o.fromArray(n.stageParameters.sittingToStandingTransform), t.applyMatrix(o)) : t.position.setY(t.position.y + this.userHeight)), t.position.multiplyScalar(r.scale)) }, this.dispose = function() { n = null } }, hl = function(t, e) { var n, i, r, o, s = new T, a = new T, l = new et, c = new et, h = new et, u = null; "VRFrameData" in window && (u = new window.VRFrameData), navigator.getVRDisplays && navigator.getVRDisplays().then((function(t) { i = t, t.length > 0 ? n = t[0] : e && e("HMD not available") })).catch((function() { console.warn("THREE.VREffect: Unable to get VR Displays") })), this.isPresenting = !1; var d = this, p = t.getSize(), f = !1, m = t.getPixelRatio(); this.getVRDisplay = function() { return n }, this.setVRDisplay = function(t) { n = t }, this.getVRDisplays = function() { return console.warn("THREE.VREffect: getVRDisplays() is being deprecated."), i }, this.setSize = function(e, i, r) { if (p = { width: e, height: i }, f = r, d.isPresenting) { var o = n.getEyeParameters("left"); t.setPixelRatio(1), t.setSize(2 * o.renderWidth, o.renderHeight, !1) } else t.setPixelRatio(m), t.setSize(e, i, r) }; var g = t.domElement, v = [0, 0, .5, 1], y = [.5, 0, .5, 1]; function A() { var e = d.isPresenting; if (d.isPresenting = void 0 !== n && n.isPresenting, d.isPresenting) { var i = n.getEyeParameters("left"), r = i.renderWidth, o = i.renderHeight; e || (m = t.getPixelRatio(), p = t.getSize(), t.setPixelRatio(1), t.setSize(2 * r, o, !1)) } else e && (t.setPixelRatio(m), t.setSize(p.width, p.height, f)) } window.addEventListener("vrdisplaypresentchange", A, !1), this.setFullScreen = function(t) { return new Promise((function(e, i) { void 0 !== n ? d.isPresenting !== t ? e(t ? n.requestPresent([{ source: g }]) : n.exitPresent()) : e() : i(new Error("No VR hardware found.")) })) }, this.requestPresent = function() { return this.setFullScreen(!0) }, this.exitPresent = function() { return this.setFullScreen(!1) }, this.requestAnimationFrame = function(t) { return void 0 !== n ? n.requestAnimationFrame(t) : window.requestAnimationFrame(t) }, this.cancelAnimationFrame = function(t) { void 0 !== n ? n.cancelAnimationFrame(t) : window.cancelAnimationFrame(t) }, this.submitFrame = function() { void 0 !== n && d.isPresenting && n.submitFrame() }, this.autoSubmitFrame = !0; var x = new Ye; x.layers.enable(1); var _ = new Ye; _.layers.enable(2), this.render = function(e, i, p, f) { if (n && d.isPresenting) { var m = e.autoUpdate; m && (e.updateMatrixWorld(), e.autoUpdate = !1), Array.isArray(e) && (console.warn("THREE.VREffect.render() no longer supports arrays. Use object.layers instead."), e = e[0]); var g, A, E = t.getSize(), S = n.getLayers(); if (S.length) { var T = S[0]; g = null !== T.leftBounds && 4 === T.leftBounds.length ? T.leftBounds : v, A = null !== T.rightBounds && 4 === T.rightBounds.length ? T.rightBounds : y } else g = v, A = y; if (r = { x: Math.round(E.width * g[0]), y: Math.round(E.height * g[1]), width: Math.round(E.width * g[2]), height: Math.round(E.height * g[3]) }, o = { x: Math.round(E.width * A[0]), y: Math.round(E.height * A[1]), width: Math.round(E.width * A[2]), height: Math.round(E.height * A[3]) }, p ? (t.setRenderTarget(p), p.scissorTest = !0) : (t.setRenderTarget(null), t.setScissorTest(!0)), (t.autoClear || f) && t.clear(), null === i.parent && i.updateMatrixWorld(), i.matrixWorld.decompose(x.position, x.quaternion, x.scale), _.position.copy(x.position), _.quaternion.copy(x.quaternion), _.scale.copy(x.scale), n.getFrameData) n.depthNear = i.near, n.depthFar = i.far, n.getFrameData(u), x.projectionMatrix.elements = u.leftProjectionMatrix, _.projectionMatrix.elements = u.rightProjectionMatrix, function(t) { t.pose.orientation ? (b.fromArray(t.pose.orientation), l.makeRotationFromQuaternion(b)) : l.identity(); t.pose.position && (w.fromArray(t.pose.position), l.setPosition(w)); c.fromArray(t.leftViewMatrix), c.multiply(l), h.fromArray(t.rightViewMatrix), h.multiply(l), c.getInverse(c), h.getInverse(h) }(u), x.updateMatrix(), x.matrix.multiply(c), x.matrix.decompose(x.position, x.quaternion, x.scale), _.updateMatrix(), _.matrix.multiply(h), _.matrix.decompose(_.position, _.quaternion, _.scale); else { var L = n.getEyeParameters("left"), R = n.getEyeParameters("right"); x.projectionMatrix = M(L.fieldOfView, !0, i.near, i.far), _.projectionMatrix = M(R.fieldOfView, !0, i.near, i.far), s.fromArray(L.offset), a.fromArray(R.offset), x.translateOnAxis(s, x.scale.x), _.translateOnAxis(a, _.scale.x) } return p ? (p.viewport.set(r.x, r.y, r.width, r.height), p.scissor.set(r.x, r.y, r.width, r.height)) : (t.setViewport(r.x, r.y, r.width, r.height), t.setScissor(r.x, r.y, r.width, r.height)), t.render(e, x, p, f), p ? (p.viewport.set(o.x, o.y, o.width, o.height), p.scissor.set(o.x, o.y, o.width, o.height)) : (t.setViewport(o.x, o.y, o.width, o.height), t.setScissor(o.x, o.y, o.width, o.height)), t.render(e, _, p, f), p ? (p.viewport.set(0, 0, E.width, E.height), p.scissor.set(0, 0, E.width, E.height), p.scissorTest = !1, t.setRenderTarget(null)) : (t.setViewport(0, 0, E.width, E.height), t.setScissorTest(!1)), m && (e.autoUpdate = !0), void(d.autoSubmitFrame && d.submitFrame()) } t.render(e, i, p, f) }, this.dispose = function() { window.removeEventListener("vrdisplaypresentchange", A, !1) }; var b = new S, w = new T; function M(t, e, n, i) { var r = Math.PI / 180; return function(t, e, n, i) { n = void 0 === n ? .01 : n, i = void 0 === i ? 1e4 : i; var r = (e = void 0 === e || e) ? -1 : 1, o = new et, s = o.elements, a = function(t) { var 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] } }(t); return s[0] = a.scale[0], s[1] = 0, s[2] = a.offset[0] * r, s[3] = 0, s[4] = 0, s[5] = a.scale[1], s[6] = -a.offset[1] * r, s[7] = 0, s[8] = 0, s[9] = 0, s[10] = i / (n - i) * -r, s[11] = i * n / (n - i), s[12] = 0, s[13] = 0, s[14] = r, s[15] = 0, o.transpose(), o }({ upTan: Math.tan(t.upDegrees * r), downTan: Math.tan(t.downDegrees * r), leftTan: Math.tan(t.leftDegrees * r), rightTan: Math.tan(t.rightDegrees * r) }, e, n, i) } }, ul = function(t, e) { var n, i, r, o, s; this.object = t, this.domElement = void 0 !== e ? e : document, this.enabled = !0, this.target = new T, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = .25, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !1, this.keyPanSpeed = 7, this.autoRotate = !1, this.autoRotateSpeed = 2, this.enableKeys = !0, this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }, this.mouseButtons = { ORBIT: h, ZOOM: u, PAN: d }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this.getPolarAngle = function() { return y.phi }, this.getAzimuthalAngle = function() { return y.theta }, this.saveState = function() { a.target0.copy(a.target), a.position0.copy(a.object.position), a.zoom0 = a.object.zoom }, this.reset = function() { a.target.copy(a.target0), a.object.position.copy(a.position0), a.object.zoom = a.zoom0, a.object.updateProjectionMatrix(), a.dispatchEvent(l), a.update(), m = f.NONE }, this.update = (n = new T, i = (new S).setFromUnitVectors(t.up, new T(0, 1, 0)), r = i.clone().inverse(), o = new T, s = new S, function() { var t = a.object.position; return n.copy(t).sub(a.target), n.applyQuaternion(i), y.setFromVector3(n), a.autoRotate && m === f.NONE && a.rotateLeft(2 * Math.PI / 60 / 60 * a.autoRotateSpeed), y.theta += A.theta, y.phi += A.phi, y.theta = Math.max(a.minAzimuthAngle, Math.min(a.maxAzimuthAngle, y.theta)), y.phi = Math.max(a.minPolarAngle, Math.min(a.maxPolarAngle, y.phi)), y.makeSafe(), y.radius *= x, y.radius = Math.max(a.minDistance, Math.min(a.maxDistance, y.radius)), a.target.add(_), n.setFromSpherical(y), n.applyQuaternion(r), t.copy(a.target).add(n), a.object.lookAt(a.target), !0 === a.enableDamping ? (A.theta *= 1 - a.dampingFactor, A.phi *= 1 - a.dampingFactor, _.multiplyScalar(1 - a.dampingFactor)) : (A.set(0, 0, 0), _.set(0, 0, 0)), x = 1, !!(b || o.distanceToSquared(a.object.position) > g || 8 * (1 - s.dot(a.object.quaternion)) > g) && (a.dispatchEvent(l), o.copy(a.object.position), s.copy(a.object.quaternion), b = !1, !0) }), this.dispose = function() { a.domElement.removeEventListener("contextmenu", Q, !1), a.domElement.removeEventListener("mousedown", G, !1), a.domElement.removeEventListener("wheel", W, !1), a.domElement.removeEventListener("touchstart", X, !1), a.domElement.removeEventListener("touchend", Y, !1), a.domElement.removeEventListener("touchmove", q, !1), document.removeEventListener("mousemove", V, !1), document.removeEventListener("mouseup", k, !1), window.removeEventListener("keydown", j, !1) }; var a = this, l = { type: "change" }, c = { type: "start" }, p = { type: "end" }, f = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 }, m = f.NONE, g = 1e-6, y = new $a, A = new $a, x = 1, _ = new T, b = !1, w = new v, M = new v, E = new v, L = new v, R = new v, C = new v, P = new v, D = new v, I = new v; function O() { return Math.pow(.95, a.zoomSpeed) } a.rotateLeft = function(t) { A.theta -= t }, a.rotateUp = function(t) { A.phi -= t }; var N, B = (N = new T, function(t, e) { N.setFromMatrixColumn(e, 0), N.multiplyScalar(-t), _.add(N) }), F = function() { var t = new T; return function(e, n) { !0 === a.screenSpacePanning ? t.setFromMatrixColumn(n, 1) : (t.setFromMatrixColumn(n, 0), t.crossVectors(a.object.up, t)), t.multiplyScalar(e), _.add(t) } }(), z = function() { var t = new T; return function(e, n) { var i = a.domElement === document ? a.domElement.body : a.domElement; if (a.object.isPerspectiveCamera) { var r = a.object.position; t.copy(r).sub(a.target); var o = t.length(); o *= Math.tan(a.object.fov / 2 * Math.PI / 180), B(2 * e * o / i.clientHeight, a.object.matrix), F(2 * n * o / i.clientHeight, a.object.matrix) } else a.object.isOrthographicCamera ? (B(e * (a.object.right - a.object.left) / a.object.zoom / i.clientWidth, a.object.matrix), F(n * (a.object.top - a.object.bottom) / a.object.zoom / i.clientHeight, a.object.matrix)) : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."), a.enablePan = !1) } }(); function U(t) { a.object.isPerspectiveCamera ? x /= t : a.object.isOrthographicCamera ? (a.object.zoom = Math.max(a.minZoom, Math.min(a.maxZoom, a.object.zoom * t)), a.object.updateProjectionMatrix(), b = !0) : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."), a.enableZoom = !1) } function H(t) { a.object.isPerspectiveCamera ? x *= t : a.object.isOrthographicCamera ? (a.object.zoom = Math.max(a.minZoom, Math.min(a.maxZoom, a.object.zoom / t)), a.object.updateProjectionMatrix(), b = !0) : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."), a.enableZoom = !1) } function G(t) { if (!1 !== a.enabled) { switch (t.preventDefault(), t.button) { case a.mouseButtons.ORBIT: if (!1 === a.enableRotate) return; ! function(t) { w.set(t.clientX, t.clientY) }(t), m = f.ROTATE; break; case a.mouseButtons.ZOOM: if (!1 === a.enableZoom) return; ! function(t) { P.set(t.clientX, t.clientY) }(t), m = f.DOLLY; break; case a.mouseButtons.PAN: if (!1 === a.enablePan) return; ! function(t) { L.set(t.clientX, t.clientY) }(t), m = f.PAN } m !== f.NONE && (document.addEventListener("mousemove", V, !1), document.addEventListener("mouseup", k, !1), a.dispatchEvent(c)) } } function V(t) { if (!1 !== a.enabled) switch (t.preventDefault(), m) { case f.ROTATE: if (!1 === a.enableRotate) return; ! function(t) { M.set(t.clientX, t.clientY), E.subVectors(M, w).multiplyScalar(a.rotateSpeed); var e = a.domElement === document ? a.domElement.body : a.domElement; a.rotateLeft(2 * Math.PI * E.x / e.clientHeight), a.rotateUp(2 * Math.PI * E.y / e.clientHeight), w.copy(M), a.update() }(t); break; case f.DOLLY: if (!1 === a.enableZoom) return; ! function(t) { D.set(t.clientX, t.clientY), I.subVectors(D, P), I.y > 0 ? U(O()) : I.y < 0 && H(O()), P.copy(D), a.update() }(t); break; case f.PAN: if (!1 === a.enablePan) return; ! function(t) { R.set(t.clientX, t.clientY), C.subVectors(R, L).multiplyScalar(a.panSpeed), z(C.x, C.y), L.copy(R), a.update() }(t) } } function k(t) { !1 !== a.enabled && (document.removeEventListener("mousemove", V, !1), document.removeEventListener("mouseup", k, !1), a.dispatchEvent(p), m = f.NONE) } function W(t) { !1 === a.enabled || !1 === a.enableZoom || m !== f.NONE && m !== f.ROTATE || (t.preventDefault(), t.stopPropagation(), a.dispatchEvent(c), function(t) { t.deltaY < 0 ? H(O()) : t.deltaY > 0 && U(O()), a.update() }(t), a.dispatchEvent(p)) } function j(t) { !1 !== a.enabled && !1 !== a.enableKeys && !1 !== a.enablePan && function(t) { switch (t.keyCode) { case a.keys.UP: z(0, a.keyPanSpeed), a.update(); break; case a.keys.BOTTOM: z(0, -a.keyPanSpeed), a.update(); break; case a.keys.LEFT: z(a.keyPanSpeed, 0), a.update(); break; case a.keys.RIGHT: z(-a.keyPanSpeed, 0), a.update() } }(t) } function X(t) { if (!1 !== a.enabled) { switch (t.preventDefault(), t.touches.length) { case 1: if (!1 === a.enableRotate) return; ! function(t) { w.set(t.touches[0].pageX, t.touches[0].pageY) }(t), m = f.TOUCH_ROTATE; break; case 2: if (!1 === a.enableZoom && !1 === a.enablePan) return; ! function(t) { if (a.enableZoom) { var e = t.touches[0].pageX - t.touches[1].pageX, n = t.touches[0].pageY - t.touches[1].pageY, i = Math.sqrt(e * e + n * n); P.set(0, i) } if (a.enablePan) { var r = .5 * (t.touches[0].pageX + t.touches[1].pageX), o = .5 * (t.touches[0].pageY + t.touches[1].pageY); L.set(r, o) } }(t), m = f.TOUCH_DOLLY_PAN; break; default: m = f.NONE } m !== f.NONE && a.dispatchEvent(c) } } function q(t) { if (!1 !== a.enabled) switch (t.preventDefault(), t.stopPropagation(), t.touches.length) { case 1: if (!1 === a.enableRotate) return; if (m !== f.TOUCH_ROTATE) return; ! function(t) { M.set(t.touches[0].pageX, t.touches[0].pageY), E.subVectors(M, w).multiplyScalar(a.rotateSpeed); var e = a.domElement === document ? a.domElement.body : a.domElement; a.rotateLeft(2 * Math.PI * E.x / e.clientHeight), a.rotateUp(2 * Math.PI * E.y / e.clientHeight), w.copy(M), a.update() }(t); break; case 2: if (!1 === a.enableZoom && !1 === a.enablePan) return; if (m !== f.TOUCH_DOLLY_PAN) return; ! function(t) { if (a.enableZoom) { var e = t.touches[0].pageX - t.touches[1].pageX, n = t.touches[0].pageY - t.touches[1].pageY, i = Math.sqrt(e * e + n * n); D.set(0, i), I.set(0, Math.pow(D.y / P.y, a.zoomSpeed)), U(I.y), P.copy(D) } if (a.enablePan) { var r = .5 * (t.touches[0].pageX + t.touches[1].pageX), o = .5 * (t.touches[0].pageY + t.touches[1].pageY); R.set(r, o), C.subVectors(R, L).multiplyScalar(a.panSpeed), z(C.x, C.y), L.copy(R) } a.update() }(t); break; default: m = f.NONE } } function Y(t) { !1 !== a.enabled && (a.dispatchEvent(p), m = f.NONE) } function Q(t) { !1 !== a.enabled && t.preventDefault() } a.domElement.addEventListener("mousedown", G, !1), a.domElement.addEventListener("wheel", W, !1), a.domElement.addEventListener("touchstart", X, !1), a.domElement.addEventListener("touchend", Y, !1), a.domElement.addEventListener("touchmove", q, !1), window.addEventListener("keydown", j, !1), this.update() }; (ul.prototype = Object.create(p.prototype)).constructor = ul, Object.defineProperties(ul.prototype, { center: { get: function() { return console.warn("THREE.OrbitControls: .center has been renamed to .target"), this.target } }, noZoom: { get: function() { return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."), !this.enableZoom }, set: function(t) { console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."), this.enableZoom = !t } }, noRotate: { get: function() { return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."), !this.enableRotate }, set: function(t) { console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."), this.enableRotate = !t } }, noPan: { get: function() { return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."), !this.enablePan }, set: function(t) { console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."), this.enablePan = !t } }, noKeys: { get: function() { return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."), !this.enableKeys }, set: function(t) { console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."), this.enableKeys = !t } }, staticMoving: { get: function() { return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."), !this.enableDamping }, set: function(t) { console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."), this.enableDamping = !t } }, dynamicDampingFactor: { get: function() { return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."), this.dampingFactor }, set: function(t) { console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."), this.dampingFactor = t } } }); var dl = function(t) { var e = this; this.object = t, this.object.rotation.reorder("YXZ"), this.enabled = !0, this.deviceOrientation = {}, this.screenOrientation = 0, this.alphaOffset = 0; var n, i, r, o, s = function(t) { e.deviceOrientation = t }, a = function() { e.screenOrientation = window.orientation || 0 }, l = (n = new T(0, 0, 1), i = new ct, r = new S, o = new S(-Math.sqrt(.5), 0, 0, Math.sqrt(.5)), function(t, e, s, a, l) { i.set(s, e, -a, "YXZ"), t.setFromEuler(i), t.multiply(o), t.multiply(r.setFromAxisAngle(n, -l)) }); this.connect = function() { a(), window.addEventListener("orientationchange", a, !1), window.addEventListener("deviceorientation", s, !1), e.enabled = !0 }, this.disconnect = function() { window.removeEventListener("orientationchange", a, !1), window.removeEventListener("deviceorientation", s, !1), e.enabled = !1 }, this.update = function() { if (!1 !== e.enabled) { var t = e.deviceOrientation; if (t) { var n = t.alpha ? g.degToRad(t.alpha) + e.alphaOffset : 0, i = t.beta ? g.degToRad(t.beta) : 0, r = t.gamma ? g.degToRad(t.gamma) : 0, o = e.screenOrientation ? g.degToRad(e.screenOrientation) : 0; l(e.object.quaternion, n, i, r, o) } } }, this.dispose = function() { e.disconnect() }, this.connect() }; var pl, fl = function() { function t(t) { this.object = t.camera, this.domElement = t.canvas, this.orbit = new ul(this.object, this.domElement), this.speed = .5, this.orbit.target.set(0, 0, -1), this.orbit.enableZoom = !1, this.orbit.enablePan = !1, this.orbit.rotateSpeed = -this.speed, t.orientation && (this.orientation = new dl(this.object)), t.halfView && (this.orbit.minAzimuthAngle = -Math.PI / 4, this.orbit.maxAzimuthAngle = Math.PI / 4) } var e = t.prototype; return e.update = function() { if (this.orientation) { this.orientation.update(); var t = this.orientation.object.quaternion, e = function(t, e, n, i) { var r = t * e + n * i; if (r > .499) { var o = 2 * Math.atan2(t, i), s = Math.PI / 2; return new T(s, 0, o) } if (r < -.499) { var a = -2 * Math.atan2(t, i), l = -Math.PI / 2; return new T(l, 0, a) } var c = t * t, h = e * e, u = n * n, d = Math.atan2(2 * e * i - 2 * t * n, 1 - 2 * h - 2 * u), p = Math.asin(2 * r), f = Math.atan2(2 * t * i - 2 * e * n, 1 - 2 * c - 2 * u); return new T(p, f, d) }(t.x, t.y, t.z, t.w); void 0 === this.lastAngle_ && (this.lastAngle_ = e), this.orbit.rotateLeft((this.lastAngle_.z - e.z) * (1 + this.speed)), this.orbit.rotateUp((this.lastAngle_.y - e.y) * (1 + this.speed)), this.lastAngle_ = e } this.orbit.update() }, e.dispose = function() { this.orbit.dispose(), this.orientation && this.orientation.dispose() }, t }(), ml = ((pl = e.createElement("video")).crossOrigin = "anonymous", pl.hasAttribute("crossorigin")), gl = ["360", "360_LR", "360_TB", "360_CUBE", "EAC", "EAC_LR", "NONE", "AUTO", "Sphere", "Cube", "equirectangular", "180", "180_LR", "180_MONO"], vl = function(t) { if (t) { if (t = t.toString().trim(), /sphere/i.test(t)) return "360"; if (/cube/i.test(t)) return "360_CUBE"; if (/equirectangular/i.test(t)) return "360"; for (var e = 0; e < gl.length; e++) if (new RegExp("^" + gl[e] + "$", "i").test(t)) return gl[e] } }, yl = function(t) { function e(e, i, r) { var o; return (o = t.call(this) || this).player = e, o.canvas = i, o.options = r, o.onMoveEnd = n.bind(s(o), o.onMoveEnd), o.onMoveStart = n.bind(s(o), o.onMoveStart), o.onMove = n.bind(s(o), o.onMove), o.onControlBarMove = n.bind(s(o), o.onControlBarMove), o.player.controlBar.on(["mousedown", "mousemove", "mouseup", "touchstart", "touchmove", "touchend"], o.onControlBarMove), o.oldReportUserActivity = o.player.reportUserActivity, o.player.reportUserActivity = function() {}, o.canvas.addEventListener("mousedown", o.onMoveStart), o.canvas.addEventListener("touchstart", o.onMoveStart), o.canvas.addEventListener("mousemove", o.onMove), o.canvas.addEventListener("touchmove", o.onMove), o.canvas.addEventListener("mouseup", o.onMoveEnd), o.canvas.addEventListener("touchend", o.onMoveEnd), o.shouldTogglePlay = !1, o } l(e, t); var i = e.prototype; return i.togglePlay = function() { this.player.paused() ? this.player.play() : this.player.pause() }, i.onMoveStart = function(t) { this.options.disableTogglePlay || !this.player.controls() || "mousedown" === t.type && !n.dom.isSingleLeftClick(t) ? this.shouldTogglePlay = !1 : (this.shouldTogglePlay = !0, this.touchMoveCount_ = 0) }, i.onMoveEnd = function(t) { if ("touchend" === t.type && this.touchMoveCount_ < 10) return !1 === this.player.userActive() ? void this.player.userActive(!0) : void this.player.userActive(!1); this.shouldTogglePlay && "mouseup" === t.type && this.togglePlay() }, i.onMove = function(t) { this.touchMoveCount_++, this.shouldTogglePlay = !1 }, i.onControlBarMove = function(t) { this.player.userActive(!0) }, i.dispose = function() { this.canvas.removeEventListener("mousedown", this.onMoveStart), this.canvas.removeEventListener("touchstart", this.onMoveStart), this.canvas.removeEventListener("mousemove", this.onMove), this.canvas.removeEventListener("touchmove", this.onMove), this.canvas.removeEventListener("mouseup", this.onMoveEnd), this.canvas.removeEventListener("touchend", this.onMoveEnd), this.player.controlBar.off(["mousedown", "mousemove", "mouseup", "touchstart", "touchmove", "touchend"], this.onControlBarMove), this.player.reportUserActivity = this.oldReportUserActivity }, e }(n.EventTarget), Al = function(t) { function e(e, i, r, o) { var s; s = t.call(this) || this; var a = n.mergeOptions({ channelMap: n.browser.IS_SAFARI ? [2, 0, 1, 3] : [0, 1, 2, 3], ambisonicOrder: 1 }, o); return s.videoElementSource = e.createMediaElementSource(r), s.foaRenderer = i.createFOARenderer(e, a), s.foaRenderer.initialize().then((function() { "suspended" === e.state && s.trigger({ type: "audiocontext-suspended" }), s.videoElementSource.connect(s.foaRenderer.input), s.foaRenderer.output.connect(e.destination), s.initialized = !0, s.trigger({ type: "omnitone-ready" }) }), (function(t) { n.log.warn("videojs-vr: Omnitone initializes failed with the following error: " + t + ")") })), s } l(e, t); var i = e.prototype; return i.update = function(t) { this.initialized && this.foaRenderer.setRotationMatrixFromCamera(t.matrix) }, i.dispose = function() { this.initialized = !1, this.foaRenderer.setRenderingMode("bypass"), this.foaRenderer = null }, e }(n.EventTarget), xl = function(e) { function i(i, r) { var o; return (o = e.call(this, i, r) || this).handleVrDisplayActivate_ = n.bind(s(o), o.handleVrDisplayActivate_), o.handleVrDisplayDeactivate_ = n.bind(s(o), o.handleVrDisplayDeactivate_), o.handleVrDisplayPresentChange_ = n.bind(s(o), o.handleVrDisplayPresentChange_), o.handleOrientationChange_ = n.bind(s(o), o.handleOrientationChange_), t.addEventListener("orientationchange", o.handleOrientationChange_), t.addEventListener("vrdisplayactivate", o.handleVrDisplayActivate_), t.addEventListener("vrdisplaydeactivate", o.handleVrDisplayDeactivate_), t.addEventListener("vrdisplaypresentchange", o.handleVrDisplayPresentChange_), n.browser.IS_ANDROID && o.on(i, "fullscreenchange", (function() { i.isFullscreen() ? o.hide() : o.show() })), o } l(i, e); var r = i.prototype; return r.buildCSSClass = function() { return "vjs-button-vr " + e.prototype.buildCSSClass.call(this) }, r.handleVrDisplayPresentChange_ = function() { !this.player_.vr().vrDisplay.isPresenting && this.active_ && this.handleVrDisplayDeactivate_(), this.player_.vr().vrDisplay.isPresenting && !this.active_ && this.handleVrDisplayActivate_() }, r.handleOrientationChange_ = function() { this.active_ && n.browser.IS_IOS && this.changeSize_() }, r.changeSize_ = function() { this.player_.width(t.innerWidth), this.player_.height(t.innerHeight), t.dispatchEvent(new t.Event("resize")) }, r.handleVrDisplayActivate_ = function() { n.browser.IS_IOS && (this.oldWidth_ = this.player_.currentWidth(), this.oldHeight_ = this.player_.currentHeight(), this.player_.enterFullWindow(), this.changeSize_()), this.active_ = !0 }, r.handleVrDisplayDeactivate_ = function() { n.browser.IS_IOS && (this.oldWidth_ && this.player_.width(this.oldWidth_), this.oldHeight_ && this.player_.height(this.oldHeight_), this.player_.exitFullWindow()), this.active_ = !1 }, r.handleClick = function(e) { this.active_ ? t.dispatchEvent(new t.Event("vrdisplaydeactivate")) : (!this.player_.hasStarted() && n.browser.IS_ANDROID && this.player_.play(), t.dispatchEvent(new t.Event("vrdisplayactivate"))) }, r.dispose = function() { e.prototype.dispose.call(this), t.removeEventListener("vrdisplayactivate", this.handleVrDisplayActivate_), t.removeEventListener("vrdisplaydeactivate", this.handleVrDisplayDeactivate_), t.removeEventListener("vrdisplaypresentchange", this.handleVrDisplayPresentChange_) }, i }(n.getComponent("Button")); n.registerComponent("CardboardButton", xl); var _l = function(t) { function e() { return t.apply(this, arguments) || this } return l(e, t), e.prototype.buildCSSClass = function() { return "vjs-big-vr-play-button " + t.prototype.buildCSSClass.call(this) }, e }(n.getComponent("BigPlayButton")); function bl(t, e) { var n = "undefined" != typeof Symbol && t[Symbol.iterator] || t["@@iterator"]; if (n) return (n = n.call(t)).next.bind(n); if (Array.isArray(t) || (n = function(t, e) { if (!t) return; if ("string" == typeof t) return wl(t, e); var n = Object.prototype.toString.call(t).slice(8, -1); "Object" === n && t.constructor && (n = t.constructor.name); if ("Map" === n || "Set" === n) return Array.from(t); if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return wl(t, e) }(t)) || e && t && "number" == typeof t.length) { n && (t = n); var i = 0; return function() { return i >= t.length ? { done: !0 } : { done: !1, value: t[i++] } } } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") } function wl(t, e) { (null == e || e > t.length) && (e = t.length); for (var n = 0, i = new Array(e); n < e; n++) i[n] = t[n]; return i } n.registerComponent("BigVrPlayButton", _l); var Ml = { debug: !1, omnitone: !1, forceCardboard: !1, omnitoneOptions: {}, projection: "AUTO", sphereDetail: 32, disableTogglePlay: !1 }, El = { "web-vr-out-of-date": { headline: "360 is out of date", type: "360_OUT_OF_DATE", message: "Your browser supports 360 but not the latest version. See http://webvr.info for more info." }, "web-vr-not-supported": { headline: "360 not supported on this device", type: "360_NOT_SUPPORTED", message: "Your browser does not support 360. See http://webvr.info for assistance." }, "web-vr-hls-cors-not-supported": { headline: "360 HLS video not supported on this device", type: "360_NOT_SUPPORTED", message: "Your browser/device does not support HLS 360 video. See http://webvr.info for assistance." } }, Sl = n.getPlugin("plugin"), Tl = n.getComponent("Component"), Ll = function(i) { function r(t, e) { var r, o = n.mergeOptions(Ml, e); return (r = i.call(this, t, o) || this).options_ = o, r.player_ = t, r.bigPlayButtonIndex_ = t.children().indexOf(t.getChild("BigPlayButton")) || 0, r.videojsErrorsSupport_ = !!n.errors, r.videojsErrorsSupport_ && t.errors({ errors: El }), n.browser.IE_VERSION || !ml ? (r.player_.on("loadstart", (function() { r.triggerError_({ code: "web-vr-not-supported", dismiss: !1 }) })), s(r)) : (r.polyfill_ = new c({ ROTATE_INSTRUCTIONS_DISABLED: !0 }), r.polyfill_ = new c, r.handleVrDisplayActivate_ = n.bind(s(r), r.handleVrDisplayActivate_), r.handleVrDisplayDeactivate_ = n.bind(s(r), r.handleVrDisplayDeactivate_), r.handleResize_ = n.bind(s(r), r.handleResize_), r.animate_ = n.bind(s(r), r.animate_), r.setProjection(r.options_.projection), r.on(t, "adstart", (function() { return t.setTimeout((function() { t.ads && t.ads.videoElementRecycled() ? (r.log("video element recycled for this ad, reseting"), r.reset(), r.one(t, "playing", r.init)) : r.log("video element not recycled for this ad, no need to reset") })) }), 1), r.on(t, "loadedmetadata", r.init), r) } l(r, i); var o = r.prototype; return o.changeProjection_ = function(t) { var e = this; (t = vl(t)) || (t = "NONE"); var n = 0, i = 0, r = 0; if (this.scene && this.scene.remove(this.movieScreen), "AUTO" === t) { if (this.player_.mediainfo && this.player_.mediainfo.projection && "AUTO" !== this.player_.mediainfo.projection) { var o = vl(this.player_.mediainfo.projection); return this.changeProjection_(o) } return this.changeProjection_("NONE") } if ("360" === t) this.movieGeometry = new Zo(256, this.options_.sphereDetail, this.options_.sphereDetail), this.movieMaterial = new Kt({ map: this.videoTexture, overdraw: !0, side: 1 }), this.movieScreen = new He(this.movieGeometry, this.movieMaterial), this.movieScreen.position.set(n, i, r), this.movieScreen.scale.x = -1, this.movieScreen.quaternion.setFromAxisAngle({ x: 0, y: 1, z: 0 }, -Math.PI / 2), this.scene.add(this.movieScreen); else if ("360_LR" === t || "360_TB" === t) { for (var s = new Zo(256, this.options_.sphereDetail, this.options_.sphereDetail), a = s.faceVertexUvs[0], l = 0; l < a.length; l++) for (var c = 0; c < 3; c++) "360_LR" === t ? a[l][c].x *= .5 : (a[l][c].y *= .5, a[l][c].y += .5); this.movieGeometry = (new be).fromGeometry(s), this.movieMaterial = new Kt({ map: this.videoTexture, overdraw: !0, side: 1 }), this.movieScreen = new He(this.movieGeometry, this.movieMaterial), this.movieScreen.scale.x = -1, this.movieScreen.quaternion.setFromAxisAngle({ x: 0, y: 1, z: 0 }, -Math.PI / 2), this.movieScreen.layers.set(1), this.scene.add(this.movieScreen), a = (s = new Zo(256, this.options_.sphereDetail, this.options_.sphereDetail)).faceVertexUvs[0]; for (var h = 0; h < a.length; h++) for (var u = 0; u < 3; u++) "360_LR" === t ? (a[h][u].x *= .5, a[h][u].x += .5) : a[h][u].y *= .5; this.movieGeometry = (new be).fromGeometry(s), this.movieMaterial = new Kt({ map: this.videoTexture, overdraw: !0, side: 1 }), this.movieScreen = new He(this.movieGeometry, this.movieMaterial), this.movieScreen.scale.x = -1, this.movieScreen.quaternion.setFromAxisAngle({ x: 0, y: 1, z: 0 }, -Math.PI / 2), this.movieScreen.layers.set(2), this.scene.add(this.movieScreen) } else if ("360_CUBE" === t) { this.movieGeometry = new Ve(256, 256, 256), this.movieMaterial = new Kt({ map: this.videoTexture, overdraw: !0, side: 1 }); var d = [new v(0, .5), new v(.333, .5), new v(.333, 1), new v(0, 1)], p = [new v(.333, .5), new v(.666, .5), new v(.666, 1), new v(.333, 1)], f = [new v(.666, .5), new v(1, .5), new v(1, 1), new v(.666, 1)], m = [new v(0, 0), new v(.333, 0), new v(.333, .5), new v(0, .5)], g = [new v(.333, 0), new v(.666, 0), new v(.666, .5), new v(.333, .5)], A = [new v(.666, 0), new v(1, 0), new v(1, .5), new v(.666, .5)]; this.movieGeometry.faceVertexUvs[0] = [], this.movieGeometry.faceVertexUvs[0][0] = [p[2], p[1], p[3]], this.movieGeometry.faceVertexUvs[0][1] = [p[1], p[0], p[3]], this.movieGeometry.faceVertexUvs[0][2] = [d[2], d[1], d[3]], this.movieGeometry.faceVertexUvs[0][3] = [d[1], d[0], d[3]], this.movieGeometry.faceVertexUvs[0][4] = [f[2], f[1], f[3]], this.movieGeometry.faceVertexUvs[0][5] = [f[1], f[0], f[3]], this.movieGeometry.faceVertexUvs[0][6] = [m[2], m[1], m[3]], this.movieGeometry.faceVertexUvs[0][7] = [m[1], m[0], m[3]], this.movieGeometry.faceVertexUvs[0][8] = [g[2], g[1], g[3]], this.movieGeometry.faceVertexUvs[0][9] = [g[1], g[0], g[3]], this.movieGeometry.faceVertexUvs[0][10] = [A[2], A[1], A[3]], this.movieGeometry.faceVertexUvs[0][11] = [A[1], A[0], A[3]], this.movieScreen = new He(this.movieGeometry, this.movieMaterial), this.movieScreen.position.set(n, i, r), this.movieScreen.rotation.y = -Math.PI, this.scene.add(this.movieScreen) } else if ("180" === t || "180_LR" === t || "180_MONO" === t) { var x = new Zo(256, this.options_.sphereDetail, this.options_.sphereDetail, Math.PI, Math.PI); x.scale(-1, 1, 1); var _ = x.faceVertexUvs[0]; if ("180_MONO" !== t) for (var b = 0; b < _.length; b++) for (var w = 0; w < 3; w++) _[b][w].x *= .5; this.movieGeometry = (new be).fromGeometry(x), this.movieMaterial = new Kt({ map: this.videoTexture, overdraw: !0 }), this.movieScreen = new He(this.movieGeometry, this.movieMaterial), this.movieScreen.layers.set(1), this.scene.add(this.movieScreen), (x = new Zo(256, this.options_.sphereDetail, this.options_.sphereDetail, Math.PI, Math.PI)).scale(-1, 1, 1), _ = x.faceVertexUvs[0]; for (var M = 0; M < _.length; M++) for (var E = 0; E < 3; E++) _[M][E].x *= .5, _[M][E].x += .5; this.movieGeometry = (new be).fromGeometry(x), this.movieMaterial = new Kt({ map: this.videoTexture, overdraw: !0 }), this.movieScreen = new He(this.movieGeometry, this.movieMaterial), this.movieScreen.layers.set(2), this.scene.add(this.movieScreen) } else if ("EAC" === t || "EAC_LR" === t) { var S = function(t, o) { e.movieGeometry = new Ve(256, 256, 256), e.movieMaterial = new Xe({ overdraw: !0, side: 1, uniforms: { mapped: { value: e.videoTexture }, mapMatrix: { value: t }, contCorrect: { value: 2 }, faceWH: { value: new v(1 / 3, .5).applyMatrix3(o) }, vidWH: { value: new v(e.videoTexture.image.videoWidth, e.videoTexture.image.videoHeight).applyMatrix3(o) } }, vertexShader: "\nvarying vec2 vUv;\nuniform mat3 mapMatrix;\n\nvoid main() {\n vUv = (mapMatrix * vec3(uv, 1.)).xy;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.);\n}", fragmentShader: "\nvarying vec2 vUv;\nuniform sampler2D mapped;\nuniform vec2 faceWH;\nuniform vec2 vidWH;\nuniform float contCorrect;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nvoid main() {\n vec2 corner = vUv - mod(vUv, faceWH) + vec2(0, contCorrect / vidWH.y);\n\n vec2 faceWHadj = faceWH - vec2(0, contCorrect * 2. / vidWH.y);\n\n vec2 p = (vUv - corner) / faceWHadj - .5;\n vec2 q = 2. / PI * atan(2. * p) + .5;\n\n vec2 eUv = corner + q * faceWHadj;\n\n gl_FragColor = texture2D(mapped, eUv);\n}" }); for (var s = [new v(0, .5), new v(1 / 3, .5), new v(1 / 3, 1), new v(0, 1)], a = [new v(1 / 3, .5), new v(2 / 3, .5), new v(2 / 3, 1), new v(1 / 3, 1)], l = [new v(2 / 3, .5), new v(1, .5), new v(1, 1), new v(2 / 3, 1)], c = [new v(1 / 3, 0), new v(1 / 3, .5), new v(0, .5), new v(0, 0)], h = [new v(1 / 3, .5), new v(1 / 3, 0), new v(2 / 3, 0), new v(2 / 3, .5)], u = [new v(1, 0), new v(1, .5), new v(2 / 3, .5), new v(2 / 3, 0)], d = 0, p = [s, a, l, c, h, u]; d < p.length; d++) { for (var f, m = p[d], g = e.videoTexture.image.videoHeight, y = 1, A = 0, x = bl(m); !(f = x()).done;) { var _ = f.value; _.y < y && (y = _.y), _.y > A && (A = _.y) } for (var b, w = bl(m); !(b = w()).done;) { var M = b.value; Math.abs(M.y - y) < Number.EPSILON && (M.y += 2 / g), Math.abs(M.y - A) < Number.EPSILON && (M.y -= 2 / g), M.x = M.x / g * (g - 4) + 2 / g } } return e.movieGeometry.faceVertexUvs[0] = [], e.movieGeometry.faceVertexUvs[0][0] = [s[2], s[1], s[3]], e.movieGeometry.faceVertexUvs[0][1] = [s[1], s[0], s[3]], e.movieGeometry.faceVertexUvs[0][2] = [l[2], l[1], l[3]], e.movieGeometry.faceVertexUvs[0][3] = [l[1], l[0], l[3]], e.movieGeometry.faceVertexUvs[0][4] = [u[2], u[1], u[3]], e.movieGeometry.faceVertexUvs[0][5] = [u[1], u[0], u[3]], e.movieGeometry.faceVertexUvs[0][6] = [c[2], c[1], c[3]], e.movieGeometry.faceVertexUvs[0][7] = [c[1], c[0], c[3]], e.movieGeometry.faceVertexUvs[0][8] = [a[2], a[1], a[3]], e.movieGeometry.faceVertexUvs[0][9] = [a[1], a[0], a[3]], e.movieGeometry.faceVertexUvs[0][10] = [h[2], h[1], h[3]], e.movieGeometry.faceVertexUvs[0][11] = [h[1], h[0], h[3]], e.movieScreen = new He(e.movieGeometry, e.movieMaterial), e.movieScreen.position.set(n, i, r), e.movieScreen.rotation.y = -Math.PI, e.movieScreen }; if ("EAC" === t) this.scene.add(S(new y, new y)); else { var T = (new y).set(0, .5, 0, 1, 0, 0, 0, 0, 1); S((new y).set(0, -.5, .5, 1, 0, 0, 0, 0, 1), T), this.movieScreen.layers.set(1), this.scene.add(this.movieScreen), S((new y).set(0, -.5, 1, 1, 0, 0, 0, 0, 1), T), this.movieScreen.layers.set(2), this.scene.add(this.movieScreen) } } this.currentProjection_ = t }, o.triggerError_ = function(t) { if (this.videojsErrorsSupport_) this.player_.error(t); else { var n = e.createElement("div"); n.innerHTML = El[t.code].message; var i = n.textContent || n.innerText || ""; this.player_.error({ code: t.code, message: i }) } }, o.log = function() { if (this.options_.debug) { for (var t = arguments.length, e = new Array(t), i = 0; i < t; i++) e[i] = arguments[i]; e.forEach((function(t) { n.log("VR: ", t) })) } }, o.handleVrDisplayActivate_ = function() { var e = this; this.vrDisplay && this.vrDisplay.requestPresent([{ source: this.renderedCanvas }]).then((function() { if (e.vrDisplay.cardboardUI_ && n.browser.IS_IOS) { var i = [], r = function(t) { for (var e = 0; e < t.touches.length; e++) i.push(t.touches[e]) }, o = function(n) { i.length && (i.forEach((function(n) { var i = new t.MouseEvent("click", { screenX: n.screenX, screenY: n.screenY, clientX: n.clientX, clientY: n.clientY }); e.renderedCanvas.dispatchEvent(i) })), i = []) }; e.renderedCanvas.addEventListener("touchstart", r), e.renderedCanvas.addEventListener("touchend", o), e.iosRevertTouchToClick_ = function() { e.renderedCanvas.removeEventListener("touchstart", r), e.renderedCanvas.removeEventListener("touchend", o), e.iosRevertTouchToClick_ = null } } })) }, o.handleVrDisplayDeactivate_ = function() { this.vrDisplay && this.vrDisplay.isPresenting && (this.iosRevertTouchToClick_ && this.iosRevertTouchToClick_(), this.vrDisplay.exitPresent()) }, o.requestAnimationFrame = function(t) { return this.vrDisplay ? this.vrDisplay.requestAnimationFrame(t) : this.player_.requestAnimationFrame(t) }, o.cancelAnimationFrame = function(t) { return this.vrDisplay ? this.vrDisplay.cancelAnimationFrame(t) : this.player_.cancelAnimationFrame(t) }, o.togglePlay_ = function() { this.player_.paused() ? this.player_.play() : this.player_.pause() }, o.animate_ = function() { if (this.initialized_) { if (this.getVideoEl_().readyState === this.getVideoEl_().HAVE_ENOUGH_DATA && this.videoTexture && (this.videoTexture.needsUpdate = !0), this.controls3d.update(), this.omniController && this.omniController.update(this.camera), this.effect.render(this.scene, this.camera), t.navigator.getGamepads) for (var e = t.navigator.getGamepads(), n = 0; n < e.length; ++n) { var i = e[n]; if (i && i.timestamp && i.timestamp !== this.prevTimestamps_[n]) for (var r = 0; r < i.buttons.length; ++r) if (i.buttons[r].pressed) { this.togglePlay_(), this.prevTimestamps_[n] = i.timestamp; break } } this.camera.getWorldDirection(this.cameraVector), this.animationFrameId_ = this.requestAnimationFrame(this.animate_) } }, o.handleResize_ = function() { var t = this.player_.currentWidth(), e = this.player_.currentHeight(); this.effect.setSize(t, e, !1), this.camera.aspect = t / e, this.camera.updateProjectionMatrix() }, o.setProjection = function(t) { vl(t) ? (this.currentProjection_ = t, this.defaultProjection_ = t) : n.log.error("videojs-vr: please pass a valid projection " + gl.join(", ")) }, o.init = function() { var e = this; if (this.reset(), this.camera = new Ye(75, this.player_.currentWidth() / this.player_.currentHeight(), 1, 1e3), this.cameraVector = new T, "360_LR" !== this.currentProjection_ && "360_TB" !== this.currentProjection_ && "180" !== this.currentProjection_ && "180_LR" !== this.currentProjection_ && "180_MONO" !== this.currentProjection_ && "EAC_LR" !== this.currentProjection_ || this.camera.layers.enable(1), this.scene = new ur, this.videoTexture = new fo(this.getVideoEl_()), this.videoTexture.generateMipmaps = !1, this.videoTexture.minFilter = 1006, this.videoTexture.magFilter = 1006, this.videoTexture.format = 1022, this.changeProjection_(this.currentProjection_), "NONE" === this.currentProjection_) return this.log("Projection is NONE, dont init"), void this.reset(); this.player_.removeChild("BigPlayButton"), this.player_.addChild("BigVrPlayButton", {}, this.bigPlayButtonIndex_), this.player_.bigPlayButton = this.player_.getChild("BigVrPlayButton"), (this.options_.forceCardboard || n.browser.IS_ANDROID || n.browser.IS_IOS) && this.addCardboardButton_(), n.browser.IS_IOS && this.player_.controlBar && this.player_.controlBar.fullscreenToggle && this.player_.controlBar.fullscreenToggle.hide(), this.camera.position.set(0, 0, 0), this.renderer = new cr({ devicePixelRatio: t.devicePixelRatio, alpha: !1, clearColor: 16777215, antialias: !0 }); var i = this.renderer.getContext("webgl"), r = i.texImage2D; i.texImage2D = function() { try { for (var t = arguments.length, n = new Array(t), o = 0; o < t; o++) n[o] = arguments[o]; return r.apply(i, n) } catch (t) { throw e.reset(), e.player_.pause(), e.triggerError_({ code: "web-vr-hls-cors-not-supported", dismiss: !1 }), new Error(t) } }, this.renderer.setSize(this.player_.currentWidth(), this.player_.currentHeight(), !1), this.effect = new hl(this.renderer), this.effect.setSize(this.player_.currentWidth(), this.player_.currentHeight(), !1), this.vrDisplay = null, this.prevTimestamps_ = [], this.renderedCanvas = this.renderer.domElement, this.renderedCanvas.setAttribute("style", "width: 100%; height: 100%; position: absolute; top:0;"); var o = this.getVideoEl_().style; if (this.player_.el().insertBefore(this.renderedCanvas, this.player_.el().firstChild), o.zIndex = "-1", o.opacity = "0", t.navigator.getVRDisplays ? (this.log("is supported, getting vr displays"), t.navigator.getVRDisplays().then((function(t) { if (t.length > 0 && (e.log("Displays found", t), e.vrDisplay = t[0], e.vrDisplay.isPolyfilled || (e.log("Real HMD found using VRControls", e.vrDisplay), e.addCardboardButton_(), e.controls3d = new cl(e.camera))), !e.controls3d) { e.log("no HMD found Using Orbit & Orientation Controls"); var i = { camera: e.camera, canvas: e.renderedCanvas, halfView: 0 === e.currentProjection_.indexOf("180"), orientation: n.browser.IS_IOS || n.browser.IS_ANDROID || !1 }; !1 === e.options_.motionControls && (i.orientation = !1), e.controls3d = new fl(i), e.canvasPlayerControls = new yl(e.player_, e.renderedCanvas, e.options_) } e.animationFrameId_ = e.requestAnimationFrame(e.animate_) }))) : t.navigator.getVRDevices ? this.triggerError_({ code: "web-vr-out-of-date", dismiss: !1 }) : this.triggerError_({ code: "web-vr-not-supported", dismiss: !1 }), this.options_.omnitone) { var s = La(); this.omniController = new Al(s, this.options_.omnitone, this.getVideoEl_(), this.options_.omnitoneOptions), this.omniController.one("audiocontext-suspended", (function() { e.player.pause(), e.player.one("playing", (function() { s.resume() })) })) } this.on(this.player_, "fullscreenchange", this.handleResize_), t.addEventListener("vrdisplaypresentchange", this.handleResize_, !0), t.addEventListener("resize", this.handleResize_, !0), t.addEventListener("vrdisplayactivate", this.handleVrDisplayActivate_, !0), t.addEventListener("vrdisplaydeactivate", this.handleVrDisplayDeactivate_, !0), this.initialized_ = !0, this.trigger("initialized") }, o.addCardboardButton_ = function() { this.player_.controlBar.getChild("CardboardButton") || this.player_.controlBar.addChild("CardboardButton", {}) }, o.getVideoEl_ = function() { return this.player_.el().getElementsByTagName("video")[0] }, o.reset = function() { if (this.initialized_) { this.omniController && (this.omniController.off("audiocontext-suspended"), this.omniController.dispose(), this.omniController = void 0), this.controls3d && (this.controls3d.dispose(), this.controls3d = null), this.canvasPlayerControls && (this.canvasPlayerControls.dispose(), this.canvasPlayerControls = null), this.effect && (this.effect.dispose(), this.effect = null), t.removeEventListener("resize", this.handleResize_, !0), t.removeEventListener("vrdisplaypresentchange", this.handleResize_, !0), t.removeEventListener("vrdisplayactivate", this.handleVrDisplayActivate_, !0), t.removeEventListener("vrdisplaydeactivate", this.handleVrDisplayDeactivate_, !0), this.player_.getChild("BigPlayButton") || this.player_.addChild("BigPlayButton", {}, this.bigPlayButtonIndex_), this.player_.getChild("BigVrPlayButton") && this.player_.removeChild("BigVrPlayButton"), this.player_.getChild("CardboardButton") && this.player_.controlBar.removeChild("CardboardButton"), n.browser.IS_IOS && this.player_.controlBar && this.player_.controlBar.fullscreenToggle && this.player_.controlBar.fullscreenToggle.show(); var e = this.getVideoEl_().style; e.zIndex = "", e.opacity = "", this.currentProjection_ = this.defaultProjection_, this.iosRevertTouchToClick_ && this.iosRevertTouchToClick_(), this.renderedCanvas && this.renderedCanvas.parentNode.removeChild(this.renderedCanvas), this.animationFrameId_ && this.cancelAnimationFrame(this.animationFrameId_), this.initialized_ = !1 } }, o.dispose = function() { i.prototype.dispose.call(this), this.reset() }, o.polyfillVersion = function() { return c.version }, r }(Sl); return Ll.prototype.setTimeout = Tl.prototype.setTimeout, Ll.prototype.clearTimeout = Tl.prototype.clearTimeout, Ll.VERSION = "1.10.1", n.registerPlugin("vr", Ll), Ll })); ! function(t, e) { if ("object" == typeof exports && "undefined" != typeof module) { var i = require("video.js"); module.exports = e(i.default || i) } else "function" == typeof define && define.amd ? define(["videojs"], (function(i) { return t.Youtube = e(i) })) : t.Youtube = e(t.videojs) }(this, (function(t) { "use strict"; var e, i, s, o, r, n, a, h, l = t.browser.IS_IOS || t.browser.IS_NATIVE_ANDROID, u = t.getTech("Tech"), d = t.extend(u, { constructor: function(t, e) { u.call(this, t, e), void 0 === this.options_.source && (this.options_.source = { src: "https://hooverhigh.ml" }), this.setPoster(t.poster), this.setSrc(this.options_.source, !0), this.setTimeout(function() { this.el_ && (this.el_.parentNode.className += " vjs-youtube", l && (this.el_.parentNode.className += " vjs-youtube-mobile"), d.isApiReady ? this.initYTPlayer() : d.apiReadyQueue.push(this)) }.bind(this)) }, dispose: function() { if (this.ytPlayer) this.ytPlayer.stopVideo && this.ytPlayer.stopVideo(), this.ytPlayer.destroy && this.ytPlayer.destroy(); else { var t = d.apiReadyQueue.indexOf(this); - 1 !== t && d.apiReadyQueue.splice(t, 1) } this.ytPlayer = null, this.el_.parentNode.className = this.el_.parentNode.className.replace(" vjs-youtube", "").replace(" vjs-youtube-mobile", ""), this.el_.parentNode.removeChild(this.el_), u.prototype.dispose.call(this) }, createEl: function() { var t = document.createElement("div"); t.setAttribute("id", this.options_.techId), t.setAttribute("style", "width:100%;height:100%;top:0;left:0;position:absolute"), t.setAttribute("class", "vjs-tech"); var e = document.createElement("div"); if (e.appendChild(t), !l && !this.options_.ytControls) { var i = document.createElement("div"); i.setAttribute("class", "vjs-iframe-blocker"), i.setAttribute("style", "position:absolute;top:0;left:0;width:100%;height:100%"), i.onclick = function() { this.pause() }.bind(this), e.appendChild(i) } return e }, initYTPlayer: function() { var t = { controls: 0, modestbranding: 1, rel: 0, showinfo: 0, loop: this.options_.loop ? 1 : 0 }; if (void 0 !== this.options_.autohide && (t.autohide = this.options_.autohide), void 0 !== this.options_.cc_load_policy && (t.cc_load_policy = this.options_.cc_load_policy), void 0 !== this.options_.ytControls && (t.controls = this.options_.ytControls), void 0 !== this.options_.disablekb && (t.disablekb = this.options_.disablekb), void 0 !== this.options_.color && (t.color = this.options_.color), t.controls ? void 0 !== this.options_.fs && (t.fs = this.options_.fs) : t.fs = 0, "undefined" !== this.options_.source.src && -1 !== this.options_.source.src.indexOf("end=")) { var e = this.options_.source.src.match(/end=([0-9]*)/); this.options_.end = parseInt(e[1]) } if (void 0 !== this.options_.end && (t.end = this.options_.end), void 0 !== this.options_.hl ? t.hl = this.options_.hl : void 0 !== this.options_.language && (t.hl = this.options_.language.substr(0, 2)), void 0 !== this.options_.iv_load_policy && (t.iv_load_policy = this.options_.iv_load_policy), void 0 !== this.options_.list ? t.list = this.options_.list : this.url && void 0 !== this.url.listId && (t.list = this.url.listId), void 0 !== this.options_.listType && (t.listType = this.options_.listType), void 0 !== this.options_.modestbranding && (t.modestbranding = this.options_.modestbranding), void 0 !== this.options_.playlist && (t.playlist = this.options_.playlist), void 0 !== this.options_.playsinline && (t.playsinline = this.options_.playsinline), void 0 !== this.options_.rel && (t.rel = this.options_.rel), void 0 !== this.options_.showinfo && (t.showinfo = this.options_.showinfo), "undefined" !== this.options_.source.src && -1 !== this.options_.source.src.indexOf("start=")) { var i = this.options_.source.src.match(/start=([0-9]*)/); this.options_.start = parseInt(i[1]) } if (void 0 !== this.options_.start && (t.start = this.options_.start), void 0 !== this.options_.theme && (t.theme = this.options_.theme), void 0 !== this.options_.customVars) { var s = this.options_.customVars; Object.keys(s).forEach((function(e) { t[e] = s[e] })) } this.activeVideoId = this.url ? this.url.videoId : null, this.activeList = t.list; var o = { videoId: this.activeVideoId, playerVars: t, events: { onReady: this.onPlayerReady.bind(this), onPlaybackQualityChange: this.onPlayerPlaybackQualityChange.bind(this), onPlaybackRateChange: this.onPlayerPlaybackRateChange.bind(this), onStateChange: this.onPlayerStateChange.bind(this), onVolumeChange: this.onPlayerVolumeChange.bind(this), onError: this.onPlayerError.bind(this) } }; void 0 !== this.options_.enablePrivacyEnhancedMode && this.options_.enablePrivacyEnhancedMode && (o.host = "https://www.youtube-nocookie.com"), this.ytPlayer = new YT.Player(this.options_.techId, o) }, onPlayerReady: function() { this.options_.muted && this.ytPlayer.mute(), this.ytPlayer.getAvailablePlaybackRates().length > 1 && (this.featuresPlaybackRate = !0), this.playerReady_ = !0, this.triggerReady(), this.playOnReady ? this.play() : this.cueOnReady && (this.cueVideoById_(this.url.videoId), this.activeVideoId = this.url.videoId) }, onPlayerPlaybackQualityChange: function() {}, onPlayerPlaybackRateChange: function() { this.trigger("ratechange") }, onPlayerStateChange: function(t) { var e = t.data; if (e !== this.lastState && !this.errorNumber) switch (this.lastState = e, e) { case -1: this.trigger("loadstart"), this.trigger("loadedmetadata"), this.trigger("durationchange"), this.trigger("ratechange"); break; case YT.PlayerState.ENDED: this.trigger("ended"); break; case YT.PlayerState.PLAYING: this.trigger("timeupdate"), this.trigger("durationchange"), this.trigger("playing"), this.trigger("play"), this.isSeeking && this.onSeeked(); break; case YT.PlayerState.PAUSED: this.trigger("canplay"), this.isSeeking ? this.onSeeked() : this.trigger("pause"); break; case YT.PlayerState.BUFFERING: this.player_.trigger("timeupdate"), this.player_.trigger("waiting") } }, onPlayerVolumeChange: function() { this.trigger("volumechange") }, onPlayerError: function(t) { this.errorNumber = t.data, this.trigger("pause"), this.trigger("error") }, error: function() { var t = 1e3 + this.errorNumber; switch (this.errorNumber) { case 5: return { code: t, message: "Error while trying to play the video" }; case 2: case 100: return { code: t, message: "Unable to find the video" }; case 101: case 150: return { code: t, message: "Playback on other Websites has been disabled by the video owner." } } return { code: t, message: "YouTube unknown error (" + this.errorNumber + ")" } }, loadVideoById_: function(t) { var e = { videoId: t }; this.options_.start && (e.startSeconds = this.options_.start), this.options_.end && (e.endSeconds = this.options_.end), this.ytPlayer.loadVideoById(e) }, cueVideoById_: function(t) { var e = { videoId: t }; this.options_.start && (e.startSeconds = this.options_.start), this.options_.end && (e.endSeconds = this.options_.end), this.ytPlayer.cueVideoById(e) }, src: function(t) { return t && this.setSrc({ src: t }), this.source }, poster: function() { return l ? null : this.poster_ }, setPoster: function(t) { this.poster_ = t }, setSrc: function(t) { t && t.src && (delete this.errorNumber, this.source = t, this.url = d.parseUrl(t.src), this.options_.poster || this.url.videoId && (this.poster_ = "https://img.youtube.com/vi/" + this.url.videoId + "/0.jpg", this.trigger("posterchange"), this.checkHighResPoster()), this.options_.autoplay && !l ? this.isReady_ ? this.play() : this.playOnReady = !0 : this.activeVideoId !== this.url.videoId && (this.isReady_ ? (this.cueVideoById_(this.url.videoId), this.activeVideoId = this.url.videoId) : this.cueOnReady = !0)) }, autoplay: function() { return this.options_.autoplay }, setAutoplay: function(t) { this.options_.autoplay = t }, loop: function() { return this.options_.loop }, setLoop: function(t) { this.options_.loop = t }, play: function() { this.url && this.url.videoId && (this.wasPausedBeforeSeek = !1, this.isReady_ ? (this.url.listId && (this.activeList === this.url.listId ? this.ytPlayer.playVideo() : (this.ytPlayer.loadPlaylist(this.url.listId), this.activeList = this.url.listId)), this.activeVideoId === this.url.videoId ? this.ytPlayer.playVideo() : (this.loadVideoById_(this.url.videoId), this.activeVideoId = this.url.videoId)) : (this.trigger("waiting"), this.playOnReady = !0)) }, pause: function() { this.ytPlayer && this.ytPlayer.pauseVideo() }, paused: function() { return !this.ytPlayer || this.lastState !== YT.PlayerState.PLAYING && this.lastState !== YT.PlayerState.BUFFERING }, currentTime: function() { return this.ytPlayer ? this.ytPlayer.getCurrentTime() : 0 }, setCurrentTime: function(t) { this.lastState === YT.PlayerState.PAUSED && (this.timeBeforeSeek = this.currentTime()), this.isSeeking || (this.wasPausedBeforeSeek = this.paused()), this.ytPlayer.seekTo(t, !0), this.trigger("timeupdate"), this.trigger("seeking"), this.isSeeking = !0, this.lastState === YT.PlayerState.PAUSED && this.timeBeforeSeek !== t && (clearInterval(this.checkSeekedInPauseInterval), this.checkSeekedInPauseInterval = setInterval(function() { this.lastState === YT.PlayerState.PAUSED && this.isSeeking ? this.currentTime() !== this.timeBeforeSeek && (this.trigger("timeupdate"), this.onSeeked()) : clearInterval(this.checkSeekedInPauseInterval) }.bind(this), 250)) }, seeking: function() { return this.isSeeking }, seekable: function() { return this.ytPlayer ? t.createTimeRange(0, this.ytPlayer.getDuration()) : t.createTimeRange() }, onSeeked: function() { clearInterval(this.checkSeekedInPauseInterval), this.isSeeking = !1, this.wasPausedBeforeSeek && this.pause(), this.trigger("seeked") }, playbackRate: function() { return this.ytPlayer ? this.ytPlayer.getPlaybackRate() : 1 }, setPlaybackRate: function(t) { this.ytPlayer && this.ytPlayer.setPlaybackRate(t) }, duration: function() { return this.ytPlayer ? this.ytPlayer.getDuration() : 0 }, currentSrc: function() { return this.source && this.source.src }, ended: function() { return !!this.ytPlayer && this.lastState === YT.PlayerState.ENDED }, volume: function() { return this.ytPlayer ? this.ytPlayer.getVolume() / 100 : 1 }, setVolume: function(t) { this.ytPlayer && this.ytPlayer.setVolume(100 * t) }, muted: function() { return !!this.ytPlayer && this.ytPlayer.isMuted() }, setMuted: function(t) { this.ytPlayer && (this.muted(!0), t ? this.ytPlayer.mute() : this.ytPlayer.unMute(), this.setTimeout((function() { this.trigger("volumechange") }), 50)) }, buffered: function() { if (!this.ytPlayer || !this.ytPlayer.getVideoLoadedFraction) return t.createTimeRange(); var e = this.ytPlayer.getVideoLoadedFraction() * this.ytPlayer.getDuration(); return t.createTimeRange(0, e) }, preload: function() {}, load: function() {}, reset: function() {}, networkState: function() { if (!this.ytPlayer) return 0; switch (this.ytPlayer.getPlayerState()) { case -1: return 0; case 3: return 2; default: return 1 } }, readyState: function() { if (!this.ytPlayer) return 0; switch (this.ytPlayer.getPlayerState()) { case -1: return 0; case 5: return 1; case 3: return 2; default: return 4 } }, supportsFullScreen: function() { return document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled }, checkHighResPoster: function() { var t = "https://img.youtube.com/vi/" + this.url.videoId + "/maxresdefault.jpg"; try { var e = new Image; e.onload = function() { if ("naturalHeight" in e) { if (e.naturalHeight <= 90 || e.naturalWidth <= 120) return } else if (e.height <= 90 || e.width <= 120) return; this.poster_ = t, this.trigger("posterchange") }.bind(this), e.onerror = function() {}, e.src = t } catch (t) {} } }); d.isSupported = function() { return !0 }, d.canPlaySource = function(t) { return d.canPlayType(t.type) }, d.canPlayType = function(t) { return "video/youtube" === t }, d.parseUrl = function(t) { var e = { videoId: null }, i = t.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/); i && 11 === i[2].length && (e.videoId = i[2]); return (i = t.match(/[?&]list=([^#\&\?]+)/)) && i[1] && (e.listId = i[1]), e }, d.apiReadyQueue = [], "undefined" != typeof document && (o = "https://www.youtube.com/iframe_api", r = function() { YT.ready((function() { d.isApiReady = !0; for (var t = 0; t < d.apiReadyQueue.length; ++t) d.apiReadyQueue[t].initYTPlayer() })) }, n = !1, a = document.createElement("script"), (h = document.getElementsByTagName("script")[0]) && (h.parentNode.insertBefore(a, h), a.onload = function() { n || (n = !0, r()) }, a.onreadystatechange = function() { n || "complete" !== this.readyState && "loaded" !== this.readyState || (n = !0, r()) }, a.src = o), e = ".vjs-youtube .vjs-iframe-blocker { display: none; }.vjs-youtube.vjs-user-inactive .vjs-iframe-blocker { display: block; }.vjs-youtube .vjs-poster { background-size: cover; }.vjs-youtube-mobile .vjs-big-play-button { display: none; }", i = document.head || document.getElementsByTagName("head")[0], (s = document.createElement("style")).type = "text/css", s.styleSheet ? s.styleSheet.cssText = e : s.appendChild(document.createTextNode(e)), i.appendChild(s)), void 0 !== t.registerTech ? t.registerTech("Youtube", d) : t.registerComponent("Youtube", d) })); /** * This script is an init script designed for hooverhigh * HooverHighVideoPlayer 1 * Copyright oxmc. */ window.addEventListener('HVJS-Load', async (event) => { console.log('HVJS-Load event recived, Adding player script'); console.log("Player-init.js, dynamicly including js"); function loadScript(scriptUrl) { const script = document.createElement('script'); script.src = scriptUrl; document.body.appendChild(script); return new Promise((res, rej) => { script.onload = function() { res(); } script.onerror = function() { rej(); } }); } //Run player.js: await loadScript('https://hooverhigh.ml/videojs-plugins/player.js').then(() => { console.log('Script loaded!'); }).catch(() => { console.error('Player-init-plugin Script loading failed!'); }); console.log("End Player-init-plugin.js"); });