(self.webpackChunktradingview = self.webpackChunktradingview || []).push([
    [53698], {
        296774: e => {
            e.exports = {}
        },
        129592: (e, t, n) => {
            "use strict";
            n.d(t, {
                createGroup: () => c,
                keyboardPressedKeysState: () => s,
                pressedKeys: () => a,
                registerWindow: () => l,
                unregisterWindow: () => d
            });
            var o = n(163586),
                r = n(764250);
            n(591800);
            const i = new o.ActionManager,
                a = i.pressedKeys(),
                s = i.keyboardPressedKeysState();

            function c(e) {
                return new r.ActionGroup(i, e)
            }

            function l(e) {
                i.listen(e)
            }

            function d(e) {
                i.unlisten(e)
            }
        },
        591800: (e, t, n) => {
            "use strict";
            n.d(t, {
                Modifiers: () => i,
                hashFromEvent: () => s,
                hotkeyHashToAriaKeyshortcuts: () => g,
                humanReadableHash: () => u,
                humanReadableModifiers: () => c,
                isMacKeyboard: () => r,
                modifiersFromEvent: () => a
            });
            var o = n(167175);
            const r = o.isMac || o.isIOS;
            var i;

            function a(e) {
                let t = 0;
                return e.shiftKey && (t += 1024), e.altKey && (t += 512), e.ctrlKey && (t += 256), e.metaKey && (t += 2048), t
            }

            function s(e) {
                return a(e) | e.keyCode
            }! function(e) {
                e[e.None = 0] = "None", e[e.Alt = 512] = "Alt", e[e.Shift = 1024] = "Shift", e[e.Mod = r ? 2048 : 256] = "Mod", e[e.Control = 256] = "Control", e[e.Meta = 2048] = "Meta"
            }(i || (i = {}));

            function c(e, t = !r) {
                let n = "";
                return 256 & e && (n += _(r ? "^" : "Ctrl", t)), 512 & e && (n += _(r ? "⌥" : "Alt", t)), 1024 & e && (n += _(r ? "⇧" : "Shift", t)), 2048 & e && (n += _(r ? "⌘" : "Win", t)), n
            }
            const l = {
                    9: "⇥",
                    13: "↵",
                    27: "Esc",
                    8: r ? "⌫" : "Backspace",
                    32: "Space",
                    35: "End",
                    36: "Home",
                    37: "←",
                    38: "↑",
                    39: "→",
                    40: "↓",
                    45: "Ins",
                    46: "Del",
                    188: ",",
                    191: "/"
                },
                d = {
                    9: "Tab",
                    13: "Enter",
                    27: "Esc",
                    8: "Backspace",
                    32: "Space",
                    35: "End",
                    36: "Home",
                    37: "ArrowLeft",
                    38: "ArrowUp",
                    39: "ArrowRight",
                    40: "ArrowDown",
                    45: "Ins",
                    46: "Del",
                    188: ",",
                    191: "/"
                };
            for (let e = 1; e <= 16; e++) l[e + 111] = `F${e}`, d[e + 111] = `F${e}`;

            function u(e) {
                let t = c(e);
                const n = 255 & e;
                return t += n in l ? l[n] : String.fromCharCode(n), t
            }

            function _(e, t) {
                return `${e}${t?" + ":r?" ":""}`
            }

            function g(e) {
                const t = [];
                256 & e && t.push("Ctrl"), 512 & e && t.push("Alt"), 1024 & e && t.push("Shift"), 2048 & e && t.push("Meta");
                const n = 255 & e;
                return n in l ? t.push(l[n]) : t.push(String.fromCharCode(n)), t.join("+")
            }
        },
        607423: (e, t, n) => {
            "use strict";
            n.d(t, {
                isNativeUIInteraction: () => i,
                isTextEditingField: () => r
            });
            var o = n(591800);

            function r(e) {
                if ("INPUT" === e.tagName) {
                    const t = e.type;
                    return "text" === t || "email" === t || "number" === t || "password" === t || "search" === t || "tel" === t || "url" === t
                }
                return "TEXTAREA" === e.tagName || e.isContentEditable
            }

            function i(e, t) {
                if (!t) return !1;
                const n = 255 & e;
                if (27 === n || n >>> 4 == 7) return !1;
                switch (e ^ n) {
                    case o.Modifiers.Alt:
                        return (38 === n || 40 === n) && "SELECT" === t.tagName || r(t);
                    case o.Modifiers.Alt + o.Modifiers.Shift:
                        return r(t);
                    case o.Modifiers.Mod:
                        if (67 === n || !o.isMacKeyboard && 45 === n) {
                            const e = t.ownerDocument && t.ownerDocument.getSelection();
                            if (e && !e.isCollapsed) return !0
                        }
                        return r(t);
                    case o.Modifiers.Mod + o.Modifiers.Shift:
                        return n >= 33 && n <= 40 && r(t);
                    case o.Modifiers.Shift:
                    case 0:
                        return 9 === n ? !(!t.ownerDocument || t === t.ownerDocument.body || t === t.ownerDocument.documentElement) : (! function(e) {
                            if ("BUTTON" === e.tagName) return !0;
                            if ("INPUT" === e.tagName) {
                                const t = e.type;
                                if ("submit" === t || "button" === t || "reset" === t || "checkbox" === t || "radio" === t) return !0
                            }
                            return !1
                        }(t) || 13 === n || 32 === n || 9 === n) && ("form" in t || t.isContentEditable)
                }
                return !1
            }
        },
        173777: (e, t, n) => {
            "use strict";
            n.d(t, {
                SEPARATOR_PREFIX: () => o,
                isSeparatorItem: () => r
            });
            const o = "###";

            function r(e) {
                return e.startsWith(o)
            }
        },
        745269: (e, t, n) => {
            "use strict";
            n.d(t, {
                CubicBezier: () => i,
                color: () => a,
                dur: () => o,
                easingFunc: () => r
            });
            const o = 350,
                r = {
                    linear: e => e,
                    easeInQuad: e => e * e,
                    easeOutQuad: e => e * (2 - e),
                    easeInOutQuad: e => e < .5 ? 2 * e * e : (4 - 2 * e) * e - 1,
                    easeInCubic: e => e * e * e,
                    easeOutCubic: e => --e * e * e + 1,
                    easeInOutCubic: e => e < .5 ? 4 * e * e * e : (e - 1) * (2 * e - 2) * (2 * e - 2) + 1,
                    easeInQuart: e => e * e * e * e,
                    easeOutQuart: e => 1 - --e * e * e * e,
                    easeInOutQuart: e => e < .5 ? 8 * e * e * e * e : 1 - 8 * --e * e * e * e,
                    easeInQuint: e => e * e * e * e * e,
                    easeOutQuint: e => 1 + --e * e * e * e * e,
                    easeInOutQuint: e => e < .5 ? 16 * e * e * e * e * e : 1 + 16 * --e * e * e * e * e
                };
            class i {
                constructor(e, t, n, o) {
                    this._mX1 = e, this._mY1 = t, this._mX2 = n, this._mY2 = o
                }
                easingFunc(e) {
                    return this._mX1 === this._mY1 && this._mX2 === this._mY2 ? e : this._calcBezier(this._getTForX(e))
                }
                _a(e, t) {
                    return 1 - 3 * t + 3 * e
                }
                _b(e, t) {
                    return 3 * t - 6 * e
                }
                _c(e) {
                    return 3 * e
                }
                _calcBezier(e) {
                    return ((this._a(this._mY1, this._mY2) * e + this._b(this._mY1, this._mY2)) * e + this._c(this._mY1)) * e
                }
                _getSlope(e) {
                    return 3 * this._a(this._mX1, this._mX2) * e * e + 2 * this._b(this._mX1, this._mX2) * e + this._c(this._mX1)
                }
                _getTForX(e) {
                    let t = e;
                    for (let n = 0; n < 4; ++n) {
                        const n = this._getSlope(t);
                        if (0 === n) return t;
                        t -= (this._calcBezier(t) - e) / n
                    }
                    return t
                }
            }
            const a = {
                black70: "#4A4A4A",
                black80: "#535353"
            }
        },
        604286: (e, t, n) => {
            "use strict";
            n.d(t, {
                hotKeyDeserialize: () => i,
                hotKeySerialize: () => r
            });
            var o = n(433524);

            function r(e) {
                return (0, o.htmlEscape)(JSON.stringify(e))
            }

            function i(e) {
                return JSON.parse((0, o.decodeHTMLEntities)(e))
            }
        },
        673747: (e, t, n) => {
            "use strict";
            n.r(t), n.d(t, {
                hide: () => y,
                show: () => m,
                showOnElement: () => g,
                tempForceHide: () => b,
                tooltipClickHandler: () => f,
                updateTooltipText: () => p
            });
            var o = n(778785),
                r = n(650151),
                i = n(799786),
                a = n(112539),
                s = n(630112),
                c = n(779527);
            let l = !1,
                d = null,
                u = null;
            o.mobiletouch || (document.addEventListener("mouseover", h, !0), document.addEventListener("focus", (function(e) {
                const t = e.target;
                if (!(t instanceof HTMLElement && t.closest('[data-tooltip-show-on-focus="true"]') && t.matches(":focus-visible"))) return;
                h(e, !0)
            }), {
                capture: !0
            }), document.addEventListener("active-descendant-focus", (function(e) {
                e.target instanceof HTMLElement && h(e, !0)
            }), {
                capture: !0
            }));
            const _ = new MutationObserver((() => {
                    if (d && d.options.target) {
                        let e;
                        e = "isConnected" in d.options.target ? d.options.target.isConnected : document.body.contains(d.options.target), e || y()
                    }
                })),
                g = (e, t = {}) => {
                    const {
                        content: n,
                        ...o
                    } = T(t), r = c.getDataFromTarget(e), i = Object.assign(r, o);
                    return "none" !== n.type && (i.content = n), !("none" === i.content.type && !i.hotkey) && (i.target = e, m(i), !0)
                },
                m = e => {
                    const t = T(e),
                        n = c.getTooltip(t);
                    if (d = {
                            options: t,
                            element: n
                        }, (0, s.setTooltip)(n), (0, a.clearSchedule)(), !l) return c.hideTooltip(n), void(0, a.scheduleRender)((() => S(n)), function(e) {
                        return "number" != typeof e.tooltipDelay || isNaN(e.tooltipDelay) ? 500 : e.tooltipDelay
                    }(t));
                    const {
                        tooltipDebounce: o
                    } = e;
                    "number" != typeof o || isNaN(o) ? S(n) : (0, a.scheduleRender)((() => S(n)), o)
                },
                p = e => c.updateTooltipTextFromTarget(e);

            function h(e, t) {
                var n;
                if ("sourceCapabilities" in e && (null === (n = e.sourceCapabilities) || void 0 === n ? void 0 : n.firesTouchEvents)) return;
                const o = function(e, t, n) {
                    const o = [];
                    for (; e && e !== t;) e.classList && e.classList.contains(n) && o.push(e), e = e.parentElement || E(e.parentNode);
                    return o
                }(e.target, e.currentTarget, "apply-common-tooltip");
                for (const n of o) {
                    if (e instanceof MouseEvent)
                        if ("buttons" in e) {
                            if (1 & e.buttons) continue
                        } else if (1 === e.which) continue;
                    const o = () => g(n);
                    if (o()) {
                        const e = e => r(null, !0),
                            r = (i, a = !1) => {
                                n.removeEventListener("common-tooltip-update", o), n.removeEventListener("mouseleave", r), n.removeEventListener("mousedown", r), document.removeEventListener("scroll", e, {
                                    capture: !0
                                }), t && (n.removeEventListener("blur", r), n.removeEventListener("active-descendant-blur", r)), u && (u.destroy(), u = null), y(a)
                            };
                        n.addEventListener("common-tooltip-update", o), n.addEventListener("mouseleave", r), n.addEventListener("mousedown", r), document.addEventListener("scroll", e, {
                            capture: !0
                        }), t && (n.addEventListener("blur", r), n.addEventListener("active-descendant-blur", r)), null === u && (u = (0, i.createGroup)({
                            desc: "Tooltip"
                        }), u.add({
                            desc: "Hide",
                            hotkey: 27,
                            handler: r
                        }));
                        break
                    }
                }
            }

            function f(e) {
                var t;
                o.mobiletouch && (g(e.currentTarget, {
                    tooltipDelay: 0
                }), document.addEventListener("scroll", v), document.addEventListener("touchstart", v), window.addEventListener("orientationchange", v), null === (t = window.screen.orientation) || void 0 === t || t.addEventListener("change", v))
            }

            function v() {
                var e;
                document.removeEventListener("scroll", v), document.removeEventListener("touchstart", v), window.removeEventListener("orientationchange", v), null === (e = window.screen.orientation) || void 0 === e || e.removeEventListener("change", v), y()
            }

            function w() {
                (0, s.empty)(), l = !1, d = null
            }
            const b = () => {
                    if ((0, a.clearSchedule)(), (0, r.ensureNotNull)(_).disconnect(), !d || !l) return;
                    const {
                        element: e
                    } = d;
                    c.hideTooltip(e), w()
                },
                y = (e, t) => {
                    if ((0, a.clearSchedule)(), (0, r.ensureNotNull)(_).disconnect(), !d) return;
                    if (!e && !l) return;
                    const {
                        element: n,
                        options: o
                    } = d, i = () => {
                        n.removeEventListener("mouseleave", i), c.hideTooltip(n), e ? w() : (0, a.scheduleRemove)((() => {
                            w()
                        }), 250), null == t || t()
                    };
                    o.tooltipHideDelay ? (0, a.scheduleHide)((() => {
                        n.querySelector(":hover") ? n.addEventListener("mouseleave", i) : i()
                    }), o.tooltipHideDelay) : i()
                };

            function S(e) {
                const {
                    options: t
                } = (0, r.ensureNotNull)(d);
                if (c.setStyle(e, t), c.showTooltip(e), (0, r.ensureNotNull)(_).observe(document, {
                        childList: !0,
                        subtree: !0
                    }), l = !0, t.forceHideOnMove) {
                    const e = () => {
                        document.removeEventListener("mousemove", e), document.removeEventListener("touchmove", e), y()
                    };
                    document.addEventListener("mousemove", e), document.addEventListener("touchmove", e)
                }
            }

            function E(e) {
                return e && (e.nodeType === Node.ELEMENT_NODE ? e : null)
            }

            function T(e) {
                if (function(e) {
                        return "content" in e
                    }(e)) return e;
                const {
                    inner: t,
                    html: n,
                    text: o,
                    ...r
                } = e;
                let i = {
                    type: "none"
                };
                return t && (i = {
                    type: "element",
                    data: t
                }), o && (i = {
                    type: n ? "html" : "text",
                    data: o
                }), {
                    content: i,
                    ...r
                }
            }
        },
        62889: (e, t, n) => {
            "use strict";
            n.d(t, {
                CopyrightPosition: () => o,
                copyrightLabel: () => c
            });
            var o, r = n(497754),
                i = n(995683),
                a = n(124829),
                s = n(453917);

            function c({
                svgText: e,
                icon: t,
                theme: n,
                url: c,
                mode: l,
                verticalPosition: d = o.Vertical.Bottom,
                horizontalPosition: u = o.Horizontal.End,
                snapToEdge: _ = !0,
                isExpanded: g = !1,
                className: m
            }) {
                let p;
                switch (l) {
                    case "new":
                    case "with_border":
                    case "large_trade":
                        p = (0,
                            a.clone)(n);
                        break;
                    default:
                        p = (0, i.mergeThemes)((0, a.clone)(s), n)
                }
                const h = document.createElement("span");
                let f;
                c && (f = document.createElement("a"), f.classList.add(...p.label__link.split(/\s/)), f.href = c, f.target = "_blank", f.rel = "noopener noreferrer", f.setAttribute("data-target-type", "copyright"), h.append(f)), h.className = r(p.label, u === o.Horizontal.Start && p.start, u === o.Horizontal.End && p.end, d === o.Vertical.Top && p.top, d === o.Vertical.Bottom && p.bottom, _ && "large_trade" !== l && p.snap, "large_old" === l && p.large, (g || "large_trade" === l) && p.expanded, m, "js-copyright-label"), h.addEventListener("click", (() => {
                    function e() {
                        h.classList.remove(p.expandedByClick), h.removeEventListener("mouseleave", e)
                    }
                    h.classList.contains(p.expandedWithTransition) || h.classList.contains(p.expanded) || (h.classList.contains(p.expandedByClick) ? c || e() : (h.classList.add(p.expandedByClick), h.addEventListener("mouseleave", e)))
                }));
                const v = document.createElement("span");
                v.className = p.logoWrap, v.innerHTML = t;
                const w = document.createElement("span");
                return w.className = p.svgTextWrap, w.innerHTML = e, h.append(v, w), [h, p]
            }! function(e) {
                let t, n;
                ! function(e) {
                    e[e.Bottom = 0] = "Bottom", e[e.Top = 1] = "Top"
                }(t = e.Vertical || (e.Vertical = {})),
                function(e) {
                    e[e.Start = 0] = "Start", e[e.End = 1] = "End"
                }(n = e.Horizontal || (e.Horizontal = {}))
            }(o || (o = {}))
        },
        351079: (e, t, n) => {
            "use strict";
            n.d(t, {
                CopyrightPosition: () => r.CopyrightPosition,
                createCopyrightLabel: () => a
            });
            var o = n(497754),
                r = n(62889),
                i = n(952598);

            function a({
                sheriffOptions: e,
                ...t
            }) {
                const [n, a] = (0, r.copyrightLabel)(t), s = e && e.includes(i.KnownAction.Expand), c = e && e.includes(i.KnownAction.LargeTradeLogo);
                return n.className = o(n.className, (s || c) && a.expandedWithTransition), n
            }
        },
        650401: (e, t, n) => {
            "use strict";
            n.d(t, {
                getWidgetSheriffActions: () => l
            });
            var o = n(702598),
                r = n(338619),
                i = n(952598);
            const a = window.WIDGET_SHERIFF_HOST || "https://widget-sheriff.xstaging-widget.tv",
                s = (0, r.getLogger)("WidgetSheriff.Widget");
            let c = null;
            async function l() {
                return null === c && (c = await async function() {
                    const e = function() {
                        if (document.location.ancestorOrigins && document.location.ancestorOrigins.length) return document.location.ancestorOrigins[document.location.ancestorOrigins.length - 1];
                        try {
                            return new URL(document.referrer).origin
                        } catch (e) {
                            return document.location.origin || null
                        }
                    }();
                    if (null === e) return s.logWarn("ancestorOrigin is undefined"), Promise.resolve([]);
                    const t = new URL("/sheriff/api/v1/rules/search", a);
                    t.searchParams.append("origin", e);
                    return (await (0, o.fetch)(t.toJSON()).then((e => {
                        if (!e.ok) throw new Error("Guard request error occured");
                        return 204 === e.status ? Promise.resolve({
                            actions: []
                        }) : e.json()
                    })).catch((e => (s.logWarn(e.message), Promise.resolve({
                        actions: []
                    }))))).actions.filter((e => i.widgetSheriffActions.has(e)))
                }()), Promise.resolve(c)
            }
        },
        714921: (e, t, n) => {
            "use strict";
            n.d(t, {
                createEmbedWidgetWrapper: () => c
            });
            n(296774);
            var o = n(650151),
                r = n(650401),
                i = n(351079);
            var a = n(952598);
            async function s(e, t, s, c, l = {}) {
                var d, u;
                const _ = l.isSheriffDisabled ? [] : await (0, r.getWidgetSheriffActions)(),
                    g = _.includes(a.KnownAction.LargeTradeLogo),
                    m = function(e) {
                        return ["crypto-coins-heatmap", "forex-cross-rates", "market-overview", "symbol-overview", "market-quotes", "stock-heatmap", "screener", "forex-heat-map", "crypto-mkt-screener", "events", "hotlists"].includes(e)
                    }(t),
                    p = g && m ? "large_trade" : void 0,
                    h = await async function(e, t, o, r) {
                        if ("lentaru" === e) {
                            const {
                                getLentaCopyrightData: e
                            } = await Promise.all([n.e(83035), n.e(1523)]).then(n.bind(n, 466672));
                            return e()
                        }
                        if ("cmoneycomtw" === e) {
                            const {
                                getCmoneycomtwCopyrightData: e
                            } = await Promise.all([n.e(25558), n.e(18867), n.e(42091)]).then(n.bind(n, 20922));
                            return e(t, o)
                        }
                        if ("new" === r) {
                            const {
                                getTradingViewCopyrightData: e
                            } = await Promise.all([n.e(30641), n.e(36228)]).then(n.bind(n, 703094));
                            return e(t, o)
                        }
                        if ("with_border" === r) {
                            const {
                                getTradingViewCopyrightData: e
                            } = await Promise.all([n.e(24328), n.e(37753)]).then(n.bind(n, 513316));
                            return e(t, o)
                        }
                        if ("large_trade" === r) {
                            const {
                                getTradingViewCopyrightData: e
                            } = await Promise.all([n.e(19545), n.e(47259)]).then(n.bind(n, 203515));
                            return e(t, o)
                        } {
                            const {
                                getTradingViewCopyrightData: e
                            } = await Promise.all([n.e(25558), n.e(47243)]).then(n.bind(n, 88136));
                            return e(t, o)
                        }
                    }(l.customer, l.locale, function(e, t) {
                        return e && e.utm_campaign && (e.utm_campaign += `-${t}`), e
                    }(c, "logo"), p),
                    f = null !== (u = null != p ? p : null === (d = l.copyrightOptions) || void 0 === d ? void 0 : d.mode) && void 0 !== u ? u : "small_old";
                (0, o.ensureNotNull)(e).appendChild((0, i.createCopyrightLabel)({
                    sheriffOptions: _,
                    snapToEdge: s,
                    ...l.copyrightOptions,
                    ...h,
                    mode: f
                }))
            }

            function c(e, t, n, r = {}) {
                if (null === e.parentElement) return console.warn("Can not wrap 'elWidgetContainer' because it has no parentElement"), e;
                let i = null,
                    a = document.querySelector(".js-embed-widget-body");
                const c = null !== a;
                if (c) {
                    a = (0, o.ensureNotNull)(a), i = (0, o.ensureNotNull)(a.parentElement);
                    let e = document.querySelector(".js-embed-widget-head");
                    null === e && (e = document.createElement("div"), e.classList.add("tv-embed-widget-wrapper__header"), e.classList.add("js-embed-widget-head"), i.insertBefore(e, a))
                } else i = document.createElement("div"), i.classList.add("tv-embed-widget-wrapper"), i.innerHTML = '<div class="tv-embed-widget-wrapper__header js-embed-widget-head"></div><div class="tv-embed-widget-wrapper__body js-embed-widget-body"></div>', a = i.querySelector(".js-embed-widget-body");
                if (r.overflowAuto && a.classList.add("tv-embed-widget-wrapper__body--overflow_auto"), r.showBorderOnTransparent && a.classList.add("tv-embed-widget-wrapper__body--border-on-transparent"), !r.isWhiteLabel) {
                    s(a, t, !document.documentElement.classList.contains("is-transparent") || Boolean(r.showBorderOnTransparent), n, r)
                }
                return c || (e.parentElement.insertBefore(i, e), a.appendChild(e)), e
            }
        },
        719240: (e, t, n) => {
            "use strict";
            n.d(t, {
                DataModeIndicator: () => c
            });
            var o = n(444372),
                r = (n(466281), n(489928), n(780792));
            const i = {
                connecting: "tv-data-mode--connecting",
                delayed: "tv-data-mode--delayed",
                delayed_streaming: "tv-data-mode--delayed",
                endofday: "tv-data-mode--endofday",
                forbidden: "tv-data-mode--forbidden",
                realtime: "tv-data-mode--realtime",
                snapshot: "tv-data-mode--snapshot",
                loading: "tv-data-mode--loading",
                replay: "tv-data-mode--replay"
            };

            function a() {
                return {
                    connecting: o.t(null, {
                        context: "data_mode_connecting_letter"
                    }, n(167040)),
                    delayed: o.t(null, {
                        context: "data_mode_delayed_letter"
                    }, n(800919)),
                    delayed_streaming: o.t(null, {
                        context: "data_mode_delayed_streaming_letter"
                    }, n(933088)),
                    endofday: o.t(null, {
                        context: "data_mode_end_of_day_letter"
                    }, n(918400)),
                    forbidden: o.t(null, {
                        context: "data_mode_forbidden_letter"
                    }, n(514149)),
                    realtime: o.t(null, {
                        context: "data_mode_realtime_letter"
                    }, n(650940)),
                    snapshot: o.t(null, {
                        context: "data_mode_snapshot_letter"
                    }, n(756757)),
                    loading: "",
                    replay: o.t(null, {
                        context: "data_mode_replay_letter"
                    }, n(745540))
                }
            }
            const s = {
                streaming: "realtime"
            };
            class c extends r.AbstractIndicator {
                constructor(e) {
                    super(e), this._quoteSessionPrefix = "data-mode-indicator", this._componentClass = "tv-data-mode", this._init(e)
                }
                getLabel() {
                    return !0 === this._shortMode ? this._shortLabelMap[this._value] || "" : super.getLabel()
                }
                setMode(e, t) {
                    this.update({
                        values: {
                            update_mode: e,
                            update_mode_seconds: t
                        }
                    })
                }
                hide() {
                    this._el.classList.add("i-hidden")
                }
                show() {
                    this._el.classList.remove("i-hidden")
                }
                getTooltipText() {
                    let e = "";
                    const t = this.getValue();
                    if ("" === t) return e;
                    switch (t) {
                        case "delayed":
                            e = o.t(null, void 0, n(369539));
                            break;
                        case "delayed_streaming":
                            e = o.t(null, void 0, n(167476));
                            break;
                        default:
                            e = this._labelMap[t] || e
                    }
                    return ["delayed", "delayed_streaming"].includes(t) && (e = e.format({
                        number: String(Math.round(this._modeInterval / 60))
                    })), e
                }
                _init(e = {}) {
                    const t = Object.assign({}, {
                        classMap: i,
                        classSuffix: "",
                        data: {
                            values: {
                                update_mode: "connecting"
                            }
                        },
                        labelMap: {
                            connecting: o.t(null, void 0, n(366891)),
                            delayed: o.t(null, void 0, n(739688)),
                            delayed_streaming: o.t(null, void 0, n(739688)),
                            endofday: o.t(null, void 0, n(328304)),
                            forbidden: o.t(null, void 0, n(909161)),
                            realtime: o.t(null, void 0, n(303058)),
                            snapshot: o.t(null, void 0, n(988408)),
                            loading: "",
                            replay: o.t(null, void 0, n(38822))
                        },
                        modeInterval: 600,
                        short: !1,
                        shortLabelMap: a(),
                        showTooltip: !0,
                        tooltipType: "custom"
                    }, e);
                    this._modeInterval = t.modeInterval || 600, this._shortLabelMap = t.shortLabelMap || a(), super._init(t), this._render()
                }
                _getValueFromData(e) {
                    let t;
                    return t = void 0 !== e.values && void 0 !== e.values.update_mode ? e.values.update_mode : this.getValue(), s[t] || t
                }
                _updateValue(e, t) {
                    void 0 !== e.values && void 0 !== e.values.update_mode_seconds && (this._modeInterval = e.values.update_mode_seconds), super._updateValue(e, t)
                }
            }
        },
        66974: (e, t, n) => {
            "use strict";
            n.r(t), n.d(t, {
                environment: () => i,
                getEnvironmentByHost: () => r,
                isDebug: () => c,
                isLocal: () => a,
                isProd: () => s
            });
            const o = new Set(["battle", "staging", "test", "local"]);

            function r(e) {
                return -1 !== ["i18n.tradingview.com", "partial.tradingview.com", "www.tradingview.com", "wwwcn.tradingview.com"].indexOf(e) || -1 !== ["d33t3vvu2t2yu5.cloudfront.net", "dwq4do82y8xi7.cloudfront.net", "s.tradingview.com", "s3.tradingview.com"].indexOf(e) || e.match(/^[a-z]{2}\.tradingview\.com/) || e.match(/prod-[^.]+.tradingview.com/) ? "battle" : e.includes("tradingview.com") || e.includes("staging") ? "staging" : "local"
            }

            function i() {
                const e = self.environment;
                return function(e) {
                    o.has(e) || console.warn("Invalid environment " + e)
                }(e), e
            }

            function a() {
                return "local" === i()
            }

            function s() {
                return "battle" === i()
            }

            function c() {
                return !s()
            }
        },
        125226: (e, t, n) => {
            "use strict";
            var o = n(49437).TVLocalStorage,
                r = n(942634).Delegate,
                i = n(855385);
            n(638456);
            var a = new r;
            TradingView.FeatureToggle = {
                force_prefix: "forcefeaturetoggle.",
                onChanged: new r,
                enableFeature: function(e) {
                    o.setItem(this.force_prefix + e, "true"), a.fire(e)
                },
                disableFeature: function(e) {
                    o.setItem(this.force_prefix + e, "false"), a.fire(e)
                },
                resetFeature: function(e) {
                    o.removeItem(this.force_prefix + e), a.fire(e)
                },
                onFeaturesStateChanged: function() {
                    return a
                }
            }, TradingView.isFeatureEnabled = function(e) {
                var t = "featuretoggle_seed";

                function r(e) {
                    try {
                        var n = i(e + function() {
                            if (window.user && window.user.id) return window.user.id;
                            var e = o.getItem(t);
                            return null !== e || (e = Math.floor(1e6 * Math.random()), o.setItem(t, e)), e
                        }());
                        return new DataView(n).getUint32(0, !0) / 4294967296
                    } catch (e) {
                        return .5
                    }
                }

                function s(t) {
                    return !("local" !== window.environment || ! function(e) {
                        var t = ["address_validation_enabled", "skip_navigation_on_chart", "tick_intervals", "broker_TRADESTATION", "broker_TRADOVATE_dev", "black_friday_mainpage", "black_friday_popup", "datawindow", "trading-fast-renew-oauth-token", "switching_year_to_month_disabled", "default_year_billing_cycle_switcher", "marketing-analytics", "visible_address_fields_by_default", "slow-support-warning", "hide-trading-floating-toolbar", "details_disable_bid_ask", "vat_disabled", "disable_recaptcha_on_signup", "braintree-gopro-in-order-dialog", "braintree-apple-pay", "braintree-google-pay", "braintree-apple-pay-trial", "braintree-google-pay-trial", "braintree-3ds-enabled", "order_presets", "trial_increased_monthly_discounts", "checkout-tvcoins", "checkout-3ds", "checkout-subscriptions", "razorpay-card-tvcoins", "razorpay-card-subscriptions", "razorpay-upi-tvcoins", "razorpay-upi-subscriptions", "dlocal-payments", "hide_gopro_popup_upgrade_button", "tradestation_use_sync_mapper", "broker_id_session", "modular_broker_use_sync_mapper", "oanda-european-accounts-warning", "mobile_show_bottom_panel", "disable_save_settings", "ignore_mobile_apps_distinguish_pro_full_name", "desktop_version_notification_enabled", "favorites-in-broker-dropdown", "hide_ecomonic_events", "mobile_trading_web", "mobile_trading_ios", "mobile_trading_android", "hide_real_brokers_on_mobile", "disable_tradestation_country_block", "enable_trading_server_logger", "hide_ranges_label_colors", "disable_user_specific_encryption", "minds_widget_enabled", "self-replacing-advanced-chart-widget", "disable-calendar-advanced-chart-widget", "disable-lse-data-screener-heatmap-widgets", "symphony_notification_badges", "paper_competition_banner", "paper_competition_started_dialog", "paper_subaccount_custom_currency", "disable_pushstream_connections_for_anonymous_users", "use_staging_verifier", "account_verifier_maintenance", "ibkr_use_new_init_session_api", "tradestation_account_data_streaming", "enable_eventsource_pushstream_transport", "enable_eventsource_pushstream_mobile", "performance_test_mode", "ftx_request_server_logger", "ibkr_request_server_logger", "disallow_concurrent_sessions", "check_ibkr_side_maintenance", "tradestation_request_server_logger", "trading_request_server_logger", "hide_tweet_drawingtool", "hide_anchored_note", "editor_new_save", "no_buy_hold_backtesting", "editor_new_save_only", "backtesting_report", "enable_new_custom_public_chats", "bottom_panel_track_events", "ibkr_ws_account_summary", "continuous_front_contract_trading", "vertex-tax-included", "enable_traded_context_linking", "order_context_validation_in_instant_mode", "show_data_problems_in_help_center", "chart_storage_hibernation_delay_60min", "chart_storage_hibernation_delay_10min", "chart_storage_hibernation_delay_5min", "force_disable_jsx_menu_items_rendering", "hide_dom", "enable_sign_in_popup_with_evercookie", "start_replay_right_after_point_selection", "switching_raf_toast", "new_order_size_calculator", "order_type_specific_settings_saving", "hide_position_trade_value", "paper_force_connect_pushstream", "use_broker_logos_from_single_source", "alerts-on-watchlists", "alerts-start-christmas", "alerts-use-http-caching", "alerts-remove-offline-pop-ups", "alerts-remove-clear-alerts-button", "forexcom_session_v2", "fxcm_server_logger", "minds_comments_enable_for_free_users", "fxcm_trailing_stop_bracket", "mock_tweet_data_for_tests", "replay_result_sharing", "ibkr_ws_server_logger", "options_strategy_analyzer_tab", "options_details_widget", "options_overlay", "options_product_page", "options_exchange_nse", "options_exchange_cme", "options_exchange_cbot", "options_exchange_comex", "options_exchange_nymex", "options_exchange_bse", "options_exchange_opra", "ibkr_subscribe_to_order_updates_first", "rest_logout_on_429", "amp_oauth_authorization", "blueline_oauth_authorization", "dorman_oauth_authorization", "cqg_oauth_authorization", "ironbeam_oauth_authorization", "optimus_oauth_authorization", "stonex_oauth_authorization", "tickmill_oauth_authorization", "ibkr_ws_account_ledger", "force_max_allowed_pulling_intervals", "fxcm_password_authorization_type", "change_password_suggestion_popup", "ibkr_disable_ws_connect_timeout", "oanda_rest_api", "launch-oanda-country-group-1", "launch-oanda-country-group-2", "launch-oanda-country-group-3", "news_enable_streaming", "news_screener_page_client", "news_enable_streaming_hibernation", "news_streaming_hibernation_delay_60min", "news_streaming_hibernation_delay_10min", "news_streaming_hibernation_delay_5min", "replay_trading_brackets", "cqg-realtime-bandwidth-limit", "cityindex_spreadbetting", "paper_use_new_auth", "stack_trace_clickable", "oauth2_code_flow_provider_server_logger", "turn_off_ai", "enable_binanceapis_base_url", "unsibscribe_competition_for_participants", "enable_first_touch_is_selection", "paper_delay_trading", "static_dom", "binance_disable_live_account_verification", "enable_forced_email_confirmation", "ylg_oauth_authorization", "show_replay_trading_panel", "order_ticket_resizable_drawer_on", "enable_toast_notifications_groupable", "enable_order_moving_by_price_line", "replay_trading_on_study", "enable_anchor_for_traded_objects", "snowplow_3", "renew_token_preemption_30", "renew_token_preemption_60", "renew_token_preemption_120", "do_not_open_ot_from_plus_button", "rest_use_async_mapper", "mockbroker_server_logging", "oanda_rest_server_logging"],
                            n = "[A-Z]+[a-zA-Z0-9_]+",
                            o = new RegExp(`broker_${n}_dev`, "g"),
                            r = new RegExp(`hide_${n}_on_ios`, "g"),
                            i = new RegExp(`hide_${n}_on_android`, "g"),
                            a = new RegExp(`hide_${n}_on_mobile_web`, "g");
                        return -1 === t.indexOf(e) && -1 === e.indexOf("-maintenance") && !1 === o.test(e) && !1 === r.test(e) && !1 === i.test(e) && !1 === a.test(e)
                    }(t)) || (!e[t] || -1 !== e[t]) && (!!("true" === o.getItem(TradingView.FeatureToggle.force_prefix + t) || window.is_authenticated && "undefined" != typeof user && user.settings && "true" === user.settings[TradingView.FeatureToggle.force_prefix + t]) || !("false" === o.getItem(TradingView.FeatureToggle.force_prefix + t) || window.is_authenticated && "undefined" != typeof user && user.settings && "false" === user.settings[TradingView.FeatureToggle.force_prefix + t]) && (!!e[t] && (1 === e[t] || r(t) <= e[t])))
                }
                return TradingView.onWidget() || Promise.all([n.e(1867), n.e(34604)]).then(n.bind(n, 501867)).then((t => {
                    t.pushStreamMultiplexer.on("featuretoggle", (function(t) {
                        var n = s(t.name);
                        e[t.name] = t.state, n !== s(t.name) && a.fire(t.name)
                    }))
                })), s
            }(window.featureToggleState || {}), TradingView.FeatureToggle, t.isFeatureEnabled = TradingView.isFeatureEnabled, t.onFeaturesStateChanged = TradingView.FeatureToggle.onFeaturesStateChanged.bind(TradingView.FeatureToggle)
        },
        251954: (e, t, n) => {
            "use strict";
            n.d(t, {
                emit: () => l,
                emitOnce: () => d,
                subscribe: () => c,
                unsubscribe: () => s
            });
            var o = n(942634);
            const r = {},
                i = [],
                a = {};

            function s(e, t, n) {
                r[e].unsubscribe(n, t)
            }

            function c(e, t, n, i) {
                r.hasOwnProperty(e) || (r[e] = new o.Delegate), a[e] ? t.call(n) : r[e].subscribe(n, t, i)
            }

            function l(e, ...t) {
                const n = [e].concat(t);
                i.forEach((e => {
                    e.apply(null, n)
                })), r.hasOwnProperty(e) && r[e].fire.apply(r[e], t)
            }

            function d(e) {
                a[e] && console.warn(`Something went wrong: emitOnce called multiple times with same event (${e})`), a[e] = !0, l.apply(null, arguments)
            }
        },
        799786: (e, t, n) => {
            "use strict";
            n.r(t), n.d(t, {
                Modifiers: () => i.Modifiers,
                createGroup: () => o.createGroup,
                keyboardPressedKeysState: () => o.keyboardPressedKeysState,
                pressedKeys: () => o.pressedKeys,
                registerWindow: () => o.registerWindow,
                unregisterWindow: () => o.unregisterWindow
            });
            var o = n(129592),
                r = n(764250),
                i = n(591800),
                a = n(345848);
            (0, o.registerWindow)(window), r.ActionGroup.setMatchedHotkeyHandler((e => {
                (0, a.trackEvent)("Keyboard Shortcuts", (0, i.humanReadableHash)(e))
            }))
        },
        588948: (e, t, n) => {
            "use strict";
            n.d(t, {
                getFreshInitData: () => c,
                getInitData: () => s,
                updateInitData: () => a
            });
            var o = n(650151);
            const r = (0, n(338619).getLogger)("Common.InitData"),
                i = window.initData || {};

            function a() {
                window.initData && window.initData !== i && (Object.assign(i, window.initData), window.initData = i);
                const e = document.querySelectorAll('script[type="application/prs.init-data+json"]');
                for (let t = 0; t < e.length; t++) {
                    const n = e[t];
                    try {
                        const e = JSON.parse((0, o.ensureNotNull)(n.textContent));
                        Object.assign(i, e)
                    } catch (e) {
                        r.logWarn(`Failed to parse initData element. ${e}`)
                    } finally {
                        (0, o.ensureNotNull)(n.parentNode).removeChild(n)
                    }
                }
            }

            function s() {
                return i
            }

            function c() {
                return a(), i
            }
        },
        49437: (e, t, n) => {
            "use strict";
            const {
                getLogger: o
            } = n(338619), r = o("TVLocalStorage");
            var i = function() {
                try {
                    this.isAvailable = !0, this.localStorage = window.localStorage, this.localStorage.setItem("tvlocalstorage.available", "true")
                } catch (e) {
                    delete this.isAvailable, delete this.localStorage
                }
                this._updateLength();
                try {
                    this._report()
                } catch (e) {}
            };
            i.prototype._report = function() {
                if (this.isAvailable) {
                    const e = 10,
                        t = [];
                    for (let e = 0; e < this.localStorage.length; e++) {
                        const n = this.key(e);
                        t.push({
                            key: n,
                            length: String(this.getItem(n)).length
                        })
                    }
                    t.sort(((e, t) => t.length - e.length));
                    const n = t.slice(0, e);
                    t.sort(((e, t) => t.key.length - e.key.length));
                    const o = t.slice(0, e);
                    r.logNormal(`Total amount of keys in Local Storage: ${this.length}`), r.logNormal(`Top ${e} keys with longest values: ${JSON.stringify(n)}`), r.logNormal(`Top ${e} longest key names: ${JSON.stringify(o)}`);
                    try {
                        navigator.storage.estimate().then((e => {
                            r.logNormal(`Storage estimate: ${JSON.stringify(e)}`)
                        }))
                    } catch (e) {}
                }
            }, i.prototype.length = 0, i.prototype.isAvailable = !1, i.prototype.localStorage = {
                "tvlocalstorage.available": "false"
            }, i.prototype._updateLength = function() {
                if (this.isAvailable) this.length = this.localStorage.length;
                else {
                    var e, t = 0;
                    for (e in this.localStorage) this.localStorage.hasOwnProperty(e) && t++;
                    this.length = t
                }
            }, i.prototype.key = function(e) {
                return this.isAvailable ? this.localStorage.key(e) : Object.keys(this.localStorage)[e]
            }, i.prototype.getItem = function(e) {
                return this.isAvailable ? this.localStorage.getItem(e) : void 0 === this.localStorage[e] ? null : this.localStorage[e]
            }, i.prototype.setItem = function(e, t) {
                this.isAvailable ? this.localStorage.setItem(e, t) : this.localStorage[e] = t, this._updateLength()
            }, i.prototype.removeItem = function(e) {
                this.isAvailable ? this.localStorage.removeItem(e) : delete this.localStorage[e], this._updateLength()
            }, i.prototype.clear = function() {
                this.isAvailable ? this.localStorage.clear() : this.localStorage = {}, this._updateLength()
            }, window.TVLocalStorage = new i, e.exports.TVLocalStorage = window.TVLocalStorage
        },
        439563: (e, t, n) => {
            "use strict";
            async function o() {
                const e = (await Promise.all([n.e(6242), n.e(19247), n.e(36683)]).then(n.bind(n, 469449))).getTrackerInstance();
                return e || null
            }
            n.d(t, {
                getEmbedWidgetTracker: () => o
            })
        },
        175203: (e, t, n) => {
            "use strict";
            n.d(t, {
                telemetry: () => d
            });
            var o = n(942634),
                r = n(702598),
                i = n(638456),
                a = n(314802);
            n(659863);
            const s = (0, n(338619).getLogger)("Common.Telemetry"),
                c = {
                    default: 15e3,
                    site: 3e5
                },
                l = ["before_websocket_connection_time_frame", "websocket_connection_time_frame", "first_series_full_time_frame", "page_full_load_time_frame", "page_load_time_frame"];
            const d = new class {
                constructor() {
                    this.reportSent = new o.Delegate, this.timeCounters = {
                        series: {
                            marks: []
                        },
                        study: {},
                        pine: {}
                    }, this._timeoutIds = {}, this._commonAdditionalData = {
                        cluster: null,
                        userId: "0"
                    }, this._reportStash = {}
                }
                setSessionInfo(e) {
                    const t = this._parseCluster(e);
                    null !== t && (this._commonAdditionalData.cluster = t)
                }
                sendReport(e, t, n) {
                    var o;
                    if (!this._isAbleToSendReport(t)) return;
                    const r = this._getSubserviceType(e),
                        i = this._getHost(e, r);
                    if (null !== i) {
                        if (n = void 0 === n ? {
                                count: 1
                            } : n, this._addReportToStash(n, t, i), !this._timeoutIds[e]) {
                            const t = null !== (o = c[e]) && void 0 !== o ? o : c.default;
                            this._timeoutIds[e] = setTimeout(this._sendTelemetryToService.bind(this, e, i), t)
                        }
                    } else s.logError(`Unable to get host for counter: ${t}, metric type: ${e}, serivce type: ${r}`)
                }
                sendChartReport(e, t, n = !0) {
                    this._sendServiceSpecifiedReport("charts", e, t, n)
                }
                sendLineToolsStorageReport(e, t, n = !0) {
                    this._sendServiceSpecifiedReport("line_tools_storage", e, t, n)
                }
                _sendServiceSpecifiedReport(e, t, n, o = !0) {
                    this._updateUserInfo(), n = void 0 === n ? {
                        count: 1
                    } : n, o && (n = this._appendCommonAdditionalInfo(n, ["cluster", "userId"])), this.sendReport(e, t, n)
                }
                _updateUserInfo() {
                    const e = "user" in window && "id" in window.user ? window.user.id : "0";
                    this._commonAdditionalData.userId = String(e)
                }
                _isAbleToSendReport(e) {
                    const t = window.TELEMETRY_HOSTS,
                        n = l.includes(e),
                        o = Boolean(window.TradingView.onChartPage || (0, i.onWidget)());
                    return t && (!n || o)
                }
                _sendTelemetryToService(e, t) {
                    if (this._reportStash.hasOwnProperty(t)) {
                        const e = this._cropParams(this._reportStash[t]),
                            n = this._renameAllParams(e),
                            o = {
                                event: "report_stash",
                                params: this._cleanAllParams(n)
                            };
                        s.logDebug(`Report to host: ${t}; stash: ${JSON.stringify(this._reportStash[t])}`), this.reportSent.fire(this._reportStash[t]), delete this._reportStash[t], (0, r.fetch)(`${t}/report`, {
                            method: "POST",
                            body: JSON.stringify(o)
                        })
                    }
                    this._timeoutIds[e] = null
                }
                _getHost(e, t) {
                    const n = window.TELEMETRY_HOSTS,
                        o = n[e] && n[e][t];
                    return Boolean(o) ? o : null
                }
                _getSubserviceType(e) {
                    if (!["charts", "site"].includes(e)) return "all";
                    let t = "free";
                    const n = window.user.is_pro;
                    return "charts" === e && (0, a.isOnMobileAppPage)("old") ? t = n ? "ios_pro" : "ios_free" : "charts" === e && (0, a.isOnMobileAppPage)("new") ? t = n ? "android_pro" : "android_free" : (0, i.onWidget)() ? t = "widget" : n && (t = "pro"), t
                }
                _parseCluster(e) {
                    let t;
                    try {
                        t = JSON.parse(e).session_id
                    } catch (e) {
                        return s.logError("Could not parse cluster id (session id)"), null
                    }
                    const n = /(.*@)(.*)/gi.exec(t);
                    return null !== n && n.length >= 3 ? n[2] : null
                }
                _appendCommonAdditionalInfo(e, t) {
                    return t.forEach((t => {
                        t in this._commonAdditionalData && (e.additional = e.additional || {}, e.additional[t] = this._commonAdditionalData[t])
                    })), e
                }
                _cropParams(e) {
                    var t;
                    for (const n in e) e.hasOwnProperty(n) && e[n].length > 1e3 && (e.too_much_metrics_frame = null !== (t = e.too_much_metrics_frame) && void 0 !== t ? t : [], e.too_much_metrics_frame.push({
                        value: e[n].length,
                        additional: {
                            event: n
                        }
                    }), delete e[n]);
                    return e
                }
                _renameAllParams(e) {
                    const t = {};
                    for (const n in e) e.hasOwnProperty(n) && (t[n] = [], e[n].forEach((e => {
                        t[n].push(this._renameEntryParams(e))
                    })));
                    return t
                }
                _renameEntryParams(e) {
                    const t = {
                        count: "c",
                        value: "v",
                        text: "t",
                        additional: "a"
                    };
                    return Object.keys(e).reduce(((n, o) => (n[t[o]] = e[o], n)), {})
                }
                _cleanAllParams(e) {
                    const t = {};
                    for (const n in e)
                        if (e.hasOwnProperty(n)) {
                            t[n] = [];
                            const o = {
                                c: 0
                            };
                            e[n].forEach((e => {
                                const r = this._cleanEntryParams(e),
                                    i = Object.keys(r).length;
                                1 === i && void 0 !== r.c ? o.c += r.c : i > 0 && t[n].push(r)
                            })), o.c > 0 && t[n].push(o), 0 === t[n].length && delete t[n]
                        }
                    return t
                }
                _cleanEntryParams(e) {
                    const t = Object.keys(e).reduce(((t, n) => "c" !== n && "t" !== n || e[n] ? (t[n] = e[n], t) : t), {});
                    return "c" in t || "v" in t || "t" in t ? t : {}
                }
                _addReportToStash(e, t, n) {
                    n in this._reportStash || (this._reportStash[n] = {}), t in this._reportStash[n] || (this._reportStash[n][t] = []), Object.keys(e).length > 0 && this._reportStash[n][t].push(e)
                }
            }
        },
        626333: (e, t, n) => {
            "use strict";

            function o(e, t = window) {
                const n = "theme-" + e,
                    o = t.document.documentElement.classList;
                for (const e of Array.from(o)) e.startsWith("theme-") && e !== n && o.remove(e);
                o.add(n)
            }
            n.d(t, {
                applyTheme: () => o
            })
        },
        331633: (e, t, n) => {
            "use strict";
            n.d(t, {
                setTheme: () => a,
                watchedTheme: () => i
            });
            var o = n(375397),
                r = n(626333);
            const i = new o.WatchedValue;

            function a(e) {
                i.setValue(e)
            }
            i.subscribe((e => {
                (0, r.applyTheme)(e, window)
            }))
        },
        345848: (e, t, n) => {
            "use strict";
            n.d(t, {
                trackEvent: () => a
            });
            n(251954);
            var o = n(764829);
            const r = (0, n(338619).getLogger)("Common.TrackEvent");
            let i = !1;
            const a = (e, t, n) => {
                if (i) return;
                let a = (e ? e + ":" : "") + t;
                n && (a += " " + n), r.logNormal(a), o.enabled("widget") || !window._UNIT_TESTS && window.gtag && window.gtag("event", t, {
                    event_category: e,
                    event_label: n
                })
            };
            "undefined" != typeof window && (window.TradingView = window.TradingView || {}, window.TradingView.trackEvent = a)
        },
        889267: (e, t, n) => {
            "use strict";
            n.d(t, {
                factorOutBraces: () => u,
                getTokenAtPos: () => d,
                isBinaryOperator: () => c,
                isSpread: () => l,
                parseToken: () => g,
                shortName: () => _,
                symbolTokenEscapeRe: () => r,
                tokenize: () => s
            });
            var o = n(173777);
            const r = /[+\-/*]/,
                i = {
                    number: /\d+(?:\.\d*|(?![a-zA-Z0-9_!:.&]))|\.\d+/,
                    incompleteNumber: /\./,
                    symbol: /(?:[^-+\/*^\s]'|[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF])(?:[^-+\/*^\s]'|[a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!|:.&])*|'.+?'/,
                    incompleteSymbol: /'[^']*/,
                    separatorPrefix: o.SEPARATOR_PREFIX,
                    openBrace: "(",
                    closeBrace: ")",
                    plus: "+",
                    minus: "-",
                    multiply: "*",
                    divide: "/",
                    power: "^",
                    whitespace: /[\0-\x20\s]+/,
                    unparsed: null
                },
                a = new RegExp(Object.values(i).map((e => {
                    return null === e ? "" : `(${"string"==typeof e?(t=e,t.replace(/[\^$()[\]{}*+?|\\]/g,"\\$&")):e.source})`;
                    var t
                })).filter((e => "" !== e)).concat(".").join("|"), "g");

            function s(e) {
                if (!e) return [];
                const t = [],
                    n = Object.keys(i);
                let o;
                for (; o = a.exec(e);) {
                    let e = !1;
                    for (let r = n.length; r--;)
                        if (o[r + 1]) {
                            n[r] && t.push({
                                value: o[r + 1],
                                type: n[r],
                                precedence: 0,
                                offset: o.index
                            }), e = !0;
                            break
                        }
                    e || t.push({
                        value: o[0],
                        type: "unparsed",
                        precedence: 0,
                        offset: o.index
                    })
                }
                return t
            }

            function c(e) {
                return "plus" === e || "minus" === e || "multiply" === e || "divide" === e || "power" === e
            }

            function l(e) {
                return e.length > 1 && e.some((e => c(e.type)))
            }

            function d(e, t) {
                for (let n = 0; n < e.length; n++) {
                    const o = e[n],
                        r = "symbol" === o.type || "incompleteSymbol" === o.type || "number" === o.type;
                    if (o.offset <= t && t <= o.offset + o.value.length && r) return o
                }
                return null
            }

            function u(e) {
                e = function(e) {
                    const t = [];
                    for (const n of e) "whitespace" !== n.type && t.push(n);
                    return t
                }(e);
                const t = [],
                    n = [];
                let o;
                for (let r = 0; r < e.length; r++) {
                    const i = e[r];
                    switch (i.type) {
                        case "plus":
                        case "minus":
                        case "multiply":
                        case "divide":
                        case "power":
                            n.length && n[n.length - 1].minPrecedence > i.precedence && (n[n.length - 1].minPrecedence = i.precedence);
                            break;
                        case "openBrace":
                            o = {
                                minPrecedence: 1 / 0,
                                openBraceIndex: r
                            }, n.push(o);
                            break;
                        case "closeBrace":
                            {
                                if (o = n.pop(), !o) break;
                                const i = e[o.openBraceIndex - 1],
                                    a = e[r + 1],
                                    s = i && ("plus" === i.type || "multiply" === i.type);
                                (!c(null == a ? void 0 : a.type) || (null == a ? void 0 : a.precedence) <= o.minPrecedence) && (!c(null == i ? void 0 : i.type) || (null == i ? void 0 : i.precedence) < (null == o ? void 0 : o.minPrecedence) || (null == i ? void 0 : i.precedence) === (null == o ? void 0 : o.minPrecedence) && s) && (t.unshift(o.openBraceIndex), t.push(r), n.length && n[n.length - 1].minPrecedence > o.minPrecedence && (n[n.length - 1].minPrecedence = o.minPrecedence))
                            }
                    }
                }
                for (let n = t.length; n--;) e.splice(t[n], 1);
                return e
            }

            function _(e) {
                return u(s(e)).reduce(((e, t) => {
                    if ("symbol" !== t.type) return e + t.value;
                    const [, n] = g(t);
                    return n ? e + n : e
                }), "")
            }

            function g(e) {
                const t = /^'?(?:([A-Z0-9_]+):)?(.*?)'?$/i.exec(e.value);
                return null === t ? [void 0, void 0] : [t[1], t[2]]
            }
        },
        995683: (e, t, n) => {
            "use strict";

            function o(e, t, n = {}) {
                return Object.assign({}, e, function(e, t, n = {}) {
                    const o = Object.assign({}, t);
                    for (const r of Object.keys(t)) {
                        const i = n[r] || r;
                        i in e && (o[r] = [e[i], t[r]].join(" "))
                    }
                    return o
                }(e, t, n))
            }
            n.d(t, {
                mergeThemes: () => o
            })
        },
        625545: (e, t, n) => {
            "use strict";
            n.r(t), n.d(t, {
                destroyQuoteSessions: () => c,
                getQuoteSessionInstance: () => i,
                getQuoteSessionNoEnsure: () => s,
                setQuoteSessionInstance: () => a
            });
            var o = n(360451);
            const r = {};

            function i(e = "full") {
                return r[e] || a(e, new o(e)), r[e]
            }

            function a(e = "full", t) {
                r[e] = t
            }

            function s(e = "full") {
                return r[e]
            }

            function c() {
                for (const e in r)
                    if (r.hasOwnProperty(e)) {
                        const t = r[e];
                        void 0 !== t && t.destroy(), delete r[e]
                    }
            }
        },
        692558: (e, t, n) => {
            "use strict";
            n.d(t, {
                LOGLEVEL: () => i,
                getLogHistory: () => y,
                getLogLevel: () => h,
                getLogger: () => E,
                getRawLogHistory: () => w,
                isHighRateEnabled: () => f,
                loggingOff: () => L,
                loggingOn: () => k,
                serializeLogHistoryEntry: () => b,
                setLogLevel: () => v
            });
            const o = "undefined" != typeof window ? window : {};
            let r = !1;
            try {
                localStorage.getItem(""), r = !0
            } catch (e) {}
            var i;
            ! function(e) {
                e[e.ERROR = 1] = "ERROR", e[e.WARNING = 2] = "WARNING", e[e.INFO = 3] = "INFO", e[e.NORMAL = 4] = "NORMAL", e[e.DEBUG = 5] = "DEBUG"
            }(i || (i = {}));
            let a = 0;
            const s = "tv.logger.loglevel",
                c = "tv.logger.logHighRate",
                l = [];
            let d = null,
                u = null,
                _ = null,
                g = NaN,
                m = i.WARNING,
                p = !1;

            function h() {
                return m
            }

            function f() {
                return p
            }

            function v(e) {
                e = Math.max(i.ERROR, Math.min(i.DEBUG, e)), m = e, O()
            }

            function w(e, t) {
                let n = l.reduce(((e, t) => e.concat(t)), []);
                return n.sort(((e, t) => e.id - t.id)), void 0 !== t && (n = n.filter((e => e.subSystemId === t))), "number" == typeof e && (n = n.slice(-e)), n
            }

            function b(e) {
                return new Date(e.timestamp).toISOString() + ":" + e.subSystemId + ":" + e.message.replace(/"/g, "'")
            }
            const y = o.lget = (e, t) => function(e, t) {
                let n, o = 0,
                    r = 0;
                for (n = e.length - 1; n >= 1 && (o += 8 * (1 + encodeURIComponent(e[n]).length), !(n - 1 > 0 && (r = 8 * (1 + encodeURIComponent(e[n - 1]).length), o + r > t))); n--);
                return e.slice(n)
            }(w(e, t).map(b), 75497472);

            function S(e, t, n, o) {
                if (t === u && o.id === _) return;
                const r = new Date;
                if (e <= i.NORMAL && function(e, t, n, o, r) {
                        "function" == typeof structuredClone && (t = structuredClone(t));
                        const i = {
                            id: a,
                            message: t,
                            subSystemId: o,
                            timestamp: Number(e)
                        };
                        a += 1, n.push(i), void 0 !== r && n.length > r && n.splice(0, 1)
                    }(r, t, n, o.id, o.maxCount), e <= m && (!o.highRate || f()) && (!d || o.id.match(d))) {
                    const n = r.toISOString() + ":" + o.id + ":" + t;
                    switch (e) {
                        case i.DEBUG:
                            console.debug(n);
                            break;
                        case i.INFO:
                        case i.NORMAL:
                            o.color ? console.log("%c" + n, "color: " + o.color) : console.log(n);
                            break;
                        case i.WARNING:
                            console.warn(n);
                            break;
                        case i.ERROR:
                            console.error(n)
                    }
                    u = t, _ = o.id, g && clearTimeout(g), g = setTimeout((() => {
                        u = null, _ = null, g = NaN
                    }), 1e3)
                }
            }

            function E(e, t = {}) {
                const n = [];
                l.push(n);
                const o = Object.assign(t, {
                    id: e
                });

                function r(e) {
                    return t => S(e, String(t), n, o)
                }
                return {
                    logDebug: r(i.DEBUG),
                    logError: r(i.ERROR),
                    logInfo: r(i.INFO),
                    logNormal: r(i.NORMAL),
                    logWarn: r(i.WARNING)
                }
            }
            const T = E("logger"),
                k = o.lon = (e, t) => {
                    v(i.DEBUG), T.logNormal("Debug logging enabled"), p = Boolean(e), d = t || null, O()
                },
                L = o.loff = () => {
                    v(i.INFO), T.logInfo("Debug logging disabled")
                };

            function O() {
                try {
                    r && (localStorage.setItem(c, String(p)), localStorage.setItem(s, String(m)))
                } catch (e) {
                    T.logWarn(`Cannot save logger state (level: ${m}, high-rate: ${p}) to localStorage: ${e.message}`)
                }
            }! function() {
                p = !!r && "true" === localStorage.getItem(c);
                let e = parseInt(r && localStorage.getItem(s) || "");
                Number.isNaN(e) && (e = i.WARNING), v(e), T.logNormal(`Init with settings - level: ${m}, high-rate: ${p}`)
            }(), o.performance && o.performance.now ? T.logNormal(`Sync logger and perf times, now is ${o.performance.now()}`) : T.logWarn("Perf time is not available")
        },
        750139: (e, t, n) => {
            "use strict";

            function o(e, t) {
                return e <= t
            }

            function r(e, t) {
                return e >= t
            }

            function i(e, t, n) {
                return Math.min(Math.max(e, t), n)
            }

            function a(e) {
                return e < 0 ? -1 : e > 0 ? 1 : 0
            }

            function s(e) {
                if (e < 0) return !1;
                if (e > 1e18) return !0;
                for (let t = e; t > 1; t /= 10)
                    if (t % 10 != 0) return !1;
                return !0
            }

            function c(e, t, n) {
                return t - e <= n
            }

            function l(e, t, n) {
                return Math.abs(e - t) < n
            }

            function d(e) {
                return e <= 0 ? NaN : Math.log(e) / Math.log(10)
            }

            function u(e, t) {
                return e < t ? -1 : e > t ? 1 : 0
            }

            function _(e, t = u) {
                if (e.length < 1) throw Error("array is empty");
                let n = e[0];
                for (let o = 0; o < e.length; ++o) t(e[o], n) < 0 && (n = e[o]);
                return n
            }

            function g(e, t = u) {
                if (e.length < 1) throw Error("array is empty");
                let n = e[0];
                for (let o = 0; o < e.length; ++o) t(e[o], n) > 0 && (n = e[o]);
                return n
            }

            function m(e) {
                const t = Math.ceil(e);
                return t % 2 != 0 ? t - 1 : t
            }

            function p(e) {
                return e > 0 ? Math.floor(e) : Math.ceil(e)
            }
            n.r(t), n.d(t, {
                ceiledEven: () => m,
                clamp: () => i,
                defComparator: () => u,
                equal: () => l,
                greaterOrEqual: () => c,
                greaterThan: () => r,
                isBaseDecimal: () => s,
                lessThan: () => o,
                log10: () => d,
                max: () => g,
                min: () => _,
                sign: () => a,
                toInt: () => p
            })
        },
        566953: (e, t, n) => {
            n(778785).setClasses();
            var o = n(411963).whenDocumentReady,
                r = n(282616).handleTVLinksClick;
            o((() => {
                r()
            }))
        },
        930203: (e, t, n) => {
            "use strict";
            n.d(t, {
                CubicBezier: () => o.CubicBezier,
                color: () => o.color,
                dur: () => o.dur,
                easingFunc: () => o.easingFunc
            });
            var o = n(745269)
        },
        986830: (e, t, n) => {
            "use strict";

            function o(e, t) {
                const n = t || window.locale || "en";
                let o = e[n] ? e[n] : e.en;
                return o = "tradingview.com" === o ? "www.tradingview.com" : o, o ? document.location.protocol + "//" + o : ""
            }
            n.d(t, {
                determineBaseUrl: () => o
            })
        },
        433524: (e, t, n) => {
            "use strict";
            n.r(t), n.d(t, {
                capitalizeFirstLetterInWord: () => m,
                decodeHTMLEntities: () => l,
                encodeHTMLEntities: () => d,
                getFirstSegmentOrCodePointString: () => p,
                htmlEscape: () => u,
                removeSpaces: () => g,
                removeTags: () => _
            });
            const o = /[<"'&>]/g,
                r = e => `&#${e.charCodeAt(0)};`,
                i = {
                    "&lt;": "<",
                    "&gt;": ">",
                    "&quot;": '"',
                    "&apos;": "'",
                    "&amp;": "&",
                    "&#60;": "<",
                    "&#62;": ">",
                    "&#34;": '"',
                    "&#39;": "'",
                    "&#039;": "'",
                    "&#38;": "&"
                },
                a = Object.assign({}, ...Object.entries(i).map((([e, t]) => ({
                    [t]: e
                })))),
                s = new RegExp(Object.keys(i).join("|"), "g"),
                c = new RegExp(Object.keys(a).join("|"), "g");

            function l(e) {
                return e.replace(s, (e => i[e] || e))
            }

            function d(e) {
                return e.replace(c, (e => a[e] || e))
            }

            function u(e) {
                return e.replace(o, r)
            }

            function _(e = "") {
                return e.replace(/(<([^>]+)>)/gi, "")
            }

            function g(e = "") {
                return e.replace(/\s+/g, "")
            }

            function m(e = "") {
                return e.replace(/\b\w/g, (e => e.toUpperCase()))
            }

            function p(e) {
                var t;
                const n = Intl.Segmenter;
                if (n) {
                    const o = new n(void 0, {
                            granularity: "grapheme"
                        }),
                        [{
                            segment: r
                        } = {
                            segment: null
                        }] = o.segment(e);
                    return null !== (t = null == r ? void 0 : r.toUpperCase()) && void 0 !== t ? t : null
                } {
                    const t = e.codePointAt(0);
                    return t ? String.fromCodePoint(t).toUpperCase() : null
                }
            }
        },
        924225: (e, t, n) => {
            "use strict";

            function o(e) {
                const t = new URL(e, document.baseURI);
                return c(t) && s(t) && a(t)
            }

            function r(e) {
                const t = new URL(e, document.baseURI);
                return s(t) && a(t)
            }

            function i(e) {
                return !e.split(/(\s+)/).filter((e => e.trim().length > 0)).some((e => {
                    try {
                        const t = new URL(e);
                        return !(!t || !t.hostname.length) && !r(e)
                    } catch (e) {
                        return !1
                    }
                }))
            }
            n.d(t, {
                isInternalHost: () => l,
                isInternalUrl: () => o,
                isSafeUrl: () => r,
                isTvLink: () => d,
                validateUrlsInText: () => i
            });
            const a = e => !e.username,
                s = e => "http:" === e.protocol || "https:" === e.protocol,
                c = e => e.hostname === location.hostname || !/^\d+\.\d+\.\d+\.\d+$/.test(e.hostname) && l(e.hostname);

            function l(e, t = window.location.hostname) {
                const n = "." === t.slice(-1) ? 3 : 2,
                    o = t.toLowerCase().split(".").slice(-n),
                    r = e.toLowerCase().split(".").slice(-o.length);
                return o.join(".") === r.join(".")
            }

            function d(e) {
                try {
                    return e.startsWith("/") || l(new URL(e).hostname, "tradingview.com")
                } catch (e) {
                    return !1
                }
            }
        },
        282616: (e, t, n) => {
            "use strict";
            n.d(t, {
                handleTVLinksClick: () => a,
                sendWidgetTrackData: () => s
            });
            var o = n(439563),
                r = n(248213),
                i = n(924225);

            function a() {
                document.addEventListener("click", (e => {
                    const t = e.target.closest(":link");
                    if (!(null == t ? void 0 : t.hostname) || !(0, i.isInternalHost)(t.hostname, "tradingview.com")) return;
                    const n = t.dataset.targetType || null;
                    s(t.href, n)
                }))
            }

            function s(e, t) {
                const n = function() {
                        const e = window.initData.hashSettings;
                        if (Object.keys(e).length > 0) return (0, r.filterUtmInfo)(e);
                        const t = new URLSearchParams(location.href);
                        return {
                            utm_campaign: t.get("utm_campaign") || void 0,
                            utm_source: t.get("utm_source") || void 0
                        }
                    }(),
                    i = function(e) {
                        var t;
                        const n = (null === (t = location.ancestorOrigins) || void 0 === t ? void 0 : t[0]) || document.referrer;
                        return e.utm_source || function(e) {
                            try {
                                return new URL(e).host
                            } catch (e) {
                                return ""
                            }
                        }(n)
                    }(n);
                !async function(e) {
                    var t;
                    null === (t = await (0, o.getEmbedWidgetTracker)()) || void 0 === t || t.trackWidgetTVLinkClick(e)
                }({
                    widget_type: c(n),
                    domain: i,
                    link: e,
                    target_type: t
                })
            }

            function c(e) {
                if (e.utm_campaign) return e.utm_campaign;
                const t = location.pathname;
                return t.includes("embed-widget") ? t.split("/")[2] : t
            }
        },
        120762: (e, t, n) => {
            "use strict";
            n.d(t, {
                extractWidgetSettings: () => r
            });
            const o = {
                whitelabel: !0,
                permissionOverrides: !0
            };

            function r(e, t = [], n) {
                return function(e, t, n, r = [], i) {
                    const a = n.slice(1),
                        s = decodeURIComponent(a);
                    let c = {};
                    try {
                        "" !== s && (c = JSON.parse(s), void 0 !== i && i(e, c), Object.keys(c).forEach((e => {
                            (o[e] || r.includes(e)) && delete c[e]
                        })))
                    } catch (e) {
                        c = {}, console.warn("Hash params parsing error! Hash params ignored.")
                    }
                    const l = t.slice(1),
                        d = t.includes("%") ? decodeURIComponent(l) : t,
                        u = new URLSearchParams(d);
                    let _ = {};
                    try {
                        u.forEach(((e, t) => {
                            r.includes(t) || (_[t] = e)
                        })), void 0 !== i && i(e, _)
                    } catch (e) {
                        _ = {}, console.warn("Search query params parsing error! Search query params ignored.")
                    }
                    return Object.assign({}, e, c, _)
                }(e, location.search, location.hash, t, n)
            }
        }
    }
]);