"use strict";
(self.webpackChunktradingview = self.webpackChunktradingview || []).push([
    [23448], {
        173777: (e, t, n) => {
            n.d(t, {
                SEPARATOR_PREFIX: () => _
            });
            const _ = "###"
        },
        66974: (e, t, n) => {
            function _(e = location.host) {
                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" : e.match(/webcharts/) ? "staging_local" : (e.match(/^localhost(:\d+)?$/), "local")
            }

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

            function r() {
                return "battle" === _()
            }

            function o() {
                return !r()
            }
            n.r(t), n.d(t, {
                environment: () => _,
                isDebug: () => o,
                isLocal: () => i,
                isProd: () => r
            })
        },
        778016: (e, t, n) => {
            n.d(t, {
                enabled: () => s,
                getConfig: () => l
            });
            n(650151);
            var _ = n(409352),
                i = n(102710),
                r = n(833813),
                o = n(822122),
                a = n(255453);

            function s(e, t, n) {
                let _ = window.user;
                n && (_ = n);
                const i = l(e, t, _);
                return !!i && !(i[r.ProductFeatures.DISABLE_ON_TRIAL] && (!_ || _.is_trial))
            }

            function c(e) {
                const t = _[e];
                return t ? t.extends ? Object.assign({}, c(t.extends), t) : t : null
            }

            function l(e, t, n) {
                var _;
                let r = c(t || function(e) {
                    let t = window.user;
                    e && (t = e);
                    let n = (null == t ? void 0 : t.pro_plan) || o.ProPlans.Free;
                    const _ = n !== o.ProPlans.Free && !(0, a.isTrialProduct)(n);
                    return _ || (n = (0, a.getProductForTrial)(n)), _ && t && !t.new_pro_product_line && (n = `__legacy_${n}`), n
                }(n));
                if (!r) return null;
                const s = null === (_ = window.TradingView) || void 0 === _ ? void 0 : _.widgetCustomer;
                return s && i[s] && (r = Object.assign({}, r, i[s])), r && r[e] || null
            }
        },
        833813: (e, t, n) => {
            var _;
            n.d(t, {
                    ProductFeatures: () => _
                }),
                function(e) {
                    e.DISABLE_ON_TRIAL = "disable_on_trial", e.CUSTOM_INTERVALS = "CUSTOM_INTERVALS", e.CHART_STORAGE = "CHART_STORAGE", e.MULTIPLE_CHARTS = "MULTIPLE_CHARTS", e.MULTIPLE_WATCHLISTS = "MULTIPLE_WATCHLISTS", e.IMPORT_WATCHLISTS = "IMPORT_WATCHLISTS", e.EXPORT_WATCHLISTS = "EXPORT_WATCHLISTS", e.INDICATORS_ON_CHART = "INDICATORS_ON_CHART", e.STUDY_ON_STUDY = "STUDY_ON_STUDY", e.TICK_BY_TICK_PUSH_DATA = "TICK_BY_TICK_PUSH_DATA", e.SERVER_SIDE_ALERTS = "SERVER_SIDE_ALERTS", e.PUBLISH_INVITE_ONLY_SCRIPTS = "PUBLISH_INVITE_ONLY_SCRIPTS", e.PUBLISH_PROTECTED_SCRIPTS = "PUBLISH_PROTECTED_SCRIPTS", e.SCREENER_ALERTS = "SCREENER_ALERTS", e.SCREENER_AUTO_REFRESH = "SCREENER_AUTO_REFRESH", e.SCREENER_EXPORT_DATA = "SCREENER_EXPORT_DATA", e.SCREENER_INTERVALS = "SCREENER_INTERVALS", e.SCREENER_NEW_AUTO_REFRESH = "SCREENER_NEW_AUTO_REFRESH", e.SIMULTANEOUS_CONNECTIONS = "SIMULTANEOUS_CONNECTIONS", e.BACKEND_CONNECTIONS = "BACKEND_CONNECTIONS", e.STUDY_TEMPLATES = "STUDY_TEMPLATES", e.CAN_EDIT_PUBLIC_CHATS = "CAN_EDIT_PUBLIC_CHATS", e.NO_SPONSORED_ADS = "NO_SPONSORED_ADS", e.IDC_AVAILABLE_DELAY = "IDC_AVAILABLE_DELAY", e.STATUS = "STATUS", e.ALERTS_NO_EXPIRATION = "ALERTS_NO_EXPIRATION", e.MULTIFLAGGED_SYMBOLS_LISTS = "MULTIFLAGGED_SYMBOLS_LISTS", e.BAR_REPLAY_INTRADAY = "BAR_REPLAY_INTRADAY", e.TV_VOLUMEBYPRICE = "TV_VOLUMEBYPRICE", e.ALERTS_WEBHOOK = "ALERTS_WEBHOOK", e.DEEP_FUNDAMENTALS_HISTORY = "DEEP_FUNDAMENTALS_HISTORY", e.EXPORT_CHART_DATA = "EXPORT_CHART_DATA",
                        e.ALERTS_ON_SECONDS = "ALERTS_ON_SECONDS", e.PERMANENT_STREAM_RECORDS = "PERMANENT_STREAM_RECORDS", e.IDEA_SOCIAL_LINKS = "IDEA_SOCIAL_LINKS", e.EXTENDED_SOCIAL_LINKS = "EXTENDED_SOCIAL_LINKS", e.DEEP_HISTORY_BACKTEST = "DEEP_HISTORY_BACKTEST", e.BACKTESTING_EXPORT = "BACKTESTING_EXPORT", e.USE_BAR_MAGNIFIER = "USE_BAR_MAGNIFIER", e.HISTORICAL_BARS = "HISTORICAL_BARS", e.KAGI_RENKO = "KAGI_RENKO", e.INTRADAY_SPREAD = "INTRADAY_SPREAD", e.SECONDS_INTERVALS = "SECONDS_INTERVALS", e.MULTICOLOR_FLAGGED_SYMBOLS = "MULTICOLOR_FLAGGED_SYMBOLS", e.INTRADAY_EXCHANGE = "INTRADAY_EXCHANGE", e.CUSTOM_CHATS = "CUSTOM_CHATS", e.VOLUME_PROFILE = "VOLUME_PROFILE", e.PRIMITIVE_ALERTS = "PRIMITIVE_ALERTS", e.COMPLEX_ALERTS = "COMPLEX_ALERTS", e.TV_PROSTUDIES = "TV_PROSTUDIES", e.CHART_PATTERNS = "CHART_PATTERNS", e.SMS_2FA_VERIFICATION = "SMS_2FA_VERIFICATION", e.SOCIAL_ACTIVITY = "SOCIAL_ACTIVITY"
                }(_ || (_ = {}))
        },
        251954: (e, t, n) => {
            n.d(t, {
                emit: () => l,
                subscribe: () => c,
                unsubscribe: () => s
            });
            var _ = n(707957),
                i = n.n(_);
            const r = {},
                o = [],
                a = {};

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

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

            function l(e, ...t) {
                const n = [e].concat(t);
                o.forEach((e => {
                    e.apply(null, n)
                })), r.hasOwnProperty(e) && r[e].fire.apply(r[e], t)
            }
        },
        588948: (e, t, n) => {
            n.d(t, {
                getInitData: () => a,
                updateInitData: () => o
            });
            var _ = n(650151);
            const i = (0, n(201089).getLogger)("Common.InitData"),
                r = window.initData || {};

            function o() {
                window.initData && window.initData !== r && (Object.assign(r, window.initData), window.initData = r);
                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, _.ensureNotNull)(n.textContent));
                        Object.assign(r, e)
                    } catch (e) {
                        i.logWarn(`Failed to parse initData element. ${e}`)
                    } finally {
                        (0, _.ensureNotNull)(n.parentNode).removeChild(n)
                    }
                }
            }

            function a() {
                return r
            }
        },
        519073: (e, t, n) => {
            function _(e) {
                return e.includes("crypto")
            }

            function i(e, t) {
                return "commodity" === e || t.includes("commodity")
            }
            n.d(t, {
                hasCryptoTypespec: () => _,
                isCommodity: () => i
            })
        },
        175203: (e, t, n) => {
            n.d(t, {
                telemetry: () => u
            });
            var _ = n(707957),
                i = n.n(_),
                r = n(120780),
                o = n(638456),
                a = n(314802);
            n(659863);
            const s = (0, n(201089).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 u = new class {
                constructor() {
                    this.reportSent = new(i()), 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 _;
                    if (!this._isAbleToSendReport(t)) return;
                    const i = this._getSubserviceType(e),
                        r = this._getHost(e, i);
                    if (null !== r) {
                        if (n = void 0 === n ? {
                                count: 1
                            } : n, this._addReportToStash(n, t, r), !this._timeoutIds[e]) {
                            const t = null !== (_ = c[e]) && void 0 !== _ ? _ : c.default;
                            this._timeoutIds[e] = setTimeout(this._sendTelemetryToService.bind(this, e, r), t)
                        }
                    } else s.logError(`Unable to get host for counter: ${t}, metric type: ${e}, serivce type: ${i}`)
                }
                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, _ = !0) {
                    this._updateUserInfo(), n = void 0 === n ? {
                        count: 1
                    } : n, _ && (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),
                        _ = Boolean(window.TradingView.onChartPage || (0, o.onWidget)());
                    return t && (!n || _)
                }
                _sendTelemetryToService(e, t) {
                    if (this._reportStash.hasOwnProperty(t)) {
                        const e = this._cropParams(this._reportStash[t]),
                            n = this._renameAllParams(e),
                            _ = {
                                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(_)
                        })
                    }
                    this._timeoutIds[e] = null
                }
                _getHost(e, t) {
                    const n = window.TELEMETRY_HOSTS,
                        _ = n[e] && n[e][t];
                    return Boolean(_) ? _ : 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, o.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, _) => (n[t[_]] = e[_], n)), {})
                }
                _cleanAllParams(e) {
                    const t = {};
                    for (const n in e)
                        if (e.hasOwnProperty(n)) {
                            t[n] = [];
                            const _ = {
                                c: 0
                            };
                            e[n].forEach((e => {
                                const i = this._cleanEntryParams(e),
                                    r = Object.keys(i).length;
                                1 === r && void 0 !== i.c ? _.c += i.c : r > 0 && t[n].push(i)
                            })), _.c > 0 && t[n].push(_), 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)
                }
            }
        },
        779923: (e, t, n) => {
            async function _(e, t) {
                const _ = await Promise.all([n.e(84139), n.e(22666), n.e(92108), n.e(9817), n.e(92191), n.e(66639), n.e(34465), n.e(69121), n.e(88194), n.e(30006), n.e(26855), n.e(43610), n.e(96899), n.e(12305), n.e(745), n.e(55092), n.e(38890)]).then(n.bind(n, 894185));
                return _.showSimpleDialog(e, _.warningModule, t)
            }
            n.d(t, {
                showWarning: () => _
            })
        },
        889267: (e, t, n) => {
            var _ = n(244842),
                i = n(173777);
            const r = {
                number: /\d+(?:\.\d*|(?![a-zA-Z0-9_!:.&]))|\.\d+/,
                incompleteNumber: /\./,
                symbol: _.enabled("charting_library_base") ? /(?:[^-+\/*^\s]'|[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF^])(?:[^-+\/*^\s]'|[a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!:.&])*|'.+?'/ : /(?:[^-+\/*^\s]'|[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF])(?:[^-+\/*^\s]'|[a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!|:.&])*|'.+?'/,
                incompleteSymbol: /'[^']*/,
                separatorPrefix: i.SEPARATOR_PREFIX,
                openBrace: "(",
                closeBrace: ")",
                plus: "+",
                minus: "-",
                multiply: "*",
                divide: "/",
                power: "^",
                whitespace: /[\0-\x20\s]+/,
                unparsed: null
            };
            new RegExp(Object.values(r).map((e => {
                return null === e ? "" : `(${"string"==typeof e?(t=e,t.replace(/[\^$()[\]{}*+?|\\]/g,"\\$&")):e.source})`;
                var t
            })).filter((e => "" !== e)).concat(".").join("|"), "g")
        },
        315347: (e, t, n) => {
            var _, i;
            n.d(t, {
                    TIMEFRAMETYPE: () => i
                }),
                function(e) {
                    e.extractErrorReason = function(e) {
                        return e.params[1]
                    }
                }(_ || (_ = {})),
                function(e) {
                    e.PeriodBack = "period-back", e.TimeRange = "time-range"
                }(i || (i = {}))
        },
        6613: (e, t, n) => {
            n.r(t), n.d(t, {
                QUOTE_FIELDS: () => r,
                QUOTE_FIELDS_CACHE: () => o,
                QuoteCache: () => i
            });
            var _ = n(650151);
            class i {
                constructor(e) {
                    this._cache = new Map, this._fields = [...e.fields]
                }
                update(e, t, n) {
                    const i = (0, _.ensureDefined)(e.symbolname);
                    if (this._cache.has(i) || this._cache.set(i, {
                            symbolname: i,
                            status: e.status,
                            values: {}
                        }), "error" === e.status) return;
                    const r = (0, _.ensureDefined)(this._cache.get(i));
                    r.status = e.status;
                    for (const _ of this._fields) t.has(_) && (n || void 0 !== e.values[_]) && (r.values[_] = e.values[_])
                }
                get(e) {
                    var t;
                    return null !== (t = this._cache.get(e)) && void 0 !== t ? t : null
                }
                fields() {
                    return this._fields
                }
            }
            const r = new Set(["pro_name", "base_name", "logoid", "currency-logoid", "base-currency-logoid", "source-logoid", "short_name", "timezone", "current_session", "lp_time", "open_price", "high_price", "low_price", "price_52_week_high", "price_52_week_low", "ask", "ask_size", "bid", "bid_size", "rch", "rchp", "rtc", "business_description", "web_site_url", "number_of_employees", "float_shares_outstanding", "earnings_release_next_calendar_date", "root", "description", "exchange", "listed_exchange", "type", "country_code", "provider_id", "sector", "typespecs", "visible-plots-set", "industry", "currency_id", "last_price", "fractional", "minmov", "minmove2", "pricescale", "change", "change_percent", "volume", "average_volume", "market_cap_basic", "total_revenue", "earnings_per_share_basic_ttm", "price_earnings_ttm", "beta_1_year", "dps_common_stock_prim_issue_fy", "dividends_yield", "earnings_release_next_date", "earnings_per_share_forecast_next_fq", "earnings_release_date", "earnings_per_share_fq", "fundamental_currency_code", "number_of_employees", "web_site_url", "business_description", "founded", "ceo", "float_shares_outstanding", "total_shares_outstanding", "dividend_payout_ratio_ttm", "dividends_yield_current", "dividend_ex_date_upcoming", "dividend_amount_upcoming", "dividend_amount_recent", "dividend_ex_date_recent", "total_revenue_fq_h", "total_revenue_fy_h", "net_income_fy_h", "net_income_fq_h", "total_assets_fy_h", "total_assets_fq_h", "total_liabilities_fy_h", "total_liabilities_fq_h", "cash_f_operating_activities_fy_h", "cash_f_operating_activities_fq_h", "cash_f_investing_activities_fy_h", "cash_f_investing_activities_fq_h", "cash_f_financing_activities_fy_h", "cash_f_financing_activities_fq_h", "fiscal_period_fy_h", "fiscal_period_fq_h", "earnings_release_date_fq_h", "earnings_release_next_date_fq", "earnings_per_share_forecast_next_fq", "earnings_per_share_forecast_fq_h", "earnings_per_share_fq_h", "earnings_fiscal_period_fq_h", "next_earnings_fiscal_period_fq", "earnings_release_next_time", "is_next_earnings_release_date_estimated", "symbol-primaryname", "currency_code", "rates_mc", "rates_fy", "rates_ttm", "value_unit_id", "update_mode", "language", "local_description", "short_description", "source", "source2", "format", "recommendation_mark", "last_report_frequency", "price_target_estimates_num", "price_target_average", "update_mode_seconds", "recommendation_total", "recommendation_buy", "recommendation_over", "recommendation_hold", "recommendation_under", "recommendation_sell", "recommendation_total", "price_target_high", "price_target_low", "rates_pt", "rates_pt", "total_revenue_fy_h", "total_revenue_fq_h", "total_revenue_fh_h", "net_income_fy_h", "net_income_fq_h", "net_income_fh_h", "total_assets_fy_h", "total_assets_fq_h", "total_assets_fh_h", "total_liabilities_fy_h", "total_liabilities_fq_h", "total_liabilities_fh_h", "cash_f_operating_activities_fy_h", "cash_f_operating_activities_fq_h", "cash_f_operating_activities_fh_h", "cash_f_investing_activities_fy_h", "cash_f_investing_activities_fq_h", "cash_f_investing_activities_fh_h", "cash_f_financing_activities_fy_h", "cash_f_financing_activities_fq_h", "cash_f_financing_activities_fh_h", "fiscal_period_fy_h", "fiscal_period_fq_h", "fiscal_period_fh_h", "earnings_release_date_fq_h", "earnings_release_date_fy_h", "earnings_release_date_fh_h", "earnings_release_next_date_fq", "earnings_release_next_date_fy", "earnings_release_next_date_fh", "earnings_release_next_time", "is_next_earnings_release_date_estimated", "earnings_per_share_forecast_next_fq", "earnings_per_share_forecast_next_fy", "earnings_per_share_forecast_next_fh", "earnings_per_share_forecast_fq_h", "earnings_per_share_forecast_fy_h", "earnings_per_share_forecast_fh_h", "earnings_per_share_fq_h", "earnings_per_share_fy_h", "earnings_per_share_fh_h", "earnings_fiscal_period_fq_h", "earnings_fiscal_period_fy_h", "earnings_fiscal_period_fh_h", "next_earnings_fiscal_period_fq", "next_earnings_fiscal_period_fy", "next_earnings_fiscal_period_fh", "revenue_fq_h", "revenue_fy_h", "revenue_fh_h", "revenue_forecast_fq_h", "revenue_forecast_fy_h", "revenue_forecast_fh_h", "revenue_forecast_next_fq", "revenue_forecast_next_fy", "revenue_forecast_next_fh", "revenue_seg_by_business_h", "revenue_seg_by_region_h", "dividend_payout_ratio_ttm", "dividends_yield_current", "dividend_ex_date_upcoming", "dividend_amount_upcoming", "dividend_amount_recent", "dividend_ex_date_recent", "dividend_amount_h", "total_revenue_fy", "gross_profit_fy", "ebitda_fy", "ebit_fy", "net_income_fy", "total_debt_fy_h", "free_cash_flow_fy_h", "cash_n_equivalents_fy_h", "total_current_assets_fy", "total_current_liabilities_fy", "total_non_current_assets_fy", "total_non_current_liabilities_fy", "price_sales_fy_h", "price_earnings_fy_h", "diluted_net_income_ttm", "total_revenue_ttm", "price_earnings_current", "price_sales_current", "isin", "website", "doc", "reddit", "twitter", "facebook", "telegram", "forum", "explorer", "sources", "contracts", "crypto_common_categories", "crypto_asset", "dividends_availability", "earnings_availability", "financials_availability"]),
                o = new i({
                    fields: r
                })
        },
        876332: (e, t, n) => {
            n.d(t, {
                getQuoteSessionInstance: () => o
            });
            var _ = n(11228),
                i = n.n(_);
            const r = {};

            function o(e = "full") {
                return r[e] || function(e = "full", t) {
                    r[e] = t
                }(e, new(i())(e)), r[e]
            }
        },
        678515: (e, t, n) => {
            function _(e, t, n) {
                return Math.min(Math.max(e, t), n)
            }

            function i(e) {
                return e > 0 ? Math.floor(e) : Math.ceil(e)
            }
            n.d(t, {
                clamp: () => _,
                toInt: () => i
            })
        },
        846540: (e, t, n) => {
            n.r(t), n.d(t, {
                types: () => _
            });
            const _ = {
                ECONOMIC: "economic",
                QUANDL: "quandl"
            }
        },
        201089: (e, t, n) => {
            n.r(t), n.d(t, {
                LOGLEVEL: () => r,
                getLogHistory: () => R,
                getLogLevel: () => m,
                getLogger: () => I,
                getRawLogHistory: () => E,
                isHighRateEnabled: () => p,
                loggingOff: () => N,
                loggingOn: () => v,
                serializeLogHistoryEntry: () => T,
                setLogLevel: () => S
            });
            const _ = "undefined" != typeof window ? window : {};
            let i = !1;
            try {
                localStorage.getItem(""), i = !0
            } catch (e) {}
            var r;
            ! 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"
            }(r || (r = {}));
            let o = 0;
            const a = "tv.logger.loglevel",
                s = "tv.logger.logHighRate",
                c = [];
            let l = null,
                u = null,
                d = null,
                f = NaN,
                h = r.WARNING,
                g = !1;

            function m() {
                return h
            }

            function p() {
                return g
            }

            function S(e) {
                e = Math.max(r.ERROR, Math.min(r.DEBUG, e)), h = e, y()
            }

            function E(e, t) {
                let n = c.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 T(e) {
                return new Date(e.timestamp).toISOString() + ":" + e.subSystemId + ":" + e.message.replace(/"/g, "'")
            }

            function R(e, t) {
                return function(e, t) {
                    let n, _ = 0,
                        i = 0;
                    for (n = e.length - 1; n >= 1 && (_ += 8 * (1 + encodeURIComponent(e[n]).length), !(n - 1 > 0 && (i = 8 * (1 + encodeURIComponent(e[n - 1]).length), _ + i > t))); n--);
                    return e.slice(n)
                }(E(e, t).map(T), 75497472)
            }

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

            function I(e, t = {}) {
                const n = [];
                c.push(n);
                const _ = Object.assign(t, {
                    id: e
                });

                function i(e) {
                    return t => A(e, String(t), n, _)
                }
                return {
                    logDebug: i(r.DEBUG),
                    logError: i(r.ERROR),
                    logInfo: i(r.INFO),
                    logNormal: i(r.NORMAL),
                    logWarn: i(r.WARNING)
                }
            }
            const O = I("logger"),
                v = _.lon = (e, t) => {
                    S(r.DEBUG), O.logNormal("Debug logging enabled"), g = Boolean(e), l = t || null, y()
                },
                N = _.loff = () => {
                    S(r.INFO), O.logInfo("Debug logging disabled")
                };

            function y() {
                try {
                    i && (localStorage.setItem(s, String(g)), localStorage.setItem(a, String(h)))
                } catch (e) {
                    O.logWarn(`Cannot save logger state (level: ${h}, high-rate: ${g}) to localStorage: ${e.message}`)
                }
            }! function() {
                g = !!i && "true" === localStorage.getItem(s);
                let e = parseInt(i && localStorage.getItem(a) || "");
                Number.isNaN(e) && (e = r.WARNING), S(e),
                    O.logNormal(`Init with settings - level: ${h}, high-rate: ${g}`)
            }(), _.performance && _.performance.now ? O.logNormal(`Sync logger and perf times, now is ${_.performance.now()}`) : O.logWarn("Perf time is not available")
        },
        746133: (e, t, n) => {
            var _;
            ! function(e) {
                e.Monthly = "m", e.ThreeMonths = "3m", e.OneYear = "y", e.TwoYears = "2y"
            }(_ || (_ = {}))
        },
        822122: (e, t, n) => {
            var _, i, r, o;
            n.d(t, {
                    ProPlans: () => _
                }),
                function(e) {
                    e.Free = "free", e.Pro = "pro", e.ProTrial = "pro_trial", e.ProRealtime = "pro_realtime", e.ProRealtimeTrial = "pro_realtime_trial", e.ProPremium = "pro_premium", e.ProPremiumTrial = "pro_premium_trial"
                }(_ || (_ = {})),
                function(e) {
                    e.ProExpert = "pro_expert", e.ProRealtimeExpert = "pro_realtime_expert", e.PremiumExpert = "pro_premium_expert"
                }(i || (i = {})),
                function(e) {
                    e.Platinum = "platinum", e.Gold = "gold", e.Silver = "silver", e.Free = "free"
                }(r || (r = {})),
                function(e) {
                    e[e.Platinum = 3] = "Platinum", e[e.Gold = 2] = "Gold", e[e.Silver = 1] = "Silver", e[e.Free = 0] = "Free"
                }(o || (o = {}))
        },
        258621: (e, t, n) => {
            function _(e, t) {
                const n = t || window.locale || "en";
                let _ = e[n] ? e[n] : e.en;
                return _ = "tradingview.com" === _ ? "www.tradingview.com" : _, _ ? document.location.protocol + "//" + _ : ""
            }
            n.d(t, {
                determineBaseUrl: () => _
            })
        },
        397150: (e, t, n) => {
            n.d(t, {
                showTooManyStudiesNotice: () => a
            });
            var _ = n(777754),
                i = n(778016),
                r = n(833813),
                o = n(779923);

            function a(e) {
                "number" != typeof e && (e = TradingView.STUDY_COUNT_LIMIT, e = (0, i.getConfig)(r.ProductFeatures.STUDY_ON_STUDY).limit), (0, o.showWarning)({
                    title: _.t(null, void 0, n(533603)),
                    text: _.t(null, void 0, n(470213)).format({
                        number: e
                    })
                })
            }
        },
        255453: (e, t, n) => {
            n.d(t, {
                getProductForTrial: () => r,
                isTrialProduct: () => i
            });
            n(586463), n(777754), n(822122), n(746133);
            const _ = "_trial";

            function i(e) {
                return new RegExp("_trial$").test(e)
            }

            function r(e) {
                return e.split(_)[0]
            }
        },
        691239: (e, t, n) => {
            function _(e) {
                const t = new URL(e, document.baseURI);
                return r(t) && i(t)
            }
            n.d(t, {
                isInternalHost: () => o,
                isSafeUrl: () => _
            });
            const i = e => !e.username,
                r = e => "http:" === e.protocol || "https:" === e.protocol;

            function o(e, t = window.location.hostname) {
                const n = "." === t.slice(-1) ? 3 : 2,
                    _ = t.toLowerCase().split(".").slice(-n),
                    i = e.toLowerCase().split(".").slice(-_.length);
                return _.join(".") === i.join(".")
            }
        },
        42398: (e, t, n) => {
            n.d(t, {
                addUtmToUrl: () => i
            });
            var _ = n(185515);

            function i(e, t) {
                if (!/([a-zA-Z0-9.-]*tradingview.com)|localhost/.test(e)) return e;
                const n = (0, _.buildUtmQueryString)(t);
                if ("" === n) return e;
                const i = e.indexOf("?"),
                    r = e.indexOf("#"),
                    o = -1 !== r;
                if (-1 !== i && (!o || i < r)) {
                    return `${e.slice(0,i)}?${o?e.slice(i+1,r):e.slice(i+1)}&${n}${o?e.slice(r):""}`
                }
                if (o) {
                    return `${e.slice(0,r)}?${n}${e.slice(r)}`
                }
                return `${e}?${n}`
            }
        }
    }
]);