{"version":3,"sources":["src/index.ts","src/data/constants.ts","src/icons/arrow.svg","src/icons/close.svg","src/icons/download.svg","src/icons/fullscreen-in.svg","src/icons/fullscreen-out.svg","src/icons/info.svg","src/icons/menu.svg","src/icons/zoom-in.svg","src/icons/zoom-out.svg","src/utils/index.ts","src/utils/math.ts","src/utils/browser.ts","src/utils/misc.ts","src/utils/psv.ts","src/PSVError.ts","src/utils/Animation.ts","src/utils/Dynamic.ts","src/utils/MultiDynamic.ts","src/utils/PressHandler.ts","src/utils/Slider.ts","src/events.ts","src/lib/TypedEventTarget.ts","src/adapters/AbstractAdapter.ts","src/adapters/DualFisheyeAdapter.ts","src/adapters/EquirectangularAdapter.ts","src/data/system.ts","src/components/AbstractComponent.ts","src/buttons/AbstractButton.ts","src/buttons/CustomButton.ts","src/buttons/DescriptionButton.ts","src/buttons/DownloadButton.ts","src/buttons/FullscreenButton.ts","src/buttons/MenuButton.ts","src/buttons/AbstractMoveButton.ts","src/buttons/MoveDownButton.ts","src/buttons/MoveLeftButton.ts","src/buttons/MoveRightButton.ts","src/buttons/MoveUpButton.ts","src/buttons/AbstractZoomButton.ts","src/buttons/ZoomInButton.ts","src/buttons/ZoomOutButton.ts","src/buttons/ZoomRangeButton.ts","src/data/config.ts","src/plugins/AbstractPlugin.ts","src/components/NavbarCaption.ts","src/components/Navbar.ts","src/data/cache.ts","src/components/Loader.ts","src/components/Notification.ts","src/components/Overlay.ts","src/components/Panel.ts","src/components/Tooltip.ts","src/icons/error.svg","src/services/DataHelper.ts","src/services/AbstractService.ts","src/services/EventsHandler.ts","src/icons/gesture.svg","src/icons/mousewheel.svg","src/services/Renderer.ts","src/lib/BlobLoader.ts","src/lib/ImageLoader.ts","src/services/TextureLoader.ts","src/services/ViewerDynamics.ts","src/services/ViewerState.ts","src/Viewer.ts"],"sourcesContent":["import * as CONSTANTS from './data/constants';\nimport * as utils from './utils';\nimport * as events from './events';\n\nexport type { AdapterConstructor } from './adapters/AbstractAdapter';\nexport type { DualFisheyeAdapterConfig } from './adapters/DualFisheyeAdapter';\nexport type { EquirectangularAdapterConfig } from './adapters/EquirectangularAdapter';\nexport type { ButtonConfig, ButtonConstructor } from './buttons/AbstractButton';\nexport type { Tooltip, TooltipConfig, TooltipPosition } from './components/Tooltip';\nexport type { Loader } from './components/Loader';\nexport type { Navbar } from './components/Navbar';\nexport type { Notification, NotificationConfig } from './components/Notification';\nexport type { Overlay, OverlayConfig } from './components/Overlay';\nexport type { Panel, PanelConfig } from './components/Panel';\nexport type { TypedEventTarget } from './lib/TypedEventTarget';\nexport type { PluginConstructor } from './plugins/AbstractPlugin';\nexport type { DataHelper } from './services/DataHelper';\nexport type { Renderer, CustomRenderer } from './services/Renderer';\nexport type { TextureLoader } from './services/TextureLoader';\nexport type { ViewerState } from './services/ViewerState';\n\nexport { AbstractAdapter } from './adapters/AbstractAdapter';\nexport { DualFisheyeAdapter } from './adapters/DualFisheyeAdapter';\nexport { EquirectangularAdapter } from './adapters/EquirectangularAdapter';\nexport { AbstractButton } from './buttons/AbstractButton';\nexport { AbstractComponent } from './components/AbstractComponent';\nexport { registerButton } from './components/Navbar';\nexport { Cache } from './data/cache';\nexport { DEFAULTS } from './data/config';\nexport { SYSTEM } from './data/system';\nexport { TypedEvent } from './lib/TypedEventTarget';\nexport { AbstractPlugin, AbstractConfigurablePlugin } from './plugins/AbstractPlugin';\nexport { PSVError } from './PSVError';\nexport { Viewer } from './Viewer';\nexport * from './model';\nexport { CONSTANTS, events, utils };\nexport const VERSION = PKG_VERSION;\n\n/** @internal  */\nimport './styles/index.scss';\n","import arrow from '../icons/arrow.svg';\nimport close from '../icons/close.svg';\nimport download from '../icons/download.svg';\nimport fullscreenIn from '../icons/fullscreen-in.svg';\nimport fullscreenOut from '../icons/fullscreen-out.svg';\nimport info from '../icons/info.svg';\nimport menu from '../icons/menu.svg';\nimport zoomIn from '../icons/zoom-in.svg';\nimport zoomOut from '../icons/zoom-out.svg';\n\n/**\n *  Minimum duration of the animations created with {@link Viewer#animate}\n */\nexport const ANIMATION_MIN_DURATION = 500;\n\n/**\n * Number of pixels below which a mouse move will be considered as a click\n */\nexport const MOVE_THRESHOLD = 4;\n\n/**\n * Delay in milliseconds between two clicks to consider a double click\n */\nexport const DBLCLICK_DELAY = 300;\n\n/**\n * Delay in milliseconds to emulate a long touch\n */\nexport const LONGTOUCH_DELAY = 500;\n\n/**\n * Delay in milliseconds to for the two fingers overlay to appear\n */\nexport const TWOFINGERSOVERLAY_DELAY = 100;\n\n/**\n * Duration in milliseconds of the \"ctrl zoom\" overlay\n */\nexport const CTRLZOOM_TIMEOUT = 2000;\n\n/**\n * Radius of the SphereGeometry, Half-length of the BoxGeometry\n */\nexport const SPHERE_RADIUS = 10;\n\n/**\n * Property name added to viewer element\n */\nexport const VIEWER_DATA = 'photoSphereViewer';\n\n/**\n * CSS class that must be applied on elements whose mouse events must not bubble to the viewer itself\n */\nexport const CAPTURE_EVENTS_CLASS = 'psv--capture-event';\n\n/**\n * Actions available for {@link ViewerConfig['keyboardActions']} configuration\n */\nexport enum ACTIONS {\n    ROTATE_UP = 'ROTATE_UP',\n    ROTATE_DOWN = 'ROTATE_DOWN',\n    ROTATE_RIGHT = 'ROTATE_RIGHT',\n    ROTATE_LEFT = 'ROTATE_LEFT',\n    ZOOM_IN = 'ZOOM_IN',\n    ZOOM_OUT = 'ZOOM_OUT',\n}\n\n/**\n * Internal identifiers for various stuff\n * @internal\n */\nexport const IDS = {\n    MENU: 'menu',\n    TWO_FINGERS: 'twoFingers',\n    CTRL_ZOOM: 'ctrlZoom',\n    ERROR: 'error',\n    DESCRIPTION: 'description',\n};\n\n/**\n * Subset of keyboard codes\n */\nexport const KEY_CODES = {\n    Enter: 'Enter',\n    Control: 'Control',\n    Escape: 'Escape',\n    Space: ' ',\n    PageUp: 'PageUp',\n    PageDown: 'PageDown',\n    ArrowLeft: 'ArrowLeft',\n    ArrowUp: 'ArrowUp',\n    ArrowRight: 'ArrowRight',\n    ArrowDown: 'ArrowDown',\n    Delete: 'Delete',\n    Plus: '+',\n    Minus: '-',\n};\n\n/**\n * Collection of SVG icons\n */\nexport const ICONS = {\n    arrow,\n    close,\n    download,\n    fullscreenIn,\n    fullscreenOut,\n    info,\n    menu,\n    zoomIn,\n    zoomOut,\n};\n\n/**\n * Collection of easing functions\n * @see https://gist.github.com/frederickk/6165768\n */\nexport const EASINGS: Record<string, (t: number) => number> = {\n    linear: (t: number) => t,\n\n    inQuad: (t: number) => t * t,\n    outQuad: (t: number) => t * (2 - t),\n    inOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n\n    inCubic: (t: number) => t * t * t,\n    outCubic: (t: number) => --t * t * t + 1,\n    inOutCubic: (t: number) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n\n    inQuart: (t: number) => t * t * t * t,\n    outQuart: (t: number) => 1 - --t * t * t * t,\n    inOutQuart: (t: number) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t),\n\n    inQuint: (t: number) => t * t * t * t * t,\n    outQuint: (t: number) => 1 + --t * t * t * t * t,\n    inOutQuint: (t: number) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t),\n\n    inSine: (t: number) => 1 - Math.cos(t * (Math.PI / 2)),\n    outSine: (t: number) => Math.sin(t * (Math.PI / 2)),\n    inOutSine: (t: number) => 0.5 - 0.5 * Math.cos(Math.PI * t),\n\n    inExpo: (t: number) => Math.pow(2, 10 * (t - 1)),\n    outExpo: (t: number) => 1 - Math.pow(2, -10 * t),\n    inOutExpo: (t: number) => ((t = t * 2 - 1) < 0 ? 0.5 * Math.pow(2, 10 * t) : 1 - 0.5 * Math.pow(2, -10 * t)),\n\n    inCirc: (t: number) => 1 - Math.sqrt(1 - t * t),\n    outCirc: (t: number) => Math.sqrt(1 - (t - 1) * (t - 1)),\n    inOutCirc: (t: number) => (t *= 2) < 1 ? 0.5 - 0.5 * Math.sqrt(1 - t * t) : 0.5 + 0.5 * Math.sqrt(1 - (t -= 2) * t),\n};\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"40 40 432 432\"><g transform=\"rotate(0, 256, 256)\"><path fill=\"currentColor\" d=\"M425.23 210.55H227.39a5 5 0 01-3.53-8.53l56.56-56.57a45.5 45.5 0 000-64.28 45.15 45.15 0 00-32.13-13.3 45.15 45.15 0 00-32.14 13.3L41.32 256l174.83 174.83a45.15 45.15 0 0032.14 13.3 45.15 45.15 0 0032.13-13.3 45.5 45.5 0 000-64.28l-56.57-56.57a5 5 0 013.54-8.53h197.84c25.06 0 45.45-20.39 45.45-45.45s-20.4-45.45-45.45-45.45z\"/></g><!-- Created by Flatart from the Noun Project --></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><g fill=\"currentColor\" transform=\" translate(50, 50) rotate(45)\"><rect x=\"-5\" y=\"-65\" width=\"10\" height=\"130\"/><rect x=\"-65\" y=\"-5\" width=\"130\" height=\"10\"/></g></svg>","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><path fill=\"currentColor\" d=\"M83.3 35.6h-17V3H32.2v32.6H16.6l33.6 32.7 33-32.7z\"/><path fill=\"currentColor\" d=\"M83.3 64.2v16.3H16.6V64.2H-.1v32.6H100V64.2H83.3z\"/><!--Created by Michael Zenaty from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><path fill=\"currentColor\" d=\"M100 40H87.1V18.8h-21V6H100zM100 93.2H66V80.3h21.1v-21H100zM34 93.2H0v-34h12.9v21.1h21zM12.9 40H0V6h34v12.9H12.8z\"/><!--Created by Garrett Knoll from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><path fill=\"currentColor\" d=\"M66 7h13v21h21v13H66zM66 60.3h34v12.9H79v21H66zM0 60.3h34v34H21V73.1H0zM21 7h13v34H0V28h21z\"/><!--Created by Garrett Knoll from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\"><path fill=\"currentColor\" d=\"M28.3 26.1c-1 2.6-1.9 4.8-2.6 7-2.5 7.4-5 14.7-7.2 22-1.3 4.4.5 7.2 4.3 7.8 1.3.2 2.8.2 4.2-.1 8.2-2 11.9-8.6 15.7-15.2l-2.2 2a18.8 18.8 0 0 1-7.4 5.2 2 2 0 0 1-1.6-.2c-.2-.1 0-1 0-1.4l.8-1.8L41.9 28c.5-1.4.9-3 .7-4.4-.2-2.6-3-4.4-6.3-4.4-8.8.2-15 4.5-19.5 11.8-.2.3-.2.6-.3 1.3 3.7-2.8 6.8-6.1 11.8-6.2z\"/><circle fill=\"currentColor\" cx=\"39.3\" cy=\"9.2\" r=\"8.2\"/><!--Created by Arafat Uddin from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"10 10 80 80\"><g fill=\"currentColor\"><circle r=\"10\" cx=\"20\" cy=\"20\"/><circle r=\"10\" cx=\"50\" cy=\"20\"/><circle r=\"10\" cx=\"80\" cy=\"20\"/><circle r=\"10\" cx=\"20\" cy=\"50\"/><circle r=\"10\" cx=\"50\" cy=\"50\"/><circle r=\"10\" cx=\"80\" cy=\"50\"/><circle r=\"10\" cx=\"20\" cy=\"80\"/><circle r=\"10\" cx=\"50\" cy=\"80\"/><circle r=\"10\" cx=\"80\" cy=\"80\"/></g><!-- Created by Richard Kunák from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M14.043 12.22a7.738 7.738 0 1 0-1.823 1.822l4.985 4.985c.503.504 1.32.504 1.822 0a1.285 1.285 0 0 0 0-1.822l-4.984-4.985zm-6.305 1.043a5.527 5.527 0 1 1 0-11.053 5.527 5.527 0 0 1 0 11.053z\"/><path fill=\"currentColor\" d=\"M8.728 4.009H6.744v2.737H4.006V8.73h2.738v2.736h1.984V8.73h2.737V6.746H8.728z\"/><!--Created by Ryan Canning from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M14.043 12.22a7.738 7.738 0 1 0-1.823 1.822l4.985 4.985c.503.504 1.32.504 1.822 0a1.285 1.285 0 0 0 0-1.822l-4.984-4.985zm-6.305 1.043a5.527 5.527 0 1 1 0-11.053 5.527 5.527 0 0 1 0 11.053z\"/><path fill=\"currentColor\" d=\"M4.006 6.746h7.459V8.73H4.006z\"/><!--Created by Ryan Canning from the Noun Project--></svg>\n","export * from './browser';\nexport * from './math';\nexport * from './misc';\nexport * from './psv';\n\nexport * from './Animation';\nexport * from './Dynamic';\nexport * from './MultiDynamic';\nexport * from './PressHandler';\nexport * from './Slider';\n","import { Point, Position } from '../model';\n\n/**\n * Ensures a value is within 0 and `max` by wrapping max to 0\n */\nexport function wrap(value: number, max: number): number {\n    let result = value % max;\n\n    if (result < 0) {\n        result += max;\n    }\n\n    return result;\n}\n\n/**\n * Computes the sum of an array\n */\nexport function sum(array: number[]): number {\n    return array.reduce((a, b) => a + b, 0);\n}\n\n/**\n * Computes the distance between two points\n */\nexport function distance(p1: Point, p2: Point): number {\n    return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n}\n\n/**\n * Computes the angle between two points\n */\nexport function angle(p1: Point, p2: Point): number {\n    return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n}\n\n/**\n * Compute the shortest offset between two angles on a sphere\n */\nexport function getShortestArc(from: number, to: number): number {\n    const candidates = [\n        0, // direct\n        Math.PI * 2, // clock-wise cross zero\n        -Math.PI * 2, // counter-clock-wise cross zero\n    ];\n\n    return candidates.reduce((value, candidate) => {\n        const newCandidate = to - from + candidate;\n        return Math.abs(newCandidate) < Math.abs(value) ? newCandidate : value;\n    }, Infinity);\n}\n\n/**\n * Computes the angle between the current position and a target position\n */\nexport function getAngle(position1: Position, position2: Position): number {\n    return Math.acos(\n        Math.cos(position1.pitch)\n        * Math.cos(position2.pitch)\n        * Math.cos(position1.yaw - position2.yaw)\n        + Math.sin(position1.pitch)\n        * Math.sin(position2.pitch),\n    );\n}\n\n/**\n * Returns the distance between two points on a sphere of radius one\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n */\nexport function greatArcDistance([yaw1, pitch1]: [number, number], [yaw2, pitch2]: [number, number]): number {\n    // if yaw delta is > PI, apply an offset to only consider the shortest arc\n    if (yaw1 - yaw2 > Math.PI) {\n        yaw1 -= 2 * Math.PI;\n    } else if (yaw1 - yaw2 < -Math.PI) {\n        yaw1 += 2 * Math.PI;\n    }\n    const x = (yaw2 - yaw1) * Math.cos((pitch1 + pitch2) / 2);\n    const y = pitch2 - pitch1;\n    return Math.sqrt(x * x + y * y);\n}\n","import { Point } from '../model';\nimport { angle, distance } from './math';\n\n/**\n * Get an element in the page by an unknown selector\n */\nexport function getElement(selector: string | HTMLElement): HTMLElement {\n    if (typeof selector === 'string') {\n        return selector.match(/^[a-z]/i) ? document.getElementById(selector) : document.querySelector(selector);\n    } else {\n        return selector;\n    }\n}\n\n/**\n * Toggles a CSS class\n */\nexport function toggleClass(element: Element, className: string, active?: boolean) {\n    if (active === undefined) {\n        element.classList.toggle(className);\n    } else if (active) {\n        element.classList.add(className);\n    } else if (!active) {\n        element.classList.remove(className);\n    }\n}\n\n/**\n * Adds one or several CSS classes to an element\n */\nexport function addClasses(element: Element, className: string) {\n    element.classList.add(...className.split(' ').filter(c => !!c));\n}\n\n/**\n * Removes one or several CSS classes to an element\n */\nexport function removeClasses(element: Element, className: string) {\n    element.classList.remove(...className.split(' ').filter(c => !!c));\n}\n\n/**\n * Searches if an element has a particular parent at any level including itself\n */\nexport function hasParent(el: HTMLElement, parent: Element): boolean {\n    let test: HTMLElement | null = el;\n\n    do {\n        if (test === parent) {\n            return true;\n        }\n        test = test.parentElement;\n    } while (test);\n\n    return false;\n}\n\n/**\n * Gets the closest parent matching the selector (can by itself)\n */\nexport function getClosest(el: HTMLElement, selector: string): HTMLElement | null {\n    // When el is document or window, the matches does not exist\n    if (!el?.matches) {\n        return null;\n    }\n\n    let test: HTMLElement | null = el;\n\n    do {\n        if (test.matches(selector)) {\n            return test;\n        }\n        test = test.parentElement;\n    } while (test);\n\n    return null;\n}\n\n/**\n * Returns the first element of the event' composedPath\n */\nexport function getEventTarget(e: Event): HTMLElement | null {\n    return e?.composedPath()[0] as HTMLElement || null;\n}\n\n/**\n * Returns the first element of the event's composedPath matching the selector\n */\nexport function getMatchingTarget(e: Event, selector: string): HTMLElement | null {\n    if (!e) {\n        return null;\n    }\n    return e.composedPath().find((el) => {\n        if (!(el instanceof HTMLElement) && !(el instanceof SVGElement)) {\n            return false;\n        }\n\n        return el.matches(selector);\n    }) as HTMLElement;\n}\n\n/**\n * Gets the position of an element in the viewport without reflow\n * Will gives the same result as getBoundingClientRect() as soon as there are no CSS transforms\n */\nexport function getPosition(el: HTMLElement): Point {\n    let x = 0;\n    let y = 0;\n    let test: HTMLElement | null = el;\n\n    while (test) {\n        x += test.offsetLeft - test.scrollLeft + test.clientLeft;\n        y += test.offsetTop - test.scrollTop + test.clientTop;\n        test = test.offsetParent as HTMLElement;\n    }\n\n    x -= window.scrollX;\n    y -= window.scrollY;\n\n    return { x, y };\n}\n\n/**\n * Gets an element style value\n */\nexport function getStyleProperty(elt: Element, varname: string): string {\n    return window.getComputedStyle(elt).getPropertyValue(varname);\n}\n\nexport type TouchData = {\n    distance: number;\n    angle: number;\n    center: Point;\n};\n\n/**\n * Returns data about a touch event (first 2 fingers) : distance, angle, center\n */\nexport function getTouchData(e: TouchEvent): TouchData {\n    if (e.touches.length < 2) {\n        return null;\n    }\n\n    const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n    const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY };\n\n    return {\n        distance: distance(p1, p2),\n        angle: angle(p1, p2),\n        center: { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 },\n    };\n}\n\nlet fullscreenElement: HTMLElement;\n\n/**\n * Detects if fullscreen is enabled\n */\nexport function isFullscreenEnabled(elt: HTMLElement, isIphone = false): boolean {\n    if (isIphone) {\n        return elt === fullscreenElement;\n    } else {\n        return document.fullscreenElement === elt;\n    }\n}\n\n/**\n * Enters fullscreen mode\n */\nexport function requestFullscreen(elt: HTMLElement, isIphone = false) {\n    if (isIphone) {\n        fullscreenElement = elt;\n        elt.classList.add('psv-fullscreen-emulation');\n        document.dispatchEvent(new Event('fullscreenchange'));\n    } else {\n        elt.requestFullscreen();\n    }\n}\n\n/**\n * Exits fullscreen mode\n */\nexport function exitFullscreen(isIphone = false) {\n    if (isIphone) {\n        fullscreenElement.classList.remove('psv-fullscreen-emulation');\n        fullscreenElement = null;\n        document.dispatchEvent(new Event('fullscreenchange'));\n    } else {\n        document.exitFullscreen();\n    }\n}\n","/**\n * Transforms a string to dash-case\n * @see https://github.com/shahata/dasherize\n */\nexport function dasherize(str: string): string {\n    return str.replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (s, i) => {\n        return (i > 0 ? '-' : '') + s.toLowerCase();\n    });\n}\n\n/**\n * Returns a function, that, when invoked, will only be triggered at most once during a given window of time.\n */\nexport function throttle<T extends (...args: any) => any>(callback: T, wait: number): (...args: Parameters<T>) => void {\n    let paused = false;\n    return function (this: any, ...args: Parameters<T>) {\n        if (!paused) {\n            paused = true;\n            setTimeout(() => {\n                callback.apply(this, args);\n                paused = false;\n            }, wait);\n        }\n    };\n}\n\n/**\n * Test if an object is a plain object\n * Test if an object is a plain object, i.e. is constructed by the built-in\n * Object constructor and inherits directly from Object.prototype or null.\n * @see https://github.com/lodash/lodash/blob/master/isPlainObject.js\n */\nexport function isPlainObject<T extends Record<string, any>>(value: any): value is T {\n    if (typeof value !== 'object' || value === null || Object.prototype.toString.call(value) !== '[object Object]') {\n        return false;\n    }\n    if (Object.getPrototypeOf(value) === null) {\n        return true;\n    }\n    let proto = value;\n    while (Object.getPrototypeOf(proto) !== null) {\n        proto = Object.getPrototypeOf(proto);\n    }\n    return Object.getPrototypeOf(value) === proto;\n}\n\n/**\n * Merges the enumerable attributes of two objects\n * Replaces arrays and alters the target object.\n * @copyright Nicholas Fisher <nfisher110@gmail.com>\n */\nexport function deepmerge<T>(target: T, src: T): T {\n    const first = src;\n\n    return (function merge(target: any, src: any) {\n        if (Array.isArray(src)) {\n            if (!target || !Array.isArray(target)) {\n                target = [];\n            } else {\n                target.length = 0;\n            }\n            src.forEach((e, i) => {\n                target[i] = merge(null, e);\n            });\n        } else if (typeof src === 'object') {\n            if (!target || Array.isArray(target)) {\n                target = {};\n            }\n            Object.keys(src).forEach((key) => {\n                if (typeof src[key] !== 'object' || !src[key] || !isPlainObject(src[key])) {\n                    target[key] = src[key];\n                } else if (src[key] !== first) {\n                    if (!target[key]) {\n                        target[key] = merge(null, src[key]);\n                    } else {\n                        merge(target[key], src[key]);\n                    }\n                }\n            });\n        } else {\n            target = src;\n        }\n\n        return target;\n    })(target, src);\n}\n\n/**\n * Deeply clones an object\n */\nexport function clone<T>(src: T): T {\n    return deepmerge(null as T, src);\n}\n\n/**\n * Tests of an object is empty\n */\nexport function isEmpty(obj: any): boolean {\n    return !obj || (Object.keys(obj).length === 0 && obj.constructor === Object);\n}\n\n/**\n * Returns if a valu is null or undefined\n */\nexport function isNil(val: any): val is null | undefined {\n    return val === null || val === undefined;\n}\n\n/**\n * Returns the first non null non undefined parameter\n */\nexport function firstNonNull<T>(...values: T[]): T | null {\n    for (const val of values) {\n        if (!isNil(val)) {\n            return val;\n        }\n    }\n\n    return null;\n}\n\n/**\n * Returns deep equality between objects\n * @see https://gist.github.com/egardner/efd34f270cc33db67c0246e837689cb9\n */\nexport function deepEqual(obj1: any, obj2: any): boolean {\n    if (obj1 === obj2) {\n        return true;\n    } else if (isObject(obj1) && isObject(obj2)) {\n        if (Object.keys(obj1).length !== Object.keys(obj2).length) {\n            return false;\n        }\n        for (const prop of Object.keys(obj1)) {\n            if (!deepEqual(obj1[prop], obj2[prop])) {\n                return false;\n            }\n        }\n        return true;\n    } else {\n        return false;\n    }\n}\n\nfunction isObject(obj: any): boolean {\n    return typeof obj === 'object' && obj !== null;\n}\n","import { Euler, LinearFilter, LinearMipmapLinearFilter, MathUtils, Quaternion, Texture, Vector3 } from 'three';\nimport { PSVError } from '../PSVError';\nimport { ExtendedPosition, PanoData, Point, ResolvableBoolean } from '../model';\nimport { getStyleProperty } from './browser';\nimport { wrap } from './math';\nimport { clone, firstNonNull, isPlainObject } from './misc';\n\n/**\n * Executes a callback with the value of a ResolvableBoolean\n */\nexport function resolveBoolean(value: boolean | ResolvableBoolean, cb: (val: boolean, init: boolean) => void) {\n    if (isPlainObject(value)) {\n        cb((value as ResolvableBoolean).initial, true);\n        (value as ResolvableBoolean).promise.then(res => cb(res, false));\n    } else {\n        cb(value as boolean, true);\n    }\n}\n\n/**\n * Inverts the result of a ResolvableBoolean\n */\nexport function invertResolvableBoolean(value: ResolvableBoolean): ResolvableBoolean {\n    return {\n        initial: !value.initial,\n        promise: value.promise.then(res => !res),\n    };\n}\n\n/**\n * Builds an Error with name 'AbortError'\n */\nexport function getAbortError(): Error {\n    const error = new Error('Loading was aborted.');\n    error.name = 'AbortError';\n    return error;\n}\n\n/**\n * Tests if an Error has name 'AbortError'\n */\nexport function isAbortError(err: Error): boolean {\n    return err?.name === 'AbortError';\n}\n\n/**\n * Displays a warning in the console with \"PhotoSphereViewer\" prefix\n */\nexport function logWarn(message: string) {\n    console.warn(`PhotoSphereViewer: ${message}`);\n}\n\n/**\n * Checks if an object is a ExtendedPosition, ie has textureX/textureY or yaw/pitch\n */\nexport function isExtendedPosition(object: any): object is ExtendedPosition {\n    if (!object || Array.isArray(object)) {\n        return false;\n    }\n    return [\n        ['textureX', 'textureY'],\n        ['yaw', 'pitch'],\n    ].some(([key1, key2]) => {\n        return object[key1] !== undefined && object[key2] !== undefined;\n    });\n}\n\n/**\n * Returns the value of a given attribute in the panorama metadata\n */\nexport function getXMPValue(data: string, attr: string, intVal = true): number | null {\n    // XMP data are stored in children\n    let result = data.match('<GPano:' + attr + '>(.*)</GPano:' + attr + '>');\n    if (result !== null) {\n        const val = intVal ? parseInt(result[1], 10) : parseFloat(result[1]);\n        return isNaN(val) ? null : val;\n    }\n\n    // XMP data are stored in attributes\n    result = data.match('GPano:' + attr + '=\"(.*?)\"');\n    if (result !== null) {\n        const val = intVal ? parseInt(result[1], 10) : parseFloat(result[1]);\n        return isNaN(val) ? null : val;\n    }\n\n    return null;\n}\n\nconst CSS_POSITIONS: Record<string, string> = {\n    top: '0%',\n    bottom: '100%',\n    left: '0%',\n    right: '100%',\n    center: '50%',\n};\nconst X_VALUES = ['left', 'center', 'right'];\nconst Y_VALUES = ['top', 'center', 'bottom'];\nconst POS_VALUES = [...X_VALUES, ...Y_VALUES];\nconst CENTER = 'center';\n\n/**\n * Translate CSS values like \"top center\" or \"10% 50%\" as top and left positions (0-1 range)\n * The implementation is as close as possible to the \"background-position\" specification\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/background-position}\n */\nexport function parsePoint(value: string | Point): Point {\n    if (!value) {\n        return { x: 0.5, y: 0.5 };\n    }\n\n    if (typeof value === 'object') {\n        return value;\n    }\n\n    let tokens = value.toLocaleLowerCase().split(' ').slice(0, 2);\n\n    if (tokens.length === 1) {\n        if (CSS_POSITIONS[tokens[0]]) {\n            tokens = [tokens[0], CENTER];\n        } else {\n            tokens = [tokens[0], tokens[0]];\n        }\n    }\n\n    const xFirst = tokens[1] !== 'left' && tokens[1] !== 'right' && tokens[0] !== 'top' && tokens[0] !== 'bottom';\n\n    tokens = tokens.map(token => CSS_POSITIONS[token] || token);\n\n    if (!xFirst) {\n        tokens.reverse();\n    }\n\n    const parsed = tokens.join(' ').match(/^([0-9.]+)% ([0-9.]+)%$/);\n\n    if (parsed) {\n        return {\n            x: parseFloat(parsed[1]) / 100,\n            y: parseFloat(parsed[2]) / 100,\n        };\n    } else {\n        return { x: 0.5, y: 0.5 };\n    }\n}\n\n/**\n * Parse a CSS-like position into an array of position keywords among top, bottom, left, right and center\n * @param value\n * @param [options]\n * @param [options.allowCenter=true] allow \"center center\"\n * @param [options.cssOrder=true] force CSS order (y axis then x axis)\n */\nexport function cleanCssPosition(\n    value: string | string[],\n    { allowCenter, cssOrder } = {\n        allowCenter: true,\n        cssOrder: true,\n    },\n): [string, string] | null {\n    if (!value) {\n        return null;\n    }\n\n    if (typeof value === 'string') {\n        value = value.split(' ');\n    }\n\n    if (value.length === 1) {\n        if (value[0] === CENTER) {\n            value = [CENTER, CENTER];\n        } else if (X_VALUES.indexOf(value[0]) !== -1) {\n            value = [CENTER, value[0]];\n        } else if (Y_VALUES.indexOf(value[0]) !== -1) {\n            value = [value[0], CENTER];\n        }\n    }\n\n    if (value.length !== 2 || POS_VALUES.indexOf(value[0]) === -1 || POS_VALUES.indexOf(value[1]) === -1) {\n        logWarn(`Unparsable position ${value}`);\n        return null;\n    }\n\n    if (!allowCenter && value[0] === CENTER && value[1] === CENTER) {\n        logWarn(`Invalid position center center`);\n        return null;\n    }\n\n    if (cssOrder && !cssPositionIsOrdered(value)) {\n        value = [value[1], value[0]];\n    }\n    if (value[1] === CENTER && X_VALUES.indexOf(value[0]) !== -1) {\n        value = [CENTER, value[0]];\n    }\n    if (value[0] === CENTER && Y_VALUES.indexOf(value[1]) !== -1) {\n        value = [value[1], CENTER];\n    }\n\n    return value as [string, string];\n}\n\n/**\n * Checks if an array of two positions is ordered (y axis then x axis)\n */\nexport function cssPositionIsOrdered(value: string[]): boolean {\n    return Y_VALUES.indexOf(value[0]) !== -1 && X_VALUES.indexOf(value[1]) !== -1;\n}\n\n/**\n * Parses an speed\n * @param speed in radians/degrees/revolutions per second/minute\n * @throws {@link PSVError} when the speed cannot be parsed\n */\nexport function parseSpeed(speed: string | number): number {\n    let parsed;\n\n    if (typeof speed === 'string') {\n        const speedStr = speed.toString().trim();\n\n        // Speed extraction\n        let speedValue = parseFloat(speedStr.replace(/^(-?[0-9]+(?:\\.[0-9]*)?).*$/, '$1'));\n        const speedUnit = speedStr.replace(/^-?[0-9]+(?:\\.[0-9]*)?(.*)$/, '$1').trim();\n\n        // \"per minute\" -> \"per second\"\n        if (speedUnit.match(/(pm|per minute)$/)) {\n            speedValue /= 60;\n        }\n\n        // Which unit?\n        switch (speedUnit) {\n            // Degrees per minute / second\n            case 'dpm':\n            case 'degrees per minute':\n            case 'dps':\n            case 'degrees per second':\n                parsed = MathUtils.degToRad(speedValue);\n                break;\n\n            // Radians per minute / second\n            case 'rdpm':\n            case 'radians per minute':\n            case 'rdps':\n            case 'radians per second':\n                parsed = speedValue;\n                break;\n\n            // Revolutions per minute / second\n            case 'rpm':\n            case 'revolutions per minute':\n            case 'rps':\n            case 'revolutions per second':\n                parsed = speedValue * Math.PI * 2;\n                break;\n\n            // Unknown unit\n            default:\n                throw new PSVError(`Unknown speed unit \"${speedUnit}\"`);\n        }\n    } else {\n        parsed = speed;\n    }\n\n    return parsed;\n}\n\n/**\n * Converts a speed into a duration for a specific angle to travel\n */\nexport function speedToDuration(value: string | number, angle: number): number {\n    if (typeof value !== 'number') {\n        // desired radial speed\n        const speed = parseSpeed(value);\n        // compute duration\n        return (angle / Math.abs(speed)) * 1000;\n    } else {\n        return Math.abs(value);\n    }\n}\n\n/**\n * Parses an angle value in radians or degrees and returns a normalized value in radians\n * @param angle - eg: 3.14, 3.14rad, 180deg\n * @param [zeroCenter=false] - normalize between -Pi - Pi instead of 0 - 2*Pi\n * @param [halfCircle=zeroCenter] - normalize between -Pi/2 - Pi/2 instead of -Pi - Pi\n * @throws {@link PSVError} when the angle cannot be parsed\n */\nexport function parseAngle(angle: string | number, zeroCenter = false, halfCircle = zeroCenter): number {\n    let parsed;\n\n    if (typeof angle === 'string') {\n        const match = angle\n            .toLowerCase()\n            .trim()\n            .match(/^(-?[0-9]+(?:\\.[0-9]*)?)(.*)$/);\n\n        if (!match) {\n            throw new PSVError(`Unknown angle \"${angle}\"`);\n        }\n\n        const value = parseFloat(match[1]);\n        const unit = match[2];\n\n        if (unit) {\n            switch (unit) {\n                case 'deg':\n                case 'degs':\n                    parsed = MathUtils.degToRad(value);\n                    break;\n                case 'rad':\n                case 'rads':\n                    parsed = value;\n                    break;\n                default:\n                    throw new PSVError(`Unknown angle unit \"${unit}\"`);\n            }\n        } else {\n            parsed = value;\n        }\n    } else if (typeof angle === 'number' && !isNaN(angle)) {\n        parsed = angle;\n    } else {\n        throw new PSVError(`Unknown angle \"${angle}\"`);\n    }\n\n    parsed = wrap(zeroCenter ? parsed + Math.PI : parsed, Math.PI * 2);\n\n    return zeroCenter\n        ? MathUtils.clamp(parsed - Math.PI, -Math.PI / (halfCircle ? 2 : 1), Math.PI / (halfCircle ? 2 : 1))\n        : parsed;\n}\n\n/**\n * Creates a THREE texture from an image\n */\nexport function createTexture(img: TexImageSource, mimaps = false): Texture {\n    const texture = new Texture(img);\n    texture.needsUpdate = true;\n    texture.minFilter = mimaps ? LinearMipmapLinearFilter : LinearFilter;\n    texture.generateMipmaps = mimaps;\n    texture.anisotropy = mimaps ? 2 : 1;\n    return texture;\n}\n\nconst quaternion = new Quaternion();\n\n/**\n * Applies the inverse of Euler angles to a vector\n */\nexport function applyEulerInverse(vector: Vector3, euler: Euler) {\n    quaternion.setFromEuler(euler).invert();\n    vector.applyQuaternion(quaternion);\n}\n\n/**\n * Declaration of configuration parsers, used by {@link getConfigParser}\n */\nexport type ConfigParsers<T, U extends T = T> = {\n    [key in keyof T]: (val: T[key], opts: { defValue: U[key]; rawConfig: T }) => U[key];\n};\n\n/**\n * Result of {@link getConfigParser}\n */\nexport type ConfigParser<T, U extends T> = {\n    (config: T): U;\n    defaults: Required<U>;\n    parsers: ConfigParsers<T, U>;\n};\n\n/**\n * Creates a function to validate an user configuration object\n *\n * @template T type of input config\n * @template U type of config after parsing\n *\n * @param defaults the default configuration\n * @param parsers function used to parse/validate the configuration\n *\n * @example\n * ```ts\n * type MyConfig = {\n *      value: number;\n *      label?: string;\n * };\n *\n * const getConfig<MyConfig>({\n *      value: 1,\n *      label: 'Title',\n * }, {\n *      value(value, { defValue }) {\n *          return value < 10 ? value : defValue;\n *      }\n * });\n *\n * const config = getConfig({ value: 3 });\n * ```\n */\nexport function getConfigParser<T extends Record<string, any>, U extends T = T>(\n    defaults: Required<U>,\n    parsers?: ConfigParsers<T, U>,\n): ConfigParser<T, U> {\n    const parser = function (userConfig: T): U {\n        const rawConfig: U = clone({\n            ...defaults,\n            ...userConfig,\n        });\n\n        const config: U = {} as U;\n\n        for (let [key, value] of Object.entries(rawConfig) as Array<[keyof T, any]>) {\n            if (parsers && key in parsers) {\n                value = parsers[key](value, {\n                    rawConfig: rawConfig,\n                    defValue: defaults[key],\n                });\n            } else if (!(key in defaults)) {\n                logWarn(`Unknown option ${key as string}`);\n                continue;\n            }\n\n            // @ts-ignore\n            config[key] = value;\n        }\n\n        return config;\n    } as ConfigParser<T, U>;\n\n    parser.defaults = defaults;\n    parser.parsers = parsers || ({} as any);\n\n    return parser;\n}\n\n/**\n * Checks if a stylesheet is loaded by the presence of a CSS variable\n */\nexport function checkStylesheet(element: HTMLElement, name: string) {\n    if (getStyleProperty(element, `--psv-${name}-loaded`) !== 'true') {\n        console.error(`PhotoSphereViewer: stylesheet \"@photo-sphere-viewer/${name}/index.css\" is not loaded`);\n    }\n}\n\n/**\n * Checks that a dependency version is the same as the core\n */\nexport function checkVersion(name: string, version: string, coreVersion: string) {\n    if (version && version !== coreVersion) {\n        console.error(`PhotoSphereViewer: @photo-sphere-viewer/${name} is in version ${version} but @photo-sphere-viewer/core is in version ${coreVersion}`);\n    }\n}\n\n/**\n * Checks if the viewer is not used insude a closed shadow DOM\n */\nexport function checkClosedShadowDom(el: Node) {\n    do {\n        if (el instanceof ShadowRoot && el.mode === 'closed') {\n            console.error(`PhotoSphereViewer: closed shadow DOM detected, the viewer might not work as expected`);\n            return;\n        }\n        el = el.parentNode;\n    } while (el);\n}\n\n/**\n * Merge XMP data with custom panoData, also apply default behaviour when data is missing\n */\nexport function mergePanoData(width: number, height: number, newPanoData?: PanoData, xmpPanoData?: PanoData): PanoData {\n    if (!newPanoData && !xmpPanoData) {\n        const fullWidth = Math.max(width, height * 2);\n        const fullHeight = Math.round(fullWidth / 2);\n        const croppedX = Math.round((fullWidth - width) / 2);\n        const croppedY = Math.round((fullHeight - height) / 2);\n\n        newPanoData = {\n            fullWidth: fullWidth,\n            fullHeight: fullHeight,\n            croppedWidth: width,\n            croppedHeight: height,\n            croppedX: croppedX,\n            croppedY: croppedY,\n        };\n    }\n\n    const panoData: PanoData = {\n        isEquirectangular: true,\n        fullWidth: firstNonNull(newPanoData?.fullWidth, xmpPanoData?.fullWidth),\n        fullHeight: firstNonNull(newPanoData?.fullHeight, xmpPanoData?.fullHeight),\n        croppedWidth: firstNonNull(newPanoData?.croppedWidth, xmpPanoData?.croppedWidth, width),\n        croppedHeight: firstNonNull(newPanoData?.croppedHeight, xmpPanoData?.croppedHeight, height),\n        croppedX: firstNonNull(newPanoData?.croppedX, xmpPanoData?.croppedX, 0),\n        croppedY: firstNonNull(newPanoData?.croppedY, xmpPanoData?.croppedY, 0),\n        poseHeading: firstNonNull(newPanoData?.poseHeading, xmpPanoData?.poseHeading, 0),\n        posePitch: firstNonNull(newPanoData?.posePitch, xmpPanoData?.posePitch, 0),\n        poseRoll: firstNonNull(newPanoData?.poseRoll, xmpPanoData?.poseRoll, 0),\n        initialHeading: xmpPanoData?.initialHeading,\n        initialPitch: xmpPanoData?.initialPitch,\n        initialFov: xmpPanoData?.initialFov,\n    };\n\n    if (!panoData.fullWidth && panoData.fullHeight) {\n        panoData.fullWidth = panoData.fullHeight * 2;\n    } else if (!panoData.fullWidth || !panoData.fullHeight) {\n        panoData.fullWidth = panoData.fullWidth ?? width;\n        panoData.fullHeight = panoData.fullHeight ?? height;\n    }\n\n    if (panoData.croppedWidth !== width || panoData.croppedHeight !== height) {\n        logWarn(`Invalid panoData, croppedWidth/croppedHeight is not coherent with the loaded image.\n        panoData: ${panoData.croppedWidth}x${panoData.croppedHeight}, image: ${width}x${height}`);\n    }\n\n    if (Math.abs(panoData.fullWidth - panoData.fullHeight * 2) > 1) {\n        logWarn('Invalid panoData, fullWidth should be twice fullHeight');\n        panoData.fullHeight = Math.round(panoData.fullWidth / 2);\n    }\n    if (panoData.croppedX + panoData.croppedWidth > panoData.fullWidth) {\n        logWarn('Invalid panoData, croppedX + croppedWidth > fullWidth');\n        panoData.croppedX = panoData.fullWidth - panoData.croppedWidth;\n    }\n    if (panoData.croppedY + panoData.croppedHeight > panoData.fullHeight) {\n        logWarn('Invalid panoData, croppedY + croppedHeight > fullHeight');\n        panoData.croppedY = panoData.fullHeight - panoData.croppedHeight;\n    }\n    if (panoData.croppedX < 0) {\n        logWarn('Invalid panoData, croppedX < 0');\n        panoData.croppedX = 0;\n    }\n    if (panoData.croppedY < 0) {\n        logWarn('Invalid panoData, croppedY < 0');\n        panoData.croppedY = 0;\n    }\n\n    return panoData;\n}\n","export class PSVError extends Error {\n    constructor(message: string, reason?: any) {\n        super(reason && reason instanceof Error ? `${message}: ${reason.message}` : message);\n        this.name = 'PSVError';\n        (Error as any).captureStackTrace?.(this, PSVError);\n    }\n}\n","import { EASINGS } from '../data/constants';\n\n/**\n * Options for {@link Animation}\n */\nexport type AnimationOptions<T> = {\n    /**\n     * interpolated properties\n     */\n    properties: Partial<Record<keyof T, { start: number; end: number }>>;\n    /**\n     * duration of the animation\n     */\n    duration: number;\n    /**\n     * delay before start\n     * @default 0\n     */\n    delay?: number;\n    /**\n     * interpoaltion function, see {@link CONSTANTS.EASINGS}\n     * @default 'linear'\n     */\n    easing?: string | ((t: number) => number);\n    /**\n     * function called for each frame\n     */\n    onTick: (properties: Record<keyof T, number>, progress: number) => void;\n};\n\ntype PropertyValues = AnimationOptions<any>['properties']['k'];\n\n/**\n * Interpolation helper for animations\n *\n * Implements the Promise API with an additional \"cancel\" method.\n * The promise is resolved with `true` when the animation is completed and `false` if the animation is cancelled.\n * @template T the type of interpoalted properties\n *\n * @example\n * ```ts\n * const anim = new Animation({\n *     properties: {\n *         width: {start: 100, end: 200}\n *     },\n *     duration: 5000,\n *     onTick: (properties) => element.style.width = `${properties.width}px`;\n * });\n *\n * anim.then((completed) => ...);\n *\n * anim.cancel();\n * ```\n */\nexport class Animation<T = any> implements PromiseLike<boolean> {\n    private options: AnimationOptions<T>;\n    private easing: (t: number) => number = EASINGS['linear'];\n    private callbacks: Array<(complete: boolean) => void> = [];\n    private start?: number;\n    private delayTimeout: ReturnType<typeof setTimeout>;\n    private animationFrame: ReturnType<typeof requestAnimationFrame>;\n\n    resolved = false;\n    cancelled = false;\n\n    constructor(options: AnimationOptions<T>) {\n        this.options = options;\n\n        if (options) {\n            if (options.easing) {\n                this.easing = typeof options.easing === 'function'\n                    ? options.easing\n                    : EASINGS[options.easing] || EASINGS['linear'];\n            }\n\n            this.delayTimeout = setTimeout(() => {\n                this.delayTimeout = undefined;\n                this.animationFrame = window.requestAnimationFrame(t => this.__run(t));\n            }, options.delay || 0);\n        } else {\n            this.resolved = true;\n        }\n    }\n\n    private __run(timestamp: number) {\n        if (this.cancelled) {\n            return;\n        }\n\n        // first iteration\n        if (!this.start) {\n            this.start = timestamp;\n        }\n\n        // compute progress\n        const progress = (timestamp - this.start) / this.options.duration;\n        const current = {} as Record<keyof T, number>;\n\n        if (progress < 1.0) {\n            // interpolate properties\n            for (const [name, prop] of Object.entries(this.options.properties) as Array<[string, PropertyValues]>) {\n                if (prop) {\n                    const value = prop.start + (prop.end - prop.start) * this.easing(progress);\n                    // @ts-ignore\n                    current[name] = value;\n                }\n            }\n            this.options.onTick(current, progress);\n\n            this.animationFrame = window.requestAnimationFrame(t => this.__run(t));\n        } else {\n            // call onTick one last time with final values\n            for (const [name, prop] of Object.entries(this.options.properties) as Array<[string, PropertyValues]>) {\n                if (prop) {\n                    // @ts-ignore\n                    current[name] = prop.end;\n                }\n            }\n            this.options.onTick(current, 1.0);\n\n            this.__resolve(true);\n            this.animationFrame = undefined;\n        }\n    }\n\n    private __resolve(value: boolean) {\n        if (value) {\n            this.resolved = true;\n        } else {\n            this.cancelled = true;\n        }\n        this.callbacks.forEach(cb => cb(value));\n        this.callbacks.length = 0;\n    }\n\n    /**\n     * Promise chaining\n     * @param [onFulfilled] - Called when the animation is complete (true) or cancelled (false)\n     */\n    then<U>(onFulfilled: (complete: boolean) => PromiseLike<U> | U): Promise<U> {\n        if (this.resolved || this.cancelled) {\n            return Promise.resolve(this.resolved).then(onFulfilled);\n        }\n\n        return new Promise((resolve: (complete: boolean) => void) => {\n            this.callbacks.push(resolve);\n        }).then(onFulfilled);\n    }\n\n    /**\n     * Cancels the animation\n     */\n    cancel() {\n        if (!this.cancelled && !this.resolved) {\n            this.__resolve(false);\n\n            if (this.delayTimeout) {\n                window.clearTimeout(this.delayTimeout);\n                this.delayTimeout = undefined;\n            }\n            if (this.animationFrame) {\n                window.cancelAnimationFrame(this.animationFrame);\n                this.animationFrame = undefined;\n            }\n        }\n    }\n}\n","import { MathUtils } from 'three';\nimport { PSVError } from '../PSVError';\nimport { wrap } from './math';\n\nconst enum DynamicMode {\n    STOP,\n    INFINITE,\n    POSITION,\n}\n\n/**\n * Represents a variable that can dynamically change with time (using requestAnimationFrame)\n */\nexport class Dynamic {\n    private readonly min: number;\n    private readonly max: number;\n    private readonly wrap: boolean;\n\n    private mode = DynamicMode.STOP;\n    private speed = 0;\n    private speedMult = 0;\n    private currentSpeed = 0;\n    private target = 0;\n    private __current = 0;\n\n    get current(): number {\n        return this.__current;\n    }\n\n    private set current(current: number) {\n        this.__current = current;\n    }\n\n    constructor(\n        private readonly fn: (val: number) => void,\n        config: {\n            min: number;\n            max: number;\n            defaultValue: number;\n            wrap: boolean;\n        },\n    ) {\n        this.min = config.min;\n        this.max = config.max;\n        this.wrap = config.wrap;\n        this.current = config.defaultValue;\n\n        if (this.wrap && this.min !== 0) {\n            throw new PSVError('invalid config');\n        }\n\n        if (this.fn) {\n            this.fn(this.current);\n        }\n    }\n\n    /**\n     * Changes base speed\n     */\n    setSpeed(speed: number) {\n        this.speed = speed;\n    }\n\n    /**\n     * Defines the target position\n     */\n    goto(position: number, speedMult = 1) {\n        this.mode = DynamicMode.POSITION;\n        this.target = this.wrap ? wrap(position, this.max) : MathUtils.clamp(position, this.min, this.max);\n        this.speedMult = speedMult;\n    }\n\n    /**\n     * Increases/decreases the target position\n     */\n    step(step: number, speedMult = 1) {\n        if (speedMult === 0) {\n            this.setValue(this.current + step);\n        } else {\n            if (this.mode !== DynamicMode.POSITION) {\n                this.target = this.current;\n            }\n            this.goto(this.target + step, speedMult);\n        }\n    }\n\n    /**\n     * Starts infinite movement\n     */\n    roll(invert = false, speedMult = 1) {\n        this.mode = DynamicMode.INFINITE;\n        this.target = invert ? -Infinity : Infinity;\n        this.speedMult = speedMult;\n    }\n\n    /**\n     * Stops movement\n     */\n    stop() {\n        this.mode = DynamicMode.STOP;\n    }\n\n    /**\n     * Defines the current position and immediately stops movement\n     * @param {number} value\n     */\n    setValue(value: number): boolean {\n        this.target = this.wrap ? wrap(value, this.max) : MathUtils.clamp(value, this.min, this.max);\n        this.mode = DynamicMode.STOP;\n        this.currentSpeed = 0;\n        if (this.target !== this.current) {\n            this.current = this.target;\n            if (this.fn) {\n                this.fn(this.current);\n            }\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * @internal\n     */\n    update(elapsed: number): boolean {\n        // in position mode switch to stop mode when in the decceleration window\n        if (this.mode === DynamicMode.POSITION) {\n            // in loop mode, alter \"current\" to avoid crossing the origin\n            if (this.wrap && Math.abs(this.target - this.current) > this.max / 2) {\n                this.current = this.current < this.target ? this.current + this.max : this.current - this.max;\n            }\n\n            const dstStop = (this.currentSpeed * this.currentSpeed) / (this.speed * this.speedMult * 4);\n            if (Math.abs(this.target - this.current) <= dstStop) {\n                this.mode = DynamicMode.STOP;\n            }\n        }\n\n        // compute speed\n        let targetSpeed = this.mode === DynamicMode.STOP ? 0 : this.speed * this.speedMult;\n        if (this.target < this.current) {\n            targetSpeed = -targetSpeed;\n        }\n        if (this.currentSpeed < targetSpeed) {\n            this.currentSpeed = Math.min(\n                targetSpeed,\n                this.currentSpeed + (elapsed / 1000) * this.speed * this.speedMult * 2,\n            );\n        } else if (this.currentSpeed > targetSpeed) {\n            this.currentSpeed = Math.max(\n                targetSpeed,\n                this.currentSpeed - (elapsed / 1000) * this.speed * this.speedMult * 2,\n            );\n        }\n\n        // compute new position\n        let next = null;\n        if (this.current > this.target && this.currentSpeed) {\n            next = Math.max(this.target, this.current + (this.currentSpeed * elapsed) / 1000);\n        } else if (this.current < this.target && this.currentSpeed) {\n            next = Math.min(this.target, this.current + (this.currentSpeed * elapsed) / 1000);\n        }\n\n        // apply value\n        if (next !== null) {\n            next = this.wrap ? wrap(next, this.max) : MathUtils.clamp(next, this.min, this.max);\n            if (next !== this.current) {\n                this.current = next;\n                if (this.fn) {\n                    this.fn(this.current);\n                }\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n","import { Dynamic } from './Dynamic';\n\n/**\n * Wrapper for multiple {@link Dynamic} evolving together\n */\nexport class MultiDynamic<T extends Record<string, Dynamic>> {\n    get current(): Record<keyof T, number> {\n        return Object.entries(this.dynamics).reduce(\n            (values, [name, dynamic]) => {\n                // @ts-ignore\n                values[name] = dynamic.current;\n                return values;\n            },\n            {} as Record<keyof T, number>,\n        );\n    }\n\n    constructor(\n        private readonly fn: (val: Record<keyof T, number>) => void,\n        private readonly dynamics: T,\n    ) {\n        if (this.fn) {\n            this.fn(this.current);\n        }\n    }\n\n    /**\n     * Changes base speed\n     */\n    setSpeed(speed: number) {\n        for (const d of Object.values(this.dynamics)) {\n            d.setSpeed(speed);\n        }\n    }\n\n    /**\n     * Defines the target positions\n     */\n    goto(positions: Partial<Record<keyof T, number>>, speedMult = 1) {\n        for (const [name, position] of Object.entries(positions)) {\n            this.dynamics[name].goto(position as number, speedMult);\n        }\n    }\n\n    /**\n     * Increase/decrease the target positions\n     */\n    step(steps: Partial<Record<keyof T, number>>, speedMult = 1) {\n        if (speedMult === 0) {\n            this.setValue(\n                Object.keys(steps).reduce(\n                    (values, name: keyof T) => {\n                        values[name] = steps[name] + this.dynamics[name].current;\n                        return values;\n                    },\n                    {} as typeof steps,\n                ),\n            );\n        } else {\n            for (const [name, step] of Object.entries(steps)) {\n                this.dynamics[name].step(step as number, speedMult);\n            }\n        }\n    }\n\n    /**\n     * Starts infinite movements\n     */\n    roll(rolls: Partial<Record<keyof T, boolean>>, speedMult = 1) {\n        for (const [name, roll] of Object.entries(rolls)) {\n            this.dynamics[name].roll(roll, speedMult);\n        }\n    }\n\n    /**\n     * Stops movements\n     */\n    stop() {\n        for (const d of Object.values(this.dynamics)) {\n            d.stop();\n        }\n    }\n\n    /**\n     * Defines the current positions and immediately stops movements\n     */\n    setValue(values: Partial<Record<keyof T, number>>): boolean {\n        let hasUpdates = false;\n\n        for (const [name, value] of Object.entries(values)) {\n            hasUpdates = this.dynamics[name].setValue(value as number) || hasUpdates;\n        }\n\n        if (hasUpdates && this.fn) {\n            this.fn(this.current);\n        }\n\n        return hasUpdates;\n    }\n\n    /**\n     * @internal\n     */\n    update(elapsed: number): boolean {\n        let hasUpdates = false;\n\n        for (const d of Object.values(this.dynamics)) {\n            hasUpdates = d.update(elapsed) || hasUpdates;\n        }\n\n        if (hasUpdates && this.fn) {\n            this.fn(this.current);\n        }\n\n        return hasUpdates;\n    }\n}\n","/**\n * Helper for pressable things (buttons, keyboard)\n * When the pressed thing goes up and was not pressed long enough, wait a bit more before execution\n * @internal\n */\nexport class PressHandler<TData = never> {\n    private time = 0;\n    private timeout: ReturnType<typeof setTimeout>;\n    private data: TData;\n\n    get pending() {\n        return this.time !== 0;\n    }\n\n    constructor(private readonly delay = 200) {\n        this.delay = delay;\n    }\n\n    down(data?: TData) {\n        if (this.timeout) {\n            clearTimeout(this.timeout);\n            this.timeout = undefined;\n        }\n\n        this.time = new Date().getTime();\n        this.data = data;\n    }\n\n    up(cb: (data: TData) => void) {\n        if (!this.time) {\n            return;\n        }\n\n        const elapsed = Date.now() - this.time;\n        if (elapsed < this.delay) {\n            this.timeout = setTimeout(() => {\n                cb(this.data);\n                this.timeout = undefined;\n                this.time = 0;\n                this.data = undefined;\n            }, this.delay);\n        } else {\n            cb(this.data);\n            this.time = 0;\n            this.data = undefined;\n        }\n    }\n}\n","import { MathUtils } from 'three';\n\n/**\n * Direction of a {@link Slider}\n */\nexport enum SliderDirection {\n    VERTICAL = 'VERTICAL',\n    HORIZONTAL = 'HORIZONTAL',\n}\n\n/**\n * Data transmitted to the {@link Slider} listener\n */\nexport type SliderUpdateData = {\n    /**\n     * slider progression for 0-1\n     */\n    readonly value: number;\n\n    /**\n     * the user clicked on the slider\n     */\n    readonly click: boolean;\n\n    /**\n     * the user moves the cursor above the slider, without click\n     */\n    readonly mouseover: boolean;\n\n    /**\n     * the user moves the cursor above the slider while maintaining click\n     */\n    readonly mousedown: boolean;\n\n    /**\n     * the cursor position on the page\n     */\n    readonly cursor: { clientX: number; clientY: number };\n};\n\n/**\n * Helper to make sliders elements\n */\nexport class Slider {\n    private mousedown = false;\n    private mouseover = false;\n\n    get isVertical() {\n        return this.direction === SliderDirection.VERTICAL;\n    }\n\n    get isHorizontal() {\n        return this.direction === SliderDirection.HORIZONTAL;\n    }\n\n    constructor(\n        /** main container of the sliding element */\n        private readonly container: HTMLElement,\n        /** direction of the slider */\n        private readonly direction: SliderDirection,\n        /** callback when the user interacts with the slider */\n        private readonly listener: (data: SliderUpdateData) => void,\n    ) {\n        this.container.addEventListener('click', this);\n        this.container.addEventListener('mousedown', this);\n        this.container.addEventListener('mouseenter', this);\n        this.container.addEventListener('mouseleave', this);\n        this.container.addEventListener('touchstart', this);\n        this.container.addEventListener('mousemove', this, true);\n        this.container.addEventListener('touchmove', this, true);\n        window.addEventListener('mouseup', this);\n        window.addEventListener('touchend', this);\n    }\n\n    destroy() {\n        window.removeEventListener('mouseup', this);\n        window.removeEventListener('touchend', this);\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case 'click': e.stopPropagation(); break;\n            case 'mousedown': this.__onMouseDown(e as MouseEvent); break;\n            case 'mouseenter': this.__onMouseEnter(e as MouseEvent); break;\n            case 'mouseleave': this.__onMouseLeave(e as MouseEvent); break;\n            case 'touchstart': this.__onTouchStart(e as TouchEvent); break;\n            case 'mousemove': this.__onMouseMove(e as MouseEvent); break;\n            case 'touchmove': this.__onTouchMove(e as TouchEvent); break;\n            case 'mouseup': this.__onMouseUp(e as MouseEvent); break;\n            case 'touchend': this.__onTouchEnd(e as TouchEvent); break;\n        }\n    }\n\n    private __onMouseDown(evt: MouseEvent) {\n        this.mousedown = true;\n        this.__update(evt.clientX, evt.clientY, true);\n    }\n\n    private __onMouseEnter(evt: MouseEvent) {\n        this.mouseover = true;\n        this.__update(evt.clientX, evt.clientY, true);\n    }\n\n    private __onTouchStart(evt: TouchEvent) {\n        this.mouseover = true;\n        this.mousedown = true;\n        const touch = evt.changedTouches[0];\n        this.__update(touch.clientX, touch.clientY, true);\n    }\n\n    private __onMouseMove(evt: MouseEvent) {\n        if (this.mousedown || this.mouseover) {\n            evt.stopPropagation();\n            this.__update(evt.clientX, evt.clientY, true);\n        }\n    }\n\n    private __onTouchMove(evt: TouchEvent) {\n        if (this.mousedown || this.mouseover) {\n            evt.stopPropagation();\n            const touch = evt.changedTouches[0];\n            this.__update(touch.clientX, touch.clientY, true);\n        }\n    }\n\n    private __onMouseUp(evt: MouseEvent) {\n        if (this.mousedown) {\n            this.mousedown = false;\n            this.__update(evt.clientX, evt.clientY, false);\n        }\n    }\n\n    private __onMouseLeave(evt: MouseEvent) {\n        if (this.mouseover) {\n            this.mouseover = false;\n            this.__update(evt.clientX, evt.clientY, true);\n        }\n    }\n\n    private __onTouchEnd(evt: TouchEvent) {\n        if (this.mousedown) {\n            this.mouseover = false;\n            this.mousedown = false;\n            const touch = evt.changedTouches[0];\n            this.__update(touch.clientX, touch.clientY, false);\n        }\n    }\n\n    private __update(clientX: number, clientY: number, moving: boolean) {\n        const boundingClientRect = this.container.getBoundingClientRect();\n\n        let val: number;\n        if (this.isVertical) {\n            val = MathUtils.clamp((boundingClientRect.bottom - clientY) / boundingClientRect.height, 0, 1);\n        } else {\n            val = MathUtils.clamp((clientX - boundingClientRect.left) / boundingClientRect.width, 0, 1);\n        }\n\n        this.listener({\n            value: val,\n            click: !moving,\n            mousedown: this.mousedown,\n            mouseover: this.mouseover,\n            cursor: { clientX, clientY },\n        });\n    }\n}\n","import { Mesh } from 'three';\nimport { Tooltip, TooltipConfig } from './components/Tooltip';\nimport { TypedEvent } from './lib/TypedEventTarget';\nimport { ClickData, Point, Position, Size, TextureData, ViewerConfig } from './model';\nimport type { Viewer } from './Viewer';\n\n/**\n * Base class for all events dispatched by {@link Viewer}\n */\nexport abstract class ViewerEvent extends TypedEvent<Viewer> {}\n\n/**\n * @event Triggered before an animation, can be cancelled\n */\nexport class BeforeAnimateEvent extends ViewerEvent {\n    static override readonly type = 'before-animate';\n    override type: 'before-animate';\n\n    /** @internal */\n    constructor(\n        /** target position, can be modified */\n        public position: Position | undefined,\n        /** target zoom level, can be modified */\n        public zoomLevel: number | undefined,\n    ) {\n        super(BeforeAnimateEvent.type, true);\n    }\n}\n\n/**\n * @event Triggered before a render\n */\nexport class BeforeRenderEvent extends ViewerEvent {\n    static override readonly type = 'before-render';\n    override type: 'before-render';\n\n    /** @internal */\n    constructor(\n        /** time provided by requestAnimationFrame */\n        public readonly timestamp: number,\n        /**  time elapsed since the previous frame */\n        public readonly elapsed: number,\n    ) {\n        super(BeforeRenderEvent.type);\n    }\n}\n\n/**\n * @event Triggered before a rotate operation, can be cancelled\n */\nexport class BeforeRotateEvent extends ViewerEvent {\n    static override readonly type = 'before-rotate';\n    override type: 'before-rotate';\n\n    /** @internal */\n    constructor(\n        /** target position, can be modified */\n        public position: Position,\n    ) {\n        super(BeforeRotateEvent.type, true);\n    }\n}\n\n/**\n * @event Triggered when the user clicks on the viewer (everywhere excluding the navbar and the side panel)\n */\nexport class ClickEvent extends ViewerEvent {\n    static override readonly type = 'click';\n    override type: 'click';\n\n    /** @internal */\n    constructor(public readonly data: ClickData) {\n        super(ClickEvent.type);\n    }\n}\n\n/**\n * @event Triggered when some options are changed\n */\nexport class ConfigChangedEvent extends ViewerEvent {\n    static override readonly type = 'config-changed';\n    override type: 'config-changed';\n\n    /** @internal */\n    constructor(public readonly options: Array<keyof ViewerConfig>) {\n        super(ConfigChangedEvent.type);\n    }\n\n    /**\n     * Checks if at least one of the `options` has been modified\n     */\n    containsOptions(...options: Array<keyof ViewerConfig>): boolean {\n        return options.some(option => this.options.includes(option));\n    }\n}\n\n/**\n * @event Triggered when the user double clicks on the viewer. The simple `click` event is always fired before `dblclick`.\n */\nexport class DoubleClickEvent extends ViewerEvent {\n    static override readonly type = 'dblclick';\n    override type: 'dblclick';\n\n    /** @internal */\n    constructor(public readonly data: ClickData) {\n        super(DoubleClickEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the fullscreen is enabled/disabled\n */\nexport class FullscreenEvent extends ViewerEvent {\n    static override readonly type = 'fullscreen';\n    override type: 'fullscreen';\n\n    /** @internal */\n    constructor(public readonly fullscreenEnabled: boolean) {\n        super(FullscreenEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the notification is hidden\n */\nexport class HideNotificationEvent extends ViewerEvent {\n    static override readonly type = 'hide-notification';\n    override type: 'hide-notification';\n\n    /** @internal */\n    constructor(public readonly notificationId?: string) {\n        super(HideNotificationEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the overlay is hidden\n */\nexport class HideOverlayEvent extends ViewerEvent {\n    static override readonly type = 'hide-overlay';\n    override type: 'hide-overlay';\n\n    /** @internal */\n    constructor(public readonly overlayId?: string) {\n        super(HideOverlayEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the panel is hidden\n */\nexport class HidePanelEvent extends ViewerEvent {\n    static override readonly type = 'hide-panel';\n    override type: 'hide-panel';\n\n    /** @internal */\n    constructor(public readonly panelId?: string) {\n        super(HidePanelEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a tooltip is hidden\n */\nexport class HideTooltipEvent extends ViewerEvent {\n    static override readonly type = 'hide-tooltip';\n    override type: 'hide-tooltip';\n\n    /** @internal */\n    constructor(\n        /** Userdata associated to the tooltip */\n        public readonly tooltipData: TooltipConfig['data'],\n    ) {\n        super(HideTooltipEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a key is pressed, can be cancelled\n */\nexport class KeypressEvent extends ViewerEvent {\n    static override readonly type = 'key-press';\n    override type: 'key-press';\n\n    /** @internal */\n    constructor(public readonly key: string, public readonly originalEvent: KeyboardEvent) {\n        super(KeypressEvent.type, true);\n    }\n}\n\n/**\n * @event Triggered when the loader value changes\n */\nexport class LoadProgressEvent extends ViewerEvent {\n    static override readonly type = 'load-progress';\n    override type: 'load-progress';\n\n    /** @internal */\n    constructor(public readonly progress: number) {\n        super(LoadProgressEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a panorama image starts loading\n */\nexport class PanoramaLoadEvent extends ViewerEvent {\n    static override readonly type = 'panorama-load';\n    override type: 'panorama-load';\n\n    /** @internal */\n    constructor(public readonly panorama: any) {\n        super(PanoramaLoadEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a panorama image has been loaded\n */\nexport class PanoramaLoadedEvent extends ViewerEvent {\n    static override readonly type = 'panorama-loaded';\n    override type: 'panorama-loaded';\n\n    /** @internal */\n    constructor(public readonly data: TextureData) {\n        super(PanoramaLoadedEvent.type);\n    }\n}\n\n/**\n * @event Triggered when an error occured when loading the panorama\n */\nexport class PanoramaErrorEvent extends ViewerEvent {\n    static override readonly type = 'panorama-error';\n    override type: 'panorama-error';\n\n    /** @internal */\n    constructor(\n        public readonly panorama: any,\n        public readonly error: Error,\n    ) {\n        super(PanoramaErrorEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the transition to a new panorama is done (complete or not)\n */\nexport class TransitionDoneEvent extends ViewerEvent {\n    static override readonly type = 'transition-done';\n    override type: 'transition-done';\n\n    /** @internal */\n    constructor(public readonly completed: boolean) {\n        super(TransitionDoneEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the view angles change\n */\nexport class PositionUpdatedEvent extends ViewerEvent {\n    static override readonly type = 'position-updated';\n    override type: 'position-updated';\n\n    /** @internal */\n    constructor(public readonly position: Position) {\n        super(PositionUpdatedEvent.type);\n    }\n}\n\n/**\n * @event Triggered when camera roll change\n */\nexport class RollUpdatedEvent extends ViewerEvent {\n    static override readonly type = 'roll-updated';\n    override type: 'roll-updated';\n\n    /** @internal */\n    constructor(public readonly roll: number) {\n        super(RollUpdatedEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the panorama image has been loaded and the viewer is ready to perform the first render\n */\nexport class ReadyEvent extends ViewerEvent {\n    static override readonly type = 'ready';\n    override type: 'ready';\n\n    /** @internal */\n    constructor() {\n        super(ReadyEvent.type);\n    }\n}\n\n/**\n * @event Triggered on each viewer render\n */\nexport class RenderEvent extends ViewerEvent {\n    static override readonly type = 'render';\n    override type: 'render';\n\n    /** @internal */\n    constructor() {\n        super(RenderEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the notification is shown\n */\nexport class ShowNotificationEvent extends ViewerEvent {\n    static override readonly type = 'show-notification';\n    override type: 'show-notification';\n\n    /** @internal */\n    constructor(public readonly notificationId?: string) {\n        super(ShowNotificationEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the overlay is shown\n */\nexport class ShowOverlayEvent extends ViewerEvent {\n    static override readonly type = 'show-overlay';\n    override type: 'show-overlay';\n\n    /** @internal */\n    constructor(public readonly overlayId?: string) {\n        super(ShowOverlayEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the panel is shown\n */\nexport class ShowPanelEvent extends ViewerEvent {\n    static override readonly type = 'show-panel';\n    override type: 'show-panel';\n\n    /** @internal */\n    constructor(public readonly panelId?: string) {\n        super(ShowPanelEvent.type);\n    }\n}\n\n/**\n * @event Triggered when a tooltip is shown\n */\nexport class ShowTooltipEvent extends ViewerEvent {\n    static override readonly type = 'show-tooltip';\n    override type: 'show-tooltip';\n\n    /** @internal */\n    constructor(\n        /** Instance of the tooltip */\n        public readonly tooltip: Tooltip,\n        /** Userdata associated to the tooltip */\n        public readonly tooltipData?: TooltipConfig['data'],\n    ) {\n        super(ShowTooltipEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the viewer size changes\n */\nexport class SizeUpdatedEvent extends ViewerEvent {\n    static override readonly type = 'size-updated';\n    override type: 'size-updated';\n\n    /** @internal */\n    constructor(public readonly size: Size) {\n        super(SizeUpdatedEvent.type);\n    }\n}\n\n/**\n * @event Triggered when all current animations are stopped\n */\nexport class StopAllEvent extends ViewerEvent {\n    static override readonly type = 'stop-all';\n    override type: 'stop-all';\n\n    /** @internal */\n    constructor() {\n        super(StopAllEvent.type);\n    }\n}\n\n/**\n * @event Triggered when the viewer zoom changes\n */\nexport class ZoomUpdatedEvent extends ViewerEvent {\n    static override readonly type = 'zoom-updated';\n    override type: 'zoom-updated';\n\n    /** @internal */\n    constructor(public readonly zoomLevel: number) {\n        super(ZoomUpdatedEvent.type);\n    }\n}\n\n/**\n * Base class for events on three.js objects\n *\n * Note: {@link Viewer#observeObjects} must be called for these events to be dispatched\n */\nexport abstract class ObjectEvent extends ViewerEvent {\n    /** @internal */\n    constructor(\n        type: string,\n        public readonly originalEvent: MouseEvent,\n        public readonly object: Mesh<any, any>,\n        public readonly viewerPoint: Point,\n        public readonly userDataKey: string,\n    ) {\n        super(type);\n    }\n}\n\n/**\n * @event Triggered when the cursor enters an object in the scene\n *\n * Note: {@link Viewer#observeObjects} must be called for this event to be dispatched\n */\nexport class ObjectEnterEvent extends ObjectEvent {\n    static override readonly type = 'enter-object';\n    override type: 'enter-object';\n\n    /** @internal */\n    constructor(originalEvent: MouseEvent, object: Mesh, viewerPoint: Point, userDataKey: string) {\n        super(ObjectEnterEvent.type, originalEvent, object, viewerPoint, userDataKey);\n    }\n}\n\n/**\n * @event Triggered when the cursor leaves an object in the scene\n *\n * Note: {@link Viewer#observeObjects} must be called for this event to be dispatched\n */\nexport class ObjectLeaveEvent extends ObjectEvent {\n    static override readonly type = 'leave-object';\n    override type: 'leave-object';\n\n    /** @internal */\n    constructor(originalEvent: MouseEvent, object: Mesh, viewerPoint: Point, userDataKey: string) {\n        super(ObjectLeaveEvent.type, originalEvent, object, viewerPoint, userDataKey);\n    }\n}\n\n/**\n * @event Triggered when the cursor moves over an object in the scene\n *\n * Note: {@link Viewer#observeObjects} must be called for this event to be dispatched\n */\nexport class ObjectHoverEvent extends ObjectEvent {\n    static override readonly type = 'hover-object';\n    override type: 'hover-object';\n\n    /** @internal */\n    constructor(originalEvent: MouseEvent, object: Mesh, viewerPoint: Point, userDataKey: string) {\n        super(ObjectHoverEvent.type, originalEvent, object, viewerPoint, userDataKey);\n    }\n}\n\nexport type ViewerEvents =\n    | BeforeAnimateEvent\n    | BeforeRenderEvent\n    | BeforeRotateEvent\n    | ClickEvent\n    | ConfigChangedEvent\n    | DoubleClickEvent\n    | FullscreenEvent\n    | HideNotificationEvent\n    | HideOverlayEvent\n    | HidePanelEvent\n    | HideTooltipEvent\n    | KeypressEvent\n    | LoadProgressEvent\n    | PanoramaLoadEvent\n    | PanoramaLoadedEvent\n    | PanoramaErrorEvent\n    | TransitionDoneEvent\n    | PositionUpdatedEvent\n    | RollUpdatedEvent\n    | ReadyEvent\n    | RenderEvent\n    | ShowNotificationEvent\n    | ShowOverlayEvent\n    | ShowPanelEvent\n    | ShowTooltipEvent\n    | SizeUpdatedEvent\n    | StopAllEvent\n    | ZoomUpdatedEvent\n    | ObjectEnterEvent\n    | ObjectLeaveEvent\n    | ObjectHoverEvent;\n","/**\n * Base class for events dispatched by {@link TypedEventTarget}\n * @template TTarget type of the event target\n */\nexport abstract class TypedEvent<TTarget extends TypedEventTarget<any>> extends Event {\n    static readonly type: string;\n\n    override target: TTarget;\n\n    constructor(type: string, cancelable = false) {\n        super(type, { cancelable });\n    }\n}\n\n/**\n * Decorator for EventTarget allowing to strongly type events and listeners\n * @see https://rjzaworski.com/2021/06/event-target-with-typescript\n * @template TEvents union of dispatched events\n */\nexport class TypedEventTarget<TEvents extends TypedEvent<any>> extends EventTarget {\n    override dispatchEvent(e: TEvents): boolean {\n        return super.dispatchEvent(e);\n    }\n\n    /**\n     * @template T the name of event\n     * @template E the class of the event\n     */\n    override addEventListener<T extends TEvents['type'], E extends TEvents & { type: T }>(\n        type: T,\n        callback: ((e: E) => void) | EventListenerObject | null,\n        options?: AddEventListenerOptions | boolean,\n    ) {\n        super.addEventListener(type, callback as any, options);\n    }\n\n    /**\n     * @template T the name of event\n     * @template E the class of the event\n     */\n    override removeEventListener<T extends TEvents['type'], E extends TEvents & { type: T }>(\n        type: TEvents['type'],\n        callback: ((e: E) => void) | EventListenerObject | null,\n        options?: EventListenerOptions | boolean,\n    ) {\n        super.removeEventListener(type, callback as any, options);\n    }\n}\n","import { Object3D } from 'three';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { PanoData, PanoDataProvider, PanoramaPosition, Position, TextureData } from '../model';\nimport { checkVersion } from '../utils';\n\n/**\n * Base class for adapters\n * @template TPanorama type of the panorama object\n * @template TData type of the panorama metadata\n * @template TTexture type of the loaded texture\n * @template TMesh type of the mesh\n */\nexport abstract class AbstractAdapter<TPanorama, TData, TTexture, TMesh extends Object3D> {\n    /**\n     * Unique identifier of the adapter\n     */\n    static readonly id: string;\n    /**\n     * Expected version of the core\n     * DO NOT USE on custom adapters\n     */\n    static readonly VERSION: string;\n\n    /**\n     * Indicates if the adapter supports panorama download natively\n     */\n    static readonly supportsDownload: boolean = false;\n\n    constructor(protected readonly viewer: Viewer) {}\n\n    /**\n     * Initializes the adapter\n     */\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    init(): void {}\n\n    /**\n     * Destroys the adapter\n     */\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    destroy(): void {}\n\n    /**\n     * Indicates if the adapter supports transitions between panoramas\n     */\n    // @ts-ignore unused parameter\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    supportsTransition(panorama: TPanorama): boolean {\n        return false;\n    }\n\n    /**\n     * Indicates if the adapter supports preload of a panorama\n     */\n    // @ts-ignore unused parameter\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    supportsPreload(panorama: TPanorama): boolean {\n        return false;\n    }\n\n    /**\n     * Converts pixel texture coordinates to spherical radians coordinates\n     * @throws {@link PSVError} when the current adapter does not support texture coordinates\n     */\n    // @ts-ignore unused parameter\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    textureCoordsToSphericalCoords(point: PanoramaPosition, data: TData): Position {\n        throw new PSVError('Current adapter does not support texture coordinates.');\n    }\n\n    /**\n     * Converts spherical radians coordinates to pixel texture coordinates\n     * @throws {@link PSVError} when the current adapter does not support texture coordinates\n     */\n    // @ts-ignore unused parameter\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    sphericalCoordsToTextureCoords(position: Position, data: TData): PanoramaPosition {\n        throw new PSVError('Current adapter does not support texture coordinates.');\n    }\n\n    /**\n     * Loads the panorama texture\n     */\n    abstract loadTexture(\n        panorama: TPanorama,\n        loader?: boolean,\n        newPanoData?: PanoData | PanoDataProvider,\n        useXmpPanoData?: boolean\n    ): Promise<TextureData<TTexture, TPanorama, TData>>;\n\n    /**\n     * Creates the mesh\n     */\n    abstract createMesh(panoData: TData): TMesh;\n\n    /**\n     * Applies the texture to the mesh\n     */\n    abstract setTexture(mesh: TMesh, textureData: TextureData<TTexture, TPanorama, TData>, transition: boolean): void;\n\n    /**\n     * Changes the opacity of the mesh\n     */\n    abstract setTextureOpacity(mesh: TMesh, opacity: number): void;\n\n    /**\n     * Clear a loaded texture from memory\n     */\n    abstract disposeTexture(textureData: TextureData<TTexture, TPanorama, TData>): void;\n\n    /**\n     * Cleanup a mesh from memory\n     */\n    abstract disposeMesh(mesh: TMesh): void;\n}\n\nexport type AdapterConstructor = (new (viewer: Viewer, config?: any) => AbstractAdapter<any, any, any, any>);\n\n/**\n * Returns the adapter constructor from the imported object\n * @internal\n */\nexport function adapterInterop(adapter: any): AdapterConstructor & typeof AbstractAdapter {\n    if (adapter) {\n        for (const [, p] of [['_', adapter], ...Object.entries(adapter)]) {\n            if (p.prototype instanceof AbstractAdapter) {\n                checkVersion(p.id, p.VERSION, PKG_VERSION);\n                return p;\n            }\n        }\n    }\n    return null;\n}\n","import { BufferAttribute, Mesh, MeshBasicMaterial, SphereGeometry } from 'three';\nimport { type Viewer } from '../Viewer';\nimport { SPHERE_RADIUS } from '../data/constants';\nimport { EquirectangularAdapter, EquirectangularMesh, EquirectangularTextureData } from './EquirectangularAdapter';\n\nexport type DualFisheyeAdapterConfig = {\n    /**\n     * number of faces of the sphere geometry, higher values may decrease performances\n     * @default 64\n     */\n    resolution?: number;\n};\n\n/**\n * @see https://github.com/acalcutt/Gear360_html5_viewer\n */\nexport class DualFisheyeAdapter extends EquirectangularAdapter {\n    static override readonly id: string = 'dual-fisheye';\n    static override readonly VERSION = PKG_VERSION;\n\n    constructor(viewer: Viewer, config?: DualFisheyeAdapterConfig) {\n        super(viewer, {\n            resolution: config?.resolution ?? 64,\n            useXmpData: false,\n        });\n    }\n\n    override async loadTexture(panorama: string, loader?: boolean): Promise<EquirectangularTextureData> {\n        const result = await super.loadTexture(panorama, loader, null, false);\n        result.panoData = null;\n        return result;\n    }\n\n    override createMesh(): EquirectangularMesh {\n        const geometry = new SphereGeometry(\n            SPHERE_RADIUS,\n            this.SPHERE_SEGMENTS,\n            this.SPHERE_HORIZONTAL_SEGMENTS,\n        )\n            .scale(-1, 1, 1)\n            .toNonIndexed() as SphereGeometry;\n\n        const uvs = geometry.getAttribute('uv') as BufferAttribute;\n        const normals = geometry.getAttribute('normal') as BufferAttribute;\n\n        for (let i = 0; i < uvs.count; i++) {\n            for (let j = 0; j < 3; j++) {\n                const index = i * 3 + j;\n\n                const x = normals.getX(index);\n                const y = normals.getY(index);\n                const z = normals.getZ(index);\n\n                const c = 0.947;\n                if (i < uvs.count / 6) {\n                    const correction = (x === 0 && z === 0) ? 1 : (Math.acos(y) / Math.sqrt(x * x + z * z)) * (2 / Math.PI);\n                    uvs.setXY(index,\n                        x * (c / 4) * correction + (1 / 4),\n                        z * (c / 2) * correction + (1 / 2),\n                    );\n                } else {\n                    const correction = (x === 0 && z === 0) ? 1 : (Math.acos(-y) / Math.sqrt(x * x + z * z)) * (2 / Math.PI);\n                    uvs.setXY(index,\n                        -x * (c / 4) * correction + (3 / 4),\n                        z * (c / 2) * correction + (1 / 2),\n                    );\n                }\n            }\n        }\n\n        geometry.rotateX(-Math.PI / 2);\n        geometry.rotateY(Math.PI);\n\n        const material = new MeshBasicMaterial({ depthTest: false, depthWrite: false });\n\n        return new Mesh(geometry, material);\n    }\n}\n","import { MathUtils, Mesh, MeshBasicMaterial, SphereGeometry, Texture } from 'three';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { SPHERE_RADIUS } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport { EquirectangularPanorama, PanoData, PanoDataProvider, PanoramaPosition, Position, TextureData } from '../model';\nimport { createTexture, getConfigParser, getXMPValue, isNil, mergePanoData } from '../utils';\nimport { AbstractAdapter } from './AbstractAdapter';\n\n/**\n * Configuration for {@link EquirectangularAdapter}\n */\nexport type EquirectangularAdapterConfig = {\n    /**\n     * number of faces of the sphere geometry, higher values may decrease performances\n     * @default 64\n     */\n    resolution?: number;\n    /**\n     * read real image size from XMP data\n     * @default true\n     */\n    useXmpData?: boolean;\n    /**\n     * used for equirectangular tiles adapter\n     * @internal\n     */\n    blur?: boolean;\n};\n\nexport type EquirectangularMesh = Mesh<SphereGeometry, MeshBasicMaterial>;\nexport type EquirectangularTextureData = TextureData<Texture, string | EquirectangularPanorama, PanoData>;\n\nconst getConfig = getConfigParser<EquirectangularAdapterConfig>(\n    {\n        resolution: 64,\n        useXmpData: true,\n        blur: false,\n    },\n    {\n        resolution: (resolution) => {\n            if (!resolution || !MathUtils.isPowerOfTwo(resolution)) {\n                throw new PSVError('EquirectangularAdapter resolution must be power of two.');\n            }\n            return resolution;\n        },\n    },\n);\n\n/**\n * Adapter for equirectangular panoramas\n */\nexport class EquirectangularAdapter extends AbstractAdapter<string | EquirectangularPanorama, PanoData, Texture, EquirectangularMesh> {\n    static override readonly id: string = 'equirectangular';\n    static override readonly VERSION = PKG_VERSION;\n    static override readonly supportsDownload: boolean = true;\n\n    private readonly config: EquirectangularAdapterConfig;\n\n    // @internal\n    public readonly SPHERE_SEGMENTS: number;\n    // @internal\n    public readonly SPHERE_HORIZONTAL_SEGMENTS: number;\n\n    constructor(viewer: Viewer, config?: EquirectangularAdapterConfig) {\n        super(viewer);\n\n        this.config = getConfig(config);\n\n        this.SPHERE_SEGMENTS = this.config.resolution;\n        this.SPHERE_HORIZONTAL_SEGMENTS = this.SPHERE_SEGMENTS / 2;\n    }\n\n    override supportsTransition() {\n        return true;\n    }\n\n    override supportsPreload() {\n        return true;\n    }\n\n    override textureCoordsToSphericalCoords(point: PanoramaPosition, data: PanoData): Position {\n        if (isNil(point.textureX) || isNil(point.textureY)) {\n            throw new PSVError(`Texture position is missing 'textureX' or 'textureY'`);\n        }\n\n        const relativeX = ((point.textureX + data.croppedX) / data.fullWidth) * Math.PI * 2;\n        const relativeY = ((point.textureY + data.croppedY) / data.fullHeight) * Math.PI;\n\n        return {\n            yaw: relativeX >= Math.PI ? relativeX - Math.PI : relativeX + Math.PI,\n            pitch: Math.PI / 2 - relativeY,\n        };\n    }\n\n    override sphericalCoordsToTextureCoords(position: Position, data: PanoData): PanoramaPosition {\n        const relativeLong = (position.yaw / Math.PI / 2) * data.fullWidth;\n        const relativeLat = (position.pitch / Math.PI) * data.fullHeight;\n\n        let textureX = Math.round(position.yaw < Math.PI ? relativeLong + data.fullWidth / 2 : relativeLong - data.fullWidth / 2) - data.croppedX;\n        let textureY = Math.round(data.fullHeight / 2 - relativeLat) - data.croppedY;\n\n        if (textureX < 0 || textureX > data.croppedWidth || textureY < 0 || textureY > data.croppedHeight) {\n            textureX = textureY = undefined;\n        }\n\n        return { textureX, textureY };\n    }\n\n    async loadTexture(\n        panorama: string | EquirectangularPanorama,\n        loader = true,\n        newPanoData?: PanoData | PanoDataProvider,\n        useXmpPanoData = this.config.useXmpData,\n    ): Promise<EquirectangularTextureData> {\n        if (typeof panorama !== 'string' && (typeof panorama !== 'object' || !panorama.path)) {\n            return Promise.reject(new PSVError('Invalid panorama url, are you using the right adapter?'));\n        }\n\n        let cleanPanorama: EquirectangularPanorama;\n        if (typeof panorama === 'string') {\n            cleanPanorama = {\n                path: panorama,\n                data: newPanoData,\n            };\n        } else {\n            cleanPanorama = {\n                data: newPanoData,\n                ...panorama,\n            };\n        }\n\n        const blob = await this.viewer.textureLoader.loadFile(\n            cleanPanorama.path,\n            loader ? p => this.viewer.textureLoader.dispatchProgress(p) : null,\n            cleanPanorama.path,\n        );\n        const xmpPanoData = useXmpPanoData ? await this.loadXMP(blob) : null;\n        const img = await this.viewer.textureLoader.blobToImage(blob);\n\n        if (typeof cleanPanorama.data === 'function') {\n            cleanPanorama.data = cleanPanorama.data(img, xmpPanoData);\n        }\n\n        const panoData = mergePanoData(img.width, img.height, cleanPanorama.data, xmpPanoData);\n\n        const texture = this.createEquirectangularTexture(img);\n\n        return {\n            panorama,\n            texture,\n            panoData,\n            cacheKey: cleanPanorama.path,\n        };\n    }\n\n    /**\n     * Loads the XMP data of an image\n     */\n    private async loadXMP(blob: Blob): Promise<PanoData> {\n        const binary = await this.loadBlobAsString(blob);\n\n        const a = binary.indexOf('<x:xmpmeta');\n        if (a === -1) {\n            return null;\n        }\n\n        const b = binary.indexOf('</x:xmpmeta>', a);\n        if (b === -1) {\n            return null;\n        }\n\n        const data = binary.substring(a, b);\n        if (!data.includes('GPano:')) {\n            return null;\n        }\n\n        return {\n            fullWidth: getXMPValue(data, 'FullPanoWidthPixels'),\n            fullHeight: getXMPValue(data, 'FullPanoHeightPixels'),\n            croppedWidth: getXMPValue(data, 'CroppedAreaImageWidthPixels'),\n            croppedHeight: getXMPValue(data, 'CroppedAreaImageHeightPixels'),\n            croppedX: getXMPValue(data, 'CroppedAreaLeftPixels'),\n            croppedY: getXMPValue(data, 'CroppedAreaTopPixels'),\n            poseHeading: getXMPValue(data, 'PoseHeadingDegrees', false),\n            posePitch: getXMPValue(data, 'PosePitchDegrees', false),\n            poseRoll: getXMPValue(data, 'PoseRollDegrees', false),\n            initialHeading: getXMPValue(data, 'InitialViewHeadingDegrees', false),\n            initialPitch: getXMPValue(data, 'InitialViewPitchDegrees', false),\n            initialFov: getXMPValue(data, 'InitialHorizontalFOVDegrees', false),\n        };\n    }\n\n    /**\n     * Reads a Blob as a string\n     */\n    private loadBlobAsString(blob: Blob): Promise<string> {\n        return new Promise((resolve, reject) => {\n            const reader = new FileReader();\n            reader.onload = () => resolve(reader.result as string);\n            reader.onerror = reject;\n            reader.readAsText(blob);\n        });\n    }\n\n    /**\n     * Creates the final texture from image and panorama data\n     */\n    private createEquirectangularTexture(img: HTMLImageElement): Texture {\n        if (this.config.blur || img.width > SYSTEM.maxTextureWidth) {\n            const ratio = Math.min(1, SYSTEM.maxCanvasWidth / img.width);\n\n            const buffer = new OffscreenCanvas(Math.floor(img.width * ratio), Math.floor(img.height * ratio));\n\n            const ctx = buffer.getContext('2d');\n\n            if (this.config.blur) {\n                ctx.filter = `blur(${buffer.width / 2048}px)`;\n            }\n\n            ctx.drawImage(img, 0, 0, buffer.width, buffer.height);\n\n            return createTexture(buffer);\n        }\n\n        return createTexture(img);\n    }\n\n    createMesh(panoData: PanoData): EquirectangularMesh {\n        const hStart = (panoData.croppedX / panoData.fullWidth) * 2 * Math.PI;\n        const hLength = (panoData.croppedWidth / panoData.fullWidth) * 2 * Math.PI;\n        const vStart = (panoData.croppedY / panoData.fullHeight) * Math.PI;\n        const vLength = (panoData.croppedHeight / panoData.fullHeight) * Math.PI;\n\n        // The middle of the panorama is placed at yaw=0\n        const geometry = new SphereGeometry(\n            SPHERE_RADIUS,\n            Math.round((this.SPHERE_SEGMENTS / (2 * Math.PI)) * hLength),\n            Math.round((this.SPHERE_HORIZONTAL_SEGMENTS / Math.PI) * vLength),\n            -Math.PI / 2 + hStart,\n            hLength,\n            vStart,\n            vLength,\n        ).scale(-1, 1, 1);\n\n        const material = new MeshBasicMaterial({ depthTest: false, depthWrite: false });\n\n        return new Mesh(geometry, material);\n    }\n\n    setTexture(mesh: EquirectangularMesh, textureData: EquirectangularTextureData) {\n        mesh.material.map = textureData.texture;\n    }\n\n    setTextureOpacity(mesh: EquirectangularMesh, opacity: number) {\n        mesh.material.opacity = opacity;\n        mesh.material.transparent = opacity < 1;\n    }\n\n    disposeTexture({ texture }: EquirectangularTextureData) {\n        texture.dispose();\n    }\n\n    disposeMesh(mesh: EquirectangularMesh) {\n        mesh.geometry.dispose();\n        mesh.material.dispose();\n    }\n}\n","import { ResolvableBoolean } from '../model';\nimport { PSVError } from '../PSVError';\nimport { VIEWER_DATA } from './constants';\n\nconst LOCALSTORAGE_TOUCH_SUPPORT = `${VIEWER_DATA}_touchSupport`;\n\n/**\n * General information about the system\n */\nexport const SYSTEM = {\n    /**\n     * Indicates if the system data has been loaded\n     */\n    loaded: false,\n\n    /**\n     * Device screen pixel ratio\n     */\n    pixelRatio: 1,\n\n    /**\n     * Device supports WebGL\n     */\n    isWebGLSupported: false,\n\n    /**\n     * Maximum WebGL texture width\n     */\n    maxTextureWidth: 0,\n\n    /**\n     * Device supports touch events\n     */\n    isTouchEnabled: null as ResolvableBoolean,\n\n    /**\n     * @internal\n     */\n    __maxCanvasWidth: null as number | null,\n\n    /**\n     * If the current device is an iPhone\n     */\n    isIphone: false,\n\n    /**\n     * Maximum canvas width\n     */\n    get maxCanvasWidth(): number {\n        if (this.__maxCanvasWidth === null) {\n            this.__maxCanvasWidth = getMaxCanvasWidth(this.maxTextureWidth);\n        }\n        return this.__maxCanvasWidth;\n    },\n\n    /**\n     * Loads the system if not already loaded\n     * @internal\n     */\n    load() {\n        if (!this.loaded) {\n            const ctx = getWebGLCtx();\n\n            this.pixelRatio = window.devicePixelRatio || 1;\n            this.isWebGLSupported = !!ctx;\n            this.maxTextureWidth = ctx ? ctx.getParameter(ctx.MAX_TEXTURE_SIZE) : 0;\n            this.isTouchEnabled = isTouchEnabled();\n            this.isIphone = /iPhone/i.test(navigator.userAgent);\n            this.loaded = true;\n        }\n\n        if (!SYSTEM.isWebGLSupported) {\n            throw new PSVError('WebGL 2 is not supported.');\n        }\n        if (SYSTEM.maxTextureWidth === 0) {\n            throw new PSVError('Unable to detect system capabilities');\n        }\n    },\n};\n\n/**\n * Tries to return a canvas webgl context\n */\nfunction getWebGLCtx(): WebGLRenderingContext | null {\n    try {\n        const canvas = document.createElement('canvas');\n        return canvas.getContext('webgl2');\n    } catch {\n        return null;\n    }\n}\n\n/**\n * Detects if the user is using a touch screen\n */\nfunction isTouchEnabled(): ResolvableBoolean {\n    let initial = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n    if (LOCALSTORAGE_TOUCH_SUPPORT in localStorage) {\n        initial = localStorage[LOCALSTORAGE_TOUCH_SUPPORT] === 'true';\n    }\n\n    const promise = new Promise<boolean>((resolve) => {\n        const clear = () => {\n            window.removeEventListener('mousedown', listenerMouse);\n            window.removeEventListener('touchstart', listenerTouch);\n            clearTimeout(listenerTimeoutId);\n        };\n\n        const listenerMouse = () => {\n            clear();\n            localStorage[LOCALSTORAGE_TOUCH_SUPPORT] = false;\n            resolve(false);\n        };\n\n        const listenerTouch = () => {\n            clear();\n            localStorage[LOCALSTORAGE_TOUCH_SUPPORT] = true;\n            resolve(true);\n        };\n\n        const listenerTimeout = () => {\n            clear();\n            localStorage[LOCALSTORAGE_TOUCH_SUPPORT] = initial;\n            resolve(initial);\n        };\n\n        window.addEventListener('mousedown', listenerMouse, false);\n        window.addEventListener('touchstart', listenerTouch, false);\n        const listenerTimeoutId = setTimeout(listenerTimeout, 10000);\n    });\n\n    return { initial, promise };\n}\n\n/**\n * Gets max canvas width supported by the browser.\n * We only test powers of 2 and height = width / 2 because that's what we need to generate WebGL textures\n * Adapted from https://github.com/jhildenbiddle/canvas-size\n */\nfunction getMaxCanvasWidth(maxWidth: number): number {\n    let width = maxWidth;\n    let pass = false;\n\n    // use 1x1 canvas to reduce the time for getImageData to complete\n    const cropCanvas = document.createElement('canvas');\n    const cropCtx = cropCanvas.getContext('2d');\n    cropCanvas.width = 1;\n    cropCanvas.height = 1;\n\n    while (width > 1024 && !pass) {\n        const testCanvas = document.createElement('canvas');\n        const testCtx = testCanvas.getContext('2d');\n        testCanvas.width = width;\n        testCanvas.height = width / 2;\n\n        try {\n            testCtx.fillStyle = 'white';\n            testCtx.fillRect(width - 1, width / 2 - 1, 1, 1);\n\n            cropCtx.drawImage(testCanvas, width - 1, width / 2 - 1, 1, 1, 0, 0, 1, 1);\n\n            if (cropCtx.getImageData(0, 0, 1, 1).data[0] > 0) {\n                pass = true;\n            }\n        } catch {\n            // continue\n        }\n\n        // Release canvas elements (Safari memory usage fix)\n        // https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n        testCanvas.width = 0;\n        testCanvas.height = 0;\n\n        if (!pass) {\n            width /= 2;\n        }\n    }\n\n    if (pass) {\n        return width;\n    } else {\n        throw new PSVError('Unable to detect system capabilities');\n    }\n}\n","import type { Viewer } from '../Viewer';\n\n/**\n * Base class for UI components\n */\nexport abstract class AbstractComponent {\n    /**\n     * Reference to main controller\n     */\n    protected readonly viewer: Viewer;\n\n    /**\n     * All child components\n     * @internal\n     */\n    readonly children: AbstractComponent[] = [];\n\n    /**\n     * Container element\n     */\n    readonly container: HTMLElement;\n\n    /**\n     * Internal properties\n     * @internal\n     */\n    protected readonly state = {\n        visible: true,\n    };\n\n    constructor(\n        protected readonly parent: Viewer | AbstractComponent,\n        config: { className?: string; tagName?: string },\n    ) {\n        this.viewer = parent instanceof AbstractComponent ? parent.viewer : parent;\n\n        this.container = document.createElement(config.tagName ?? 'div');\n        this.container.className = config.className || '';\n\n        this.parent.children.push(this);\n        this.parent.container.appendChild(this.container);\n    }\n\n    /**\n     * Destroys the component\n     */\n    destroy() {\n        this.parent.container.removeChild(this.container);\n\n        const childIdx = this.parent.children.indexOf(this);\n        if (childIdx !== -1) {\n            this.parent.children.splice(childIdx, 1);\n        }\n\n        this.children.slice().forEach(child => child.destroy());\n        this.children.length = 0;\n    }\n\n    /**\n     * Displays or hides the component\n     */\n    toggle(visible = !this.isVisible()) {\n        if (!visible) {\n            this.hide();\n        } else {\n            this.show();\n        }\n    }\n\n    /**\n     * Hides the component\n     */\n    // @ts-ignore unused parameter\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    hide(options?: any) {\n        this.container.style.display = 'none';\n        this.state.visible = false;\n    }\n\n    /**\n     * Displays the component\n     */\n    // @ts-ignore unused parameter\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    show(options?: any) {\n        this.container.style.display = '';\n        this.state.visible = true;\n    }\n\n    /**\n     * Checks if the component is visible\n     */\n    isVisible(): boolean {\n        return this.state.visible;\n    }\n}\n","import { AbstractComponent } from '../components/AbstractComponent';\nimport type { Navbar } from '../components/Navbar';\nimport { KEY_CODES } from '../data/constants';\nimport { ResolvableBoolean } from '../model';\nimport { addClasses, getConfigParser, resolveBoolean, toggleClass } from '../utils';\n\n/**\n * Configuration for {@link AbstractButton}\n */\nexport type ButtonConfig = {\n    id?: string;\n    tagName?: string;\n    className?: string;\n    title?: string;\n    /**\n     * if the button has an mouse hover effect\n     * @default false\n     */\n    hoverScale?: boolean;\n    /**\n     * if the button can be moved to menu when the navbar is too small\n     * @default false\n     */\n    collapsable?: boolean;\n    /**\n     * if the button is accessible with the keyboard\n     * @default true\n     */\n    tabbable?: boolean;\n    /**\n     * icon of the button\n     */\n    icon?: string;\n    /**\n     * override icon when the button is active\n     */\n    iconActive?: string;\n};\n\nconst getConfig = getConfigParser<ButtonConfig>({\n    id: null,\n    tagName: null,\n    className: null,\n    title: null,\n    hoverScale: false,\n    collapsable: false,\n    tabbable: true,\n    icon: null,\n    iconActive: null,\n});\n\n/**\n * Base class for navbar buttons\n */\nexport abstract class AbstractButton extends AbstractComponent {\n    /**\n     * Unique identifier of the button\n     */\n    static readonly id: string;\n\n    /**\n     * Identifier to declare a group of buttons\n     */\n    static readonly groupId?: string;\n\n    /**\n     * Internal properties\n     */\n    protected override readonly state = {\n        visible: true,\n        enabled: true,\n        supported: true,\n        collapsed: false,\n        active: false,\n        width: 0,\n    };\n\n    protected readonly config: ButtonConfig;\n\n    get id(): string {\n        return this.config.id;\n    }\n\n    get title(): string {\n        return this.container.title;\n    }\n\n    get content(): string {\n        return this.container.innerHTML;\n    }\n\n    get width(): number {\n        return this.state.width;\n    }\n\n    get collapsable(): boolean {\n        return this.config.collapsable;\n    }\n\n    constructor(navbar: Navbar, config: ButtonConfig) {\n        super(navbar, {\n            tagName: config.tagName,\n            className: `psv-button ${config.hoverScale ? 'psv-button--hover-scale' : ''} ${config.className || ''}`,\n        });\n\n        this.config = getConfig(config);\n        if (!config.id) {\n            this.config.id = (this.constructor as typeof AbstractButton).id;\n        }\n\n        if (config.icon) {\n            this.__setIcon(config.icon);\n        }\n\n        this.state.width = this.container.offsetWidth;\n\n        if (this.config.title) {\n            this.container.title = this.viewer.config.lang[this.config.title] ?? this.config.title;\n        } else if (this.id && this.id in this.viewer.config.lang) {\n            this.container.title = (this.viewer.config.lang as any)[this.id];\n        }\n\n        if (config.tabbable) {\n            this.container.tabIndex = 0;\n        }\n\n        this.container.addEventListener('click', (e) => {\n            if (this.state.enabled) {\n                this.onClick();\n            }\n            e.stopPropagation();\n        });\n\n        this.container.addEventListener('keydown', (e) => {\n            if (e.key === KEY_CODES.Enter && this.state.enabled) {\n                this.onClick();\n                e.stopPropagation();\n            }\n        });\n    }\n\n    /**\n     * Action when the button is clicked\n     */\n    abstract onClick(): void;\n\n    override show(refresh = true) {\n        if (!this.isVisible()) {\n            this.state.visible = true;\n            if (!this.state.collapsed) {\n                this.container.style.display = '';\n            }\n            if (refresh) {\n                this.viewer.navbar.autoSize();\n            }\n        }\n    }\n\n    override hide(refresh = true) {\n        if (this.isVisible()) {\n            this.state.visible = false;\n            this.container.style.display = 'none';\n            if (refresh) {\n                this.viewer.navbar.autoSize();\n            }\n        }\n    }\n\n    /**\n     * Hides/shows the button depending of the result of {@link isSupported}\n     * @internal\n     */\n    checkSupported() {\n        resolveBoolean(this.isSupported(), (supported, init) => {\n            if (!this.state) {\n                return; // the component has been destroyed\n            }\n            this.state.supported = supported;\n            if (!init) {\n                this.toggle(supported);\n            } else if (!supported) {\n                this.hide();\n            }\n        });\n    }\n\n    /**\n     * Perform action when the navbar size/content changes\n     * @internal\n     */\n    autoSize() {\n        // nothing\n    }\n\n    /**\n     * Checks if the button can be displayed\n     */\n    isSupported(): boolean | ResolvableBoolean {\n        return true;\n    }\n\n    /**\n     * Changes the active state of the button\n     */\n    toggleActive(active = !this.state.active) {\n        if (active !== this.state.active) {\n            this.state.active = active;\n            toggleClass(this.container, 'psv-button--active', this.state.active);\n\n            if (this.config.iconActive) {\n                this.__setIcon(this.state.active ? this.config.iconActive : this.config.icon);\n            }\n        }\n    }\n\n    /**\n     * Disables the button\n     */\n    disable() {\n        this.container.classList.add('psv-button--disabled');\n        this.state.enabled = false;\n    }\n\n    /**\n     * Enables the button\n     */\n    enable() {\n        this.container.classList.remove('psv-button--disabled');\n        this.state.enabled = true;\n    }\n\n    /**\n     * Collapses the button in the navbar menu\n     */\n    collapse() {\n        this.state.collapsed = true;\n        this.container.style.display = 'none';\n    }\n\n    /**\n     * Uncollapses the button from the navbar menu\n     */\n    uncollapse() {\n        this.state.collapsed = false;\n        if (this.state.visible) {\n            this.container.style.display = '';\n        }\n    }\n\n    private __setIcon(icon: string) {\n        this.container.innerHTML = icon;\n        addClasses(this.container.querySelector('svg'), 'psv-button-svg');\n    }\n}\n\nexport type ButtonConstructor = (new (navbar: Navbar) => AbstractButton) & typeof AbstractButton;\n","import type { Navbar } from '../components/Navbar';\nimport { NavbarCustomButton } from '../model';\nimport { AbstractButton } from './AbstractButton';\n\nexport class CustomButton extends AbstractButton {\n    private readonly customOnClick: NavbarCustomButton['onClick'];\n\n    constructor(navbar: Navbar, config: NavbarCustomButton) {\n        super(navbar, {\n            id: config.id ?? `psvButton-${Math.random().toString(36).substring(2)}`,\n            className: `psv-custom-button ${config.className || ''}`,\n            hoverScale: false,\n            collapsable: config.collapsable !== false,\n            tabbable: config.tabbable !== false,\n            title: config.title,\n        });\n\n        this.customOnClick = config.onClick;\n\n        if (config.content) {\n            if (typeof config.content === 'string') {\n                this.container.innerHTML = config.content;\n            } else {\n                this.container.classList.add('psv-custom-button--no-padding');\n                config.content.style.height = '100%';\n                config.content.attachViewer?.(this.viewer);\n                this.container.appendChild(config.content);\n            }\n        }\n\n        this.state.width = this.container.offsetWidth;\n\n        if (config.disabled) {\n            this.disable();\n        }\n\n        if (config.visible === false) {\n            this.hide();\n        }\n    }\n\n    onClick() {\n        this.customOnClick?.(this.viewer);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS, IDS } from '../data/constants';\nimport {\n    ConfigChangedEvent,\n    HideNotificationEvent,\n    HidePanelEvent,\n    ShowNotificationEvent,\n    ShowPanelEvent,\n} from '../events';\nimport { AbstractButton } from './AbstractButton';\n\nconst enum DescriptionButtonMode {\n    NONE,\n    NOTIF,\n    PANEL,\n}\n\nexport class DescriptionButton extends AbstractButton {\n    static override readonly id = 'description';\n\n    private mode = DescriptionButtonMode.NONE;\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: 'psv-description-button',\n            hoverScale: true,\n            collapsable: false,\n            tabbable: true,\n            icon: ICONS.info,\n        });\n\n        this.viewer.addEventListener(HideNotificationEvent.type, this);\n        this.viewer.addEventListener(ShowNotificationEvent.type, this);\n        this.viewer.addEventListener(HidePanelEvent.type, this);\n        this.viewer.addEventListener(ShowPanelEvent.type, this);\n        this.viewer.addEventListener(ConfigChangedEvent.type, this);\n    }\n\n    override destroy() {\n        this.viewer.removeEventListener(HideNotificationEvent.type, this);\n        this.viewer.removeEventListener(ShowNotificationEvent.type, this);\n        this.viewer.removeEventListener(HidePanelEvent.type, this);\n        this.viewer.removeEventListener(ShowPanelEvent.type, this);\n        this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof ConfigChangedEvent) {\n            e.containsOptions('description') && this.autoSize(true);\n            return;\n        }\n\n        if (!this.mode) {\n            return;\n        }\n\n        let closed = false;\n        if (e instanceof HideNotificationEvent) {\n            closed = this.mode === DescriptionButtonMode.NOTIF;\n        } else if (e instanceof ShowNotificationEvent) {\n            closed = this.mode === DescriptionButtonMode.NOTIF && e.notificationId !== IDS.DESCRIPTION;\n        } else if (e instanceof HidePanelEvent) {\n            closed = this.mode === DescriptionButtonMode.PANEL;\n        } else if (e instanceof ShowPanelEvent) {\n            closed = this.mode === DescriptionButtonMode.PANEL && e.panelId !== IDS.DESCRIPTION;\n        }\n\n        if (closed) {\n            this.toggleActive(false);\n            this.mode = DescriptionButtonMode.NONE;\n        }\n    }\n\n    onClick() {\n        if (this.mode) {\n            this.__close();\n        } else {\n            this.__open();\n        }\n    }\n\n    override hide(refresh?: boolean) {\n        super.hide(refresh);\n\n        if (this.mode) {\n            this.__close();\n        }\n    }\n\n    /**\n     * This button can only be refreshed from NavbarCaption\n     * @internal\n     */\n    override autoSize(refresh = false) {\n        if (refresh) {\n            const caption = this.viewer.navbar.getButton('caption', false);\n            const captionHidden = caption && !caption.isVisible();\n            const hasDescription = !!this.viewer.config.description;\n\n            if (captionHidden || hasDescription) {\n                this.show(false);\n            } else {\n                this.hide(false);\n            }\n        }\n    }\n\n    private __close() {\n        switch (this.mode) {\n            case DescriptionButtonMode.NOTIF:\n                this.viewer.notification.hide(IDS.DESCRIPTION);\n                break;\n            case DescriptionButtonMode.PANEL:\n                this.viewer.panel.hide(IDS.DESCRIPTION);\n                break;\n            default:\n        }\n    }\n\n    private __open() {\n        this.toggleActive(true);\n\n        if (this.viewer.config.description) {\n            this.mode = DescriptionButtonMode.PANEL;\n            this.viewer.panel.show({\n                id: IDS.DESCRIPTION,\n                content: `${this.viewer.config.caption ? `<p>${this.viewer.config.caption}</p>` : ''}${this.viewer.config.description}`,\n            });\n        } else {\n            this.mode = DescriptionButtonMode.NOTIF;\n            this.viewer.notification.show({\n                id: IDS.DESCRIPTION,\n                content: this.viewer.config.caption,\n            });\n        }\n    }\n}\n","import { AbstractAdapter } from '../adapters/AbstractAdapter';\nimport type { Navbar } from '../components/Navbar';\nimport { ICONS } from '../data/constants';\nimport { ConfigChangedEvent, PanoramaLoadedEvent } from '../events';\nimport { AbstractButton } from './AbstractButton';\n\nexport class DownloadButton extends AbstractButton {\n    static override readonly id = 'download';\n\n    readonly link: HTMLAnchorElement;\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            tagName: 'a',\n            className: 'psv-download-button',\n            hoverScale: true,\n            collapsable: true,\n            tabbable: true,\n            icon: ICONS.download,\n        });\n\n        this.viewer.addEventListener(ConfigChangedEvent.type, this);\n        this.viewer.addEventListener(PanoramaLoadedEvent.type, this);\n    }\n\n    override destroy(): void {\n        this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n        this.viewer.removeEventListener(PanoramaLoadedEvent.type, this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof ConfigChangedEvent) {\n            e.containsOptions('downloadUrl') && this.checkSupported();\n            e.containsOptions('downloadUrl', 'downloadName') && this.__update();\n        } else if (e instanceof PanoramaLoadedEvent) {\n            this.__update();\n        }\n    }\n\n    onClick() {\n        // nothing\n    }\n\n    override checkSupported() {\n        const adapter = this.viewer.adapter.constructor as typeof AbstractAdapter;\n        const supported = adapter.supportsDownload || this.viewer.config.downloadUrl;\n        if (supported) {\n            this.show();\n        } else {\n            this.hide();\n        }\n    }\n\n    private __update() {\n        const link = this.container as HTMLAnchorElement;\n        link.href = this.viewer.config.downloadUrl || this.viewer.config.panorama;\n        link.target = '_blank';\n        if (link.href.startsWith('data:') && !this.viewer.config.downloadName) {\n            link.download = 'panorama.' + link.href.substring(0, link.href.indexOf(';')).split('/').pop();\n        } else {\n            link.download = this.viewer.config.downloadName || link.href.split('/').pop();\n        }\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { FullscreenEvent } from '../events';\nimport { AbstractButton } from './AbstractButton';\nimport { ICONS } from '../data/constants';\n\nexport class FullscreenButton extends AbstractButton {\n    static override readonly id = 'fullscreen';\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: 'psv-fullscreen-button',\n            hoverScale: true,\n            collapsable: false,\n            tabbable: true,\n            icon: ICONS.fullscreenIn,\n            iconActive: ICONS.fullscreenOut,\n        });\n\n        this.viewer.addEventListener(FullscreenEvent.type, this);\n    }\n\n    override destroy() {\n        this.viewer.removeEventListener(FullscreenEvent.type, this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof FullscreenEvent) {\n            this.toggleActive(e.fullscreenEnabled);\n        }\n    }\n\n    onClick() {\n        this.viewer.toggleFullscreen();\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS, IDS } from '../data/constants';\nimport { HidePanelEvent, ShowPanelEvent } from '../events';\nimport { getClosest } from '../utils';\nimport { AbstractButton } from './AbstractButton';\n\nconst BUTTON_DATA = 'psvButton';\n\nconst MENU_TEMPLATE = (buttons: AbstractButton[], title: string) => `\n<div class=\"psv-panel-menu psv-panel-menu--stripped\">\n  <h1 class=\"psv-panel-menu-title\">${ICONS.menu} ${title}</h1>\n  <ul class=\"psv-panel-menu-list\">\n    ${buttons\n        .map(\n            button => `\n    <li data-psv-button=\"${button.id}\" class=\"psv-panel-menu-item\" tabindex=\"0\">\n      <span class=\"psv-panel-menu-item-icon\">${button.content}</span>\n      <span class=\"psv-panel-menu-item-label\">${button.title}</span>\n    </li>\n    `,\n        )\n        .join('')}\n  </ul>\n</div>\n`;\n\nexport class MenuButton extends AbstractButton {\n    static override readonly id = 'menu';\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: 'psv-menu-button',\n            hoverScale: true,\n            collapsable: false,\n            tabbable: true,\n            icon: ICONS.menu,\n        });\n\n        this.viewer.addEventListener(ShowPanelEvent.type, this);\n        this.viewer.addEventListener(HidePanelEvent.type, this);\n\n        super.hide();\n    }\n\n    override destroy() {\n        this.viewer.removeEventListener(ShowPanelEvent.type, this);\n        this.viewer.removeEventListener(HidePanelEvent.type, this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof ShowPanelEvent) {\n            this.toggleActive(e.panelId === IDS.MENU);\n        } else if (e instanceof HidePanelEvent) {\n            this.toggleActive(false);\n        }\n    }\n\n    onClick() {\n        if (this.state.active) {\n            this.__hideMenu();\n        } else {\n            this.__showMenu();\n        }\n    }\n\n    override hide(refresh?: boolean) {\n        super.hide(refresh);\n        this.__hideMenu();\n    }\n\n    override show(refresh?: boolean) {\n        super.show(refresh);\n\n        if (this.state.active) {\n            this.__showMenu();\n        }\n    }\n\n    private __showMenu() {\n        this.viewer.panel.show({\n            id: IDS.MENU,\n            content: MENU_TEMPLATE(this.viewer.navbar.collapsed, this.viewer.config.lang.menu),\n            noMargin: true,\n            clickHandler: (target) => {\n                const li = target ? getClosest(target as HTMLElement, '.psv-panel-menu-item') : undefined;\n                const buttonId = li ? li.dataset[BUTTON_DATA] : undefined;\n\n                if (buttonId) {\n                    this.viewer.navbar.getButton(buttonId).onClick();\n                    this.__hideMenu();\n                }\n            },\n        });\n    }\n\n    private __hideMenu() {\n        this.viewer.panel.hide(IDS.MENU);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS, KEY_CODES } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport { invertResolvableBoolean } from '../utils';\nimport { PressHandler } from '../utils/PressHandler';\nimport { AbstractButton } from './AbstractButton';\n\nexport const enum MoveButtonDirection {\n    UP,\n    DOWN,\n    LEFT,\n    RIGHT,\n}\n\nfunction getIcon(value: MoveButtonDirection): string {\n    let angle = 0;\n    switch (value) {\n        case MoveButtonDirection.UP: angle = 90; break;\n        case MoveButtonDirection.DOWN: angle = -90; break;\n        case MoveButtonDirection.RIGHT: angle = 180; break;\n        default: angle = 0; break;\n    }\n\n    return ICONS.arrow.replace('rotate(0', `rotate(${angle}`);\n}\n\nexport abstract class AbstractMoveButton extends AbstractButton {\n    static override readonly groupId = 'move';\n\n    private readonly handler = new PressHandler();\n\n    constructor(\n        navbar: Navbar,\n        private direction: MoveButtonDirection,\n    ) {\n        super(navbar, {\n            className: 'psv-move-button',\n            hoverScale: true,\n            collapsable: false,\n            tabbable: true,\n            icon: getIcon(direction),\n        });\n\n        this.container.addEventListener('mousedown', this);\n        this.container.addEventListener('keydown', this);\n        this.container.addEventListener('keyup', this);\n        this.viewer.container.addEventListener('mouseup', this);\n        this.viewer.container.addEventListener('touchend', this);\n    }\n\n    override destroy() {\n        this.__onMouseUp();\n\n        this.viewer.container.removeEventListener('mouseup', this);\n        this.viewer.container.removeEventListener('touchend', this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case 'mousedown': this.__onMouseDown(); break;\n            case 'mouseup': this.__onMouseUp(); break;\n            case 'touchend': this.__onMouseUp(); break;\n            case 'keydown': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseDown(); break;\n            case 'keyup': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseUp(); break;\n        }\n    }\n\n    onClick() {\n        // nothing\n    }\n\n    override isSupported() {\n        return invertResolvableBoolean(SYSTEM.isTouchEnabled);\n    }\n\n    private __onMouseDown() {\n        if (!this.state.enabled) {\n            return;\n        }\n\n        const dynamicRoll: {\n            yaw?: boolean;\n            pitch?: boolean;\n        } = {};\n        switch (this.direction) {\n            case MoveButtonDirection.UP: dynamicRoll.pitch = false; break;\n            case MoveButtonDirection.DOWN: dynamicRoll.pitch = true; break;\n            case MoveButtonDirection.RIGHT: dynamicRoll.yaw = false; break;\n            default: dynamicRoll.yaw = true; break;\n        }\n\n        this.viewer.stopAll();\n        this.viewer.dynamics.position.roll(dynamicRoll);\n        this.handler.down();\n    }\n\n    private __onMouseUp() {\n        if (!this.state.enabled) {\n            return;\n        }\n\n        this.handler.up(() => {\n            this.viewer.dynamics.position.stop();\n            this.viewer.resetIdleTimer();\n        });\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveDownButton extends AbstractMoveButton {\n    static override readonly id = 'moveDown';\n\n    constructor(navbar: Navbar) {\n        super(navbar, MoveButtonDirection.DOWN);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveLeftButton extends AbstractMoveButton {\n    static override readonly id = 'moveLeft';\n\n    constructor(navbar: Navbar) {\n        super(navbar, MoveButtonDirection.LEFT);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveRightButton extends AbstractMoveButton {\n    static override readonly id = 'moveRight';\n\n    constructor(navbar: Navbar) {\n        super(navbar, MoveButtonDirection.RIGHT);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveUpButton extends AbstractMoveButton {\n    static override readonly id = 'moveUp';\n\n    constructor(navbar: Navbar) {\n        super(navbar, MoveButtonDirection.UP);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { KEY_CODES } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport { invertResolvableBoolean } from '../utils';\nimport { PressHandler } from '../utils/PressHandler';\nimport { AbstractButton } from './AbstractButton';\n\nexport const enum ZoomButtonDirection {\n    IN,\n    OUT,\n}\n\nexport class AbstractZoomButton extends AbstractButton {\n    static override readonly groupId = 'zoom';\n\n    private readonly handler = new PressHandler();\n\n    constructor(\n        navbar: Navbar,\n        icon: string,\n        private direction: ZoomButtonDirection,\n    ) {\n        super(navbar, {\n            className: 'psv-zoom-button',\n            hoverScale: true,\n            collapsable: false,\n            tabbable: true,\n            icon: icon,\n        });\n\n        this.container.addEventListener('mousedown', this);\n        this.container.addEventListener('keydown', this);\n        this.container.addEventListener('keyup', this);\n        this.viewer.container.addEventListener('mouseup', this);\n        this.viewer.container.addEventListener('touchend', this);\n    }\n\n    override destroy() {\n        this.__onMouseUp();\n\n        this.viewer.container.removeEventListener('mouseup', this);\n        this.viewer.container.removeEventListener('touchend', this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case 'mousedown': this.__onMouseDown(); break;\n            case 'mouseup': this.__onMouseUp(); break;\n            case 'touchend': this.__onMouseUp(); break;\n            case 'keydown': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseDown(); break;\n            case 'keyup': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseUp(); break;\n        }\n    }\n\n    onClick() {\n        // nothing\n    }\n\n    override isSupported() {\n        return invertResolvableBoolean(SYSTEM.isTouchEnabled);\n    }\n\n    private __onMouseDown() {\n        if (!this.state.enabled) {\n            return;\n        }\n\n        this.viewer.dynamics.zoom.roll(this.direction === ZoomButtonDirection.OUT);\n        this.handler.down();\n    }\n\n    private __onMouseUp() {\n        if (!this.state.enabled) {\n            return;\n        }\n\n        this.handler.up(() => this.viewer.dynamics.zoom.stop());\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS } from '../data/constants';\nimport { AbstractZoomButton, ZoomButtonDirection } from './AbstractZoomButton';\n\nexport class ZoomInButton extends AbstractZoomButton {\n    static override readonly id = 'zoomIn';\n\n    constructor(navbar: Navbar) {\n        super(navbar, ICONS.zoomIn, ZoomButtonDirection.IN);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS } from '../data/constants';\nimport { AbstractZoomButton, ZoomButtonDirection } from './AbstractZoomButton';\n\nexport class ZoomOutButton extends AbstractZoomButton {\n    static override readonly id = 'zoomOut';\n\n    constructor(navbar: Navbar) {\n        super(navbar, ICONS.zoomOut, ZoomButtonDirection.OUT);\n    }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { SYSTEM } from '../data/system';\nimport { ReadyEvent, ZoomUpdatedEvent } from '../events';\nimport { Slider, SliderDirection, SliderUpdateData, getStyleProperty, invertResolvableBoolean } from '../utils';\nimport { AbstractButton } from './AbstractButton';\n\nexport class ZoomRangeButton extends AbstractButton {\n    static override readonly id = 'zoomRange';\n    static override readonly groupId = 'zoom';\n\n    private readonly slider: Slider;\n    private readonly zoomRange: HTMLElement;\n    private readonly zoomValue: HTMLElement;\n    private readonly mediaMinWidth: number;\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: 'psv-zoom-range',\n            hoverScale: false,\n            collapsable: false,\n            tabbable: false,\n        });\n\n        this.zoomRange = document.createElement('div');\n        this.zoomRange.className = 'psv-zoom-range-line';\n        this.container.appendChild(this.zoomRange);\n\n        this.zoomValue = document.createElement('div');\n        this.zoomValue.className = 'psv-zoom-range-handle';\n        this.zoomRange.appendChild(this.zoomValue);\n\n        this.slider = new Slider(this.container, SliderDirection.HORIZONTAL, data => this.__onSliderUpdate(data));\n\n        this.mediaMinWidth = parseInt(getStyleProperty(this.container, 'max-width'), 10);\n\n        this.viewer.addEventListener(ZoomUpdatedEvent.type, this);\n        if (this.viewer.state.ready) {\n            this.__moveZoomValue(this.viewer.getZoomLevel());\n        } else {\n            this.viewer.addEventListener(ReadyEvent.type, this);\n        }\n    }\n\n    override destroy() {\n        this.slider.destroy();\n\n        this.viewer.removeEventListener(ZoomUpdatedEvent.type, this);\n        this.viewer.removeEventListener(ReadyEvent.type, this);\n\n        super.destroy();\n    }\n\n    handleEvent(e: Event) {\n        if (e instanceof ZoomUpdatedEvent) {\n            this.__moveZoomValue(e.zoomLevel);\n        } else if (e instanceof ReadyEvent) {\n            this.__moveZoomValue(this.viewer.getZoomLevel());\n        }\n    }\n\n    onClick() {\n        // nothing\n    }\n\n    override isSupported() {\n        return invertResolvableBoolean(SYSTEM.isTouchEnabled);\n    }\n\n    override autoSize() {\n        if (this.state.supported) {\n            if (this.viewer.state.size.width <= this.mediaMinWidth && this.state.visible) {\n                this.hide(false);\n            } else if (this.viewer.state.size.width > this.mediaMinWidth && !this.state.visible) {\n                this.show(false);\n            }\n        }\n    }\n\n    private __moveZoomValue(level: number) {\n        this.zoomValue.style.left = (level / 100) * this.zoomRange.offsetWidth - this.zoomValue.offsetWidth / 2 + 'px';\n    }\n\n    private __onSliderUpdate(data: SliderUpdateData) {\n        if (data.mousedown) {\n            this.viewer.zoom(data.value * 100);\n        }\n    }\n}\n","import { MathUtils } from 'three';\nimport { PSVError } from '../PSVError';\nimport { adapterInterop } from '../adapters/AbstractAdapter';\nimport { EquirectangularAdapter } from '../adapters/EquirectangularAdapter';\nimport { ParsedViewerConfig, ReadonlyViewerConfig, ViewerConfig } from '../model';\nimport { pluginInterop } from '../plugins/AbstractPlugin';\nimport { ConfigParsers, clone, getConfigParser, logWarn, parseAngle } from '../utils';\nimport { ACTIONS, KEY_CODES } from './constants';\n\n/**\n * Default options\n */\nexport const DEFAULTS: Required<ParsedViewerConfig> = {\n    panorama: null,\n    container: null,\n    adapter: [EquirectangularAdapter as any, null],\n    plugins: [],\n    caption: null,\n    description: null,\n    downloadUrl: null,\n    downloadName: null,\n    loadingImg: null,\n    loadingTxt: '', // empty string => `lang.loading`\n    size: null,\n    fisheye: 0,\n    minFov: 30,\n    maxFov: 90,\n    defaultZoomLvl: 50,\n    defaultYaw: 0,\n    defaultPitch: 0,\n    sphereCorrection: null,\n    moveSpeed: 1,\n    zoomSpeed: 1,\n    moveInertia: 0.8,\n    mousewheel: true,\n    mousemove: true,\n    mousewheelCtrlKey: false,\n    touchmoveTwoFingers: false,\n    panoData: null,\n    requestHeaders: null,\n    canvasBackground: '#000',\n    defaultTransition: {\n        speed: 1500,\n        rotation: true,\n        effect: 'fade',\n    },\n    rendererParameters: { alpha: true, antialias: true },\n    withCredentials: false,\n    navbar: [\n        'zoom',\n        'move',\n        'download',\n        'description',\n        'caption',\n        'fullscreen',\n    ],\n    lang: {\n        zoom: 'Zoom',\n        zoomOut: 'Zoom out',\n        zoomIn: 'Zoom in',\n        moveUp: 'Move up',\n        moveDown: 'Move down',\n        moveLeft: 'Move left',\n        moveRight: 'Move right',\n        description: 'Description',\n        download: 'Download',\n        fullscreen: 'Fullscreen',\n        loading: 'Loading...',\n        menu: 'Menu',\n        close: 'Close',\n        twoFingers: 'Use two fingers to navigate',\n        ctrlZoom: 'Use ctrl + scroll to zoom the image',\n        loadError: 'The panorama cannot be loaded',\n        webglError: 'Your browser does not seem to support WebGL',\n    },\n    keyboard: 'fullscreen',\n    keyboardActions: {\n        [KEY_CODES.ArrowUp]: ACTIONS.ROTATE_UP,\n        [KEY_CODES.ArrowDown]: ACTIONS.ROTATE_DOWN,\n        [KEY_CODES.ArrowRight]: ACTIONS.ROTATE_RIGHT,\n        [KEY_CODES.ArrowLeft]: ACTIONS.ROTATE_LEFT,\n        [KEY_CODES.PageUp]: ACTIONS.ZOOM_IN,\n        [KEY_CODES.PageDown]: ACTIONS.ZOOM_OUT,\n        [KEY_CODES.Plus]: ACTIONS.ZOOM_IN,\n        [KEY_CODES.Minus]: ACTIONS.ZOOM_OUT,\n    },\n};\n\n/**\n * List of unmodifiable options and their error messages\n * @internal\n */\nexport const READONLY_OPTIONS: Record<ReadonlyViewerConfig, string> = {\n    panorama: 'Use setPanorama method to change the panorama',\n    panoData: 'Use setPanorama method to change the panorama',\n    container: 'Cannot change viewer container',\n    adapter: 'Cannot change adapter',\n    plugins: 'Cannot change plugins',\n};\n\n/**\n * Parsers/validators for each option\n * @internal\n */\nexport const CONFIG_PARSERS: ConfigParsers<ViewerConfig, ParsedViewerConfig> = {\n    container: (container) => {\n        if (!container) {\n            throw new PSVError('No value given for container.');\n        }\n        return container;\n    },\n    adapter: (adapter, { defValue }) => {\n        if (!adapter) {\n            adapter = defValue;\n        } else if (Array.isArray(adapter)) {\n            adapter = [adapterInterop(adapter[0]), adapter[1]];\n        } else {\n            adapter = [adapterInterop(adapter), null];\n        }\n        if (!adapter[0]) {\n            throw new PSVError('An undefined value was given for adapter.');\n        }\n        if (!(adapter[0] as any).id) {\n            throw new PSVError(`Adapter has no id.`);\n        }\n        return adapter;\n    },\n    defaultYaw: (defaultYaw) => {\n        // defaultYaw is between 0 and PI\n        return parseAngle(defaultYaw);\n    },\n    defaultPitch: (defaultPitch) => {\n        // defaultPitch is between -PI/2 and PI/2\n        return parseAngle(defaultPitch, true);\n    },\n    defaultZoomLvl: (defaultZoomLvl) => {\n        return MathUtils.clamp(defaultZoomLvl, 0, 100);\n    },\n    minFov: (minFov, { rawConfig }) => {\n        // minFov and maxFov must be ordered\n        if (rawConfig.maxFov < minFov) {\n            logWarn('maxFov cannot be lower than minFov');\n            minFov = rawConfig.maxFov;\n        }\n        // minFov between 1 and 179\n        return MathUtils.clamp(minFov, 1, 179);\n    },\n    maxFov: (maxFov, { rawConfig }) => {\n        // minFov and maxFov must be ordered\n        if (maxFov < rawConfig.minFov) {\n            maxFov = rawConfig.minFov;\n        }\n        // maxFov between 1 and 179\n        return MathUtils.clamp(maxFov, 1, 179);\n    },\n    moveInertia: (moveInertia, { defValue }) => {\n        if (moveInertia === true) {\n            return defValue;\n        }\n        if (moveInertia === false) {\n            return 0;\n        }\n        return moveInertia;\n    },\n    lang: (lang) => {\n        return {\n            ...DEFAULTS.lang,\n            ...lang,\n        };\n    },\n    keyboardActions: (keyboardActions, { rawConfig }) => {\n        if (rawConfig.keyboard && typeof rawConfig.keyboard === 'object') {\n            return rawConfig.keyboard;\n        }\n        return keyboardActions;\n    },\n    fisheye: (fisheye) => {\n        // translate boolean fisheye to amount\n        if (fisheye === true) {\n            return 1;\n        } else if (fisheye === false) {\n            return 0;\n        }\n        return fisheye;\n    },\n    requestHeaders: (requestHeaders) => {\n        if (requestHeaders && typeof requestHeaders === 'object') {\n            return () => requestHeaders;\n        }\n        if (typeof requestHeaders === 'function') {\n            return requestHeaders;\n        }\n        return null;\n    },\n    defaultTransition: (defaultTransition, { defValue }) => {\n        if (defaultTransition === null || defaultTransition.speed === 0) {\n            return null;\n        } else {\n            return { ...defValue, ...defaultTransition };\n        }\n    },\n    rendererParameters: (rendererParameters, { defValue }) => ({\n        ...rendererParameters,\n        ...defValue,\n    }),\n    plugins: (plugins) => {\n        return plugins.map((plugin, i) => {\n            if (Array.isArray(plugin)) {\n                plugin = [pluginInterop(plugin[0]), plugin[1]];\n            } else {\n                plugin = [pluginInterop(plugin), null];\n            }\n            if (!plugin[0]) {\n                throw new PSVError(`An undefined value was given for plugin ${i}.`);\n            }\n            if (!(plugin[0] as any).id) {\n                throw new PSVError(`Plugin ${i} has no id.`);\n            }\n            return plugin;\n        });\n    },\n    navbar: (navbar) => {\n        if (navbar === false) {\n            return null;\n        }\n        if (navbar === true) {\n            // true becomes the default array\n            return clone(DEFAULTS.navbar as string[]);\n        }\n        if (typeof navbar === 'string') {\n            // can be a space or coma separated list\n            return navbar.split(/[ ,]/);\n        }\n        return navbar;\n    },\n};\n\n/**\n * @internal\n */\nexport const getViewerConfig = getConfigParser<ViewerConfig, ParsedViewerConfig>(DEFAULTS, CONFIG_PARSERS);\n","import { TypedEvent, TypedEventTarget } from '../lib/TypedEventTarget';\nimport { checkVersion, ConfigParser, logWarn } from '../utils';\nimport type { Viewer } from '../Viewer';\n\n/**\n * Base class for plugins\n * @template TEvents union of dispatched events\n */\nexport abstract class AbstractPlugin<\n    TEvents extends TypedEvent<AbstractPlugin> = never,\n> extends TypedEventTarget<TEvents> {\n    /**\n     * Unique identifier of the plugin\n     */\n    static readonly id: string;\n    /**\n     * Expected version of the core\n     * DO NOT USE on custom plugins\n     */\n    static readonly VERSION: string;\n\n    constructor(protected viewer: Viewer) {\n        super();\n    }\n\n    /**\n     * Initializes the plugin\n     */\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    init(): void {}\n\n    /**\n     * Destroys the plugin\n     */\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    destroy(): void {}\n}\n\n/**\n * Base class for plugins with updatable configuration\n * The implementation must have a static `configParser` property which is the result of {@link utils.getConfigParser}\n *\n * @template TConfig type of input config\n * @template TParsedConfig type of config after parsing\n * @template TUpdatableConfig type of config that can be updated\n * @template TEvents union of dispatched events\n */\nexport abstract class AbstractConfigurablePlugin<\n    TConfig extends Record<string, any>,\n    TParsedConfig extends TConfig = TConfig,\n    TUpdatableConfig extends TConfig = TConfig,\n    TEvents extends TypedEvent<AbstractPlugin> = never,\n> extends AbstractPlugin<TEvents> {\n    static configParser: ConfigParser<any, any>;\n    static readonlyOptions: string[] = [];\n\n    readonly config: TParsedConfig;\n\n    constructor(viewer: Viewer, config: TConfig) {\n        super(viewer);\n\n        this.config = (this.constructor as typeof AbstractConfigurablePlugin).configParser(config) as TParsedConfig;\n    }\n\n    /**\n     * Update options\n     */\n    setOption<T extends keyof TUpdatableConfig>(option: T, value: TUpdatableConfig[T]) {\n        // @ts-ignore\n        this.setOptions({ [option]: value });\n    }\n\n    /**\n     * Update options\n     */\n    setOptions(options: Partial<TUpdatableConfig>) {\n        const rawConfig: TConfig = {\n            ...this.config,\n            ...options,\n        };\n\n        const ctor = this.constructor as typeof AbstractConfigurablePlugin;\n        const parser: ConfigParser<TConfig, TParsedConfig> = ctor.configParser as any;\n        const readonly = ctor.readonlyOptions;\n        const id = ctor.id;\n\n        for (let [key, value] of Object.entries(options) as Array<[keyof TConfig, any]>) {\n            if (!(key in parser.defaults)) {\n                logWarn(`${id}: Unknown option \"${key as string}\"`);\n                continue;\n            }\n\n            if (readonly.includes(key as string)) {\n                logWarn(`${id}: Option \"${key as string}\" cannot be updated`);\n                continue;\n            }\n\n            if (key in parser.parsers) {\n                value = parser.parsers[key](value, {\n                    rawConfig: rawConfig,\n                    defValue: parser.defaults[key],\n                });\n            }\n\n            this.config[key] = value;\n        }\n    }\n}\n\nexport type PluginConstructor = new (viewer: Viewer, config?: any) => AbstractPlugin<any>;\n\n/**\n * Returns the plugin constructor from the imported object\n * @internal\n */\nexport function pluginInterop(plugin: any): PluginConstructor & typeof AbstractPlugin {\n    if (plugin) {\n        for (const [, p] of [['_', plugin], ...Object.entries(plugin)]) {\n            if (p.prototype instanceof AbstractPlugin) {\n                checkVersion(p.id, p.VERSION, PKG_VERSION);\n                return p;\n            }\n        }\n    }\n    return null;\n}\n","import { AbstractButton } from '../buttons/AbstractButton';\nimport { DescriptionButton } from '../buttons/DescriptionButton';\nimport type { Navbar } from './Navbar';\n\nexport class NavbarCaption extends AbstractButton {\n    static override readonly id = 'caption';\n\n    private contentWidth = 0;\n\n    private readonly contentElt: HTMLElement;\n\n    constructor(navbar: Navbar) {\n        super(navbar, {\n            className: 'psv-caption',\n            hoverScale: false,\n            collapsable: false,\n            tabbable: true,\n        });\n\n        this.state.width = 0;\n\n        this.contentElt = document.createElement('div');\n        this.contentElt.className = 'psv-caption-content';\n        this.container.appendChild(this.contentElt);\n\n        this.setCaption(this.viewer.config.caption);\n    }\n\n    override hide() {\n        this.contentElt.style.display = 'none';\n        this.state.visible = false;\n    }\n\n    override show() {\n        this.contentElt.style.display = '';\n        this.state.visible = true;\n    }\n\n    onClick(): void {\n        // nothing\n    }\n\n    /**\n     * Changes the caption\n     */\n    setCaption(html: string | null) {\n        this.show();\n        this.contentElt.innerHTML = html ?? '';\n\n        if (this.contentElt.innerHTML) {\n            this.contentWidth = this.contentElt.offsetWidth;\n        } else {\n            this.contentWidth = 0;\n        }\n\n        this.autoSize();\n    }\n\n    /**\n     * Toggles content and icon depending on available space\n     */\n    override autoSize() {\n        this.toggle(this.container.offsetWidth >= this.contentWidth);\n        this.__refreshButton();\n    }\n\n    private __refreshButton() {\n        (this.viewer.navbar.getButton(DescriptionButton.id, false) as DescriptionButton)?.autoSize(true);\n    }\n}\n","import { AbstractButton, ButtonConstructor } from '../buttons/AbstractButton';\nimport { CustomButton } from '../buttons/CustomButton';\nimport { DescriptionButton } from '../buttons/DescriptionButton';\nimport { DownloadButton } from '../buttons/DownloadButton';\nimport { FullscreenButton } from '../buttons/FullscreenButton';\nimport { MenuButton } from '../buttons/MenuButton';\nimport { MoveDownButton } from '../buttons/MoveDownButton';\nimport { MoveLeftButton } from '../buttons/MoveLeftButton';\nimport { MoveRightButton } from '../buttons/MoveRightButton';\nimport { MoveUpButton } from '../buttons/MoveUpButton';\nimport { ZoomInButton } from '../buttons/ZoomInButton';\nimport { ZoomOutButton } from '../buttons/ZoomOutButton';\nimport { ZoomRangeButton } from '../buttons/ZoomRangeButton';\nimport { DEFAULTS } from '../data/config';\nimport { CAPTURE_EVENTS_CLASS } from '../data/constants';\nimport { ParsedViewerConfig } from '../model';\nimport { PSVError } from '../PSVError';\nimport { logWarn } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { AbstractComponent } from './AbstractComponent';\nimport { NavbarCaption } from './NavbarCaption';\n\n/**\n * List of available buttons\n */\nconst AVAILABLE_BUTTONS: Record<string, ButtonConstructor> = {};\n\n/**\n * List of available buttons\n */\nconst AVAILABLE_GROUPS: Record<string, ButtonConstructor[]> = {};\n\n/**\n * Register a new button available for all viewers\n * @param button\n * @param [defaultPosition]  If provided the default configuration of the navbar will be modified.\n * Possible values are :\n *    - `start`\n *    - `end`\n *    - `[id]:left`\n *    - `[id]:right`\n * @throws {@link PSVError} if the button constructor has no \"id\"\n */\nexport function registerButton(button: ButtonConstructor, defaultPosition?: string) {\n    if (!button.id) {\n        throw new PSVError('Button id is required');\n    }\n\n    AVAILABLE_BUTTONS[button.id] = button;\n\n    if (button.groupId) {\n        (AVAILABLE_GROUPS[button.groupId] = AVAILABLE_GROUPS[button.groupId] || []).push(button);\n    }\n\n    if (defaultPosition) {\n        const navbar = DEFAULTS.navbar as string[];\n        switch (defaultPosition) {\n            case 'start':\n                navbar.unshift(button.id);\n                break;\n            case 'end':\n                navbar.push(button.id);\n                break;\n            default: {\n                const [id, pos] = defaultPosition.split(':');\n                const idx = navbar.indexOf(id);\n                if (!id || !pos || idx === -1) {\n                    throw new PSVError(`Invalid defaultPosition ${defaultPosition}`);\n                }\n                navbar.splice(idx + (pos === 'right' ? 1 : 0), 0, button.id);\n            }\n        }\n    }\n}\n\n[\n    ZoomOutButton,\n    ZoomRangeButton,\n    ZoomInButton,\n    DescriptionButton,\n    NavbarCaption,\n    DownloadButton,\n    FullscreenButton,\n    MoveLeftButton,\n    MoveRightButton,\n    MoveUpButton,\n    MoveDownButton,\n].forEach(btn => registerButton(btn));\n\n/**\n * Navigation bar component\n */\nexport class Navbar extends AbstractComponent {\n    /**\n     * @internal\n     */\n    collapsed: AbstractButton[] = [];\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer, {\n            className: `psv-navbar ${CAPTURE_EVENTS_CLASS}`,\n        });\n\n        this.state.visible = false;\n    }\n\n    /**\n     * Shows the navbar\n     */\n    override show() {\n        this.viewer.container.classList.add('psv--has-navbar');\n        this.container.classList.add('psv-navbar--open');\n        this.state.visible = true;\n    }\n\n    /**\n     * Hides the navbar\n     */\n    override hide() {\n        this.viewer.container.classList.remove('psv--has-navbar');\n        this.container.classList.remove('psv-navbar--open');\n        this.state.visible = false;\n    }\n\n    /**\n     * Change the buttons visible on the navbar\n     */\n    setButtons(buttons: ParsedViewerConfig['navbar']) {\n        this.children.slice().forEach(item => item.destroy());\n        this.children.length = 0;\n\n        // force description button if caption is present (used on narrow screens)\n        if (buttons.indexOf(NavbarCaption.id) !== -1 && buttons.indexOf(DescriptionButton.id) === -1) {\n            buttons.splice(buttons.indexOf(NavbarCaption.id), 0, DescriptionButton.id);\n        }\n\n        buttons.forEach((button) => {\n            if (typeof button === 'object') {\n                new CustomButton(this, button);\n            } else if (AVAILABLE_BUTTONS[button]) {\n                // @ts-ignore\n                new AVAILABLE_BUTTONS[button](this);\n            } else if (AVAILABLE_GROUPS[button]) {\n                AVAILABLE_GROUPS[button].forEach((buttonCtor) => {\n                    // @ts-ignore\n                    new buttonCtor(this);\n                });\n            } else {\n                logWarn(`Unknown button ${button}`);\n            }\n        });\n\n        new MenuButton(this);\n\n        this.children.forEach((item) => {\n            if (item instanceof AbstractButton) {\n                item.checkSupported();\n            }\n        });\n\n        this.autoSize();\n    }\n\n    /**\n     * Changes the navbar caption\n     */\n    setCaption(html: string | null) {\n        this.children.some((item) => {\n            if (item instanceof NavbarCaption) {\n                item.setCaption(html);\n                return true;\n            } else {\n                return false;\n            }\n        });\n    }\n\n    /**\n     * Returns a button by its identifier\n     */\n    getButton(id: string, warnNotFound = true): AbstractButton {\n        const button = this.children.find((item) => {\n            return item instanceof AbstractButton && item.id === id;\n        });\n\n        if (!button && warnNotFound) {\n            logWarn(`button \"${id}\" not found in the navbar`);\n        }\n\n        return button as AbstractButton;\n    }\n\n    /**\n     * Try to focus a button, will focus the first button if the requested button does not exist.\n     */\n    focusButton(id: string) {\n        if (this.isVisible()) {\n            (this.getButton(id, false)?.container || this.container.firstElementChild as HTMLElement)?.focus();\n        }\n    }\n\n    /**\n     * Automatically collapses buttons\n     * @internal\n     */\n    autoSize() {\n        this.children.forEach((child) => {\n            if (child instanceof AbstractButton) {\n                child.autoSize();\n            }\n        });\n\n        const availableWidth = this.container.offsetWidth;\n\n        let totalWidth = 0;\n        const collapsableButtons: AbstractButton[] = [];\n\n        this.children.forEach((item) => {\n            if (item.isVisible() && item instanceof AbstractButton) {\n                totalWidth += item.width;\n                if (item.collapsable) {\n                    collapsableButtons.push(item);\n                }\n            }\n        });\n\n        if (totalWidth === 0) {\n            return;\n        }\n\n        if (availableWidth < totalWidth && collapsableButtons.length > 0) {\n            collapsableButtons.forEach(item => item.collapse());\n            this.collapsed = collapsableButtons;\n\n            this.getButton(MenuButton.id).show(false);\n        } else if (availableWidth >= totalWidth && this.collapsed.length > 0) {\n            this.collapsed.forEach(item => item.uncollapse());\n            this.collapsed = [];\n\n            this.getButton(MenuButton.id).hide(false);\n        }\n\n        this.getButton(NavbarCaption.id, false)?.autoSize();\n    }\n}\n","import { Cache as ThreeCache } from 'three';\nimport { logWarn } from '../utils';\n\nThreeCache.enabled = false;\n\nexport const Cache = {\n    enabled: true,\n\n    maxItems: 10,\n\n    ttl: 10 * 60,\n\n    items: {} as Record<string, { files: Record<string, HTMLImageElement | Blob>; lastAccess: number }>,\n\n    purgeInterval: null as ReturnType<typeof setInterval>,\n\n    init() {\n        if (ThreeCache.enabled) {\n            logWarn('ThreeJS cache should be disabled');\n            ThreeCache.enabled = false;\n        }\n\n        if (!this.purgeInterval && this.enabled) {\n            this.purgeInterval = setInterval(() => this.purge(), 60 * 1000);\n        }\n    },\n\n    add(url: string, key: string, data: HTMLImageElement | Blob) {\n        if (this.enabled && key) {\n            this.items[key] = this.items[key] ?? { files: {}, lastAccess: null };\n            this.items[key].files[url] = data;\n            this.items[key].lastAccess = Date.now();\n        }\n    },\n\n    get(url: string, key: string): HTMLImageElement | Blob {\n        if (this.enabled && key && this.items[key]) {\n            this.items[key].lastAccess = Date.now();\n            return this.items[key].files[url];\n        }\n    },\n\n    remove(url: string, key: string) {\n        if (this.enabled && key && this.items[key]) {\n            delete this.items[key].files[url];\n            if (Object.keys(this.items[key].files).length === 0) {\n                delete this.items[key];\n            }\n        }\n    },\n\n    purge() {\n        Object.entries(this.items)\n            .sort(([, a], [, b]) => {\n                return b.lastAccess - a.lastAccess;\n            })\n            .forEach(([key, { lastAccess }], index) => {\n                // remove expired items and extra numerous items\n                // but always keep the most recent one\n                if (index > 0 && (Date.now() - lastAccess >= this.ttl * 1000 || index >= this.maxItems)) {\n                    delete this.items[key];\n                }\n            });\n    },\n};\n","import { MathUtils } from 'three';\nimport { ConfigChangedEvent } from '../events';\nimport { getStyleProperty } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Loader component\n */\nexport class Loader extends AbstractComponent {\n    private readonly loader: HTMLElement;\n    private readonly canvas: SVGElement;\n\n    private readonly size: number;\n    private readonly border: number;\n    private readonly thickness: number;\n    private readonly color: string;\n    private readonly textColor: string;\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer, { className: 'psv-loader-container' });\n\n        this.loader = document.createElement('div');\n        this.loader.className = 'psv-loader';\n        this.container.appendChild(this.loader);\n\n        this.size = this.loader.offsetWidth;\n\n        this.canvas = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n        this.canvas.setAttribute('class', 'psv-loader-canvas');\n        this.canvas.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`);\n        this.loader.appendChild(this.canvas);\n\n        this.textColor = getStyleProperty(this.loader, 'color');\n        this.color = getStyleProperty(this.canvas, 'color');\n        this.border = parseInt(getStyleProperty(this.loader, '--psv-loader-border'), 10);\n        this.thickness = parseInt(getStyleProperty(this.loader, '--psv-loader-tickness'), 10);\n\n        const halfSize = this.size / 2;\n        this.canvas.innerHTML = `\n            <circle cx=\"${halfSize}\" cy=\"${halfSize}\" r=\"${halfSize}\" fill=\"${this.color}\"/>\n            <path d=\"\" fill=\"none\" stroke=\"${this.textColor}\" stroke-width=\"${this.thickness}\" stroke-linecap=\"round\"/>\n        `;\n\n        this.viewer.addEventListener(ConfigChangedEvent.type, this);\n\n        this.__updateContent();\n        this.hide();\n    }\n\n    /**\n     * @internal\n     */\n    override destroy(): void {\n        this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        if (e instanceof ConfigChangedEvent) {\n            e.containsOptions('loadingImg', 'loadingTxt', 'lang') && this.__updateContent();\n        }\n    }\n\n    /**\n     * Sets the loader progression\n     */\n    setProgress(value: number) {\n        this.container.classList.remove('psv-loader--undefined');\n\n        const angle = (MathUtils.clamp(value, 0, 99.999) / 100) * Math.PI * 2;\n        const halfSize = this.size / 2;\n        const startX = halfSize;\n        const startY = this.thickness / 2 + this.border;\n        const radius = (this.size - this.thickness) / 2 - this.border;\n        const endX = Math.sin(angle) * radius + halfSize;\n        const endY = -Math.cos(angle) * radius + halfSize;\n        const largeArc = value > 50 ? '1' : '0';\n\n        this.canvas.querySelector('path').setAttributeNS(null, 'd',\n            `M ${startX} ${startY} A ${radius} ${radius} 0 ${largeArc} 1 ${endX} ${endY}`,\n        );\n    }\n\n    /**\n     * Animates the loader with an unknown state\n     */\n    showUndefined() {\n        this.show();\n        this.setProgress(25);\n        this.container.classList.add('psv-loader--undefined');\n    }\n\n    private __updateContent() {\n        const current = this.loader.querySelector('.psv-loader-image, .psv-loader-text');\n        if (current) {\n            this.loader.removeChild(current);\n        }\n\n        let inner;\n        if (this.viewer.config.loadingImg) {\n            inner = document.createElement('img');\n            inner.className = 'psv-loader-image';\n            inner.src = this.viewer.config.loadingImg;\n        } else if (this.viewer.config.loadingTxt !== null) {\n            inner = document.createElement('div');\n            inner.className = 'psv-loader-text';\n            inner.innerHTML = this.viewer.config.loadingTxt || this.viewer.config.lang.loading;\n        }\n        if (inner) {\n            const size = Math.round(Math.sqrt(2 * Math.pow(this.size / 2 - this.thickness / 2 - this.border, 2)));\n            inner.style.maxWidth = size + 'px';\n            inner.style.maxHeight = size + 'px';\n            this.loader.appendChild(inner);\n        }\n    }\n}\n","import { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { HideNotificationEvent, ShowNotificationEvent } from '../events';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Configuration for {@link Notification.show}\n */\nexport type NotificationConfig = {\n    /**\n     * unique identifier to use with {@link Notification.hide} and {@link Notification.isVisible}\n     */\n    id?: string;\n    /**\n     * notification content\n     */\n    content: string;\n    /**\n     * automatically hide the notification after X milliseconds\n     */\n    timeout?: number;\n};\n\n/**\n * Notification component\n */\nexport class Notification extends AbstractComponent {\n    /**\n     * @internal\n     */\n    protected override readonly state = {\n        visible: false,\n        contentId: null as string,\n        timeout: null as ReturnType<typeof setTimeout>,\n    };\n\n    private readonly content: HTMLElement;\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer, {\n            className: 'psv-notification',\n        });\n\n        this.content = document.createElement('div');\n        this.content.className = 'psv-notification-content';\n        this.container.appendChild(this.content);\n\n        this.content.addEventListener('click', () => this.hide());\n    }\n\n    /**\n     * Checks if the notification is visible\n     */\n    override isVisible(id?: string) {\n        return this.state.visible && (!id || !this.state.contentId || this.state.contentId === id);\n    }\n\n    /**\n     * @throws {@link PSVError} always\n     * @internal\n     */\n    override toggle() {\n        throw new PSVError('Notification cannot be toggled');\n    }\n\n    /**\n     * Displays a notification on the viewer\n     *\n     * @example\n     * viewer.showNotification({ content: 'Hello world', timeout: 5000 })\n     * @example\n     * viewer.showNotification('Hello world')\n     */\n    override show(config: string | NotificationConfig) {\n        if (this.state.timeout) {\n            clearTimeout(this.state.timeout);\n            this.state.timeout = null;\n        }\n\n        if (typeof config === 'string') {\n            config = { content: config };\n        }\n\n        this.state.contentId = config.id || null;\n        this.content.innerHTML = config.content;\n\n        this.container.classList.add('psv-notification--visible');\n        this.state.visible = true;\n\n        this.viewer.dispatchEvent(new ShowNotificationEvent(this.state.contentId));\n\n        if (config.timeout) {\n            this.state.timeout = setTimeout(() => this.hide(this.state.contentId), config.timeout);\n        }\n    }\n\n    /**\n     * Hides the notification\n     */\n    override hide(id?: string) {\n        if (this.isVisible(id)) {\n            const contentId = this.state.contentId;\n\n            this.container.classList.remove('psv-notification--visible');\n            this.state.visible = false;\n\n            this.state.contentId = null;\n\n            this.viewer.dispatchEvent(new HideNotificationEvent(contentId));\n        }\n    }\n}\n","import { CAPTURE_EVENTS_CLASS, KEY_CODES } from '../data/constants';\nimport { HideOverlayEvent, KeypressEvent, ShowOverlayEvent } from '../events';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Configuration for {@link Overlay.show}\n */\nexport type OverlayConfig = {\n    /**\n     * unique identifier to use with {@link Overlay.hide} and {@link Overlay.isVisible}\n     */\n    id?: string;\n    /**\n     * SVG image/icon displayed above the text\n     */\n    image?: string;\n    /**\n     * main message\n     */\n    title: string;\n    /**\n     * secondary message\n     */\n    text?: string;\n    /**\n     * if the user can hide the overlay by clicking\n     * @default true\n     */\n    dismissible?: boolean;\n};\n\n/**\n * Overlay component\n */\nexport class Overlay extends AbstractComponent {\n    /**\n     * @internal\n     */\n    protected override readonly state = {\n        visible: false,\n        contentId: null as string,\n        dismissible: true,\n    };\n\n    private readonly image: HTMLElement;\n    private readonly title: HTMLElement;\n    private readonly text: HTMLElement;\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer, {\n            className: `psv-overlay ${CAPTURE_EVENTS_CLASS}`,\n        });\n\n        this.image = document.createElement('div');\n        this.image.className = 'psv-overlay-image';\n        this.container.appendChild(this.image);\n\n        this.title = document.createElement('div');\n        this.title.className = 'psv-overlay-title';\n        this.container.appendChild(this.title);\n\n        this.text = document.createElement('div');\n        this.text.className = 'psv-overlay-text';\n        this.container.appendChild(this.text);\n\n        this.container.addEventListener('click', this);\n        this.viewer.addEventListener(KeypressEvent.type, this);\n\n        super.hide();\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        this.viewer.removeEventListener(KeypressEvent.type, this);\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        if (e.type === 'click') {\n            if (this.isVisible() && this.state.dismissible) {\n                this.hide();\n                e.stopPropagation();\n            }\n        } else if (e instanceof KeypressEvent) {\n            if (this.isVisible() && this.state.dismissible && e.key === KEY_CODES.Escape) {\n                this.hide();\n                e.preventDefault();\n            }\n        }\n    }\n\n    /**\n     * Checks if the overlay is visible\n     */\n    override isVisible(id?: string) {\n        return this.state.visible && (!id || !this.state.contentId || this.state.contentId === id);\n    }\n\n    /**\n     * @throws {@link PSVError} always\n     * @internal\n     */\n    override toggle() {\n        throw new PSVError('Overlay cannot be toggled');\n    }\n\n    /**\n     * Displays an overlay on the viewer\n     */\n    override show(config: string | OverlayConfig) {\n        if (typeof config === 'string') {\n            config = { title: config };\n        }\n\n        this.state.contentId = config.id || null;\n        this.state.dismissible = config.dismissible !== false;\n        this.image.innerHTML = config.image || '';\n        this.title.innerHTML = config.title || '';\n        this.text.innerHTML = config.text || '';\n\n        super.show();\n\n        this.viewer.dispatchEvent(new ShowOverlayEvent(this.state.contentId));\n    }\n\n    /**\n     * Hides the overlay\n     */\n    override hide(id?: string) {\n        if (this.isVisible(id)) {\n            const contentId = this.state.contentId;\n\n            super.hide();\n\n            this.state.contentId = null;\n\n            this.viewer.dispatchEvent(new HideOverlayEvent(contentId));\n        }\n    }\n}\n","import { CAPTURE_EVENTS_CLASS, ICONS, KEY_CODES } from '../data/constants';\nimport { PSVError } from '../PSVError';\nimport { getEventTarget, toggleClass } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { HidePanelEvent, KeypressEvent, ShowPanelEvent } from '../events';\nimport { AbstractComponent } from './AbstractComponent';\n\nconst PANEL_MIN_WIDTH = 200;\n\nconst PANEL_CLASS_NO_INTERACTION = 'psv-panel-content--no-interaction';\n\n/**\n * Configuration for {@link Panel.show}\n */\nexport type PanelConfig = {\n    /**\n     * unique identifier to use with {@link Panel.hide} and {@link Panel.isVisible} and to store the width\n     */\n    id?: string;\n    /**\n     * HTML content of the panel\n     */\n    content: string;\n    /**\n     * remove the default margins\n     * @default false\n     */\n    noMargin?: boolean;\n    /**\n     * initial width\n     */\n    width?: string;\n    /**\n     * called when the user clicks inside the panel or presses the Enter key while an element focused\n     */\n    clickHandler?: (target: HTMLElement) => void;\n};\n\n/**\n * Panel component\n */\nexport class Panel extends AbstractComponent {\n    /**\n     * @internal\n     */\n    protected override readonly state = {\n        visible: false,\n        contentId: null as string,\n        mouseX: 0,\n        mouseY: 0,\n        mousedown: false,\n        clickHandler: null as (e: MouseEvent) => void,\n        keyHandler: null as (e: KeyboardEvent) => void,\n        width: {} as Record<string, string>,\n    };\n\n    private readonly content: HTMLElement;\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer, {\n            className: `psv-panel ${CAPTURE_EVENTS_CLASS}`,\n        });\n\n        const resizer = document.createElement('div');\n        resizer.className = 'psv-panel-resizer';\n        this.container.appendChild(resizer);\n\n        const closeBtn = document.createElement('div');\n        closeBtn.className = 'psv-panel-close-button';\n        closeBtn.innerHTML = ICONS.close;\n        closeBtn.title = viewer.config.lang.close;\n        this.container.appendChild(closeBtn);\n\n        this.content = document.createElement('div');\n        this.content.className = 'psv-panel-content';\n        this.container.appendChild(this.content);\n\n        closeBtn.addEventListener('click', () => this.hide());\n\n        // Event for panel resizing\n        resizer.addEventListener('mousedown', this);\n        resizer.addEventListener('touchstart', this);\n        this.viewer.container.addEventListener('mouseup', this);\n        this.viewer.container.addEventListener('touchend', this);\n        this.viewer.container.addEventListener('mousemove', this);\n        this.viewer.container.addEventListener('touchmove', this);\n\n        this.viewer.addEventListener(KeypressEvent.type, this);\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        this.viewer.removeEventListener(KeypressEvent.type, this);\n\n        this.viewer.container.removeEventListener('mousemove', this);\n        this.viewer.container.removeEventListener('touchmove', this);\n        this.viewer.container.removeEventListener('mouseup', this);\n        this.viewer.container.removeEventListener('touchend', this);\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case 'mousedown': this.__onMouseDown(e as MouseEvent); break;\n            case 'touchstart': this.__onTouchStart(e as TouchEvent); break;\n            case 'mousemove': this.__onMouseMove(e as MouseEvent); break;\n            case 'touchmove': this.__onTouchMove(e as TouchEvent); break;\n            case 'mouseup': this.__onMouseUp(e as MouseEvent); break;\n            case 'touchend': this.__onTouchEnd(e as TouchEvent); break;\n            case KeypressEvent.type: this.__onKeyPress(e as KeypressEvent); break;\n        }\n    }\n\n    /**\n     * Checks if the panel is visible\n     */\n    override isVisible(id?: string) {\n        return this.state.visible && (!id || !this.state.contentId || this.state.contentId === id);\n    }\n\n    /**\n     * @throws {@link PSVError} always\n     * @internal\n     */\n    override toggle() {\n        throw new PSVError('Panel cannot be toggled');\n    }\n\n    /**\n     * Shows the panel\n     */\n    override show(config: string | PanelConfig) {\n        if (typeof config === 'string') {\n            config = { content: config };\n        }\n        const wasVisible = this.isVisible(config.id);\n\n        this.state.contentId = config.id || null;\n        this.state.visible = true;\n\n        if (this.state.clickHandler) {\n            this.content.removeEventListener('click', this.state.clickHandler);\n            this.content.removeEventListener('keydown', this.state.keyHandler);\n            this.state.clickHandler = null;\n            this.state.keyHandler = null;\n        }\n\n        if (config.id && this.state.width[config.id]) {\n            this.container.style.width = this.state.width[config.id];\n        } else if (config.width) {\n            this.container.style.width = config.width;\n        } else {\n            this.container.style.width = null;\n        }\n\n        this.content.innerHTML = config.content;\n        this.content.scrollTop = 0;\n        this.container.classList.add('psv-panel--open');\n\n        toggleClass(this.content, 'psv-panel-content--no-margin', config.noMargin === true);\n\n        if (config.clickHandler) {\n            this.state.clickHandler = (e) => {\n                config.clickHandler(getEventTarget(e));\n            };\n            this.state.keyHandler = (e) => {\n                if (e.key === KEY_CODES.Enter) {\n                    config.clickHandler(getEventTarget(e));\n                }\n            };\n            this.content.addEventListener('click', this.state.clickHandler);\n            this.content.addEventListener('keydown', this.state.keyHandler);\n\n            // focus the first element if possible, after animation ends\n            if (!wasVisible) {\n                setTimeout(() => {\n                    (this.content.querySelector('a,button,[tabindex]') as HTMLElement)?.focus();\n                }, 300);\n            }\n        }\n\n        this.viewer.dispatchEvent(new ShowPanelEvent(this.state.contentId));\n    }\n\n    /**\n     * Hides the panel\n     */\n    override hide(id?: string) {\n        if (this.isVisible(id)) {\n            const contentId = this.state.contentId;\n\n            this.state.visible = false;\n            this.state.contentId = null;\n\n            this.content.innerHTML = null;\n            this.container.classList.remove('psv-panel--open');\n\n            if (this.state.clickHandler) {\n                this.content.removeEventListener('click', this.state.clickHandler);\n                this.content.removeEventListener('keydown', this.state.keyHandler);\n                this.state.clickHandler = null;\n                this.state.keyHandler = null;\n            }\n\n            this.viewer.dispatchEvent(new HidePanelEvent(contentId));\n        }\n    }\n\n    private __onMouseDown(evt: MouseEvent) {\n        evt.stopPropagation();\n        this.__startResize(evt.clientX, evt.clientY);\n    }\n\n    private __onTouchStart(evt: TouchEvent) {\n        evt.stopPropagation();\n        if (evt.touches.length === 1) {\n            const touch = evt.touches[0];\n            this.__startResize(touch.clientX, touch.clientY);\n        }\n    }\n\n    private __onMouseUp(evt: MouseEvent) {\n        if (this.state.mousedown) {\n            evt.stopPropagation();\n            this.state.mousedown = false;\n            this.content.classList.remove(PANEL_CLASS_NO_INTERACTION);\n        }\n    }\n\n    private __onTouchEnd(evt: TouchEvent) {\n        if (this.state.mousedown) {\n            evt.stopPropagation();\n            if (evt.touches.length === 0) {\n                this.state.mousedown = false;\n                this.content.classList.remove(PANEL_CLASS_NO_INTERACTION);\n            }\n        }\n    }\n\n    private __onMouseMove(evt: MouseEvent) {\n        if (this.state.mousedown) {\n            evt.stopPropagation();\n            this.__resize(evt.clientX, evt.clientY);\n        }\n    }\n\n    private __onTouchMove(evt: TouchEvent) {\n        if (this.state.mousedown) {\n            const touch = evt.touches[0];\n            this.__resize(touch.clientX, touch.clientY);\n        }\n    }\n\n    private __onKeyPress(evt: KeypressEvent) {\n        if (this.isVisible() && evt.key === KEY_CODES.Escape) {\n            this.hide();\n            evt.preventDefault();\n        }\n    }\n\n    private __startResize(clientX: number, clientY: number) {\n        this.state.mouseX = clientX;\n        this.state.mouseY = clientY;\n        this.state.mousedown = true;\n        this.content.classList.add(PANEL_CLASS_NO_INTERACTION);\n    }\n\n    private __resize(clientX: number, clientY: number) {\n        const x = clientX;\n        const y = clientY;\n        const width = Math.max(PANEL_MIN_WIDTH, this.container.offsetWidth - (x - this.state.mouseX)) + 'px';\n\n        if (this.state.contentId) {\n            this.state.width[this.state.contentId] = width;\n        }\n\n        this.container.style.width = width;\n\n        this.state.mouseX = x;\n        this.state.mouseY = y;\n    }\n}\n","import { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { HideTooltipEvent, ShowTooltipEvent } from '../events';\nimport { addClasses, cleanCssPosition, cssPositionIsOrdered, getStyleProperty } from '../utils';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Object defining the tooltip position\n */\nexport type TooltipPosition = {\n    /**\n     * Position of the tip of the arrow of the tooltip, in pixels\n     */\n    top: number;\n    /**\n     * Position of the tip of the arrow of the tooltip, in pixels\n     */\n    left: number;\n    /**\n     * Tooltip position toward it's arrow tip.\n     * Accepted values are combinations of `top`, `center`, `bottom` and `left`, `center`, `right`.\n     */\n    position?: string | [string, string];\n    /**\n     * @internal\n     */\n    box?: { width: number; height: number };\n};\n\n/**\n * Configuration for {@link Viewer.createTooltip}\n */\nexport type TooltipConfig = TooltipPosition & {\n    /**\n     * HTML content of the tooltip\n     */\n    content: string;\n    /**\n     * Additional CSS class added to the tooltip\n     */\n    className?: string;\n    /**\n     * CSS properties added to the tooltip\n     */\n    style?: Record<string, string>;\n    /**\n     * Userdata associated to the tooltip\n     */\n    data?: any;\n};\n\ntype TooltipStyle = {\n    posClass: [string, string];\n    width: number;\n    height: number;\n    top: number;\n    left: number;\n    arrowTop: number;\n    arrowLeft: number;\n};\n\nconst enum TooltipState {\n    NONE,\n    SHOWING,\n    HIDING,\n    READY,\n}\n\n/**\n * Tooltip component\n * Never instanciate tooltips directly use {@link Viewer#createTooltip} instead\n */\nexport class Tooltip extends AbstractComponent {\n    /**\n     * @internal\n     */\n    protected override readonly state = {\n        visible: true,\n        arrow: 0,\n        border: 0,\n        state: TooltipState.NONE,\n        width: 0,\n        height: 0,\n        pos: '',\n        config: null as TooltipPosition,\n        data: null as any,\n        hideTimeout: null as ReturnType<typeof setTimeout>,\n    };\n\n    private readonly content: HTMLElement;\n    private readonly arrow: HTMLElement;\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer, config: TooltipConfig) {\n        super(viewer, {\n            className: 'psv-tooltip',\n        });\n\n        this.content = document.createElement('div');\n        this.content.className = 'psv-tooltip-content';\n        this.container.appendChild(this.content);\n\n        this.arrow = document.createElement('div');\n        this.arrow.className = 'psv-tooltip-arrow';\n        this.container.appendChild(this.arrow);\n\n        this.container.addEventListener('transitionend', this);\n\n        // allows to interact with static tooltips\n        this.container.addEventListener('touchdown', e => e.stopPropagation());\n        this.container.addEventListener('mousedown', e => e.stopPropagation());\n\n        this.container.style.top = '-1000px';\n        this.container.style.left = '-1000px';\n\n        this.show(config);\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        if (e.type === 'transitionend') {\n            this.__onTransitionEnd(e as TransitionEvent);\n        }\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        clearTimeout(this.state.hideTimeout);\n        delete this.state.data;\n        super.destroy();\n    }\n\n    /**\n     * @throws {@link PSVError} always\n     * @internal\n     */\n    override toggle() {\n        throw new PSVError('Tooltip cannot be toggled');\n    }\n\n    /**\n     * Displays the tooltip on the viewer\n     * @internal\n     */\n    override show(config: TooltipConfig) {\n        if (this.state.state !== TooltipState.NONE) {\n            throw new PSVError('Initialized tooltip cannot be re-initialized');\n        }\n\n        if (config.className) {\n            addClasses(this.container, config.className);\n        }\n        if (config.style) {\n            Object.assign(this.container.style, config.style);\n        }\n\n        this.state.state = TooltipState.READY;\n\n        this.update(config.content, config);\n\n        this.state.data = config.data;\n        this.state.state = TooltipState.SHOWING;\n\n        this.viewer.dispatchEvent(new ShowTooltipEvent(this, this.state.data));\n\n        this.__waitImages();\n    }\n\n    /**\n     * Updates the content of the tooltip, optionally with a new position\n     * @throws {@link PSVError} if the configuration is invalid\n     */\n    update(content: string, config?: TooltipPosition) {\n        this.content.innerHTML = content;\n\n        const rect = this.container.getBoundingClientRect();\n        this.state.width = rect.right - rect.left;\n        this.state.height = rect.bottom - rect.top;\n        this.state.arrow = parseInt(getStyleProperty(this.arrow, 'border-top-width'), 10);\n        this.state.border = parseInt(getStyleProperty(this.container, 'border-top-left-radius'), 10);\n\n        this.move(config ?? this.state.config);\n        this.__waitImages();\n    }\n\n    /**\n     * Moves the tooltip to a new position\n     * @throws {@link PSVError} if the configuration is invalid\n     */\n    move(config: TooltipPosition) {\n        if (this.state.state !== TooltipState.SHOWING && this.state.state !== TooltipState.READY) {\n            throw new PSVError('Uninitialized tooltip cannot be moved');\n        }\n\n        config.box = config.box ?? this.state.config?.box ?? { width: 0, height: 0 };\n        this.state.config = config;\n\n        const t = this.container;\n        const a = this.arrow;\n\n        // compute size\n        const style: TooltipStyle = {\n            posClass: cleanCssPosition(config.position, { allowCenter: false, cssOrder: false }) || ['top', 'center'],\n            width: this.state.width,\n            height: this.state.height,\n            top: 0,\n            left: 0,\n            arrowTop: 0,\n            arrowLeft: 0,\n        };\n\n        // set initial position\n        this.__computeTooltipPosition(style, config);\n\n        // correct position if overflow\n        let swapY = null;\n        let swapX = null;\n        if (style.top < 0) {\n            swapY = 'bottom';\n        } else if (style.top + style.height > this.viewer.state.size.height) {\n            swapY = 'top';\n        }\n        if (style.left < 0) {\n            swapX = 'right';\n        } else if (style.left + style.width > this.viewer.state.size.width) {\n            swapX = 'left';\n        }\n        if (swapX || swapY) {\n            const ordered = cssPositionIsOrdered(style.posClass);\n            if (swapY) {\n                style.posClass[ordered ? 0 : 1] = swapY;\n            }\n            if (swapX) {\n                style.posClass[ordered ? 1 : 0] = swapX;\n            }\n            this.__computeTooltipPosition(style, config);\n        }\n\n        // apply position\n        t.style.top = style.top + 'px';\n        t.style.left = style.left + 'px';\n\n        a.style.top = style.arrowTop + 'px';\n        a.style.left = style.arrowLeft + 'px';\n\n        const newPos = style.posClass.join('-');\n        if (newPos !== this.state.pos) {\n            t.classList.remove(`psv-tooltip--${this.state.pos}`);\n\n            this.state.pos = newPos;\n            t.classList.add(`psv-tooltip--${this.state.pos}`);\n        }\n    }\n\n    /**\n     * Hides the tooltip\n     */\n    override hide() {\n        this.container.classList.remove('psv-tooltip--visible');\n        this.state.state = TooltipState.HIDING;\n\n        this.viewer.dispatchEvent(new HideTooltipEvent(this.state.data));\n\n        // watchdog in case the \"transitionend\" event is not received\n        const duration = parseFloat(getStyleProperty(this.container, 'transition-duration'));\n        this.state.hideTimeout = setTimeout(() => {\n            this.destroy();\n        }, duration * 2);\n    }\n\n    /**\n     * Finalize transition\n     */\n    private __onTransitionEnd(e: TransitionEvent) {\n        if (e.propertyName === 'transform') {\n            switch (this.state.state) {\n                case TooltipState.SHOWING:\n                    this.container.classList.add('psv-tooltip--visible');\n                    this.state.state = TooltipState.READY;\n                    break;\n\n                case TooltipState.HIDING:\n                    this.state.state = TooltipState.NONE;\n                    this.destroy();\n                    break;\n\n                default:\n                // nothing\n            }\n        }\n    }\n\n    /**\n     * Computes the position of the tooltip and its arrow\n     */\n    private __computeTooltipPosition(style: TooltipStyle, config: TooltipPosition) {\n        const arrow = this.state.arrow;\n        const top = config.top;\n        const height = style.height;\n        const left = config.left;\n        const width = style.width;\n        const offsetSide = arrow + this.state.border;\n        const offsetX = config.box.width / 2 + arrow * 2;\n        const offsetY = config.box.height / 2 + arrow * 2;\n\n        switch (style.posClass.join('-')) {\n            case 'top-left':\n                style.top = top - offsetY - height;\n                style.left = left + offsetSide - width;\n                style.arrowTop = height;\n                style.arrowLeft = width - offsetSide - arrow;\n                break;\n            case 'top-center':\n                style.top = top - offsetY - height;\n                style.left = left - width / 2;\n                style.arrowTop = height;\n                style.arrowLeft = width / 2 - arrow;\n                break;\n            case 'top-right':\n                style.top = top - offsetY - height;\n                style.left = left - offsetSide;\n                style.arrowTop = height;\n                style.arrowLeft = arrow;\n                break;\n            case 'bottom-left':\n                style.top = top + offsetY;\n                style.left = left + offsetSide - width;\n                style.arrowTop = -arrow * 2;\n                style.arrowLeft = width - offsetSide - arrow;\n                break;\n            case 'bottom-center':\n                style.top = top + offsetY;\n                style.left = left - width / 2;\n                style.arrowTop = -arrow * 2;\n                style.arrowLeft = width / 2 - arrow;\n                break;\n            case 'bottom-right':\n                style.top = top + offsetY;\n                style.left = left - offsetSide;\n                style.arrowTop = -arrow * 2;\n                style.arrowLeft = arrow;\n                break;\n            case 'left-top':\n                style.top = top + offsetSide - height;\n                style.left = left - offsetX - width;\n                style.arrowTop = height - offsetSide - arrow;\n                style.arrowLeft = width;\n                break;\n            case 'center-left':\n                style.top = top - height / 2;\n                style.left = left - offsetX - width;\n                style.arrowTop = height / 2 - arrow;\n                style.arrowLeft = width;\n                break;\n            case 'left-bottom':\n                style.top = top - offsetSide;\n                style.left = left - offsetX - width;\n                style.arrowTop = arrow;\n                style.arrowLeft = width;\n                break;\n            case 'right-top':\n                style.top = top + offsetSide - height;\n                style.left = left + offsetX;\n                style.arrowTop = height - offsetSide - arrow;\n                style.arrowLeft = -arrow * 2;\n                break;\n            case 'center-right':\n                style.top = top - height / 2;\n                style.left = left + offsetX;\n                style.arrowTop = height / 2 - arrow;\n                style.arrowLeft = -arrow * 2;\n                break;\n            case 'right-bottom':\n                style.top = top - offsetSide;\n                style.left = left + offsetX;\n                style.arrowTop = arrow;\n                style.arrowLeft = -arrow * 2;\n                break;\n\n            // no default\n        }\n    }\n\n    /**\n     * If the tooltip contains images, recompute its size once they are loaded\n     */\n    private __waitImages() {\n        const images = this.content.querySelectorAll('img') as NodeListOf<HTMLImageElement>;\n\n        if (images.length > 0) {\n            const promises: Array<Promise<any>> = [];\n\n            images.forEach((image) => {\n                if (!image.complete) {\n                    promises.push(\n                        new Promise((resolve) => {\n                            image.onload = resolve;\n                            image.onerror = resolve;\n                        }),\n                    );\n                }\n            });\n\n            if (promises.length) {\n                Promise.all(promises).then(() => {\n                    if (this.state.state === TooltipState.SHOWING || this.state.state === TooltipState.READY) {\n                        const rect = this.container.getBoundingClientRect();\n                        this.state.width = rect.right - rect.left;\n                        this.state.height = rect.bottom - rect.top;\n                        this.move(this.state.config);\n                    }\n                });\n            }\n        }\n    }\n}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"15 15 70 70\"><path fill=\"currentColor\" d=\"M50,16.2c-18.6,0-33.8,15.1-33.8,33.8S31.4,83.7,50,83.7S83.8,68.6,83.8,50S68.6,16.2,50,16.2z M50,80.2c-16.7,0-30.2-13.6-30.2-30.2S33.3,19.7,50,19.7S80.3,33.3,80.3,50S66.7,80.2,50,80.2z\"/><rect fill=\"currentColor\" x=\"48\" y=\"31.7\" width=\"4\" height=\"28\"/><rect fill=\"currentColor\" x=\"48\" y=\"63.2\" width=\"4\" height=\"5\"/><!--Created by Shastry from the Noun Project--></svg>\n","import { Euler, MathUtils, Vector3 } from 'three';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { DEFAULTS } from '../data/config';\nimport { ANIMATION_MIN_DURATION, SPHERE_RADIUS, VIEWER_DATA } from '../data/constants';\nimport {\n    ExtendedPosition,\n    PanoData,\n    PanoramaOptions,\n    PanoramaPosition,\n    Point,\n    Position,\n    SphereCorrection,\n    TransitionOptions,\n} from '../model';\nimport {\n    AnimationOptions,\n    applyEulerInverse,\n    getAngle,\n    getShortestArc,\n    isExtendedPosition,\n    isNil,\n    parseAngle,\n    speedToDuration,\n} from '../utils';\nimport { AbstractService } from './AbstractService';\n\nconst vector3 = new Vector3();\nconst EULER_ZERO = new Euler(0, 0, 0, 'ZXY');\n\n/**\n * Collections of data converters for the viewer\n */\nexport class DataHelper extends AbstractService {\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer);\n    }\n\n    /**\n     * Converts vertical FOV to zoom level\n     */\n    fovToZoomLevel(fov: number): number {\n        const temp = Math.round(((fov - this.config.minFov) / (this.config.maxFov - this.config.minFov)) * 100);\n        return MathUtils.clamp(temp - 2 * (temp - 50), 0, 100);\n    }\n\n    /**\n     * Converts zoom level to vertical FOV\n     */\n    zoomLevelToFov(level: number): number {\n        return this.config.maxFov + (level / 100) * (this.config.minFov - this.config.maxFov);\n    }\n\n    /**\n     * Converts vertical FOV to horizontal FOV\n     */\n    vFovToHFov(vFov: number): number {\n        return MathUtils.radToDeg(2 * Math.atan(Math.tan(MathUtils.degToRad(vFov) / 2) * this.state.aspect));\n    }\n\n    /**\n     * Converts horizontal FOV to vertical FOV\n     */\n    hFovToVFov(hFov: number): number {\n        return MathUtils.radToDeg(2 * Math.atan(Math.tan(MathUtils.degToRad(hFov) / 2) / this.state.aspect));\n    }\n\n    /**\n     * @internal\n     */\n    getAnimationProperties(\n        speed: number | string,\n        targetPosition: Position,\n        targetZoom: number,\n    ): {\n            duration: number;\n            properties: AnimationOptions<{ yaw: any; pitch: any; zoom: any }>['properties'];\n        } {\n        const positionProvided = !isNil(targetPosition);\n        const zoomProvided = !isNil(targetZoom);\n\n        const properties: AnimationOptions<{ yaw: any; pitch: any; zoom: any }>['properties'] = {};\n        let duration = null;\n\n        // clean/filter position and compute duration\n        if (positionProvided) {\n            const currentPosition = this.viewer.getPosition();\n            const dYaw = getShortestArc(currentPosition.yaw, targetPosition.yaw);\n\n            properties.yaw = { start: currentPosition.yaw, end: currentPosition.yaw + dYaw };\n            properties.pitch = { start: currentPosition.pitch, end: targetPosition.pitch };\n\n            duration = speedToDuration(speed, getAngle(currentPosition, targetPosition));\n        }\n\n        // clean/filter zoom and compute duration\n        if (zoomProvided) {\n            const currentZoom = this.viewer.getZoomLevel();\n            const dZoom = Math.abs(targetZoom - currentZoom);\n\n            properties.zoom = { start: currentZoom, end: targetZoom };\n\n            if (duration === null) {\n                // if animating zoom only and a speed is given, use an arbitrary PI/4 to compute the duration\n                duration = speedToDuration(speed, ((Math.PI / 4) * dZoom) / 100);\n            }\n        }\n\n        // if nothing to animate\n        if (duration === null) {\n            if (typeof speed === 'number') {\n                duration = speed;\n            } else {\n                duration = ANIMATION_MIN_DURATION;\n            }\n        } else {\n            duration = Math.max(ANIMATION_MIN_DURATION, duration);\n        }\n\n        return { duration, properties };\n    }\n\n    /**\n     * @internal\n     */\n    getTransitionOptions(options: PanoramaOptions): TransitionOptions {\n        let transition: TransitionOptions;\n        const defaultTransition = this.config.defaultTransition ?? DEFAULTS.defaultTransition;\n\n        if (options.transition === false || options.transition === null) {\n            transition = null;\n        } else if (options.transition === true) {\n            transition = {\n                ...defaultTransition,\n            };\n        } else if (typeof options.transition === 'object') {\n            transition = {\n                ...defaultTransition,\n                ...options.transition,\n            };\n        } else {\n            transition = this.config.defaultTransition;\n        }\n\n        return transition;\n    }\n\n    /**\n     * Converts pixel texture coordinates to spherical radians coordinates\n     * @throws {@link PSVError} when the current adapter does not support texture coordinates\n     */\n    textureCoordsToSphericalCoords(point: PanoramaPosition): Position {\n        if (!this.state.textureData?.panoData) {\n            throw new PSVError('Current adapter does not support texture coordinates or no texture has been loaded');\n        }\n\n        const result = this.viewer.adapter.textureCoordsToSphericalCoords(point, this.state.textureData.panoData);\n\n        if (\n            !EULER_ZERO.equals(this.viewer.renderer.panoramaPose)\n            || !EULER_ZERO.equals(this.viewer.renderer.sphereCorrection)\n        ) {\n            this.sphericalCoordsToVector3(result, vector3);\n            vector3.applyEuler(this.viewer.renderer.panoramaPose);\n            vector3.applyEuler(this.viewer.renderer.sphereCorrection);\n            return this.vector3ToSphericalCoords(vector3);\n        } else {\n            return result;\n        }\n    }\n\n    /**\n     * Converts spherical radians coordinates to pixel texture coordinates\n     * @throws {@link PSVError} when the current adapter does not support texture coordinates\n     */\n    sphericalCoordsToTextureCoords(position: Position): PanoramaPosition {\n        if (!this.state.textureData?.panoData) {\n            throw new PSVError('Current adapter does not support texture coordinates or no texture has been loaded');\n        }\n\n        if (\n            !EULER_ZERO.equals(this.viewer.renderer.panoramaPose)\n            || !EULER_ZERO.equals(this.viewer.renderer.sphereCorrection)\n        ) {\n            this.sphericalCoordsToVector3(position, vector3);\n            applyEulerInverse(vector3, this.viewer.renderer.sphereCorrection);\n            applyEulerInverse(vector3, this.viewer.renderer.panoramaPose);\n            position = this.vector3ToSphericalCoords(vector3);\n        }\n\n        return this.viewer.adapter.sphericalCoordsToTextureCoords(position, this.state.textureData.panoData);\n    }\n\n    /**\n     * Converts spherical radians coordinates to a Vector3\n     */\n    sphericalCoordsToVector3(position: Position, vector?: Vector3, distance = SPHERE_RADIUS): Vector3 {\n        if (!vector) {\n            vector = new Vector3();\n        }\n        vector.x = distance * -Math.cos(position.pitch) * Math.sin(position.yaw);\n        vector.y = distance * Math.sin(position.pitch);\n        vector.z = distance * Math.cos(position.pitch) * Math.cos(position.yaw);\n        return vector;\n    }\n\n    /**\n     * Converts a Vector3 to spherical radians coordinates\n     */\n    vector3ToSphericalCoords(vector: Vector3): Position {\n        const phi = Math.acos(vector.y / Math.sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z));\n        const theta = Math.atan2(vector.x, vector.z);\n\n        return {\n            yaw: theta < 0 ? -theta : Math.PI * 2 - theta,\n            pitch: Math.PI / 2 - phi,\n        };\n    }\n\n    /**\n     * Converts position on the viewer to a THREE.Vector3\n     */\n    viewerCoordsToVector3(viewerPoint: Point): Vector3 {\n        const sphereIntersect = this.viewer.renderer\n            .getIntersections(viewerPoint)\n            .filter(i => i.object.userData[VIEWER_DATA]);\n\n        if (sphereIntersect.length) {\n            return sphereIntersect[0].point;\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Converts position on the viewer to spherical radians coordinates\n     */\n    viewerCoordsToSphericalCoords(viewerPoint: Point): Position {\n        const vector = this.viewerCoordsToVector3(viewerPoint);\n        return vector ? this.vector3ToSphericalCoords(vector) : null;\n    }\n\n    /**\n     * Converts a Vector3 to position on the viewer\n     */\n    vector3ToViewerCoords(vector: Vector3): Point {\n        const vectorClone = vector.clone();\n        vectorClone.project(this.viewer.renderer.camera);\n\n        return {\n            x: Math.round(((vectorClone.x + 1) / 2) * this.state.size.width),\n            y: Math.round(((1 - vectorClone.y) / 2) * this.state.size.height),\n        };\n    }\n\n    /**\n     * Converts spherical radians coordinates to position on the viewer\n     */\n    sphericalCoordsToViewerCoords(position: Position): Point {\n        this.sphericalCoordsToVector3(position, vector3);\n        return this.vector3ToViewerCoords(vector3);\n    }\n\n    /**\n     * Checks if a point in the 3D scene is currently visible\n     */\n    isPointVisible(vector: Vector3): boolean;\n\n    /**\n     * Checks if a point on the sphere is currently visible\n     */\n    isPointVisible(position: Position): boolean;\n\n    /**\n     * @internal\n     */\n    isPointVisible(point: Vector3 | Position): boolean {\n        let vector: Vector3;\n        let viewerPoint: Point;\n\n        if (point instanceof Vector3) {\n            vector = point;\n            viewerPoint = this.vector3ToViewerCoords(point);\n        } else if (isExtendedPosition(point)) {\n            vector = this.sphericalCoordsToVector3(point, vector3);\n            viewerPoint = this.vector3ToViewerCoords(vector);\n        } else {\n            return false;\n        }\n\n        return (\n            vector.dot(this.viewer.state.direction) > 0\n            && viewerPoint.x >= 0\n            && viewerPoint.x <= this.viewer.state.size.width\n            && viewerPoint.y >= 0\n            && viewerPoint.y <= this.viewer.state.size.height\n        );\n    }\n\n    /**\n     * Converts pixel position to angles if present and ensure boundaries\n     */\n    cleanPosition(position: ExtendedPosition): Position {\n        if ('yaw' in position || 'pitch' in position) {\n            if (!('yaw' in position) || !('pitch' in position)) {\n                throw new PSVError(`Position is missing 'yaw' or 'pitch'`);\n            }\n            return {\n                yaw: parseAngle(position.yaw),\n                pitch: parseAngle(position.pitch, true),\n            };\n        } else {\n            return this.textureCoordsToSphericalCoords(position);\n        }\n    }\n\n    /**\n     * Ensure a SphereCorrection object is valid\n     */\n    cleanSphereCorrection(sphereCorrection: SphereCorrection): SphereCorrection<number> {\n        return {\n            pan: parseAngle(sphereCorrection?.pan || 0),\n            tilt: parseAngle(sphereCorrection?.tilt || 0, true),\n            roll: parseAngle(sphereCorrection?.roll || 0, true, false),\n        };\n    }\n\n    /**\n     * Parse the pose angles of the pano data\n     */\n    cleanPanoramaPose(panoData: PanoData): SphereCorrection<number> {\n        return {\n            pan: MathUtils.degToRad(panoData?.poseHeading || 0),\n            tilt: MathUtils.degToRad(panoData?.posePitch || 0),\n            roll: MathUtils.degToRad(panoData?.poseRoll || 0),\n        };\n    }\n\n    /**\n     * Update the panorama options if the panorama files contains \"InitialView\" metadata\n     */\n    cleanPanoramaOptions(options: PanoramaOptions, panoData: PanoData): PanoramaOptions {\n        if (!panoData?.isEquirectangular) {\n            return options;\n        }\n\n        if (isNil(options.zoom) && !isNil(panoData.initialFov)) {\n            options = {\n                ...options,\n                zoom: this.fovToZoomLevel(this.hFovToVFov(panoData.initialFov)),\n            };\n        }\n        if (isNil(options.position) && !isNil(panoData.initialHeading) && !isNil(panoData.initialPitch)) {\n            options = {\n                ...options,\n                position: {\n                    yaw: parseAngle(panoData.initialHeading),\n                    pitch: parseAngle(panoData.initialPitch, true),\n                },\n            };\n        }\n        return options;\n    }\n}\n","import { ParsedViewerConfig } from '../model';\nimport type { Viewer } from '../Viewer';\nimport { ViewerState } from './ViewerState';\n\n/**\n * Base class for services\n */\nexport abstract class AbstractService {\n    protected readonly config: ParsedViewerConfig;\n    protected readonly state: ViewerState;\n\n    /**\n     * @internal\n     */\n    constructor(protected readonly viewer: Viewer) {\n        this.config = viewer.config;\n        this.state = viewer.state;\n    }\n\n    /**\n     * Destroys the service\n     * @internal\n     */\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    destroy() {}\n}\n","import { MathUtils, Mesh } from 'three';\nimport {\n    ACTIONS,\n    CAPTURE_EVENTS_CLASS,\n    CTRLZOOM_TIMEOUT,\n    DBLCLICK_DELAY,\n    IDS,\n    KEY_CODES,\n    LONGTOUCH_DELAY,\n    MOVE_THRESHOLD,\n    TWOFINGERSOVERLAY_DELAY,\n    VIEWER_DATA,\n} from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport {\n    BeforeRenderEvent,\n    ClickEvent,\n    DoubleClickEvent,\n    FullscreenEvent,\n    KeypressEvent,\n    ObjectEnterEvent,\n    ObjectHoverEvent,\n    ObjectLeaveEvent,\n    StopAllEvent,\n    ViewerEvents,\n} from '../events';\nimport gestureIcon from '../icons/gesture.svg';\nimport mousewheelIcon from '../icons/mousewheel.svg';\nimport { ClickData, Point, Position } from '../model';\nimport {\n    clone,\n    getEventTarget,\n    getMatchingTarget,\n    getPosition,\n    getTouchData,\n    isEmpty,\n    throttle,\n} from '../utils';\nimport { PressHandler } from '../utils/PressHandler';\nimport type { Viewer } from '../Viewer';\nimport { AbstractService } from './AbstractService';\n\nclass Step {\n    static IDLE = 0;\n    static CLICK = 1;\n    static MOVING = 2;\n\n    private $: number = Step.IDLE;\n\n    is(...steps: number[]): boolean {\n        return steps.some(step => this.$ & step);\n    }\n\n    set(step: number) {\n        this.$ = step;\n    }\n\n    add(step: number) {\n        this.$ |= step;\n    }\n\n    remove(step: number) {\n        this.$ &= ~step;\n    }\n}\n\n/**\n * Events handler\n * @internal\n */\nexport class EventsHandler extends AbstractService {\n    private readonly data = {\n        /** start x position of the click/touch */\n        startMouseX: 0,\n        /** start y position of the click/touch */\n        startMouseY: 0,\n        /** current x position of the cursor */\n        mouseX: 0,\n        /** current y position of the cursor */\n        mouseY: 0,\n        /** current distance between fingers */\n        pinchDist: 0,\n        /** accumulator for smooth movement */\n        moveDelta: { yaw: 0, pitch: 0, zoom: 0 },\n        accumulatorFactor: 0,\n        /** when the Ctrl key is pressed */\n        ctrlKeyDown: false,\n        /** temporary storage of click data between two clicks */\n        dblclickData: null as ClickData,\n        dblclickTimeout: null as ReturnType<typeof setTimeout>,\n        longtouchTimeout: null as ReturnType<typeof setTimeout>,\n        twofingersTimeout: null as ReturnType<typeof setTimeout>,\n        ctrlZoomTimeout: null as ReturnType<typeof setTimeout>,\n    };\n\n    private readonly step = new Step();\n    private readonly keyHandler = new PressHandler<ACTIONS>();\n    private readonly resizeObserver = new ResizeObserver(throttle(() => this.viewer.autoSize(), 50));\n    private readonly moveThreshold = MOVE_THRESHOLD * SYSTEM.pixelRatio;\n\n    constructor(viewer: Viewer) {\n        super(viewer);\n    }\n\n    /**\n     * @internal\n     */\n    init() {\n        window.addEventListener('keydown', this, { passive: false });\n        window.addEventListener('keyup', this);\n        this.viewer.container.addEventListener('mousedown', this);\n        window.addEventListener('mousemove', this, { passive: false });\n        window.addEventListener('mouseup', this);\n        this.viewer.container.addEventListener('touchstart', this, { passive: false });\n        window.addEventListener('touchmove', this, { passive: false });\n        window.addEventListener('touchend', this, { passive: false });\n        this.viewer.container.addEventListener('wheel', this, { passive: false });\n        document.addEventListener('fullscreenchange', this);\n        this.resizeObserver.observe(this.viewer.container);\n\n        this.viewer.addEventListener(BeforeRenderEvent.type, this);\n        this.viewer.addEventListener(StopAllEvent.type, this);\n    }\n\n    override destroy() {\n        window.removeEventListener('keydown', this);\n        window.removeEventListener('keyup', this);\n        this.viewer.container.removeEventListener('mousedown', this);\n        window.removeEventListener('mousemove', this);\n        window.removeEventListener('mouseup', this);\n        this.viewer.container.removeEventListener('touchstart', this);\n        window.removeEventListener('touchmove', this);\n        window.removeEventListener('touchend', this);\n        this.viewer.container.removeEventListener('wheel', this);\n        document.removeEventListener('fullscreenchange', this);\n        this.resizeObserver.disconnect();\n\n        this.viewer.removeEventListener(BeforeRenderEvent.type, this);\n        this.viewer.removeEventListener(StopAllEvent.type, this);\n\n        clearTimeout(this.data.dblclickTimeout);\n        clearTimeout(this.data.longtouchTimeout);\n        clearTimeout(this.data.twofingersTimeout);\n        clearTimeout(this.data.ctrlZoomTimeout);\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(evt: Event) {\n        switch (evt.type) {\n            case 'keydown': this.__onKeyDown(evt as KeyboardEvent); break;\n            case 'keyup': this.__onKeyUp(); break;\n            case 'mousemove': this.__onMouseMove(evt as MouseEvent); break;\n            case 'mouseup': this.__onMouseUp(evt as MouseEvent); break;\n            case 'touchmove': this.__onTouchMove(evt as TouchEvent); break;\n            case 'touchend': this.__onTouchEnd(evt as TouchEvent); break;\n            case 'fullscreenchange': this.__onFullscreenChange(); break;\n            case BeforeRenderEvent.type: this.__applyMoveDelta(); break;\n            case StopAllEvent.type: this.__clearMoveDelta(); break;\n        }\n\n        if (!getMatchingTarget(evt, '.' + CAPTURE_EVENTS_CLASS)) {\n            switch (evt.type) {\n                case 'mousedown': this.__onMouseDown(evt as MouseEvent); break;\n                case 'touchstart': this.__onTouchStart(evt as TouchEvent); break;\n                case 'wheel': this.__onMouseWheel(evt as WheelEvent); break;\n            }\n        }\n    }\n\n    /**\n     * Handles keyboard events\n     */\n    private __onKeyDown(e: KeyboardEvent) {\n        if (this.config.mousewheelCtrlKey) {\n            this.data.ctrlKeyDown = e.key === KEY_CODES.Control;\n\n            if (this.data.ctrlKeyDown) {\n                clearTimeout(this.data.ctrlZoomTimeout);\n                this.viewer.overlay.hide(IDS.CTRL_ZOOM);\n            }\n        }\n\n        if (!this.viewer.dispatchEvent(new KeypressEvent(e.key, e))) {\n            return;\n        }\n\n        if (!this.state.keyboardEnabled) {\n            return;\n        }\n\n        const action = this.config.keyboardActions?.[e.key];\n\n        if (typeof action === 'function') {\n            action(this.viewer, e);\n            e.preventDefault();\n            return;\n        }\n\n        if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {\n            return;\n        }\n\n        if (action && !this.keyHandler.pending) {\n            if (action !== ACTIONS.ZOOM_IN && action !== ACTIONS.ZOOM_OUT) {\n                this.viewer.stopAll();\n            }\n\n            switch (action) {\n                case ACTIONS.ROTATE_UP: this.viewer.dynamics.position.roll({ pitch: false }); break;\n                case ACTIONS.ROTATE_DOWN: this.viewer.dynamics.position.roll({ pitch: true }); break;\n                case ACTIONS.ROTATE_RIGHT: this.viewer.dynamics.position.roll({ yaw: false }); break;\n                case ACTIONS.ROTATE_LEFT: this.viewer.dynamics.position.roll({ yaw: true }); break;\n                case ACTIONS.ZOOM_IN: this.viewer.dynamics.zoom.roll(false); break;\n                case ACTIONS.ZOOM_OUT: this.viewer.dynamics.zoom.roll(true); break;\n            }\n\n            this.keyHandler.down(action);\n            e.preventDefault();\n        }\n    }\n\n    /**\n     * Handles keyboard events\n     */\n    private __onKeyUp() {\n        this.data.ctrlKeyDown = false;\n\n        if (!this.state.keyboardEnabled) {\n            return;\n        }\n\n        this.keyHandler.up((action) => {\n            if (action === ACTIONS.ZOOM_IN || action === ACTIONS.ZOOM_OUT) {\n                this.viewer.dynamics.zoom.stop();\n            } else {\n                this.viewer.dynamics.position.stop();\n                this.viewer.resetIdleTimer();\n            }\n        });\n    }\n\n    /**\n     * Handles mouse down events\n     */\n    private __onMouseDown(evt: MouseEvent) {\n        this.step.add(Step.CLICK);\n        this.data.startMouseX = evt.clientX;\n        this.data.startMouseY = evt.clientY;\n    }\n\n    /**\n     *Handles mouse up events\n     */\n    private __onMouseUp(evt: MouseEvent) {\n        if (this.step.is(Step.CLICK, Step.MOVING)) {\n            this.__stopMove(evt.clientX, evt.clientY, evt, evt.button === 2);\n        }\n    }\n\n    /**\n     * Handles mouse move events\n     */\n    private __onMouseMove(evt: MouseEvent) {\n        if (this.config.mousemove && this.step.is(Step.CLICK, Step.MOVING)) {\n            evt.preventDefault();\n            this.__doMove(evt.clientX, evt.clientY);\n        }\n\n        this.__handleObjectsEvents(evt);\n    }\n\n    /**\n     * Handles touch events\n     */\n    private __onTouchStart(evt: TouchEvent) {\n        if (evt.touches.length === 1) {\n            this.step.add(Step.CLICK);\n            this.data.startMouseX = evt.touches[0].clientX;\n            this.data.startMouseY = evt.touches[0].clientY;\n\n            if (!this.data.longtouchTimeout) {\n                this.data.longtouchTimeout = setTimeout(() => {\n                    const touch = evt.touches[0];\n                    this.__stopMove(touch.clientX, touch.clientY, evt, true);\n                    this.data.longtouchTimeout = null;\n                }, LONGTOUCH_DELAY);\n            }\n        } else if (evt.touches.length === 2) {\n            this.step.set(Step.IDLE);\n            this.__cancelLongTouch();\n\n            if (this.config.mousemove) {\n                this.__cancelTwoFingersOverlay();\n                this.__startMoveZoom(evt);\n                evt.preventDefault();\n            }\n        }\n    }\n\n    /**\n     * Handles touch events\n     */\n    private __onTouchEnd(evt: TouchEvent) {\n        this.__cancelLongTouch();\n\n        if (this.step.is(Step.CLICK, Step.MOVING)) {\n            evt.preventDefault();\n            this.__cancelTwoFingersOverlay();\n\n            if (evt.touches.length === 1) {\n                this.__stopMove(this.data.mouseX, this.data.mouseY);\n            } else if (evt.touches.length === 0) {\n                const touch = evt.changedTouches[0];\n                this.__stopMove(touch.clientX, touch.clientY, evt);\n            }\n        }\n    }\n\n    /**\n     * Handles touch move events\n     */\n    private __onTouchMove(evt: TouchEvent) {\n        this.__cancelLongTouch();\n\n        if (!this.config.mousemove) {\n            return;\n        }\n\n        if (evt.touches.length === 1) {\n            if (this.config.touchmoveTwoFingers) {\n                if (this.step.is(Step.CLICK) && !this.data.twofingersTimeout) {\n                    this.data.twofingersTimeout = setTimeout(() => {\n                        this.viewer.overlay.show({\n                            id: IDS.TWO_FINGERS,\n                            image: gestureIcon,\n                            title: this.config.lang.twoFingers,\n                        });\n                    }, TWOFINGERSOVERLAY_DELAY);\n                }\n            } else if (this.step.is(Step.CLICK, Step.MOVING)) {\n                evt.preventDefault();\n                const touch = evt.touches[0];\n                this.__doMove(touch.clientX, touch.clientY);\n            }\n        } else {\n            this.__doMoveZoom(evt);\n            this.__cancelTwoFingersOverlay();\n        }\n    }\n\n    /**\n     * Cancel the long touch timer if any\n     */\n    private __cancelLongTouch() {\n        if (this.data.longtouchTimeout) {\n            clearTimeout(this.data.longtouchTimeout);\n            this.data.longtouchTimeout = null;\n        }\n    }\n\n    /**\n     * Cancel the two fingers overlay timer if any\n     */\n    private __cancelTwoFingersOverlay() {\n        if (this.config.touchmoveTwoFingers) {\n            if (this.data.twofingersTimeout) {\n                clearTimeout(this.data.twofingersTimeout);\n                this.data.twofingersTimeout = null;\n            }\n            this.viewer.overlay.hide(IDS.TWO_FINGERS);\n        }\n    }\n\n    /**\n     * Handles mouse wheel events\n     */\n    private __onMouseWheel(evt: WheelEvent) {\n        if (!this.config.mousewheel || !evt.deltaY) {\n            return;\n        }\n\n        if (this.config.mousewheelCtrlKey && !this.data.ctrlKeyDown) {\n            this.viewer.overlay.show({\n                id: IDS.CTRL_ZOOM,\n                image: mousewheelIcon,\n                title: this.config.lang.ctrlZoom,\n            });\n\n            clearTimeout(this.data.ctrlZoomTimeout);\n            this.data.ctrlZoomTimeout = setTimeout(() => this.viewer.overlay.hide(IDS.CTRL_ZOOM), CTRLZOOM_TIMEOUT);\n\n            return;\n        }\n\n        evt.preventDefault();\n        evt.stopPropagation();\n\n        const delta = (evt.deltaY / Math.abs(evt.deltaY)) * 5 * this.config.zoomSpeed;\n        if (delta !== 0) {\n            this.viewer.dynamics.zoom.step(-delta, 5);\n        }\n    }\n\n    /**\n     * Handles fullscreen events\n     */\n    private __onFullscreenChange() {\n        const fullscreen = this.viewer.isFullscreenEnabled();\n\n        if (this.config.keyboard === 'fullscreen') {\n            if (fullscreen) {\n                this.viewer.startKeyboardControl();\n            } else {\n                this.viewer.stopKeyboardControl();\n            }\n        }\n\n        this.viewer.dispatchEvent(new FullscreenEvent(fullscreen));\n    }\n\n    /**\n     * Resets all state variables\n     */\n    private __resetMove() {\n        this.step.set(Step.IDLE);\n        this.data.mouseX = 0;\n        this.data.mouseY = 0;\n        this.data.startMouseX = 0;\n        this.data.startMouseY = 0;\n    }\n\n    /**\n     * Initializes the combines move and zoom\n     */\n    private __startMoveZoom(evt: TouchEvent) {\n        this.viewer.stopAll();\n        this.__resetMove();\n\n        const touchData = getTouchData(evt);\n\n        this.step.set(Step.MOVING);\n        this.data.accumulatorFactor = this.config.moveInertia;\n        ({\n            distance: this.data.pinchDist,\n            center: { x: this.data.mouseX, y: this.data.mouseY },\n        } = touchData);\n    }\n\n    /**\n     * Stops the movement\n     * @description If the move threshold was not reached a click event is triggered\n     */\n    private __stopMove(clientX: number, clientY: number, event?: Event, rightclick = false) {\n        if (this.step.is(Step.CLICK) && !this.__moveThresholdReached(clientX, clientY)) {\n            this.__doClick(clientX, clientY, event, rightclick);\n        }\n\n        if (this.config.moveInertia) {\n            this.data.accumulatorFactor = Math.pow(this.config.moveInertia, 0.5);\n        }\n\n        this.__resetMove();\n        this.viewer.resetIdleTimer();\n    }\n\n    /**\n     * Triggers an event with all coordinates when a simple click is performed\n     */\n    private __doClick(clientX: number, clientY: number, event?: Event, rightclick = false) {\n        const boundingRect = this.viewer.container.getBoundingClientRect();\n\n        const viewerX = clientX - boundingRect.left;\n        const viewerY = clientY - boundingRect.top;\n\n        const intersections = this.viewer.renderer.getIntersections({ x: viewerX, y: viewerY });\n        const sphereIntersection = intersections.find(i => i.object.userData[VIEWER_DATA]);\n\n        if (sphereIntersection) {\n            const sphericalCoords = this.viewer.dataHelper.vector3ToSphericalCoords(sphereIntersection.point);\n\n            const data: ClickData = {\n                rightclick: rightclick,\n                originalEvent: event,\n                target: getEventTarget(event),\n                clientX,\n                clientY,\n                viewerX,\n                viewerY,\n                yaw: sphericalCoords.yaw,\n                pitch: sphericalCoords.pitch,\n                objects: intersections.map(i => i.object).filter(o => !o.userData[VIEWER_DATA]),\n            };\n\n            try {\n                const textureCoords = this.viewer.dataHelper.sphericalCoordsToTextureCoords(data);\n                Object.assign(data, textureCoords);\n            } catch {\n                // nothing\n            }\n\n            if (!this.data.dblclickTimeout) {\n                this.viewer.dispatchEvent(new ClickEvent(data));\n\n                this.data.dblclickData = clone(data);\n                this.data.dblclickTimeout = setTimeout(() => {\n                    this.data.dblclickTimeout = null;\n                    this.data.dblclickData = null;\n                }, DBLCLICK_DELAY);\n            } else {\n                if (\n                    Math.abs(this.data.dblclickData.clientX - data.clientX) < this.moveThreshold\n                    && Math.abs(this.data.dblclickData.clientY - data.clientY) < this.moveThreshold\n                ) {\n                    this.viewer.dispatchEvent(new DoubleClickEvent(this.data.dblclickData));\n                }\n\n                clearTimeout(this.data.dblclickTimeout);\n                this.data.dblclickTimeout = null;\n                this.data.dblclickData = null;\n            }\n        }\n    }\n\n    /**\n     * Trigger events for observed THREE objects\n     */\n    private __handleObjectsEvents(evt: MouseEvent) {\n        if (!isEmpty(this.state.objectsObservers) && evt.composedPath().includes(this.viewer.container)) {\n            const viewerPos = getPosition(this.viewer.container);\n\n            const viewerPoint: Point = {\n                x: evt.clientX - viewerPos.x,\n                y: evt.clientY - viewerPos.y,\n            };\n\n            const intersections = this.viewer.renderer.getIntersections(viewerPoint);\n\n            const emit = (\n                object: Mesh,\n                key: string,\n                evtCtor: new (e: MouseEvent, o: Mesh, pt: Point, data: any) => ViewerEvents,\n            ) => {\n                this.viewer.dispatchEvent(new evtCtor(evt, object, viewerPoint, key));\n            };\n\n            for (const [key, object] of Object.entries(this.state.objectsObservers) as Array<[string, Mesh | null]>) {\n                const intersection = intersections.find(i => i.object.userData[key]);\n\n                if (intersection) {\n                    if (object && intersection.object !== object) {\n                        emit(object, key, ObjectLeaveEvent);\n                        this.state.objectsObservers[key] = null;\n                    }\n\n                    if (!object) {\n                        this.state.objectsObservers[key] = intersection.object;\n                        emit(intersection.object, key, ObjectEnterEvent);\n                    } else {\n                        emit(intersection.object, key, ObjectHoverEvent);\n                    }\n                } else if (object) {\n                    emit(object, key, ObjectLeaveEvent);\n                    this.state.objectsObservers[key] = null;\n                }\n            }\n        }\n    }\n\n    /**\n     * Starts moving when crossing moveThreshold and performs movement\n     */\n    private __doMove(clientX: number, clientY: number) {\n        if (this.step.is(Step.CLICK) && this.__moveThresholdReached(clientX, clientY)) {\n            this.viewer.stopAll();\n            this.__resetMove();\n            this.step.set(Step.MOVING);\n            this.data.mouseX = clientX;\n            this.data.mouseY = clientY;\n            this.data.accumulatorFactor = this.config.moveInertia;\n        } else if (this.step.is(Step.MOVING)) {\n            const x = (clientX - this.data.mouseX) * Math.cos(this.state.roll) - (clientY - this.data.mouseY) * Math.sin(this.state.roll);\n            const y = (clientY - this.data.mouseY) * Math.cos(this.state.roll) + (clientX - this.data.mouseX) * Math.sin(this.state.roll);\n\n            const rotation: Position = {\n                yaw: this.config.moveSpeed * (x / this.state.size.width) * MathUtils.degToRad(this.state.hFov),\n                pitch: this.config.moveSpeed * (y / this.state.size.height) * MathUtils.degToRad(this.state.vFov),\n            };\n\n            this.data.moveDelta.yaw += rotation.yaw;\n            this.data.moveDelta.pitch += rotation.pitch;\n\n            this.data.mouseX = clientX;\n            this.data.mouseY = clientY;\n        }\n    }\n\n    /**\n     * Checks if the cursor was move beyond the move threshold\n     */\n    private __moveThresholdReached(clientX: number, clientY: number) {\n        return (\n            Math.abs(clientX - this.data.startMouseX) >= this.moveThreshold\n            || Math.abs(clientY - this.data.startMouseY) >= this.moveThreshold\n        );\n    }\n\n    /**\n     * Perfoms combined move and zoom\n     */\n    private __doMoveZoom(evt: TouchEvent) {\n        if (this.step.is(Step.MOVING)) {\n            evt.preventDefault();\n\n            const touchData = getTouchData(evt);\n\n            this.__doMove(touchData.center.x, touchData.center.y);\n\n            this.data.moveDelta.zoom += this.config.zoomSpeed * ((touchData.distance - this.data.pinchDist) / SYSTEM.pixelRatio);\n\n            this.data.pinchDist = touchData.distance;\n        }\n    }\n\n    private __applyMoveDelta() {\n        const EPS = 0.001;\n\n        if (Math.abs(this.data.moveDelta.yaw) > 0 || Math.abs(this.data.moveDelta.pitch) > 0) {\n            const currentPosition = this.viewer.getPosition();\n            this.viewer.rotate({\n                yaw: currentPosition.yaw - this.data.moveDelta.yaw * (1 - this.config.moveInertia),\n                pitch: currentPosition.pitch + this.data.moveDelta.pitch * (1 - this.config.moveInertia),\n            });\n\n            this.data.moveDelta.yaw *= this.data.accumulatorFactor;\n            this.data.moveDelta.pitch *= this.data.accumulatorFactor;\n\n            if (Math.abs(this.data.moveDelta.yaw) <= EPS) {\n                this.data.moveDelta.yaw = 0;\n            }\n            if (Math.abs(this.data.moveDelta.pitch) <= EPS) {\n                this.data.moveDelta.pitch = 0;\n            }\n        }\n\n        if (Math.abs(this.data.moveDelta.zoom) > 0) {\n            const currentZoom = this.viewer.getZoomLevel();\n            this.viewer.zoom(currentZoom + this.data.moveDelta.zoom * (1 - this.config.moveInertia));\n\n            this.data.moveDelta.zoom *= this.config.moveInertia;\n\n            if (Math.abs(this.data.moveDelta.zoom) <= EPS) {\n                this.data.moveDelta.zoom = 0;\n            }\n        }\n    }\n\n    private __clearMoveDelta() {\n        this.data.moveDelta.yaw = 0;\n        this.data.moveDelta.pitch = 0;\n        this.data.moveDelta.zoom = 0;\n    }\n}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><path fill=\"currentColor\" d=\"M33.38 33.2a1.96 1.96 0 0 0 1.5-3.23 10.61 10.61 0 0 1 7.18-17.51c.7-.06 1.31-.49 1.61-1.12a13.02 13.02 0 0 1 11.74-7.43c7.14 0 12.96 5.8 12.96 12.9 0 3.07-1.1 6.05-3.1 8.38-.7.82-.61 2.05.21 2.76.83.7 2.07.6 2.78-.22a16.77 16.77 0 0 0 4.04-10.91C72.3 7.54 64.72 0 55.4 0a16.98 16.98 0 0 0-14.79 8.7 14.6 14.6 0 0 0-12.23 14.36c0 3.46 1.25 6.82 3.5 9.45.4.45.94.69 1.5.69m45.74 43.55a22.13 22.13 0 0 1-5.23 12.4c-4 4.55-9.53 6.86-16.42 6.86-12.6 0-20.1-10.8-20.17-10.91a1.82 1.82 0 0 0-.08-.1c-5.3-6.83-14.55-23.82-17.27-28.87-.05-.1 0-.21.02-.23a6.3 6.3 0 0 1 8.24 1.85l9.38 12.59a1.97 1.97 0 0 0 3.54-1.17V25.34a4 4 0 0 1 1.19-2.87 3.32 3.32 0 0 1 2.4-.95c1.88.05 3.4 1.82 3.4 3.94v24.32a1.96 1.96 0 0 0 3.93 0v-33.1a3.5 3.5 0 0 1 7 0v35.39a1.96 1.96 0 0 0 3.93 0v-.44c.05-2.05 1.6-3.7 3.49-3.7 1.93 0 3.5 1.7 3.5 3.82v5.63c0 .24.04.48.13.71l.1.26a1.97 1.97 0 0 0 3.76-.37c.33-1.78 1.77-3.07 3.43-3.07 1.9 0 3.45 1.67 3.5 3.74l-1.77 18.1zM77.39 51c-1.25 0-2.45.32-3.5.9v-.15c0-4.27-3.33-7.74-7.42-7.74-1.26 0-2.45.33-3.5.9V16.69a7.42 7.42 0 0 0-14.85 0v1.86a7 7 0 0 0-3.28-.94 7.21 7.21 0 0 0-5.26 2.07 7.92 7.92 0 0 0-2.38 5.67v37.9l-5.83-7.82a10.2 10.2 0 0 0-13.35-2.92 4.1 4.1 0 0 0-1.53 5.48C20 64.52 28.74 80.45 34.07 87.34c.72 1.04 9.02 12.59 23.4 12.59 7.96 0 14.66-2.84 19.38-8.2a26.06 26.06 0 0 0 6.18-14.6l1.78-18.2v-.2c0-4.26-3.32-7.73-7.42-7.73z\"/><!--Created by AomAm from the Noun Project--></svg>\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"10 17 79 79\"><path fill=\"currentColor\" d=\"M38.1 29.27c-.24 0-.44.2-.44.45v10.7a.45.45 0 00.9 0v-10.7c0-.25-.2-.45-.45-.45zm10.2 26.66a11.54 11.54 0 01-8.48-6.14.45.45 0 10-.8.41 12.45 12.45 0 009.22 6.62.45.45 0 00.07-.9zm24.55-13.08a23.04 23.04 0 00-22.56-23v7.07l-.01.05a2.83 2.83 0 012.39 2.78v14.03l.09-.02h8.84v-9.22a.45.45 0 11.9 0v9.22h10.35v-.9zm0 27.33V44.66H62.5c-.02 2.01-.52 4-1.47 5.76a.45.45 0 01-.61.18.45.45 0 01-.19-.61 11.54 11.54 0 001.36-5.33h-8.83l-.1-.01a2.83 2.83 0 01-2.83 2.84h-.04-.04a2.83 2.83 0 01-2.83-2.83v-14.9a2.82 2.82 0 012.47-2.8v-7.11a23.04 23.04 0 00-22.57 23v.91h14.72V29.88a8.2 8.2 0 015.02-7.57c.22-.1.5.01.59.24.1.23-.01.5-.24.6a7.3 7.3 0 00-4.47 6.73v13.88h3.9a.45.45 0 110 .9h-3.9v.15a7.32 7.32 0 0011.23 6.17.45.45 0 01.49.76 8.22 8.22 0 01-12.62-6.93v-.15H26.82v25.52a23.04 23.04 0 0023.01 23.01 23.04 23.04 0 0023.02-23.01zm1.8-27.33v27.33A24.85 24.85 0 0149.84 95a24.85 24.85 0 01-24.82-24.82V42.85a24.85 24.85 0 0124.82-24.82 24.85 24.85 0 0124.83 24.82zM57.98 29.88v9.36a.45.45 0 11-.9 0v-9.36a7.28 7.28 0 00-3.4-6.17.45.45 0 01.49-.76 8.18 8.18 0 013.8 6.93z\"/><!-- Created by Icon Island from the Noun Project --></svg>\n","import {\n    Box3,\n    ColorManagement,\n    Euler,\n    Frustum,\n    Group,\n    Intersection,\n    LinearSRGBColorSpace,\n    LinearToneMapping,\n    MathUtils,\n    Matrix4,\n    Mesh,\n    MeshBasicMaterial,\n    Object3D,\n    PerspectiveCamera,\n    Raycaster,\n    Scene,\n    SphereGeometry,\n    Vector2,\n    Vector3,\n    WebGLRenderTarget,\n    WebGLRenderer,\n} from 'three';\nimport { SPHERE_RADIUS, VIEWER_DATA } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport {\n    BeforeAnimateEvent,\n    BeforeRenderEvent,\n    ConfigChangedEvent,\n    PositionUpdatedEvent,\n    RenderEvent,\n    RollUpdatedEvent,\n    SizeUpdatedEvent,\n    ZoomUpdatedEvent,\n} from '../events';\nimport {\n    PanoData,\n    PanoramaOptions,\n    Point,\n    SphereCorrection,\n    TextureData,\n    TransitionOptions,\n} from '../model';\nimport { Animation, isNil } from '../utils';\nimport { Viewer } from '../Viewer';\nimport { AbstractService } from './AbstractService';\n\n// https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791\nColorManagement.enabled = false;\n\nconst vector2 = new Vector2();\nconst matrix4 = new Matrix4();\nconst box3 = new Box3();\n\nexport type CustomRenderer = Pick<WebGLRenderer, 'render'> & {\n    getIntersections?(raycaster: Raycaster, vector: Vector2): Array<Intersection<Mesh>>;\n};\n\n/**\n * Controller for the three.js scene\n */\nexport class Renderer extends AbstractService {\n    private readonly renderer: WebGLRenderer;\n    private readonly scene: Scene;\n    /** @internal */\n    public readonly camera: PerspectiveCamera;\n    /** @internal */\n    public mesh: Object3D;\n    private meshContainer: Group;\n    private readonly raycaster: Raycaster;\n    private readonly frustum: Frustum;\n    private readonly container: HTMLElement;\n\n    private timestamp?: number;\n    private frustumNeedsUpdate = true;\n    private customRenderer?: CustomRenderer;\n\n    get panoramaPose(): Euler {\n        return this.mesh.rotation;\n    }\n\n    get sphereCorrection(): Euler {\n        return this.meshContainer.rotation;\n    }\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer);\n\n        this.renderer = new WebGLRenderer(this.config.rendererParameters);\n        this.renderer.setPixelRatio(SYSTEM.pixelRatio);\n        // https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791\n        this.renderer.outputColorSpace = LinearSRGBColorSpace;\n        this.renderer.toneMapping = LinearToneMapping;\n        this.renderer.domElement.className = 'psv-canvas';\n        this.renderer.domElement.style.background = this.config.canvasBackground;\n\n        this.scene = new Scene();\n\n        this.camera = new PerspectiveCamera(50, 16 / 9, 0.1, 2 * SPHERE_RADIUS);\n        this.camera.matrixAutoUpdate = false;\n\n        // mesh used to detect clicks on the viewer\n        const raycasterMesh = new Mesh(\n            new SphereGeometry(SPHERE_RADIUS).scale(-1, 1, 1),\n            new MeshBasicMaterial({ opacity: 0, transparent: true, depthTest: false, depthWrite: false }),\n        );\n        raycasterMesh.userData = { [VIEWER_DATA]: true };\n        this.scene.add(raycasterMesh);\n\n        this.raycaster = new Raycaster();\n        this.frustum = new Frustum();\n\n        this.container = document.createElement('div');\n        this.container.className = 'psv-canvas-container';\n        this.container.appendChild(this.renderer.domElement);\n        this.viewer.container.appendChild(this.container);\n\n        this.container.addEventListener('contextmenu', e => e.preventDefault());\n\n        this.viewer.addEventListener(SizeUpdatedEvent.type, this);\n        this.viewer.addEventListener(ZoomUpdatedEvent.type, this);\n        this.viewer.addEventListener(PositionUpdatedEvent.type, this);\n        this.viewer.addEventListener(RollUpdatedEvent.type, this);\n        this.viewer.addEventListener(ConfigChangedEvent.type, this);\n\n        this.hide();\n    }\n\n    /**\n     * @internal\n     */\n    init() {\n        this.show();\n        this.renderer.setAnimationLoop(t => this.__renderLoop(t));\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        // destroy ThreeJS\n        this.renderer.setAnimationLoop(null);\n        this.cleanScene(this.scene);\n        this.renderer.dispose();\n\n        // remove container\n        this.viewer.container.removeChild(this.container);\n\n        this.viewer.removeEventListener(SizeUpdatedEvent.type, this);\n        this.viewer.removeEventListener(ZoomUpdatedEvent.type, this);\n        this.viewer.removeEventListener(PositionUpdatedEvent.type, this);\n        this.viewer.removeEventListener(RollUpdatedEvent.type, this);\n        this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n        super.destroy();\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        switch (e.type) {\n            case SizeUpdatedEvent.type: this.__onSizeUpdated(); break;\n            case ZoomUpdatedEvent.type: this.__onZoomUpdated(); break;\n            case PositionUpdatedEvent.type: this.__onPositionUpdated(); break;\n            case RollUpdatedEvent.type: this.__onPositionUpdated(); break;\n            case ConfigChangedEvent.type:\n                if ((e as ConfigChangedEvent).containsOptions('fisheye')) {\n                    this.__onPositionUpdated();\n                }\n                if ((e as ConfigChangedEvent).containsOptions('canvasBackground')) {\n                    this.renderer.domElement.style.background = this.config.canvasBackground;\n                }\n                break;\n        }\n    }\n\n    /**\n     * Hides the viewer\n     */\n    hide() {\n        this.container.style.opacity = '0';\n    }\n\n    /**\n     * Shows the viewer\n     */\n    show() {\n        this.container.style.opacity = '1';\n    }\n\n    /**\n     * Resets or replaces the THREE renderer by a custom one\n     */\n    setCustomRenderer(factory: ((renderer: WebGLRenderer) => CustomRenderer) | null) {\n        if (factory) {\n            this.customRenderer = factory(this.renderer);\n        } else {\n            this.customRenderer = null;\n        }\n        this.viewer.needsUpdate();\n    }\n\n    /**\n     * Updates the size of the renderer and the aspect of the camera\n     */\n    private __onSizeUpdated() {\n        this.renderer.setSize(this.state.size.width, this.state.size.height);\n        this.camera.aspect = this.state.aspect;\n        this.camera.updateProjectionMatrix();\n        this.viewer.needsUpdate();\n        this.frustumNeedsUpdate = true;\n    }\n\n    /**\n     * Updates the fov of the camera\n     */\n    private __onZoomUpdated() {\n        this.camera.fov = this.state.vFov;\n        this.camera.updateProjectionMatrix();\n        this.viewer.needsUpdate();\n        this.frustumNeedsUpdate = true;\n    }\n\n    /**\n     * Updates the position of the camera\n     */\n    private __onPositionUpdated() {\n        this.camera.position.set(0, 0, 0);\n        this.camera.lookAt(this.state.direction);\n        if (this.config.fisheye) {\n            this.camera.position\n                .copy(this.state.direction)\n                .multiplyScalar(this.config.fisheye / 2)\n                .negate();\n        }\n        this.camera.rotateZ(-this.state.roll);\n\n        this.camera.updateMatrix();\n        this.camera.updateMatrixWorld();\n\n        this.viewer.needsUpdate();\n        this.frustumNeedsUpdate = true;\n    }\n\n    /**\n     * Main event loop, performs a render if `state.needsUpdate` is true\n     */\n    private __renderLoop(timestamp: number) {\n        const elapsed = !this.timestamp ? 0 : timestamp - this.timestamp;\n        this.timestamp = timestamp;\n\n        this.viewer.dispatchEvent(new BeforeRenderEvent(timestamp, elapsed));\n        this.viewer.dynamics.update(elapsed);\n\n        if (this.state.needsUpdate || this.state.continuousUpdateCount > 0) {\n            this.state.needsUpdate = false;\n            (this.customRenderer || this.renderer).render(this.scene, this.camera);\n            this.viewer.dispatchEvent(new RenderEvent());\n        }\n    }\n\n    /**\n     * Applies the texture to the scene, creates the scene if needed\n     * @internal\n     */\n    setTexture(textureData: TextureData) {\n        if (!this.meshContainer) {\n            this.meshContainer = new Group();\n            this.scene.add(this.meshContainer);\n        }\n\n        if (this.state.textureData) {\n            this.viewer.adapter.disposeTexture(this.state.textureData);\n        }\n\n        if (this.mesh) {\n            this.meshContainer.remove(this.mesh);\n            this.viewer.adapter.disposeMesh(this.mesh);\n        }\n\n        this.mesh = this.viewer.adapter.createMesh(textureData.panoData);\n        this.viewer.adapter.setTexture(this.mesh, textureData, false);\n        this.meshContainer.add(this.mesh);\n\n        this.state.textureData = textureData;\n\n        this.viewer.needsUpdate();\n    }\n\n    /**\n     * Applies a panorama data pose to a Mesh\n     * @internal\n     */\n    setPanoramaPose(panoData: PanoData, mesh: Object3D = this.mesh) {\n        const cleanCorrection = this.viewer.dataHelper.cleanPanoramaPose(panoData);\n        mesh.rotation.set(cleanCorrection.tilt, cleanCorrection.pan, cleanCorrection.roll, 'YXZ');\n    }\n\n    /**\n     * Applies a SphereCorrection to a Group\n     * @internal\n     */\n    setSphereCorrection(sphereCorrection: SphereCorrection, group: Object3D = this.meshContainer) {\n        const cleanCorrection = this.viewer.dataHelper.cleanSphereCorrection(sphereCorrection);\n        group.rotation.set(cleanCorrection.tilt, cleanCorrection.pan, cleanCorrection.roll, 'YXZ');\n    }\n\n    /**\n     * Performs transition between the current and a new texture\n     * @internal\n     */\n    transition(textureData: TextureData, options: PanoramaOptions, transition: TransitionOptions): Animation<any> {\n        // do not animate zoom in black/white transition without rotation\n        const zoomTransition = transition.effect === 'fade' || transition.rotation;\n\n        const positionProvided = !isNil(options.position);\n        const zoomProvided = !isNil(options.zoom);\n\n        const e = new BeforeAnimateEvent(\n            positionProvided ? this.viewer.dataHelper.cleanPosition(options.position) : undefined,\n            options.zoom,\n        );\n        this.viewer.dispatchEvent(e);\n\n        const tempContainer = new Group();\n        const newMesh = this.viewer.adapter.createMesh(textureData.panoData);\n        this.viewer.adapter.setTexture(newMesh, textureData, true);\n        this.viewer.adapter.setTextureOpacity(newMesh, 0);\n        this.setPanoramaPose(textureData.panoData, newMesh);\n        this.setSphereCorrection(options.sphereCorrection, tempContainer);\n\n        // rotate the new sphere to make the target position face the camera\n        if (positionProvided && !transition.rotation) {\n            const currentPosition = this.viewer.getPosition();\n\n            // rotation along the vertical axis\n            const verticalAxis = new Vector3(0, 1, 0);\n            tempContainer.rotateOnWorldAxis(verticalAxis, e.position.yaw - currentPosition.yaw);\n\n            // rotation along the camera horizontal axis\n            const horizontalAxis = new Vector3(0, 1, 0).cross(this.camera.getWorldDirection(new Vector3())).normalize();\n            tempContainer.rotateOnWorldAxis(horizontalAxis, e.position.pitch - currentPosition.pitch);\n        }\n\n        tempContainer.add(newMesh);\n        this.scene.add(tempContainer);\n\n        // make sure the new texture is transfered to the GPU before starting the animation\n        this.renderer.setRenderTarget(new WebGLRenderTarget<any>());\n        this.renderer.render(this.scene, this.camera);\n        this.renderer.setRenderTarget(null);\n\n        const { duration, properties } = this.viewer.dataHelper.getAnimationProperties(\n            transition.speed,\n            transition.rotation ? e.position : null,\n            zoomTransition ? e.zoomLevel : null,\n        );\n\n        const animation = new Animation({\n            properties: {\n                ...properties,\n                opacity: { start: 0.0, end: 1.0 },\n            },\n            duration: duration,\n            easing: 'inOutCubic',\n            onTick: (props) => {\n                switch (transition.effect) {\n                    case 'fade':\n                        this.viewer.adapter.setTextureOpacity(newMesh, props.opacity);\n                        break;\n                    case 'black':\n                    case 'white':\n                        if (props.opacity < 0.5) {\n                            this.renderer.toneMappingExposure = transition.effect === 'black'\n                                ? MathUtils.mapLinear(props.opacity, 0, 0.5, 1, 0)\n                                : MathUtils.mapLinear(props.opacity, 0, 0.5, 1, 4);\n                        } else {\n                            this.renderer.toneMappingExposure = transition.effect === 'black'\n                                ? MathUtils.mapLinear(props.opacity, 0.5, 1, 0, 1)\n                                : MathUtils.mapLinear(props.opacity, 0.5, 1, 4, 1);\n\n                            this.mesh.visible = false;\n                            this.viewer.adapter.setTextureOpacity(newMesh, 1);\n\n                            if (zoomProvided && !zoomTransition) {\n                                this.viewer.dynamics.zoom.setValue(e.zoomLevel);\n                            }\n                        }\n                        break;\n                }\n\n                if (positionProvided && transition.rotation) {\n                    this.viewer.dynamics.position.setValue({\n                        yaw: props.yaw,\n                        pitch: props.pitch,\n                    });\n                }\n                if (zoomProvided && zoomTransition) {\n                    this.viewer.dynamics.zoom.setValue(props.zoom);\n                }\n\n                this.viewer.needsUpdate();\n            },\n        });\n\n        animation.then((completed) => {\n            tempContainer.remove(newMesh);\n            this.scene.remove(tempContainer);\n\n            if (completed) {\n                // remove old texture and mesh\n                this.viewer.adapter.disposeTexture(this.state.textureData);\n                this.meshContainer.remove(this.mesh);\n                this.viewer.adapter.disposeMesh(this.mesh);\n\n                // promote new texture and mesh\n                this.mesh = newMesh;\n                this.meshContainer.add(newMesh);\n                this.state.textureData = textureData;\n\n                // apply rotations\n                this.setPanoramaPose(textureData.panoData);\n                this.setSphereCorrection(options.sphereCorrection);\n\n                if (positionProvided && !transition.rotation) {\n                    this.viewer.rotate(options.position);\n                }\n            } else {\n                this.viewer.adapter.disposeTexture(textureData);\n                this.viewer.adapter.disposeMesh(newMesh);\n            }\n        });\n\n        return animation;\n    }\n\n    /**\n     * Returns intersections with objects in the scene\n     */\n    getIntersections(viewerPoint: Point): Array<Intersection<Mesh>> {\n        vector2.x = (2 * viewerPoint.x) / this.state.size.width - 1;\n        vector2.y = (-2 * viewerPoint.y) / this.state.size.height + 1;\n\n        this.raycaster.setFromCamera(vector2, this.camera);\n\n        const intersections = this.raycaster\n            .intersectObjects(this.scene.children, true)\n            .filter(i => i.object.visible)\n            .filter(i => (i.object as Mesh).isMesh && !!i.object.userData) as Array<Intersection<Mesh>>;\n\n        if (this.customRenderer?.getIntersections) {\n            intersections.push(...this.customRenderer.getIntersections(this.raycaster, vector2));\n        }\n\n        return intersections;\n    }\n\n    /**\n     * Checks if an object/point is currently visible\n     */\n    isObjectVisible(value: Object3D | Vector3): boolean {\n        if (!value) {\n            return false;\n        }\n\n        if (this.frustumNeedsUpdate) {\n            matrix4.multiplyMatrices(this.camera.projectionMatrix, this.camera.matrixWorldInverse);\n            this.frustum.setFromProjectionMatrix(matrix4);\n            this.frustumNeedsUpdate = false;\n        }\n\n        if ((value as Vector3).isVector3) {\n            return this.frustum.containsPoint(value as Vector3);\n        } else if ((value as Mesh).isMesh && (value as Mesh).geometry) {\n            // Frustum.intersectsObject uses the boundingSphere by default\n            // for better precision we prefer the boundingBox\n            const mesh = value as Mesh;\n            if (!mesh.geometry.boundingBox) {\n                mesh.geometry.computeBoundingBox();\n            }\n            box3.copy(mesh.geometry.boundingBox).applyMatrix4(mesh.matrixWorld);\n            return this.frustum.intersectsBox(box3);\n        } else if ((value as Object3D).isObject3D) {\n            return this.frustum.intersectsObject(value as Object3D);\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Adds an object to the THREE scene\n     */\n    addObject(object: Object3D) {\n        this.scene.add(object);\n    }\n\n    /**\n     * Removes an object from the THREE scene\n     */\n    removeObject(object: Object3D) {\n        this.scene.remove(object);\n    }\n\n    /**\n     * Calls `dispose` on all objects and textures\n     * @internal\n     */\n    cleanScene(object: any) {\n        const disposeMaterial = (material: any) => {\n            material.map?.dispose();\n\n            if (material.uniforms) {\n                Object.values(material.uniforms).forEach((uniform: any) => {\n                    uniform.value?.dispose?.();\n                });\n            }\n\n            material.dispose();\n        };\n\n        object.traverse((item: any) => {\n            item.geometry?.dispose();\n\n            if (item.material) {\n                if (Array.isArray(item.material)) {\n                    item.material.forEach((material: any) => {\n                        disposeMaterial(material);\n                    });\n                } else {\n                    disposeMaterial(item.material);\n                }\n            }\n\n            if (!(item instanceof Scene)) {\n                item.dispose?.();\n            }\n\n            if (item !== object) {\n                this.cleanScene(item);\n            }\n        });\n    }\n}\n","import { Loader } from 'three';\n\n/**\n * Copy of ThreeJS FileLoader with support of an AbortSignal and only supporting Blob response\n * Also removing all unused features for PSV\n */\nexport class BlobLoader extends Loader<Blob, string> {\n    // @ts-ignore\n    load(\n        url: string,\n        onLoad: (data: Blob) => void,\n        onProgress: (event: ProgressEvent) => void,\n        onError: (err: unknown) => void,\n        abortSignal?: AbortSignal,\n    ) {\n        // create request\n        const req = new Request(url, {\n            headers: new Headers(this.requestHeader),\n            credentials: this.withCredentials ? 'include' : 'same-origin',\n        });\n\n        // start the fetch\n        fetch(req, {\n            signal: abortSignal,\n        })\n            .then((response) => {\n                if (response.status === 200 || response.status === 0) {\n                    const reader = response.body.getReader();\n\n                    // Nginx needs X-File-Size check\n                    // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n                    const contentLength = response.headers.get('Content-Length') || response.headers.get('X-File-Size');\n                    const total = contentLength ? parseInt(contentLength) : 0;\n                    const lengthComputable = total !== 0;\n                    let loaded = 0;\n\n                    // periodically read data into the new stream tracking while download progress\n                    const stream = new ReadableStream({\n                        start(controller) {\n                            readData();\n\n                            function readData() {\n                                reader.read()\n                                    .then(({ done, value }) => {\n                                        if (done) {\n                                            controller.close();\n                                        } else {\n                                            loaded += value.byteLength;\n                                            const event = new ProgressEvent('progress', { lengthComputable, loaded, total });\n                                            onProgress(event);\n                                            controller.enqueue(value);\n                                            readData();\n                                        }\n                                    })\n                                    .catch((err) => {\n                                        onError(err);\n                                    });\n                            }\n                        },\n                    });\n\n                    return new Response(stream);\n                } else {\n                    throw new Error(`fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`);\n                }\n            })\n            .then((response) => {\n                return response.blob();\n            })\n            .then((data) => {\n                onLoad(data);\n            })\n            .catch((err) => {\n                onError(err);\n            });\n    }\n}\n","import { Loader } from 'three';\n\n/**\n * Copy of ThreeJS ImageLoader with support of an AbortSignal\n * Also removing all unused features for PSV\n */\nexport class ImageLoader extends Loader<HTMLImageElement, string> {\n    // @ts-ignore\n    load(\n        url: string,\n        onLoad: (data: HTMLImageElement) => void,\n        onError: (err: unknown) => void,\n        abortSignal?: AbortSignal,\n    ) {\n        const image = document.createElement('img');\n\n        function onImageLoad(this: HTMLImageElement) {\n            removeEventListeners();\n            onLoad(this);\n        }\n\n        function onImageError(event: ErrorEvent) {\n            removeEventListeners();\n\n            if (abortSignal?.aborted) {\n                // Simulate an error similar to the DOMException thrown by the Fetch API\n                // (DOMException is not instanciable)\n                const e = new Error();\n                e.name = 'AbortError';\n                e.message = 'The operation was aborted.';\n                onError(e);\n            } else {\n                onError(event);\n            }\n        }\n\n        function onAbortSignal() {\n            image.src = '';\n        }\n\n        function removeEventListeners() {\n            image.removeEventListener('load', onImageLoad, false);\n            image.removeEventListener('error', onImageError, false);\n\n            abortSignal?.removeEventListener('abort', onAbortSignal, false);\n        }\n\n        image.addEventListener('load', onImageLoad, false);\n        image.addEventListener('error', onImageError, false);\n\n        abortSignal?.addEventListener('abort', onAbortSignal, false);\n\n        if (!url.startsWith('data:') && this.crossOrigin !== undefined) {\n            image.crossOrigin = this.crossOrigin;\n        }\n\n        image.src = url;\n\n        return image;\n    }\n}\n","import { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { Cache } from '../data/cache';\nimport { LoadProgressEvent } from '../events';\nimport { BlobLoader } from '../lib/BlobLoader';\nimport { ImageLoader } from '../lib/ImageLoader';\nimport { AbstractService } from './AbstractService';\n\n/**\n * Image and texture loading system\n */\nexport class TextureLoader extends AbstractService {\n    private readonly fileLoader: BlobLoader;\n    private readonly imageLoader: ImageLoader;\n\n    private abortCtrl: Record<string, AbortController> = {};\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer);\n\n        this.fileLoader = new BlobLoader();\n        this.imageLoader = new ImageLoader();\n\n        if (this.config.withCredentials) {\n            this.fileLoader.setWithCredentials(true);\n            this.imageLoader.setCrossOrigin('use-credentials');\n        }\n    }\n\n    /**\n     * @internal\n     */\n    override destroy() {\n        this.abortLoading();\n        super.destroy();\n    }\n\n    /**\n     * Cancels current HTTP requests\n     * @internal\n     */\n    abortLoading() {\n        Object.values(this.abortCtrl).forEach(ctrl => ctrl.abort());\n        this.abortCtrl = {};\n    }\n\n    /**\n     * Loads a Blob with FileLoader\n     */\n    loadFile(url: string, onProgress?: (p: number) => void, cacheKey?: string): Promise<Blob> {\n        const cached = Cache.get(url, cacheKey);\n\n        if (cached) {\n            if (cached instanceof Blob) {\n                onProgress?.(100);\n                return Promise.resolve(cached);\n            } else {\n                // unlikely case when the image has already been loaded with the ImageLoader\n                Cache.remove(url, cacheKey);\n            }\n        }\n\n        if (this.config.requestHeaders) {\n            this.fileLoader.setRequestHeader(this.config.requestHeaders(url));\n        }\n\n        return new Promise((resolve, reject) => {\n            let progress = 0;\n            onProgress?.(progress);\n\n            this.fileLoader.load(\n                url,\n                (result) => {\n                    progress = 100;\n                    onProgress?.(progress);\n                    Cache.add(url, cacheKey, result);\n                    resolve(result);\n                },\n                (e) => {\n                    if (e.lengthComputable) {\n                        const newProgress = (e.loaded / e.total) * 100;\n                        if (newProgress > progress) {\n                            progress = newProgress;\n                            onProgress?.(progress);\n                        }\n                    }\n                },\n                (err) => {\n                    reject(err);\n                },\n                this.__getAbortSignal(cacheKey),\n            );\n        });\n    }\n\n    /**\n     * Loads an image with ImageLoader or with FileLoader if progress is tracked or if request headers are configured\n     */\n    loadImage(url: string, onProgress?: (p: number) => void, cacheKey?: string): Promise<HTMLImageElement> {\n        const cached = Cache.get(url, cacheKey);\n\n        if (cached) {\n            onProgress?.(100);\n            if (cached instanceof Blob) {\n                // unlikely case when the image has already been loaded with the FileLoader\n                return this.blobToImage(cached);\n            } else {\n                return Promise.resolve(cached);\n            }\n        }\n\n        if (!onProgress && !this.config.requestHeaders) {\n            return new Promise((resolve, reject) => {\n                this.imageLoader.load(\n                    url,\n                    (result) => {\n                        Cache.add(url, cacheKey, result);\n                        resolve(result);\n                    },\n                    (err) => {\n                        reject(err);\n                    },\n                    this.__getAbortSignal(cacheKey),\n                );\n            });\n        } else {\n            return this.loadFile(url, onProgress, cacheKey).then(blob => this.blobToImage(blob));\n        }\n    }\n\n    /**\n     * Converts a file loaded with {@link loadFile} into an image\n     */\n    blobToImage(blob: Blob): Promise<HTMLImageElement> {\n        return new Promise((resolve, reject) => {\n            const img = document.createElement('img');\n            img.onload = () => {\n                URL.revokeObjectURL(img.src);\n                resolve(img);\n            };\n            img.onerror = reject;\n            img.src = URL.createObjectURL(blob);\n        });\n    }\n\n    /**\n     * Preload a panorama file without displaying it\n     */\n    preloadPanorama(panorama: any): Promise<unknown> {\n        if (this.viewer.adapter.supportsPreload(panorama)) {\n            return this.viewer.adapter.loadTexture(panorama, false);\n        } else {\n            return Promise.reject(new PSVError('Current adapter does not support preload'));\n        }\n    }\n\n    /**\n     * @internal\n     */\n    dispatchProgress(progress: number) {\n        this.viewer.loader.setProgress(progress);\n        this.viewer.dispatchEvent(new LoadProgressEvent(Math.round(progress)));\n    }\n\n    /**\n     * Get an abort signal\n     * the signal is shared accross all requests with the same cache key (for tiles adapters)\n     */\n    private __getAbortSignal(cacheKey: string): AbortSignal {\n        if (cacheKey) {\n            if (this.abortCtrl[cacheKey]?.signal.aborted) {\n                delete this.abortCtrl[cacheKey];\n            }\n            if (!this.abortCtrl[cacheKey]) {\n                this.abortCtrl[cacheKey] = new AbortController();\n            }\n            return this.abortCtrl[cacheKey].signal;\n        }\n        return null;\n    }\n}\n","import { MathUtils } from 'three';\nimport { Dynamic, MultiDynamic } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { PositionUpdatedEvent, RollUpdatedEvent, ZoomUpdatedEvent } from '../events';\nimport { AbstractService } from './AbstractService';\n\nexport class ViewerDynamics extends AbstractService {\n    readonly zoom = new Dynamic(\n        (zoomLevel) => {\n            this.viewer.state.vFov = this.viewer.dataHelper.zoomLevelToFov(zoomLevel);\n            this.viewer.state.hFov = this.viewer.dataHelper.vFovToHFov(this.viewer.state.vFov);\n            this.viewer.dispatchEvent(new ZoomUpdatedEvent(zoomLevel));\n        },\n        {\n            defaultValue: this.viewer.config.defaultZoomLvl,\n            min: 0,\n            max: 100,\n            wrap: false,\n        },\n    );\n\n    readonly position = new MultiDynamic(\n        (position) => {\n            this.viewer.dataHelper.sphericalCoordsToVector3(position, this.viewer.state.direction);\n            this.viewer.dispatchEvent(new PositionUpdatedEvent(position));\n        },\n        {\n            yaw: new Dynamic(null, {\n                defaultValue: this.config.defaultYaw,\n                min: 0,\n                max: 2 * Math.PI,\n                wrap: true,\n            }),\n            pitch: new Dynamic(null, {\n                defaultValue: this.config.defaultPitch,\n                min: -Math.PI / 2,\n                max: Math.PI / 2,\n                wrap: false,\n            }),\n        },\n    );\n\n    readonly roll = new Dynamic(\n        (roll) => {\n            this.viewer.state.roll = roll;\n            this.viewer.dispatchEvent(new RollUpdatedEvent(roll));\n        },\n        {\n            defaultValue: 0,\n            min: -Math.PI,\n            max: Math.PI,\n            wrap: false,\n        },\n    );\n\n    /**\n     * @internal\n     */\n    constructor(viewer: Viewer) {\n        super(viewer);\n        this.updateSpeeds();\n    }\n\n    /**\n     * @internal\n     */\n    updateSpeeds() {\n        this.zoom.setSpeed(this.config.zoomSpeed * 50);\n        this.position.setSpeed(MathUtils.degToRad(this.config.moveSpeed * 50));\n        this.roll.setSpeed(MathUtils.degToRad(this.config.moveSpeed * 50));\n    }\n\n    /**\n     * @internal\n     */\n    update(elapsed: number) {\n        this.zoom.update(elapsed);\n        this.position.update(elapsed);\n        this.roll.update(elapsed);\n    }\n}\n","import { Mesh, Vector3 } from 'three';\nimport { SPHERE_RADIUS } from '../data/constants';\nimport { Size, TextureData } from '../model';\nimport type { Animation } from '../utils';\n\n/**\n * Internal properties of the viewer\n */\nexport class ViewerState {\n    /**\n     * when all components are loaded\n     */\n    ready = false;\n\n    /**\n     * if the view needs to be renderer\n     */\n    needsUpdate = false;\n\n    /**\n     * number of plugins requesting to continuously render the scene\n     */\n    continuousUpdateCount = 0;\n\n    /**\n     * if the keyboard events are currently listened to\n     */\n    keyboardEnabled = false;\n\n    /**\n     * direction of the camera\n     */\n    direction = new Vector3(0, 0, SPHERE_RADIUS);\n\n    /**\n     * current camera roll\n     */\n    roll = 0;\n\n    /**\n     * vertical FOV\n     */\n    vFov = 60;\n\n    /**\n     * horizontal FOV\n     */\n    hFov = 60;\n\n    /**\n     * renderer aspect ratio\n     */\n    aspect = 1;\n\n    /**\n     * currently running animation\n     */\n    animation: Animation = null;\n\n    /**\n     * currently running transition\n     */\n    transitionAnimation: Animation = null;\n\n    /**\n     * promise of the last \"setPanorama()\" call\n     */\n    loadingPromise: Promise<any> = null;\n\n    /**\n     * time of the last user action\n     */\n    idleTime = -1;\n\n    /**\n     * registered THREE objects observer\n     */\n    objectsObservers: Record<string, Mesh | null> = {};\n\n    /**\n     * size of the container\n     */\n    size: Size = {\n        width: 0,\n        height: 0,\n    };\n\n    /**\n     * Current panorama texture displayed\n     */\n    textureData: TextureData;\n\n    /**\n     * Current override of the global cursor\n     */\n    cursorOverride: string;\n\n    /**\n     * @internal\n     */\n    // eslint-disable-next-line  @typescript-eslint/no-empty-function\n    constructor() {}\n}\n","import { Object3D } from 'three';\nimport { PSVError } from './PSVError';\nimport type { AbstractAdapter } from './adapters/AbstractAdapter';\nimport type { AbstractComponent } from './components/AbstractComponent';\nimport { Loader } from './components/Loader';\nimport { Navbar } from './components/Navbar';\nimport { Notification } from './components/Notification';\nimport { Overlay } from './components/Overlay';\nimport { Panel } from './components/Panel';\nimport { Tooltip, TooltipConfig } from './components/Tooltip';\nimport { Cache } from './data/cache';\nimport { CONFIG_PARSERS, DEFAULTS, getViewerConfig, READONLY_OPTIONS } from './data/config';\nimport { IDS, VIEWER_DATA } from './data/constants';\nimport { SYSTEM } from './data/system';\nimport {\n    BeforeAnimateEvent,\n    BeforeRotateEvent,\n    ConfigChangedEvent,\n    PanoramaErrorEvent,\n    PanoramaLoadedEvent,\n    PanoramaLoadEvent,\n    ReadyEvent,\n    SizeUpdatedEvent,\n    StopAllEvent,\n    TransitionDoneEvent,\n    ViewerEvents,\n    ZoomUpdatedEvent,\n} from './events';\nimport errorIcon from './icons/error.svg';\nimport { TypedEventTarget } from './lib/TypedEventTarget';\nimport {\n    AnimateOptions,\n    CssSize,\n    ExtendedPosition,\n    PanoramaOptions,\n    ParsedViewerConfig,\n    Position,\n    Size,\n    UpdatableViewerConfig,\n    ViewerConfig,\n} from './model';\nimport type { AbstractPlugin, PluginConstructor } from './plugins/AbstractPlugin';\nimport { pluginInterop } from './plugins/AbstractPlugin';\nimport { DataHelper } from './services/DataHelper';\nimport { EventsHandler } from './services/EventsHandler';\nimport { Renderer } from './services/Renderer';\nimport { TextureLoader } from './services/TextureLoader';\nimport { ViewerDynamics } from './services/ViewerDynamics';\nimport { ViewerState } from './services/ViewerState';\nimport {\n    Animation,\n    checkClosedShadowDom,\n    checkStylesheet,\n    exitFullscreen,\n    getAbortError,\n    getElement,\n    isAbortError,\n    isExtendedPosition,\n    isFullscreenEnabled,\n    isNil,\n    logWarn,\n    requestFullscreen,\n    resolveBoolean,\n    toggleClass,\n} from './utils';\n\n/**\n * Photo Sphere Viewer controller\n */\nexport class Viewer extends TypedEventTarget<ViewerEvents> {\n    readonly state: ViewerState;\n    readonly config: ParsedViewerConfig;\n\n    readonly parent: HTMLElement;\n    readonly container: HTMLElement;\n\n    /** @internal */\n    readonly adapter: AbstractAdapter<any, any, any, Object3D>;\n    /** @internal */\n    readonly plugins: Record<string, AbstractPlugin<any>> = {};\n    /** @internal */\n    readonly dynamics: ViewerDynamics;\n\n    readonly renderer: Renderer;\n    readonly textureLoader: TextureLoader;\n    /** @internal */\n    readonly eventsHandler: EventsHandler;\n    readonly dataHelper: DataHelper;\n\n    readonly loader: Loader;\n    readonly navbar: Navbar;\n    readonly notification: Notification;\n    readonly overlay: Overlay;\n    readonly panel: Panel;\n\n    /** @internal */\n    readonly children: AbstractComponent[] = [];\n\n    constructor(config: ViewerConfig) {\n        super();\n\n        // init\n        this.parent = getElement(config.container);\n        if (!this.parent) {\n            throw new PSVError(`\"container\" element not found.`);\n        }\n\n        // @ts-ignore\n        this.parent[VIEWER_DATA] = this;\n\n        this.container = document.createElement('div');\n        this.container.classList.add('psv-container');\n        this.parent.appendChild(this.container);\n\n        checkClosedShadowDom(this.parent);\n        checkStylesheet(this.container, 'core');\n\n        this.state = new ViewerState();\n        this.config = getViewerConfig(config);\n\n        this.__setSize(this.config.size);\n\n        this.overlay = new Overlay(this);\n\n        try {\n            SYSTEM.load();\n        } catch (err) {\n            console.error(err);\n            this.showError(this.config.lang.webglError);\n            return;\n        }\n\n        Cache.init();\n\n        this.adapter = new this.config.adapter[0](this, this.config.adapter[1]);\n\n        this.renderer = new Renderer(this);\n        this.textureLoader = new TextureLoader(this);\n        this.eventsHandler = new EventsHandler(this);\n        this.dataHelper = new DataHelper(this);\n        this.dynamics = new ViewerDynamics(this);\n\n        this.adapter.init?.();\n\n        this.loader = new Loader(this);\n        this.navbar = new Navbar(this);\n        this.panel = new Panel(this);\n        this.notification = new Notification(this);\n\n        this.autoSize();\n        this.setCursor(null);\n\n        resolveBoolean(SYSTEM.isTouchEnabled, (enabled) => {\n            toggleClass(this.container, 'psv--is-touch', enabled);\n        });\n\n        // init plugins\n        this.config.plugins.forEach(([plugin, opts]) => {\n            // @ts-ignore\n            this.plugins[plugin.id] = new plugin(this, opts);\n        });\n        for (const plugin of Object.values(this.plugins)) {\n            plugin.init?.();\n        }\n\n        // init buttons\n        if (this.config.navbar) {\n            this.navbar.setButtons(this.config.navbar);\n        }\n\n        // load panorama\n        if (!this.state.loadingPromise) {\n            if (this.config.panorama) {\n                this.setPanorama(this.config.panorama, {\n                    sphereCorrection: this.config.sphereCorrection,\n                    panoData: this.config.panoData,\n                });\n            } else {\n                this.loader.show();\n            }\n        }\n    }\n\n    /**\n     * Destroys the viewer\n     */\n    destroy() {\n        this.stopAll();\n        this.stopKeyboardControl();\n        this.exitFullscreen();\n\n        for (const [id, plugin] of Object.entries(this.plugins)) {\n            plugin.destroy();\n            delete this.plugins[id];\n        }\n\n        this.children.slice().forEach(child => child.destroy());\n        this.children.length = 0;\n\n        this.eventsHandler?.destroy();\n        this.renderer?.destroy();\n        this.textureLoader?.destroy();\n        this.dataHelper?.destroy();\n        this.adapter?.destroy();\n        this.dynamics?.destroy();\n\n        this.parent.removeChild(this.container);\n        // @ts-ignore\n        delete this.parent[VIEWER_DATA];\n    }\n\n    private init() {\n        this.eventsHandler.init();\n        this.renderer.init();\n\n        if (this.config.navbar) {\n            this.navbar.show();\n        }\n\n        if (this.config.keyboard === 'always') {\n            this.startKeyboardControl();\n        }\n\n        this.resetIdleTimer();\n\n        this.state.ready = true;\n\n        this.dispatchEvent(new ReadyEvent());\n    }\n\n    /**\n     * Restarts the idle timer\n     * @internal\n     */\n    resetIdleTimer() {\n        this.state.idleTime = performance.now();\n    }\n\n    /**\n     * Stops the idle timer\n     * @internal\n     */\n    disableIdleTimer() {\n        this.state.idleTime = -1;\n    }\n\n    /**\n     * Returns the instance of a plugin if it exists\n     * @example By plugin identifier\n     * ```js\n     * viewer.getPlugin('markers')\n     * ```\n     * @example By plugin class with TypeScript support\n     * ```ts\n     * viewer.getPlugin<MarkersPlugin>(MarkersPlugin)\n     * ```\n     */\n    getPlugin<T extends AbstractPlugin<any>>(pluginId: string | PluginConstructor): T {\n        if (typeof pluginId === 'string') {\n            return this.plugins[pluginId] as T;\n        } else {\n            const pluginCtor = pluginInterop(pluginId);\n            return pluginCtor ? (this.plugins[pluginCtor.id] as T) : null;\n        }\n    }\n\n    /**\n     * Returns the current position of the camera\n     */\n    getPosition(): Position {\n        return this.dataHelper.cleanPosition(this.dynamics.position.current);\n    }\n\n    /**\n     * Returns the current zoom level\n     */\n    getZoomLevel(): number {\n        return this.dynamics.zoom.current;\n    }\n\n    /**\n     * Returns the current viewer size\n     */\n    getSize(): Size {\n        return { ...this.state.size };\n    }\n\n    /**\n     * Checks if the viewer is in fullscreen\n     */\n    isFullscreenEnabled(): boolean {\n        return isFullscreenEnabled(this.parent, SYSTEM.isIphone);\n    }\n\n    /**\n     * Request a new render of the scene\n     */\n    needsUpdate() {\n        this.state.needsUpdate = true;\n    }\n\n    /**\n     * Request the scene to be continuously renderer (when using videos)\n     */\n    needsContinuousUpdate(enabled: boolean) {\n        if (enabled) {\n            this.state.continuousUpdateCount++;\n        } else if (this.state.continuousUpdateCount > 0) {\n            this.state.continuousUpdateCount--;\n        }\n    }\n\n    /**\n     * Resizes the scene if the viewer is resized\n     */\n    autoSize() {\n        if (\n            this.container.clientWidth !== this.state.size.width\n            || this.container.clientHeight !== this.state.size.height\n        ) {\n            this.state.size.width = Math.round(this.container.clientWidth);\n            this.state.size.height = Math.round(this.container.clientHeight);\n            this.state.aspect = this.state.size.width / this.state.size.height;\n            this.state.hFov = this.dataHelper.vFovToHFov(this.state.vFov);\n\n            this.dispatchEvent(new SizeUpdatedEvent(this.getSize()));\n            this.navbar.autoSize();\n        }\n    }\n\n    /**\n     * Loads a new panorama file\n     * Loads a new panorama file, optionally changing the camera position/zoom and activating the transition animation.<br>\n     * If the \"options\" parameter is not defined, the camera will not move and the ongoing animation will continue.<br>\n     * If another loading is already in progress it will be aborted.\n     * @returns promise resolved with false if the loading was aborted by another call\n     */\n    setPanorama(path: any, options: PanoramaOptions = {}): Promise<boolean> {\n        this.textureLoader.abortLoading();\n        this.state.transitionAnimation?.cancel();\n\n        const transition = this.dataHelper.getTransitionOptions(options);\n\n        if (options.showLoader === undefined) {\n            options.showLoader = true;\n        }\n        if (options.caption === undefined) {\n            options.caption = this.config.caption;\n        }\n        if (options.description === undefined) {\n            options.description = this.config.description;\n        }\n        if (!options.panoData && typeof this.config.panoData === 'function') {\n            options.panoData = this.config.panoData;\n        }\n\n        this.hideError();\n        this.resetIdleTimer();\n\n        this.config.panorama = path;\n        this.config.caption = options.caption;\n        this.config.description = options.description;\n        this.config.sphereCorrection = options.sphereCorrection;\n\n        const done = (err?: Error) => {\n            if (isAbortError(err)) {\n                return false;\n            }\n\n            this.loader.hide();\n            this.state.loadingPromise = null;\n\n            if (err) {\n                this.navbar.setCaption(null);\n                this.showError(this.config.lang.loadError);\n                console.error(err);\n                this.dispatchEvent(new PanoramaErrorEvent(path, err));\n                throw err;\n            } else {\n                this.navbar.setCaption(this.config.caption);\n                return true;\n            }\n        };\n\n        this.navbar.setCaption(`<em>${this.config.lang.loading}</em>`);\n        if (options.showLoader || !this.state.ready) {\n            this.loader.show();\n        }\n\n        this.dispatchEvent(new PanoramaLoadEvent(path));\n\n        const loadingPromise = this.adapter.loadTexture(this.config.panorama, true, options.panoData).then((textureData) => {\n            // check if another panorama was requested\n            if (textureData.panorama !== this.config.panorama) {\n                this.adapter.disposeTexture(textureData);\n                throw getAbortError();\n            }\n\n            const cleanOptions = this.dataHelper.cleanPanoramaOptions(options, textureData.panoData);\n\n            if (!isNil(cleanOptions.zoom) || !isNil(cleanOptions.position)) {\n                this.stopAll();\n            }\n\n            return {\n                textureData,\n                cleanOptions,\n            };\n        });\n\n        if (!transition || !this.state.ready || !this.adapter.supportsTransition(this.config.panorama)) {\n            this.state.loadingPromise = loadingPromise\n                .then(({ textureData, cleanOptions }) => {\n                    this.renderer.show();\n                    this.renderer.setTexture(textureData);\n                    this.renderer.setPanoramaPose(textureData.panoData);\n                    this.renderer.setSphereCorrection(options.sphereCorrection);\n\n                    if (!this.state.ready) {\n                        this.init();\n                    }\n\n                    this.dispatchEvent(new PanoramaLoadedEvent(textureData));\n\n                    if (!isNil(cleanOptions.zoom)) {\n                        this.zoom(cleanOptions.zoom);\n                    }\n                    if (!isNil(cleanOptions.position)) {\n                        this.rotate(cleanOptions.position);\n                    }\n                })\n                .then(\n                    () => done(),\n                    err => done(err),\n                );\n        } else {\n            this.state.loadingPromise = loadingPromise\n                .then(({ textureData, cleanOptions }) => {\n                    this.loader.hide();\n\n                    this.dispatchEvent(new PanoramaLoadedEvent(textureData));\n\n                    this.state.transitionAnimation = this.renderer.transition(textureData, cleanOptions, transition);\n                    return this.state.transitionAnimation;\n                })\n                .then((completed) => {\n                    this.state.transitionAnimation = null;\n\n                    this.dispatchEvent(new TransitionDoneEvent(completed));\n\n                    if (!completed) {\n                        throw getAbortError();\n                    }\n                })\n                .then(\n                    () => done(),\n                    err => done(err),\n                );\n        }\n\n        return this.state.loadingPromise;\n    }\n\n    /**\n     * Update options\n     * @throws {@link PSVError} if the configuration is invalid\n     */\n    setOptions(options: Partial<UpdatableViewerConfig>) {\n        const rawConfig: ViewerConfig = {\n            ...this.config,\n            ...options,\n        };\n\n        for (let [key, value] of Object.entries(options) as Array<[keyof typeof rawConfig, any]>) {\n            if (!(key in DEFAULTS)) {\n                logWarn(`Unknown option ${key}`);\n                continue;\n            }\n\n            if (key in READONLY_OPTIONS) {\n                logWarn((READONLY_OPTIONS as any)[key]);\n                continue;\n            }\n\n            if (key in CONFIG_PARSERS) {\n                // @ts-ignore\n                value = CONFIG_PARSERS[key](value, {\n                    rawConfig: rawConfig,\n                    defValue: DEFAULTS[key],\n                } as any);\n            }\n\n            // @ts-ignore\n            this.config[key] = value;\n\n            switch (key) {\n                case 'mousemove':\n                    if (!this.state.cursorOverride) {\n                        this.setCursor(null);\n                    }\n                    break;\n\n                case 'caption':\n                    this.navbar.setCaption(this.config.caption);\n                    break;\n\n                case 'size':\n                    this.resize(this.config.size);\n                    break;\n\n                case 'sphereCorrection':\n                    this.renderer.setSphereCorrection(this.config.sphereCorrection);\n                    break;\n\n                case 'navbar':\n                case 'lang':\n                    this.navbar.setButtons(this.config.navbar);\n                    break;\n\n                case 'moveSpeed':\n                case 'zoomSpeed':\n                    this.dynamics.updateSpeeds();\n                    break;\n\n                case 'minFov':\n                case 'maxFov':\n                    this.dynamics.zoom.setValue(this.dataHelper.fovToZoomLevel(this.state.vFov));\n                    this.dispatchEvent(new ZoomUpdatedEvent(this.getZoomLevel()));\n                    break;\n\n                case 'keyboard':\n                    if (this.config.keyboard === 'always') {\n                        this.startKeyboardControl();\n                    } else {\n                        this.stopKeyboardControl();\n                    }\n                    break;\n\n                default:\n                    break;\n            }\n        }\n\n        this.needsUpdate();\n\n        this.dispatchEvent(new ConfigChangedEvent(Object.keys(options) as any));\n    }\n\n    /**\n     * Update options\n     * @throws {@link PSVError} if the configuration is invalid\n     */\n    setOption<T extends keyof UpdatableViewerConfig>(option: T, value: UpdatableViewerConfig[T]) {\n        this.setOptions({ [option]: value });\n    }\n\n    /**\n     * Displays an error message over the viewer\n     */\n    showError(message: string) {\n        this.overlay.show({\n            id: IDS.ERROR,\n            image: errorIcon,\n            title: message,\n            dismissible: false,\n        });\n    }\n\n    /**\n     *  Hides the error message\n     */\n    hideError() {\n        this.overlay.hide(IDS.ERROR);\n    }\n\n    /**\n     * Rotates the view to specific position\n     */\n    rotate(position: ExtendedPosition) {\n        const e = new BeforeRotateEvent(this.dataHelper.cleanPosition(position));\n        this.dispatchEvent(e);\n\n        if (e.defaultPrevented) {\n            return;\n        }\n\n        this.dynamics.position.setValue(e.position);\n    }\n\n    /**\n     * Zooms to a specific level between `maxFov` and `minFov`\n     */\n    zoom(level: number) {\n        this.dynamics.zoom.setValue(level);\n    }\n\n    /**\n     * Increases the zoom level\n     */\n    zoomIn(step = 1) {\n        this.dynamics.zoom.step(step);\n    }\n\n    /**\n     * Decreases the zoom level\n     */\n    zoomOut(step = 1) {\n        this.dynamics.zoom.step(-step);\n    }\n\n    /**\n     * Rotates and zooms the view with a smooth animation\n     */\n    animate(options: AnimateOptions): Animation {\n        const positionProvided = isExtendedPosition(options);\n        const zoomProvided = !isNil(options.zoom);\n\n        const e = new BeforeAnimateEvent(\n            positionProvided ? this.dataHelper.cleanPosition(options) : undefined,\n            options.zoom,\n        );\n        this.dispatchEvent(e);\n\n        if (e.defaultPrevented) {\n            return;\n        }\n\n        this.stopAll();\n\n        const { duration, properties } = this.dataHelper.getAnimationProperties(options.speed, e.position, e.zoomLevel);\n\n        // if no animation needed\n        if (!duration) {\n            if (positionProvided) {\n                this.rotate(e.position);\n            }\n            if (zoomProvided) {\n                this.zoom(e.zoomLevel);\n            }\n\n            return new Animation(null);\n        }\n\n        this.state.animation = new Animation({\n            properties: properties,\n            duration: duration,\n            easing: options.easing || 'inOutSine',\n            onTick: (props) => {\n                if (positionProvided) {\n                    this.dynamics.position.setValue({\n                        yaw: props.yaw,\n                        pitch: props.pitch,\n                    });\n                }\n                if (zoomProvided) {\n                    this.dynamics.zoom.setValue(props.zoom);\n                }\n            },\n        });\n\n        this.state.animation.then(() => {\n            this.state.animation = null;\n            this.resetIdleTimer();\n        });\n\n        return this.state.animation;\n    }\n\n    /**\n     * Stops the ongoing animation\n     * The return value is a Promise because the is no guaranty the animation can be stopped synchronously.\n     */\n    stopAnimation(): PromiseLike<any> {\n        if (this.state.animation) {\n            this.state.animation.cancel();\n            return this.state.animation;\n        } else {\n            return Promise.resolve();\n        }\n    }\n\n    /**\n     * Resizes the viewer\n     */\n    resize(size: CssSize) {\n        this.__setSize(size);\n        this.autoSize();\n    }\n\n    private __setSize(size?: CssSize) {\n        (['width', 'height'] as Array<'width' | 'height'>).forEach((dim) => {\n            if (size?.[dim]) {\n                if (/^[0-9.]+$/.test(size[dim])) {\n                    size[dim] += 'px';\n                }\n                this.parent.style[dim] = size[dim];\n            }\n        });\n    }\n\n    /**\n     * Enters the fullscreen mode\n     */\n    enterFullscreen() {\n        if (!this.isFullscreenEnabled()) {\n            requestFullscreen(this.parent, SYSTEM.isIphone);\n        }\n    }\n\n    /**\n     * Exits the fullscreen mode\n     */\n    exitFullscreen() {\n        if (this.isFullscreenEnabled()) {\n            exitFullscreen(SYSTEM.isIphone);\n        }\n    }\n\n    /**\n     * Enters or exits the fullscreen mode\n     */\n    toggleFullscreen() {\n        if (!this.isFullscreenEnabled()) {\n            this.enterFullscreen();\n        } else {\n            this.exitFullscreen();\n        }\n    }\n\n    /**\n     * Enables the keyboard controls\n     */\n    startKeyboardControl() {\n        this.state.keyboardEnabled = true;\n    }\n\n    /**\n     * Disables the keyboard controls\n     */\n    stopKeyboardControl() {\n        this.state.keyboardEnabled = false;\n    }\n\n    /**\n     * Creates a new tooltip\n     * Use {@link Tooltip.move} to update the tooltip without re-create\n     * @throws {@link PSVError} if the configuration is invalid\n     */\n    createTooltip(config: TooltipConfig): Tooltip {\n        return new Tooltip(this, config);\n    }\n\n    /**\n     * Changes the global mouse cursor\n     */\n    setCursor(cursor: string | null) {\n        this.state.cursorOverride = cursor;\n        if (!cursor) {\n            this.container.style.cursor = this.config.mousemove ? 'move' : 'default';\n        } else {\n            this.container.style.cursor = cursor;\n        }\n    }\n\n    /**\n     * Subscribes to events on objects in the three.js scene\n     * @param userDataKey - only objects with the following `userData` will be observed\n     */\n    observeObjects(userDataKey: string): void {\n        if (!this.state.objectsObservers[userDataKey]) {\n            this.state.objectsObservers[userDataKey] = null;\n        }\n    }\n\n    /**\n     * Unsubscribes to events on objects\n     */\n    unobserveObjects(userDataKey: string): void {\n        delete this.state.objectsObservers[userDataKey];\n    }\n\n    /**\n     * Stops all current animations\n     * @internal\n     */\n    stopAll(): PromiseLike<void> {\n        this.dispatchEvent(new StopAllEvent());\n\n        this.disableIdleTimer();\n\n        return this.stopAnimation();\n    }\n}\n"],"mappings":"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","names":["ACTIONS","target","src","angle","import_three","import_three","SliderDirection","import_three","import_three","getConfig","angle","import_three","import_three","ThreeCache","import_three","angle","import_three","distance","import_three","import_three","import_three","import_three","import_three","import_three"]}