(window.webpackJsonp = window.webpackJsonp || []).push([ ["library"], { "+2Ad": function(e, t, i) { "use strict"; i.r(t), i.d(t, "setupChartScreenshotHint", (function() { return o })); var s = i("YFKU"), r = i("FQhm"), n = i("Eyy1"); function o(e, t) { const o = Object(s.t)("Link to the chart image copied to clipboard {emoji}").format({ emoji: "👍" }), a = Object(s.t)("Chart image copied to clipboard {emoji}").format({ emoji: "👍" }); r.on("onServerScreenshotCopiedToClipboard", () => h(o), null), r.on( "onClientScreenshotCopiedToClipboard", () => h(a), null); let l = null; const c = e.getContainer(); function h(e) { l ? l.show(e) : Promise.all([i.e("react"), i.e(84), i.e("chart-screenshot-hint")]).then( i.bind(null, "USSy")).then(i => { l || (l = new i.ChartScreenshotHintRenderer(Object(n.ensureNotNull)(c), { bottomPadding: t.seriesControlBarEnabled }), l.show(e)) }) } } }, "+6II": function(e, t, i) { "use strict"; var s = i("8+VR"); let r = 0, n = 0, o = 0; function a() { clearTimeout(r), clearTimeout(n), clearTimeout(o) } function l(e, t) { r = setTimeout(e, t) } const c = "tooltip-root-element"; let h; function u() { const e = document.getElementById(c); e ? h = e : (h = document.createElement("div"), h.id = c, document.body.appendChild(h)) } function d() { h && (h.innerHTML = "") } "interactive" === document.readyState ? u() : document.addEventListener("DOMContentLoaded", u); var p = i("Eyy1"); const _ = { default: "", white: "theme-white", "round-shadow": "theme-round-shadow" }, m = Object.keys(_); var f = i("CPmC"), g = i("/DW5"), b = i("gWrr"), v = i("Ialn"), S = (i("HbRj"), i("XAms")), y = i("Hr11"), w = i("qFKp"), P = i("Wo0S"); function C(e) { const t = e.hasAttribute("data-tooltip") ? e.getAttribute("data-tooltip") : e.getAttribute( "title"); return t && (Object(f.b)(e, "text", t), e.removeAttribute("title")), Object(f.a)(e, "text") || "" } function x(e) { const t = E.cloneNode(!0), i = V(t), { content: s } = e; switch (s.type) { case "element": i.innerHTML = "", i.appendChild(s.data); break; case "html": i.innerHTML = s.data; break; case "text": if (e.hotkey) { const e = D.cloneNode(!0); e.innerText = s.data, i.appendChild(e) } else i.innerText = s.data } if (e.hotkey) { const t = "none" !== s.type, r = k.cloneNode(!0), n = Object(g.a)(e.hotkey), o = n.keys.map(e => `${e}`); r.innerHTML = function(e, t) { return e.replace(/{\d}|{hotkey_\d}/gi, e => { const i = Number(e.match(/\d/)); return t[i] }) }(n.text, o).replace(/\s\+\s/g, `+`), i.classList.add(P[ "common-tooltip__body--with-hotkey"]), t && r.classList.add(P[ "common-tooltip__hotkey-block--divider"]), i.appendChild(r) } return t.addEventListener("contextmenu", S.a), t } function T(e, t) { const i = t.rect; if (!i) return; ! function(e, t) { const i = m.includes(t) ? _[t] : ""; e.classList.remove(...m.map(e => _[e]).filter(e => !!e)), i && !e.classList.contains( i) && e.classList.add(i) }(e, t.colorTheme || "default"), t.addClass && e.classList.add(t.addClass); const s = V(e), r = e.querySelector("." + P["common-tooltip__button-container"]); s.classList.toggle(P["common-tooltip__body--width_wide"], Boolean(t.wide)), s.classList .toggle(P["common-tooltip__body--no-padding"], Boolean(t.noPadding)), s.classList .toggle(P["common-tooltip__body--width_narrow"], Boolean(t.narrow)), s.classList.toggle(P["common-tooltip__body--no-buttons"], !0), s.style.left = M(0), s .style.width = M(s.clientWidth + (Boolean(t.noPadding) ? 0 : 2)); const n = document.body.clientWidth, o = w.CheckMobile.iOS() || Object(w.supportTouch)() && Object(w.isMac)() ? window .innerHeight : document.body.clientHeight, a = t.vertical, l = t.extendMargin || a && i.w < 20 || !a && i.h < 20; e.classList.toggle(P["common-tooltip--farther"], l), e.classList.toggle(P[ "common-tooltip--vertical"], a), e.classList.toggle(P["common-tooltip--horizontal"], !a); const c = function(e) { return e.querySelector("." + P["common-tooltip__ear-holder"]) }(e), h = e.offsetHeight; if (a) { const a = 10, l = o - 10, u = 12, d = a + u, p = l - u, _ = Object(y.clamp)(i.y + i.h / 2, d, p) - h / 2, m = _ + h; e.style.left = M(i.x + i.w), e.style.top = M(_), _ < a ? s.style.top = r.style.top = M( a - _) : m > l && (s.style.top = r.style.top = M(l - m)); const { right: f } = (e.querySelector(":last-child") || s).getBoundingClientRect(), g = f + 10 > n; e.classList.toggle(P["common-tooltip--direction_reversed"], g), e.classList.toggle(P[ "common-tooltip--direction_normal"], !g); let b = g ? "after" : "before"; Object(v.isRtl)() ? (b = t.otr ? "after" : b, b = t.otl ? "before" : b) : (b = t.otr ? "before" : b, b = t.otl ? "after" : b), c.classList.toggle(P[ "common-tooltip__ear-holder--before"], "before" === b), c.classList.toggle(P[ "common-tooltip__ear-holder--after"], "after" === b), "after" === b && (e.style .left = "auto", e.style.right = M(n - i.x)) } else { const a = i.x - (s.offsetWidth - i.w) / 2, l = n - 10 - e.offsetWidth, u = Math.max(10, Math.min(a, l)); e.style.left = M(u); const d = l < a; e.classList.toggle(P["common-tooltip--direction_reversed"], d), e.classList.toggle(P[ "common-tooltip--direction_normal"], !d); const p = function(e, t, i, s) { if (e.above) return B(t, s) ? "above" : "below"; if (e.below) return function(e, t, i) { return i.y + i.h + t + 10 < e }(t, i, s) ? "below" : "above"; return B(i, s) ? "above" : "below" }(t, o, h, i); "above" === p ? e.style.bottom = M(o - i.y) : e.style.top = M(i.y + i.h), c.classList .add("above" === p ? P["common-tooltip__ear-holder--above"] : P[ "common-tooltip__ear-holder--below"]); const { left: _ } = s.getBoundingClientRect(); let m = Math.trunc(i.x + i.w / 2 - (_ + s.clientWidth / 2)); e.style.left = M(u + m), e.style.width = M(s.clientWidth + r.clientWidth), m = d ? Math .max(0, m) : Math.min(0, m), r.style.left = M(-m), s.style.left = M(-m) } } function I(e) { e.classList.toggle(P["common-tooltip--hidden"], !0) } function M(e) { return Math.floor(e) + "px" } const O = `\n\t
\n\t\t
\n\t\t\t
\n\t\t
\n\t\t
\n\t
\n`, L = `\n\t
\n`, A = `\n\t
\n`, E = Object(b.b)(O), k = Object(b.b)(L), D = Object(b.b)(A); function V(e) { return e.querySelector("." + P["common-tooltip__body"]) } function B(e, t) { return 10 + e < t.y } var R = i("lxNp"); i.d(t, "c", (function() { return H })), i.d(t, "b", (function() { return U })), i.d(t, "a", (function() { return G })); let N = !1, j = null, F = null; s.mobiletouch || document.addEventListener("mouseover", (function(e) { var t; if (null === (t = e.sourceCapabilities) || void 0 === t ? void 0 : t .firesTouchEvents) return; const i = e.target, s = e.currentTarget, r = function(e, t, i) { const s = []; for (; e && e !== t;) e.classList && e.classList.contains(i) && s.push( e), e = e.parentElement || (r = e.parentNode) && (r.nodeType === Node.ELEMENT_NODE ? r : null); var r; return s }(i, s, "apply-common-tooltip"); for (const t of r) { if ("buttons" in e) { if (1 & e.buttons) continue } else if (1 === e.which) continue; const i = () => H(t); if (i()) { const e = e => { e.target instanceof Element && e.target.contains(t) && s(null, ! 0) }, s = (r, n = !1) => { t.removeEventListener("common-tooltip-update", i), t .removeEventListener("mouseleave", s), t .removeEventListener("mousedown", s), document .removeEventListener("scroll", e, { capture: !0 }), F && (F.destroy(), F = null), G(n) }; t.addEventListener("common-tooltip-update", i), t.addEventListener( "mouseleave", s), t.addEventListener("mousedown", s), document .addEventListener("scroll", e, { capture: !0 }), null === F && (F = Object(R.createGroup)({ desc: "Tooltip" }), F.add({ desc: "Hide", hotkey: 27, handler: s })); break } } }), !0); const W = new MutationObserver(() => { if (j && j.options.target) { let e; e = "isConnected" in j.options.target ? j.options.target.isConnected : document .body.contains(j.options.target), e || G() } }), H = (e, t = {}) => { const { content: i, ...s } = Y(t), r = function(e) { const t = C(e), i = e.getBoundingClientRect(), s = { h: i.height, w: i.width, x: i.left, y: i.top }, r = e.getAttribute("data-color-theme") || "", n = e.classList.contains("common-tooltip-html"), o = parseInt(e.getAttribute("data-tooltip-delay") || ""), a = parseInt(e.getAttribute("data-tooltip-debounce") || ""); let l = { type: "none" }; return t && (l = { type: n ? "html" : "text", data: t }), { above: e.classList.contains("common-tooltip-above"), below: e.classList.contains("common-tooltip-below"), otl: e.classList.contains("common-tooltip-otl"), otr: e.classList.contains("common-tooltip-otr"), vertical: e.classList.contains("common-tooltip-vertical"), hotkey: e.getAttribute("data-tooltip-hotkey"), narrow: e.classList.contains("common-tooltip-narrow"), wide: e.classList.contains("common-tooltip-wide"), colorTheme: r, tooltipDelay: o, tooltipDebounce: a, rect: s, content: l, target: e } }(e), n = Object.assign(r, s); return "none" !== i.type && (n.content = i), !("none" === n.content.type && !n .hotkey) && (n.target = e, U(n), !0) }, U = e => { const t = Y(e), i = x(t); var s; if (j = { options: t, element: i }, s = i, d(), h && h.appendChild(s), a(), !N) return I(i), void l(() => q(i), function(e) { return "number" != typeof e.tooltipDelay || isNaN(e.tooltipDelay) ? 500 : e.tooltipDelay }(t)); const { tooltipDebounce: r } = e; "number" != typeof r || isNaN(r) ? q(i) : l(() => q(i), r) }; function z() { d(), N = !1, j = null } const G = e => { if (a(), W.disconnect(), !j) return; if (!e && !N) return; const { element: t, options: i } = j, s = () => { t.removeEventListener("mouseleave", s), I(t), e ? z() : o = setTimeout(() => { z() }, 250) }; var r, l; i.tooltipHideDelay ? (r = () => { t.querySelector(":hover") ? t.addEventListener("mouseleave", s) : s() }, l = i.tooltipHideDelay, n = setTimeout(r, l)) : s() }; function q(e) { const { options: t } = Object(p.ensureNotNull)(j); if (T(e, t), function(e) { e.classList.toggle(P["common-tooltip--hidden"], !1) }(e), W.observe(document, { childList: !0, subtree: !0 }), N = !0, t.forceHideOnMove) { const e = () => { document.removeEventListener("mousemove", e), G() }; document.addEventListener("mousemove", e) } } function Y(e) { if (function(e) { return "content" in e }(e)) return e; const { inner: t, html: i, text: s, ...r } = e; let n = { type: "none" }; return t && (n = { type: "element", data: t }), s && (n = { type: i ? "html" : "text", data: s }), { content: n, ...r } } }, "+6ja": function(e, t, i) { "use strict"; i.r(t), i.d(t, "availableTimezones", (function() { return o })), i.d(t, "timezoneIsAvailable", (function() { return a })), i.d(t, "timezoneTitle", (function() { return l })); i("YFKU"); var s = i("/+9u"); const r = [{ id: "Etc/UTC", title: window.t("UTC") }, { id: "exchange", title: window.t("Exchange") }], n = [{ id: "Africa/Cairo", title: window.t("Cairo"), offset: 0 }, { id: "Africa/Johannesburg", title: window.t("Johannesburg"), offset: 0 }, { id: "Africa/Lagos", title: window.t("Lagos"), offset: 0 }, { id: "America/Argentina/Buenos_Aires", title: window.t("Buenos Aires"), offset: 0 }, { id: "America/Bogota", title: window.t("Bogota"), offset: 0 }, { id: "America/Caracas", title: window.t("Caracas"), offset: 0 }, { id: "America/Chicago", title: window.t("Chicago"), offset: 0 }, { id: "America/El_Salvador", title: window.t("San Salvador"), offset: 0 }, { id: "America/Juneau", title: window.t("Juneau"), offset: 0 }, { id: "America/Lima", title: window.t("Lima"), offset: 0 }, { id: "America/Los_Angeles", title: window.t("Los Angeles"), offset: 0 }, { id: "America/Mexico_City", title: window.t("Mexico City"), offset: 0 }, { id: "America/New_York", title: window.t("New York"), offset: 0 }, { id: "America/Phoenix", title: window.t("Phoenix"), offset: 0 }, { id: "America/Santiago", title: window.t("Santiago"), offset: 0 }, { id: "America/Sao_Paulo", title: window.t("Sao Paulo"), offset: 0 }, { id: "America/Toronto", title: window.t("Toronto"), offset: 0 }, { id: "America/Vancouver", title: window.t("Vancouver"), offset: 0 }, { id: "US/Mountain", title: window.t("Denver"), offset: 0 }, { id: "Asia/Almaty", title: window.t("Almaty"), offset: 0 }, { id: "Asia/Ashkhabad", title: window.t("Ashkhabad"), offset: 0 }, { id: "Asia/Bahrain", title: window.t("Bahrain"), offset: 0 }, { id: "Asia/Bangkok", title: window.t("Bangkok"), offset: 0 }, { id: "Asia/Chongqing", title: window.t("Chongqing"), offset: 0 }, { id: "Asia/Dubai", title: window.t("Dubai"), offset: 0 }, { id: "Asia/Ho_Chi_Minh", title: window.t("Ho Chi Minh"), offset: 0 }, { id: "Asia/Hong_Kong", title: window.t("Hong Kong"), offset: 0 }, { id: "Asia/Jakarta", title: window.t("Jakarta"), offset: 0 }, { id: "Asia/Jerusalem", title: window.t("Jerusalem"), offset: 0 }, { id: "Asia/Kolkata", title: window.t("Kolkata"), offset: 0 }, { id: "Asia/Kuwait", title: window.t("Kuwait"), offset: 0 }, { id: "Asia/Muscat", title: window.t("Muscat"), offset: 0 }, { id: "Asia/Qatar", title: window.t("Qatar"), offset: 0 }, { id: "Asia/Riyadh", title: window.t("Riyadh"), offset: 0 }, { id: "Asia/Seoul", title: window.t("Seoul"), offset: 0 }, { id: "Asia/Shanghai", title: window.t("Shanghai"), offset: 0 }, { id: "Asia/Singapore", title: window.t("Singapore"), offset: 0 }, { id: "Asia/Taipei", title: window.t("Taipei"), offset: 0 }, { id: "Asia/Tehran", title: window.t("Tehran"), offset: 0 }, { id: "Asia/Tokyo", title: window.t("Tokyo"), offset: 0 }, { id: "Atlantic/Reykjavik", title: window.t("Reykjavik"), offset: 0 }, { id: "Australia/Adelaide", title: window.t("Adelaide"), offset: 0 }, { id: "Australia/Brisbane", title: window.t("Brisbane"), offset: 0 }, { id: "Australia/Perth", title: window.t("Perth"), offset: 0 }, { id: "Australia/Sydney", title: window.t("Sydney"), offset: 0 }, { id: "Europe/Amsterdam", title: window.t("Amsterdam"), offset: 0 }, { id: "Europe/Athens", title: window.t("Athens"), offset: 0 }, { id: "Europe/Belgrade", title: window.t("Belgrade"), offset: 0 }, { id: "Europe/Berlin", title: window.t("Berlin"), offset: 0 }, { id: "Europe/Brussels", title: window.t("Brussels"), offset: 0 }, { id: "Europe/Copenhagen", title: window.t("Copenhagen"), offset: 0 }, { id: "Europe/Dublin", title: window.t("Dublin"), offset: 0 }, { id: "Europe/Helsinki", title: window.t("Helsinki"), offset: 0 }, { id: "Europe/Istanbul", title: window.t("Istanbul"), offset: 0 }, { id: "Europe/Lisbon", title: window.t("Lisbon"), offset: 0 }, { id: "Europe/London", title: window.t("London"), offset: 0 }, { id: "Europe/Luxembourg", title: window.t("Luxembourg"), offset: 0 }, { id: "Europe/Madrid", title: window.t("Madrid"), offset: 0 }, { id: "Europe/Malta", title: window.t("Malta"), offset: 0 }, { id: "Europe/Moscow", title: window.t("Moscow"), offset: 0 }, { id: "Europe/Oslo", title: window.t("Oslo"), offset: 0 }, { id: "Europe/Paris", title: window.t("Paris"), offset: 0 }, { id: "Europe/Riga", title: window.t("Riga"), offset: 0 }, { id: "Europe/Rome", title: window.t("Rome"), offset: 0 }, { id: "Europe/Stockholm", title: window.t("Stockholm"), offset: 0 }, { id: "Europe/Tallinn", title: window.t("Tallinn"), offset: 0 }, { id: "Europe/Vilnius", title: window.t("Vilnius"), offset: 0 }, { id: "Europe/Warsaw", title: window.t("Warsaw"), offset: 0 }, { id: "Europe/Zurich", title: window.t("Zurich"), offset: 0 }, { id: "Pacific/Auckland", title: window.t("New Zealand"), offset: 0 }, { id: "Pacific/Chatham", title: window.t("Chatham Islands"), offset: 0 }, { id: "Pacific/Fakaofo", title: window.t("Tokelau"), offset: 0 }, { id: "Pacific/Honolulu", title: window.t("Honolulu"), offset: 0 }, { id: "Pacific/Norfolk", title: window.t("Norfolk Island"), offset: 0 }]; for (const e of n) { const t = Object(s.a)(e.id); e.title = `(${t.string}) ${e.title}`, e.offset = t.offset } n.sort((e, t) => { const i = e.offset - t.offset; return 0 !== i ? i : e.title.localeCompare(t.title) }); const o = r.concat(n); function a(e) { for (let t = 0; t < o.length; t++) if (e === o[t].id) return !0; return !1 } function l(e) { for (const t of o) if (t.id === e) return t.title; return e } }, "+DwS": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("hY0g"), r = i.n(s); function n(e, t) { const i = new r.a(e()), s = {}; t.subscribe(s, () => { i.setValue(e()) }); return i.readonly().spawn(() => t.unsubscribeAll(s)) } }, "+FzY": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("VymR"); function r(e, t) { let i = ""; return s.a.parse(e, e => (i = s.a.base + ("svg" === t ? `svg/${e}.svg` : `72x72/${e}.png`), !1)), i } }, "+GxX": function(e, t, i) { "use strict"; var s = i("VVxS").TVLocalStorage, r = i("aIyQ"); i("qFKp"); var n = new r; TradingView.FeatureToggle = { force_prefix: "forcefeaturetoggle.", onChanged: new r, enableFeature: function(e) { s.setItem(this.force_prefix + e, "true"), n.fire(e) }, disableFeature: function(e) { s.setItem(this.force_prefix + e, "false"), n.fire(e) }, resetFeature: function(e) { s.removeItem(this.force_prefix + e), n.fire(e) }, onFeaturesStateChanged: function() { return n } }, TradingView.isFeatureEnabled = function(e) { function t(e) { try { var t = (void 0)(e + function() { if (window.user && window.user.id) return window.user.id; var e = s.getItem("featuretoggle_seed"); return null !== e || (e = Math.floor(1e6 * Math.random()), s .setItem("featuretoggle_seed", e)), e }()); return new DataView(t).getUint32(0, !0) / 4294967296 } catch (e) { return .5 } } return function(i) { return !("local" !== window.environment || ! function(e) { return -1 === ["broker_FXCM_token_v2", "broker_TRADESTATION_V3", "broker_TRADOVATE_dev", "black_friday_mainpage", "black_friday_popup", "datawindow", "trading-fast-renew-oauth-token", "switching_trial_year_to_month_disabled", "switching_year_to_month_disabled", "default_year_billing_cycle_switcher", "marketing-analytics", "disable_obs_streaming", "google-ads", "visible_address_fields_by_default", "slow-support-warning", "hide-trading-floating-toolbar", "tvcoins_donations", "save-short-streams", "details_disable_bid_ask", "vat_disabled", "pro_plan_upgrades_disabled", "pro_plan_downgrades_disabled", "video-ideas-new-api", "unit_conversion", "disable_recaptcha_on_signup", "braintree-trial-implementation", "braintree-gopro-in-order-dialog", "trial-weekly", "braintree-apple-pay", "braintree-google-pay", "braintree-apple-pay-trial", "braintree-google-pay-trial", "hide_gopro_popup_upgrade_button", "yandex_metric_enabled", "broker_id_session", "remove_line_tools_from_content", "chart_storage_with_broker_name", "autosave_line_tools_immediately", "log_removing_line_tools_group", "oanda-european-accounts-warning", "mobile_show_bottom_panel", "disable_save_settings", "enable_non_unique_watch_sections", "desktop_version_notification_enabled", "paperrest_2fa", "paperrest_preview", "favorites-in-broker-dropdown", "streams_stats_profile", "hide_ecomonic_events", "aggregating_page_pings", "hide_alert_counter", "mobile_menu_alert_button", "show_reverse_on_active_source_only", "mobile_trading_web", "mobile_trading_ios", "mobile_trading_android", "hide_real_brokers_on_mobile", "percentage_values_for_percentage_scale", "hide_historical_price_label", "hide_ranges_label_colors", "new_align_trading_sources" ].indexOf(e) && -1 === e.indexOf("-maintenance") && !1 === /broker_[A-Z]+[a-zA-Z0-9_]+_dev/g.test(e) }(i)) || (!e[i] || -1 !== e[i]) && (!!("true" === s.getItem(TradingView .FeatureToggle.force_prefix + i) || window.is_authenticated && "undefined" != typeof user && user.settings && "true" === user .settings[TradingView.FeatureToggle.force_prefix + i]) || !( "false" === s.getItem(TradingView.FeatureToggle.force_prefix + i) || window.is_authenticated && "undefined" != typeof user && user .settings && "false" === user.settings[TradingView.FeatureToggle .force_prefix + i]) && (!!e[i] && (1 === e[i] || t(i) <= e[i]))) } }(window.featureToggleState || {}), t.FeatureToggle = TradingView.FeatureToggle, t .isFeatureEnabled = TradingView.isFeatureEnabled, t.onFeaturesStateChanged = TradingView .FeatureToggle.onFeaturesStateChanged.bind(TradingView.FeatureToggle) }, "+PIq": function(e, t, i) { "use strict"; i.r(t); var s = i("ocLq"); function r(e, t, i) { const r = { slope: NaN, average: NaN, intercept: NaN, stdDev: NaN, upDev: NaN, downDev: NaN, pearsons: NaN }; return 0 === e.length || (function(e, t) { let i = 0, s = 0, r = 0, n = 0; for (let t = 0; t < e.length; ++t) { const o = e[t], a = t + 1; i += a, s += o, r += a * a, n += o * a } t.slope = (e.length * n - i * s) / (e.length * r - i * i), t.average = s / e .length, t.intercept = t.average - t.slope * i / e.length + t.slope }(e, r), function(e, t, i, r) { let n = 0, o = 0, a = 0, l = 0, c = 0, h = 0, u = r.intercept; const d = e.length - 1, p = r.intercept + r.slope * d / 2; for (let s = 0; s <= d; ++s) { let d = t[s] - u; d > n && (n = d), d = u - i[s], d > o && (o = d), d = e[s]; const _ = d - r.average, m = u - p; d -= u, a += d * d, l += _ * _, c += m * m, h += _ * m, u += r.slope } r.stdDev = Math.sqrt(a / (0 === d ? 1 : d)), r.pearsons = s.Std.isZero(l) || s .Std.isZero(c) ? 0 : h / Math.sqrt(l * c), r.upDev = n, r.downDev = o }(e, t, i, r)), r } i.d(t, "regressionTrendStudyItem", (function() { return n })); const n = { name: "Regression Trend", metainfo: { _metainfoVersion: 51, description: "Regression Trend", format: { type: "inherit" }, id: "RegressionTrend@tv-basicstudies-144", is_hidden_study: !0, is_price_study: !0, shortDescription: "Reg Trend", defaults: { inputs: { "first bar time": 0, "last bar time": 0, "lower diviation": -2, source: "close", "upper diviation": 2, "use lower diviation": !0, "use upper diviation": !0 } }, inputs: [{ defval: 2, id: "upper diviation", max: 500, min: -500, name: "Upper Deviation", type: "float" }, { defval: -2, id: "lower diviation", max: 500, min: -500, name: "Lower Deviation", type: "float" }, { defval: !0, id: "use upper diviation", name: "Use Upper Deviation", type: "bool" }, { defval: !0, id: "use lower diviation", name: "Use Lower Deviation", type: "bool" }, { defval: 0, id: "first bar time", isHidden: !0, max: 253370764800, min: -253370764800, name: "First bar time", type: "time" }, { defval: 0, id: "last bar time", isHidden: !0, max: 253370764800, min: -253370764800, name: "Last bar time", type: "time" }, { defval: "close", id: "source", name: "Source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"], type: "source" }], plots: [] }, constructor: class { constructor() { this._resultSent = !1 } init(e, t) { this._resultSent = !1, this._data = { baseLine: { startPrice: NaN, endPrice: NaN }, upLine: { startPrice: NaN, endPrice: NaN }, downLine: { startPrice: NaN, endPrice: NaN }, pearsons: NaN, startIndex__t: NaN, endIndex__t: NaN } } main(e, t) { const i = t(6), n = e.new_unlimited_var(s.Std.time(e)), o = e.new_unlimited_var(s.Std.high(e)), a = e.new_unlimited_var(s.Std.low(e)), l = e.new_unlimited_var(s.Std[i](e)); if (!e.symbol.isLastBar) return null; if (this._resultSent) return null; const c = t(0), h = t(1), u = t(2), d = t(3), p = t(4), _ = t(5), m = n.indexOf(p), f = n.indexOf(_), g = [], b = [], v = [], S = []; for (let e = m; e >= f; --e) g.push(n.get(e)), b.push(o.get(e)), v.push( a.get(e)), S.push(l.get(e)); return this._updateData(g, u, c, d, h, p, _, r(S, b, v)), this ._resultSent = !0, { type: "non_series_data", nonseries: !0, data: { data: this._data } } } _updateData(e, t, i, s, r, n, o, a) { const l = e.length - 1; this._data.baseLine.startPrice = a.intercept, this._data.baseLine .endPrice = a.intercept + a.slope * l; const c = a.intercept + (t ? a.stdDev * i : a.upDev); this._data.upLine.startPrice = c, this._data.upLine.endPrice = c + a .slope * l; const h = a.intercept + (s ? a.stdDev * r : -a.downDev); this._data.downLine.startPrice = h, this._data.downLine.endPrice = h + a .slope * l, this._data.pearsons = a.pearsons, this._data .startIndex__t = n, this._data.endIndex__t = o } } } }, "+Qfv": function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("O+9b"), n = i("ocLq"), o = i("23IT"), a = i("KG+6"), l = i("LxhU"), c = i("8LSp"), h = i("iu9X"), u = i("c7G1"), d = i("WYmP"), p = i("hXqA"), _ = i("WTyR"), m = i("972a"), f = i("aR4w"); class g extends f.a { constructor(e, t, i, s, r, n, o, a, l, c, h, u) { super(e, t, i, n, o, a, !1, l, c, () => h, u, s, r, !1), this._firstBarTime = s, this._lastBarTime = r } update(e) { this._supplyRowsLayout(this._ctx), this.timeInRequestedRange(e) && super.update( e) } timeInRequestedRange(e) { const t = this._timeScale().get(e); return this._firstBarTime <= t && t < this._lastBarTime } } var b = i("rWtV"); i.d(t, "VolumeProfileFixedRange", (function() { return v })), i.d(t, "volumeProfileFixedRangeVbPStudyItem", (function() { return y })), i.d(t, "volumeProfileFixedRangeBSStudyItem", (function() { return w })); class v extends r.a { constructor() { super(...arguments), this._rowsLayout = "Number Of Rows", this._rowSize = 24, this._volume = "Up/Down", this._firstBarTime = 0, this._lastBarTime = 0, this._vaVolumePercent = 70, this._anInt = 0, this._eraseCmds = [] } nextGraphicsObjId() { return ++this._anInt } pushEraseObjCmd(e, t) { this._eraseCmds.push(new u.b(e, t)) } popEraseCmds() { const e = this._eraseCmds; return this._eraseCmds = [], e } init(e, t) { this._studyDataUpdate = new p.a(!0), this._hists = new c.a, this._boxPolygons = new d.a, this._pocLines = new d.a, this._valueAreaHists = new c.a; const i = new h.b; i.getObjsContainer("hhists").push(new h.a("histBars2", this._hists)), i .getObjsContainer("hhists").push(new h.a("histBarsVA", this ._valueAreaHists)), i.getObjsContainer("horizlines").push(new h.a( "pocLines", this._pocLines)), i.getObjsContainer("polygons").push(new h .a("histBoxBg", this._boxPolygons)), this._studyDataUpdate.init(i), this ._rowsLayout = t(0), this._rowSize = t(1), this._volume = t(2), this ._firstBarTime = t(3), this._lastBarTime = t(4), this._vaVolumePercent = t( 5), this.verifyRowSizeInput(this._rowSize, this._rowsLayout), this ._originalResolution = l.Interval.parse(e.symbol.interval + e.symbol .resolution); const n = this._lastBarTime + this._originalResolution.inMilliseconds(this ._lastBarTime); 0 === this._firstBarTime && 0 === this._lastBarTime ? this._basicResolution = this._originalResolution : this._basicResolution = this .findBasicResolutionForFromTo(this._originalResolution, this._firstBarTime, n, Object(s.ensureDefined)(e.symbol.info)), this._hasSecondarySymbol = ! this._originalResolution.isEqualTo(this._basicResolution), this ._hasSecondarySymbol && e.new_sym(e.symbol.tickerid, this._basicResolution .value()); const o = this._getRowsLayout(this._rowsLayout, this._rowSize); this._vbPCheckHaveVolumeExpr = new _.a(this), this._volumeByPriceExpr = new g( Object(r.c)(this._volume), e, this, this._firstBarTime, n, this._hists, this._boxPolygons, this._pocLines, this._valueAreaHists, this ._vaVolumePercent, o, Object(r.b)()), this._volumeByPriceExpr .setIdsGeneratorProxy(this), this._developingPocSeries = new b.a, this ._developingVAHighSeries = new b.a, this._developingVALowSeries = new b.a } main(e, t, i) { this._hasSecondarySymbol && e.select_sym(1), this._timeSeries = e .new_unlimited_var(), this._openSeries = e.new_unlimited_var(), this ._highSeries = e.new_unlimited_var(), this._lowSeries = e .new_unlimited_var(), this._closeSeries = e.new_unlimited_var(), this._volumeSeries = e.new_unlimited_var(); const r = { type: "composite", data: [] }; if (i && i.period === this._basicResolution.value() && (this._timeSeries.set(n .Std.time(e)), this._openSeries.set(n.Std.open(e)), this._highSeries .set(n.Std.high(e)), this._lowSeries.set(n.Std.low(e)), this ._closeSeries.set(n.Std.close(e)), this._volumeSeries.set(n.Std.volume( e)), this._developingPocSeries.addHist(n.Std.time(e)), this ._developingVAHighSeries.addHist(n.Std.time(e)), this ._developingVALowSeries.addHist(n.Std.time(e)), this ._vbPCheckHaveVolumeExpr.update(0, e.symbol.isLastBar), this ._volumeByPriceExpr.update(0), this._developingPocSeries .removeLastIfNaN(), this._developingVAHighSeries.removeLastIfNaN(), this ._developingVALowSeries.removeLastIfNaN(), e.symbol.isLastBar)) { this._studyDataUpdate.setEraseCmds(this.popEraseCmds()), this ._studyDataUpdate.update(); const e = this._studyDataUpdate.getUpdate(); e.json && r.data.push({ nonseries: !0, type: "study_graphics", data: e.json }), e.jsonUpdate && r.data.push({ nonseries: !0, type: "study_graphics", data: e.jsonUpdate }) } if (this._hasSecondarySymbol && e.select_sym(0), i && i.period === this ._originalResolution.value()) { Object(s.assert)(e.symbol.time === i.time); const t = i.time, n = t + this._originalResolution.inMilliseconds(t) - 1; if (t && t >= this._firstBarTime) { const e = this._developingPocSeries.getLeftOrEqual(n), t = this._developingVAHighSeries.getLeftOrEqual(n), i = this._developingVALowSeries.getLeftOrEqual(n); r.data.push([e, t, i]) } else r.data.push([NaN, NaN, NaN]) } return r } time() { return this._timeSeries } open() { return this._openSeries } high() { return this._highSeries } low() { return this._lowSeries } close() { return this._closeSeries } volume() { return this._volumeSeries } developingPoc() { return this._developingPocSeries } developingVAHigh() { return this._developingVAHighSeries } developingVALow() { return this._developingVALowSeries } } function S(e) { return { constructor: v, name: e.description, metainfo: { _metainfoVersion: 51, shortDescription: "VPFR", format: { type: "volume" }, is_price_study: !0, defaults: { graphics: { hhists: { histBars2: { colors: ["#1592e6", "#fbc123"], direction: a.a.LeftToRight, percentWidth: 30, showValues: !1, transparencies: [76, 76], valuesColor: "#424242", visible: !0 }, histBarsVA: { colors: ["#1592e6", "#fbc123"], direction: a.a.LeftToRight, percentWidth: 30, showValues: !1, transparencies: [30, 30], valuesColor: "#424242", visible: !0 } }, horizlines: { pocLines: { color: "#ff0000", style: m.b.Solid, visible: !0, width: 2 } }, polygons: { histBoxBg: { color: "#37a6ef", transparency: 94 } } }, inputs: { first_bar_time: 0, last_bar_time: 0, rows: 24, rowsLayout: "Number Of Rows", subscribeRealtime: !0, vaVolume: 70, volume: "Up/Down" }, styles: { developingPoc: { color: "#ff0000", linestyle: m.b.Solid, linewidth: 1, plottype: o.LineStudyPlotStyle.StepLine, trackPrice: !1, transparency: 0, visible: !1 }, developingVAHigh: { color: "#0000ff", linestyle: m.b.Solid, linewidth: 1, plottype: o.LineStudyPlotStyle.StepLine, trackPrice: !1, transparency: 0, visible: !1 }, developingVALow: { color: "#0000ff", linestyle: m.b.Solid, linewidth: 1, plottype: o.LineStudyPlotStyle.StepLine, trackPrice: !1, transparency: 0, visible: !1 } } }, graphics: { hhists: { histBars2: { location: a.b.Absolute, title: "Volume Profile", titles: ["Up Volume", "Down Volume"] }, histBarsVA: { location: a.b.Absolute, title: "Value Area", titles: ["Value Area Up", "Value Area Down"] } }, horizlines: { pocLines: { name: "POC", showPrice: !0 } }, polygons: { histBoxBg: { mouseTouchable: !1, name: "Histogram Box", showBorder: !1 } } }, inputs: [{ defval: "Number Of Rows", id: "rowsLayout", name: "Rows Layout", options: ["Number Of Rows", "Ticks Per Row"], type: "text" }, { defval: 24, id: "rows", max: 1e6, min: 1, name: "Row Size", type: "integer" }, { defval: "Up/Down", id: "volume", name: "Volume", options: ["Up/Down", "Total"], type: "text" }, { defval: 0, id: "first_bar_time", isHidden: !0, max: 253370764800, min: -253370764800, name: "First Bar Time", type: "time" }, { defval: 0, id: "last_bar_time", isHidden: !0, max: 253370764800, min: -253370764800, name: "Last Bar Time", type: "time" }, { defval: 70, id: "vaVolume", max: 100, min: 0, name: "Value Area Volume", type: "integer" }, { defval: !0, id: "subscribeRealtime", isHidden: !0, name: "SubscribeRealtime", type: "bool" }], plots: [{ id: "developingPoc", type: "line" }, { id: "developingVAHigh", type: "line" }, { id: "developingVALow", type: "line" }], styles: { developingPoc: { histogramBase: 0, title: "Developing Poc" }, developingVAHigh: { histogramBase: 0, title: "Developing VA High" }, developingVALow: { histogramBase: 0, title: "Developing VA Low" } }, ...e } } } const y = S({ id: "VbPFixed@tv-volumebyprice-57", description: "Volume Profile Fixed Range" }), w = S({ id: "VbPFixed@tv-basicstudies-152", description: "Fixed Range", is_hidden_study: !0 }) }, "+cnz": function(e, t) { e.exports = '' }, "+hLl": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolBrush", (function() { return o })); var s = i("Ocx9"), r = i("DVnF"), n = i("j3hX"); class o extends r.a { constructor(e, t) { super(e, t || o.createProperties()), this._loadPaneViews(e) } properties() { return super.properties() } smooth() { return this.properties().childs().smooth.value() } name() { return "Brush" } hasEditableCoordinates() { return !1 } static createProperties(e) { const t = new s.DefaultProperty("linetoolbrush", e); return o._configureProperties(t), t } _loadPaneViews(e) { i.e("lt-pane-views").then(i.bind(null, "00XE")).then(t => { this._setPaneViews([new t.BrushPaneView(this, e)]) }) } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "ZSes")).then( e => e.BrushDefinitionsViewModel) } static _configureProperties(e) { r.a._configureProperties(e), e.addChild("backgroundsColors", new n .LineToolColorsProperty([e.childs().backgroundColor], e.childs() .fillBackground)) } } }, "+jnJ": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return a })); i("YFKU"); var s = i("8+VR"), r = i("m/cY"), n = i("Vdly"); function o(e) { return "alwaysOn" === e || "alwaysOff" === e ? e : "visibleOnMouseOver" } function a(e, t) { let i, a; function l() { if (!i) { i = Object(r.a)(); let s = n.getValue(e); void 0 === s && void 0 !== t && (s = n.getValue(t)), i.setValue(o(s)), i.subscribe( i, t => { n.setValue(e, o(t.value())) }) } return i } return { property: l, availableValues: function() { return [{ id: "visibleOnMouseOver", value: "visibleOnMouseOver", title: window.t("Visible on Mouse Over") }, { id: "alwaysOn", value: "alwaysOn", title: window.t("Always Visible") }, { id: "alwaysOff", value: "alwaysOff", title: window.t("Always Invisible") }] }, actualBehavior: function() { if (!a) { a = Object(r.a)(); const e = l(), t = () => { let t = e.value(); "alwaysOn" !== t && "alwaysOff" !== t && (t = s.mobiletouch ? "alwaysOn" : "visibleOnMouseOver"), a && a.setValue(t) }; e.subscribe(a, t), t() } return a } } } }, "/+9u": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("jCNj"); function r(e, t = Date.now()) { const i = Object(s.get_timezone)(e).offset_utc(t); let r = ""; const n = i / 1e3 / 60 / 60; n % 1 && (r = ":" + n % 1 * 60); let o = ""; return o = n > 0 ? "+" + (n - n % 1) + r : 0 === n ? "" : String(n - n % 1 + r), { offset: i, string: "UTC" + o } } }, "//lZ": function(e, t, i) { "use strict"; i.r(t), i.d(t, "doAnimate", (function() { return n })); const s = { from: 0, duration: 250, easing: i("9uLv").c.easeOutCubic }; class r { constructor(e) { this._doing = !0, this._completed = !1, this._options = { ...s, ...e }; const t = performance.now(); window.requestAnimationFrame(e => { this._animation(t, this._options.from, e) }) } stop() { this._doing = !1 } completed() { return this._completed } _animation(e, t, i) { if (!this._doing) return void this._finishAnimation(); const s = (i = !i || i < 1e12 ? performance.now() : i) - e, r = s >= this._options.duration || t === this._options.to, n = (o = this._options.from, a = this._options.to, l = this._options.easing(s / this._options.duration), o * (1 - l) + a * l); var o, a, l; const c = r ? this._options.to : n, h = c - t; this._options.onStep(h, c), r ? this._finishAnimation() : window .requestAnimationFrame(t => { this._animation(e, c, t) }) } _finishAnimation() { this._options.onComplete && this._options.onComplete(), this._completed = !0 } } function n(e) { return new r(e) } }, "//lt": function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "PaneCursorType", (function() { return s })), function(e) { e[e.Default = 0] = "Default", e[e.Pointer = 1] = "Pointer", e[e.Eraser = 2] = "Eraser", e[e.Dot = 3] = "Dot", e[e.Grabbing = 4] = "Grabbing", e[e.ZoomIn = 5] = "ZoomIn", e[ e.VerticalResize = 6] = "VerticalResize", e[e.HorizontalResize = 7] = "HorizontalResize", e[e.DiagonalNeSwResize = 8] = "DiagonalNeSwResize", e[e .DiagonalNwSeResize = 9] = "DiagonalNwSeResize" }(s || (s = {})) }, "/3z9": function(e, t, i) { "use strict"; i.r(t), i.d(t, "isMacKeyboard", (function() { return r })), i.d(t, "Modifiers", (function() { return n })), i.d(t, "modifiersFromEvent", (function() { return o })), i.d(t, "hashFromEvent", (function() { return a })), i.d(t, "humanReadableModifiers", (function() { return l })), i.d(t, "humanReadableHash", (function() { return h })); var s = i("qFKp"); const r = Object(s.isMac)() || s.CheckMobile.iOS(); var n; function o(e) { let t = 0; return e.shiftKey && (t += 1024), e.altKey && (t += 512), e.ctrlKey && (t += 256), e .metaKey && (t += 2048), t } function a(e) { return o(e) | e.keyCode } function l(e) { let t = ""; return 256 & e && (t += r ? "^" : "Ctrl + "), 512 & e && (t += r ? "⌥" : "Alt + "), 1024 & e && (t += r ? "⇧" : "Shift + "), 2048 & e && (t += r ? "⌘" : "Win + "), t }! 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" }(n || (n = {})); const c = { 9: "⇥", 13: "↵", 27: "Esc", 8: r ? "⌫" : "Backspace", 32: "Space", 35: "End", 36: "Home", 37: "←", 38: "↑", 39: "→", 40: "↓", 45: "Ins", 46: "Del", 188: ",", 191: "/" }; for (let e = 1; e <= 16; e++) c[e + 111] = "F" + e; function h(e) { let t = l(e); const i = 255 & e; return t += i in c ? c[i] : String.fromCharCode(i), t } }, "/5ju": function(e, t, i) { "use strict"; i.r(t); var s = i("Kxc7"), r = i("hY0g"), n = i.n(r), o = i("FQhm"), a = i("htUT"), l = i("/z0S"), c = i("YFKU"); i("HbRj"), i("+GxX"); i("zUrt"); async function h() { return !0 } var u = i("fZEr"); class d { constructor(e, t) { this._visibility = new n.a(!1), this._chartWidgetCollection = e, this._doSave = t } hide() { var e; null === (e = this._hide) || void 0 === e || e.call(this), this._visibility .setValue(!1) } visible() { return this._visibility.readonly() } } class p extends d { cloneChart() { this._cloneChart().then(() => this._visibility.setValue(!0)) } show() { Object(l.a)(this.cloneChart.bind(this), { source: "Clone chart" }) } async _cloneChart() { const e = this._chartWidgetCollection, t = await h(), i = e.metaInfo.name.value(); t && (this._hide = await Object(u.showRename)({ title: Object(c.t)("Copy Chart Layout"), text: Object(c.t)("Enter a new chart layout name") + ":", maxLength: 64, initValue: Object(c.t)("{title} copy", { context: "ex: AAPL chart copy" }).format({ title: e.metaInfo.name.value() }), onRename: ({ newValue: t, dialogClose: r }) => { s.enabled("saveload_storage_customization") && (e.metaInfo .uid.deleteValue(), e.metaInfo.id.deleteValue(), e .metaInfo.name.setValue(t), this._doSave(void 0, void 0, () => { e.metaInfo.name.setValue(i) })), r() }, onClose: () => this._visibility.setValue(!1) })) } } class _ extends d { show(e, t, i) { this._saveNewChart(e, t, i).then(() => this._visibility.setValue(!0)) } async _saveNewChart(e, t, i) { const s = this._chartWidgetCollection, r = s.metaInfo.name.value(); await h() && (this._hide = await Object(u.showRename)({ title: Object(c.t)("Save New Chart Layout"), text: Object(c.t)("Enter a new chart layout name") + ":", maxLength: 64, initValue: r, onRename: ({ newValue: n, dialogClose: o }) => { s.metaInfo.name.setValue(n), this._doSave(e, t, () => { s.metaInfo.name.setValue(r), null == i || i() }), o() }, onClose: () => this._visibility.setValue(!1) })) } } class m extends d { show() { this._renameChart(), this._visibility.setValue(!0) } _renameChart() { Object(l.a)(async () => { const e = this._chartWidgetCollection, t = e.metaInfo.name.value(); this._hide = await Object(u.showRename)({ title: Object(c.t)("Rename Chart Layout"), text: Object(c.t)("Enter a new chart layout name") + ":", maxLength: 64, initValue: t, onRename: ({ newValue: i, dialogClose: s }) => { e.metaInfo.name.setValue(i), this._doSave( void 0, void 0, () => { e.metaInfo.name.setValue(t) }), s() }, onClose: () => this._visibility.setValue(!1) }) }, { source: "Rename chart" }) } } i.d(t, "SaveChartService", (function() { return f })); class f { constructor(e, t) { this._autosaveTimer = null, this._watchedAutoSaveEnabled = new n.a, this ._toggleAutoSaveEnabledHandler = this._toggleAutoSaveEnabled.bind(this), this ._doSave = (e, t, i, s) => { const r = this._chartWidgetCollection; void 0 !== e && e(), this._chartSaver.saveChartSilently(e => { var i; i = r.metaInfo.uid.value(), "/chart/" === location.pathname && ( location.href = "/chart/" + i), void 0 !== t && t(e) }, () => { void 0 !== i && i() }, { autoSave: Boolean(s) }) }, this._chartWidgetCollection = e, this._chartSaver = t, this ._createController = new _(e, this._doSave), this._renameController = new m(e, this._doSave), this._saveAsController = new p( e, this._doSave), this._chartChangesWatcher = new a.ChartChangesWatcher(e .undoHistory, t, o), e.saveKeysPressed().subscribe(this, this .saveChartOrShowTitleDialog), this._chartChangesWatcher.getOnChange() .subscribe(this, this._onStateChanged) } autoSaveEnabled() { return this._watchedAutoSaveEnabled } destroy() { 0 } getCreateController() { return this._createController } getRenameController() { return this._renameController } getSaveAsController() { return this._saveAsController } cloneChart() { this._saveAsController.cloneChart() } saveChartAs() { this._saveAsController.show() } renameChart() { this._renameController.show() } saveNewChart(e, t, i) { this._createController.show(e, t, i) } saveExistentChart(e, t, i) { this._doSave(e, t, i) } hasChanges() { return this._chartChangesWatcher.hasChanges() } saveChartOrShowTitleDialog(e, t, i) { const s = window.saver.isSaveInProcess(), r = this._chartChangesWatcher.hasChanges(), n = !!this._chartWidgetCollection.metaInfo.id.value(); window.is_authenticated && (s || !r && n) || Object(l.a)(() => { null != this._chartWidgetCollection.metaInfo.id.value() ? this .saveExistentChart(e, t, i) : this.saveNewChart(e, t, i) }, { source: "Save chart", sourceMeta: "Chart" }) } whenReadyToSave(e) { this._chartSaver.whenReadyToSave(e) } saveToJSON() { return this._chartSaver.saveToJSON() } saveChartSilently(e, t, i) { this._chartSaver.saveChartSilently(e, t, i) } setAutoSaveEnabled(e) { window.is_authenticated && window.saver.isSaveInProcess() || Object(l.a)(() => { this._watchedAutoSaveEnabled.setValue(e) }, { source: "AutoSave chart" }) } saveChartLineTools(e, t) { return this._chartSaver.saveChartLineTools(e, t) } _autoSaveEnabledSettingHandler(e) { 0 } _toggleAutoSaveEnabled(e) { 0 } _enableAutoSave() { 0 } _disableAutoSave() { 0 } _onStateChanged(e) { e ? this._startAutosave() : this._stopAutosave() } _startAutosave() { s.enabled("charts_auto_save") && null === this._autosaveTimer && (this ._autosaveTimer = setTimeout(() => { this._autosaveTimer = null, this._chartWidgetCollection.metaInfo.id .value() && this._doSave(void 0, void 0, void 0, !0) }, 6e4)) } _stopAutosave() { null !== this._autosaveTimer && (clearInterval(this._autosaveTimer), this ._autosaveTimer = null) } } }, "/DW5": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return r })), i.d(t, "a", (function() { return n })); var s = i("CLNU"); function r(e) { return Object(s.clean)(JSON.stringify(e)) } function n(e) { return JSON.parse(Object(s.clean)(e, !0)) } }, "/DxK": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolHorzLine", (function() { return l })); var s = i("tc+8"), r = i.n(s), n = i("Ocx9"), o = i("Ss5c"), a = i("p1SQ"); class l extends o.LineDataSource { constructor(e, t) { super(e, t || l.createProperties()), this._priceAxisView = new a .LineToolHorzLinePriceAxisView(this), i.e("lt-pane-views").then(i.bind(null, "ckl+")).then(({ HorzLinePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } state(e) { const t = super.state(e); return t.points && 0 !== t.points.length && (t.points[0].offset = 0), t } pointsCount() { return 1 } name() { return "Horizontal Line" } priceAxisViews(e, t) { return this.isSourceHidden() ? null : t === this.priceScale() && this .properties().showPrice.value() && this._model.paneForSource(this) === e ? [ this._priceAxisView ] : null } timeAxisViews() { return null } timeAxisPoints() { return [] } updateAllViews() { super.updateAllViews(), this._priceAxisView.update() } canHasAlert() { return !0 } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e.showLabel = this .properties().childs().showLabel.value(), e } static createProperties(e) { const t = new n.DefaultProperty("linetoolhorzline", e); return l._configureProperties(t), t } _getAlertPlots() { return [this.points()[0].price] } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "NEbb")).then( e => e.HorizontalLineDefinitionsViewModel) } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text || ""), this.properties().childs().showLabel.setValue(Boolean(e.showLabel)) } static _configureProperties(e) { o.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new r.a("")), e.addExclusion("text"), e.addExclusion( "showLabel") } } }, "/G2Z": function(e, t, i) { "use strict"; (function(e) { i("xdS3"); var t, s = i("Eyy1").assert; i("fPdn"), i("wZIs"), i("WmDe"), JSON.parse(urlParams.disabledFeatures).forEach(( function(t) { e.setEnabled(t, !1) })), JSON.parse(urlParams.enabledFeatures).forEach((function(t) { e.setEnabled(t, !0) })), null != (t = window.parent[window.urlParams.uid].settingsAdapter) ? (TVSettings .setSettingsAdapter(t), TVSettings.sync()) : e.enabled( "use_localstorage_for_settings") && TVSettings.sync(); var r = i("UlDV").RestrictedToolsetBootloader, n = i("I4UZ").HeaderToolbarBootloader, o = i("9zVu").DrawingToolbarBootloader, a = i("OiSa").isDrawingToolbarVisible; (0, i("8+VR").setClasses)(); var l = i("EsvI"), c = i("oiZD").setTheme, h = i("JcHK"), u = i("Ery9"), d = i("lxNp"), p = i("n0Bl").migrateShortcut, _ = i("RXmj").ChartSaver, m = i("/5ju").SaveChartService, f = i("lA7n").LoadChartService, g = i("F58L").StudyTemplates, b = i("54XG").FavoriteStudyTemplateService, v = i("PT1i").linking, S = i("FQhm"), y = i("kcTO").formatterOptions, w = i("iboI").customFormatters, P = i("JT5O").StudyMarket, C = i("FBuY").TVXWindowEvents, x = i("jofe").createDeferredPromise, T = i("FIi8").deepExtend, I = i("e3/o").randomHash, M = i("/qn+").convertPropertyToWatchedValue, O = i("1ANp").property, L = i("RspR").property, A = i("3t3b").dateFormatProperty, E = i("UXvI").default, k = i("LxhU").Interval, D = i("lW/c").Root, V = i("NsVT").ChartPage, B = i("IWXC").destroyQuoteSessions, R = i("uDHo").TIMEFRAMETYPE, N = new V(new D(window).allocate()), j = N.allocate({ areaName: "center" }), F = (N.allocate({ areaName: "tradingpanel" }), window.parent[urlParams.uid].brokerFactory, Boolean(!1)), W = i("vPbs").CHART_WIDGET_COLLECTION_SERVICE, H = i("eqEH"); i("Wh/T"); var U = i("/Y2c"), z = i("g5Qf").createFavoriteDrawingToolbar, G = i("x5Tw").setupChartEventHint, q = i("+2Ad").setupChartScreenshotHint, Y = i("EX27"), K = i("0YCj"), J = i("9nLJ"); i("2cgs"), i("vIQA"); var Z = i("K5cv").setSearchRequestDelay, X = i("dfhE"), $ = i("ocLq"), Q = i("qE4g").addBrandingSource, ee = i("6vtU").setAdditionalSymbolInfoFields, te = i("kNVT").setSymbolSearchCompleteOverrideFunction, ie = i("fRER").DropdownApi, se = window.parent[urlParams.uid].getCustomIndicators, re = x(), ne = x(), oe = e.enabled("left_toolbar"); if (Promise.all([re.promise, ne.promise]).then((function() { window.ChartApiInstance.start() })), "function" == typeof se) { var ae = se($); ae && ae.then ? ae.then((function(e) { if (!Array.isArray(e)) return console.warn( "custom_indicators_getter should be a function that returns a Promise object which result is an array of custom indicators" ), void re.resolve(); JSServer.studyLibrary.push.apply(JSServer.studyLibrary, e), re .resolve(), console.log("{0} custom indicators loaded.".format(e .length)) })).catch((function(e) { console.warn("Error loading custom indicators " + e), re.resolve() })) : (console.warn( "custom_indicators_getter should be a function that returns a Promise object" ), re.resolve()) } else re.resolve(); window.widgetReady = function(e) { S.subscribe("onChartReady", e) }; var le = urlParams.theme && urlParams.theme.toLowerCase(); function ce(e) { window.__defaultsOverrides = window.__defaultsOverrides || {}, T(window .__defaultsOverrides, e), void 0 !== TradingView.defaultProperties && void 0 !== TradingView.defaultProperties.chartproperties && (window .applyDefaultsOverrides(TradingView.defaultProperties.chartproperties), window.applyDefaultOverridesToLinetools()) }! function(e) { l.themes[e] && c(e) }(le), window.applyStudiesOverrides = function(e) { e && (window.chartWidgetCollection ? window.chartWidgetCollection .applyStudiesOverrides(e) : K.mergeDefaultsOverrides(e)) }, window.applyOverrides = function(e) { ce(e), window.chartWidgetCollection && window.chartWidgetCollection .applyOverrides(e) }, window.doWhenApiIsReady = function(e) { window.tradingViewApi ? e() : ne.promise.then(e) }, window.applyTradingCustomization = function(e) { for (var t in e.order) TradingView.defaultProperties.linetoolorder[t] = e.order[ t]; for (var t in e.position) TradingView.defaultProperties.linetoolposition[t] = e .position[t] }, window.changeTheme = function(e, t) { var i = l.themes[e.toLowerCase()]; return i ? window.tradingViewApi.themes().setStdTheme(i.name, !0, t && t .disableUndo) : Promise.resolve() }, window.getTheme = function() { return window.tradingViewApi.themes().getCurrentThemeName() }, window.is_authenticated = !1; JSON.parse(window.urlParams.brokerConfig); window.t("charts by TradingView"), window.t("powered by TradingView"), window.t( "by TradingView"); var he = null, ue = x(), de = null, pe = function() { if (e.setEnabled("charting_library_debug_mode", "true" === urlParams.debug), e .setEnabled("chart_property_page_trading", !1), e.enabled( "remove_library_container_border")) { var t = document.querySelector("#library-container"); null !== t && (t.style.border = "0px", t.style.padding = "1px") } e.enabled("no_min_chart_width") && (window.document.body.style.minWidth = "0px"), null != urlParams.studiesOverrides && K.mergeDefaultsOverrides( JSON .parse(urlParams.studiesOverrides)), s(void 0 === TradingView .defaultProperties, "Default properties are inited before applying overrides"), ce(JSON.parse(urlParams.overrides)), urlParams.numeric_formatting = urlParams.numeric_formatting && JSON.parse(urlParams.numeric_formatting), urlParams.numeric_formatting && "string" == typeof urlParams .numeric_formatting.decimal_sign && (y.decimalSign = urlParams .numeric_formatting.decimal_sign[0]), window.ChartApiInstance = new Y( window.parent[urlParams.uid].datafeed), window.parent[urlParams.uid] .customFormatters && (window.parent[urlParams.uid].customFormatters .timeFormatter && (w.timeFormatter = window.parent[urlParams.uid] .customFormatters.timeFormatter), window.parent[urlParams.uid] .customFormatters.dateFormatter && (w.dateFormatter = window.parent[ urlParams.uid].customFormatters.dateFormatter), window.parent[ urlParams.uid].customFormatters.tickMarkFormatter && (w .tickMarkFormatter = window.parent[urlParams.uid].customFormatters .tickMarkFormatter)), window.ChartApiInstance .setStudiesAccessController(window.ChartApiInstance .createStudiesAccessController(urlParams.studiesAccess)); var c = urlParams.chartContent ? JSON.parse(urlParams.chartContent).json : void 0, u = urlParams.chartContentExtendedData ? JSON.parse(urlParams .chartContentExtendedData) : c ? c.extendedData : void 0, d = urlParams.interval || "D", p = function(e) { var t = /(\d+)(\w+)/; return e.map((function(e) { var i = t.exec(e.text), s = i[2].toLowerCase(), r = parseInt(i[1]), n = "y" === s ? 12 * r + "M" : r + s, o = k.parse(e.resolution); return { text: window.t(e.title) || r + window.t(s, { context: "dates", count: r }), description: e.description || "", value: { value: n.toUpperCase(), type: R.PeriodBack }, targetResolution: o.value(), requiresIntraday: o.isIntraday() } })) }(JSON.parse(urlParams.timeFrames)), x = { resizerBridge: j, padding: e.enabled("border_around_the_chart") ? 2 : 0, content: c, widgetOptions: { addToWatchlistEnabled: !1, hideIdeas: !0, addVolume: window.ChartApiInstance.studiesAccessController .isToolEnabled("Volume"), muteSessionErrors: !0, timezone: urlParams.timezone, defSymbol: urlParams.symbol, defInterval: d, compareSymbols: urlParams.compareSymbols && JSON.parse(urlParams .compareSymbols), defTimeframe: urlParams.timeframe, paneContextMenuEnabled: e.enabled("pane_context_menu"), paneContextMenu: { mainSeriesTrade: F }, priceScaleContextMenuEnabled: e.enabled("scales_context_menu"), currencyConversionEnabled: e.enabled("pricescale_currency"), unitConversionEnabled: e.enabled("pricescale_unit"), legendWidgetEnabled: e.enabled("legend_widget"), legendWidget: { contextMenu: { settings: e.enabled("show_chart_property_page"), showOpenMarketStatus: e.enabled("display_market_status") } }, sourceStatusesWidget: { errorSolution: !1 }, marketStatusWidgetEnabled: e.enabled("display_market_status"), marketStatusWidget: { preMarketSolution: !1, postMarketSolution: !1 }, chartWarningWidget: { subscriptionFullInfo: !1 }, timeScaleWidget: { contextMenuEnabled: e.enabled("scales_context_menu"), timezoneMenuEnabled: e.enabled("timezone_menu"), priceAxisLabelsOptions: { showLabels: e.enabled("main_series_scale_menu") } }, timeScale: { preserveBarSpacing: !1, lockVisibleTimeRangeOnResize: e.enabled( "lock_visible_time_range_on_resize"), rightBarStaysOnScroll: e.enabled("right_bar_stays_on_scroll"), minBarSpacing: urlParams.time_scale && JSON.parse(urlParams .time_scale).min_bar_spacing }, goToDateEnabled: e.enabled("go_to_date"), crossHair: { menuEnabled: e.enabled("chart_crosshair_menu") }, handleScale: { mouseWheel: e.enabled("mouse_wheel_scale"), pinch: e.enabled("pinch_scale"), axisPressedMouseMove: { time: e.enabled("axis_pressed_mouse_move_scale"), price: e.enabled("axis_pressed_mouse_move_scale") } }, handleScroll: { mouseWheel: e.enabled("mouse_wheel_scroll"), pressedMouseMove: e.enabled("pressed_mouse_move_scroll"), horzTouchDrag: e.enabled("horz_touch_drag_scroll"), vertTouchDrag: e.enabled("vert_touch_drag_scroll") }, shiftVisibleRangeOnNewBar: e.enabled( "shift_visible_range_on_new_bar"), croppedTickMarks: e.enabled("cropped_tick_marks"), countdownEnabled: e.enabled("countdown"), indicatorsDialogShortcutEnabled: e.enabled( "insert_indicator_dialog_shortcut") }, seriesControlBarEnabled: e.enabled("timeframes_toolbar"), seriesControlBar: { timeFramesWidgetEnabled: !0, timeFramesWidget: { goToDateEnabled: e.enabled("go_to_date"), availableTimeFrames: function(e, t) { return e ? t !== X.STATUS_DELAYED && t !== X .STATUS_DELAYED_STREAMING && t !== X.STATUS_READY ? [] : p.filter((function(t) { return !(t.requiresIntraday && !e .has_intraday) && !(e .supported_resolutions && !e .supported_resolutions.includes( t.targetResolution)) })) : [] } }, timeWidgetEnabled: !0, timeWidget: { timezoneMenuEnabled: e.enabled("timezone_menu") }, adjustForDividendsButtonEnabled: !1, sessionIdButtonEnabled: !1, percentageScaleButtonEnabled: !0, logScaleButtonEnabled: !0, autoScaleButtonEnabled: !0, fullscreenButtonEnabled: !0, mobileChangeLayoutEnabled: !1 }, globalEvents: !0, snapshotUrl: urlParams.snapshotUrl, mobileForceChartMaximizeEnabled: !1, saveChartEnabled: e.enabled("save_shortcut") }; oe && (z(), x.widgetOptions.isDrawingToolbarVisible = a), u && (x.metaInfo = { id: u.uid, name: u.name, description: u.description, uid: u.uid, username: "", tags: "" }), window.parent[urlParams.uid].additionalSymbolInfoFields && ee(window .parent[urlParams.uid].additionalSymbolInfoFields), window.parent[ urlParams.uid].symbolSearchComplete && te(window.parent[urlParams.uid] .symbolSearchComplete); var T = window.chartWidgetCollection = new U(x); Q(T), window.studyMarket = new P(T), void 0 !== H && H.registerService(W, T), T .activeChartWidget.subscribe((function(e) { S.emit("activeChartChanged", T.getAll().indexOf(e)) })), window.saver = new _(T); var I = new m(T, window.saver), M = new f(T); window.chartWidget = T.activeChartWidget.value(), window.pro = new TradingView .Pro; var O = function(t) { if (!e.enabled("header_widget")) return null; var s = N.allocate({ areaName: "top" }), o = new(0, i("htUT").ChartChangesWatcher)(t.chartWidgetCollection .undoHistory, window.saver, S), a = JSON.parse(urlParams.favorites); a.intervals = a.intervals.map((function(e) { var t = "" + e; return t.match(/1[DWMYdwmy]/) && (t = t.slice(1)), t })); var l = null; e.enabled("study_templates") && (l = new b(C, TVSettings), de = new g({ chartWidgetCollection: t.chartWidgetCollection, favoriteStudyTemplatesService: l })); var c = void 0, h = urlParams.header_widget_buttons_mode; "fullsize" === h && (c = ["full"]); "compact" === h && (c = ["small"]); return new n(new r, { chartSaver: window.saver, chartApiInstance: ChartApiInstance, chartWidgetCollection: t.chartWidgetCollection, defaultFavoriteStyles: a.chartTypes, defaultFavoriteIntervals: a.intervals, hideStudyTemplates: !0, resizerBridge: s, studyMarket: window.studyMarket, studyTemplates: de, favoriteStudyTemplatesService: l, allowedModes: c, saveChartService: t.saveChartService, loadChartService: t.loadChartService, chartChangesWatcher: o, onClick: we, snapshotUrl: t.snapshotUrl }) }({ chartWidgetCollection: T, saveChartService: I, loadChartService: M, snapshotUrl: urlParams.snapshotUrl }); null !== O ? O.load().then((function(e) { he = e.getComponent(), ue.resolve() })) : (ue.promise.catch((function() {})), ue.reject( "header widget is not loaded")); var L = function(e) { if (oe) { var t = urlParams.toolbarbg && /^[0-9a-f]+$/i.test(urlParams .toolbarbg) ? String(urlParams.toolbarbg) : void 0; if (t) { var i = document.createElement("style"); i.textContent = "body,.chart-controls-bar,#footer-chart-panel{background-color:#" + t + " !important}", document.head.appendChild(i) } return new o({ bgColor: t, chartWidgetCollection: e, drawingsAccess: urlParams.drawingsAccess ? JSON.parse( urlParams.drawingsAccess) : void 0, resizerBridge: N.allocate({ areaName: "left" }), onClick: we }) } return null }(T), A = null; window.tradingViewApi = new J({ chartWidgetCollection: T, chartApiInstance: window.ChartApiInstance, saveChartService: I, loadChartService: M }); if (v.bindToChartWidgetCollection(T), TradingView.isNaN(urlParams .studyCountLimit) || (TradingView.STUDY_COUNT_LIMIT = Math.max(2, + urlParams.studyCountLimit)), !TradingView.isNaN(urlParams.ssreqdelay)) { var D = Math.max(0, +urlParams.ssreqdelay); Z(D) } window.ChartApiInstance.connect(), Promise.all([i.e("react"), i.e(1), i.e(4), i .e(6), i.e(11), i.e(12), i.e(13), i.e(14), i.e(17), i.e(21), i.e( 22), i.e(24), i.e(28), i.e(33), i.e(41), i.e(48), i.e(51), i.e( 52), i.e(60), i.e(67), i.e(75), i.e(0), i.e(5), i.e(30), i.e(38), i.e( "line-tools-icons"), i.e(53), i.e(54), i.e("floating-toolbars") ]).then(i.t.bind(null, "tPkB", 7)).then(({ default: e }) => { window.lineToolPropertiesToolbar = new e(T) }); var V = document.querySelector(".tv-content"); function B() { L && L.load(), A && A.load().then((function(e) { window.footerWidget = e.getComponent() })) } null !== V && V.addEventListener("contextmenu", (function(e) { null !== e.target && "input" !== e.target.tagName .toLowerCase() && "textarea" !== e.target.tagName .toLowerCase() && e.preventDefault() })), ne.resolve(), T.undoHistory.undoStack().onChange().subscribe(null, E(( function() { S.emit("onAutoSaveNeeded") }), 1e3 * (urlParams.autoSaveDelay || 5), { leading: !1, trailing: !0 })), window.chartWidget.withModel(null, (function() { if (ChartApiInstance.on("realtime_tick", (function(e) { S.emit("onTick", e) })), !l.savedThemeName() && le) { var t = l.getStdTheme(le); t && t.content && void 0 === c && T.applyTheme(t.content, ! 1, !1, le, !0, !0).then(() => window.applyOverrides( window.__defaultsOverrides)) } e.enabled("charting_library_debug_mode") && S.subscribeToAll(( function() { var e = Array.prototype.slice.call(arguments); console.log('Event "{0}", arguments: {1}' .format(e[0], JSON.stringify(e.slice( 1)))) })), G && (G(T), G = null), q && (q(T, { seriesControlBarEnabled: e.enabled( "timeframes_toolbar") }), q = null) })), h.isAnyChartWidgetInitialized(T) ? B() : h.waitAnyChartWidgetInitialized(T, B), S.subscribe("chart_load_requested", (function(e) { window.tradingViewApi.loadChart({ json: JSON.parse(e.content), extendedData: e }) })) }; window.addEventListener("unload", (function() { window.ChartApiInstance && window.ChartApiInstance.disconnect(), window .chartWidgetCollection && (window.chartWidgetCollection.destroy(), window.chartWidgetCollection = null), B(), window .ChartApiInstance && (window.ChartApiInstance.destroy(), window .ChartApiInstance = null) })), e.enabled("saveload_storage_customization") && (window.parent[urlParams.uid] .saveLoadAdapter ? u.setCustomAdapter(window.parent[urlParams.uid] .saveLoadAdapter) : void 0 !== urlParams.chartsStorageUrl && urlParams .chartsStorageUrl && void 0 !== urlParams.clientId && urlParams.clientId ? u .initialize(urlParams.clientId, urlParams.userId, urlParams.chartsStorageUrl, urlParams.chartsStorageVer || "1.0") : (e.setEnabled( "saveload_storage_customization", !1), e.setEnabled("header_saveload", ! 1))); var _e = x(); function me() { _e.resolve() } window.parent[urlParams.uid].loadLastChart && e.enabled( "saveload_storage_customization") ? u.getCharts().then((function(e) { if (0 !== e.length) { var t = e.sort((function(e, t) { return t.modified_iso - e.modified_iso }))[0]; u.getChartContent(t).then((function(e) { var t = JSON.parse(e.content); t.extendedData = e, urlParams.chartContent = JSON .stringify({ json: t }), me() })).catch(me) } else me() })).catch(me) : me(); var fe, ge, be = x(); Promise.all([be.promise, _e.promise]).then((function() { var t, i, s, r, n, o, a = document.querySelector(".loading-indicator"); if (a && (a.style.display = "none"), setTimeout(pe, 0), e.enabled( "14851") && Math.random() <= .02) { t = window, i = document, s = "script", r = "ga", t .GoogleAnalyticsObject = r, t.ga = t.ga || function() { (t.ga.q = t.ga.q || []).push(arguments) }, t.ga.l = 1 * new Date, n = i.createElement(s), o = i .getElementsByTagName(s)[0], n.async = 1, n.src = "//www.google-analytics.com/analytics.js", o.parentNode .insertBefore(n, o); var l = document.URL.match(new RegExp("(:?.*://)([^/]+)/.*"))[2]; ga("create", "UA-112911840-1", "auto"), ga("set", "anonymizeIp", ! 0), ga("set", { hostname: l, page: l, referrer: l }), ga("send", "pageview") } })), fe = !0, window.parent[urlParams.uid].datafeed.onReady((function(e) { fe && console.warn( "`onReady` should return result asynchronously. Use `setTimeout` with 0 interval to execute the callback function." ), window.configurationData = e, be.resolve() })), fe = !1, window.getFunctionFromArguments = function(e) { return window.parent[urlParams.uid][e] }, window.createShortcutAction = (ge = d.createGroup({ desc: "API" }), function(e, t) { ge.add({ hotkey: p(e), handler: t }) }), window.initializationFinished = function() { window.chartWidgetCollection.undoHistory.clearStack() }, window.headerReady = function() { return ue.promise }, window.createButton = function(e) { if (null === he) throw new Error( "Cannot create button: header widget is not ready or is not loaded - use `headerReady` to wait until header is ready" ); var t = (e = e || {}).align || "left"; return he.addButton(I(), t) }, window.createDropdown = function(e) { if (void 0 === e) throw new Error( "Cannot create dropdown without any parameters. Please refer to the documentation" ); void 0 === e.align && (e.align = "left"); const t = I(); return he ? (he.addDropdown(t, e), Promise.resolve(new ie(he, t))) : ue.promise .then(() => (he.addDropdown(t, e), new ie(he, t))) }, window.getAllFeatures = function() { const t = e.getAllFeatures(); return Object.keys(t).forEach((function(e) { isNaN(parseFloat(e)) || delete t[e] })), t }; var ve = null; window.getNavigationButtonsVisibility = function() { return null === ve && (ve = M(O())), ve }; var Se = null; window.getPaneButtonsVisibility = function() { return null === Se && (Se = M(L())), Se }; var ye = null; function we(e) { var t = TradingView.bottomWidgetBar; t && t.turnOffMaximize() } window.getDateFormat = function() { return null === ye && (ye = M(A)), ye } }).call(this, i("Kxc7")) }, "/McG": function(e) { e.exports = JSON.parse( '{"content":{"chartProperties":{"scalesProperties":{"textColor":"#131722","lineColor":"rgba(42, 46, 57, 0.14)","backgroundColor":"#ffffff"},"paneProperties":{"vertGridProperties":{"color":"rgba(42, 46, 57, 0.06)"},"horzGridProperties":{"color":"rgba(42, 46, 57, 0.06)"},"crossHairProperties":{"color":"#9598A1"},"background":"#ffffff","backgroundGradientStartColor":"#ffffff","backgroundGradientEndColor":"#ffffff"}},"sessions":{"graphics":{"backgrounds":{"outOfSession":{"color":"#2962FF","transparency":92},"preMarket":{"color":"#FF9800","transparency":92},"postMarket":{"color":"#2962FF","transparency":92}},"vertlines":{"sessBreaks":{"color":"#4985e7","style":2,"width":1}}}},"mainSourceProperties":{"baseLineColor":"#B2B5BE","candleStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#737375","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"haStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#737375","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"barStyle":{"downColor":"#ef5350","upColor":"#26a69a"},"pnfStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"},"baselineStyle":{"baselineColor":"rgba( 117, 134, 150, 1)","topFillColor1":"rgba( 38, 166, 154, 0.28)","topFillColor2":"rgba( 38, 166, 154, 0.05)","bottomFillColor1":"rgba( 239, 83, 80, 0.05)","bottomFillColor2":"rgba( 239, 83, 80, 0.28)","topLineColor":"rgba( 38, 166, 154, 1)","bottomLineColor":"rgba( 239, 83, 80, 1)"},"areaStyle":{"transparency":100,"color1":"rgba(41, 98, 255, 0.28)","color2":"#2962FF","linecolor":"#2962FF","linewidth":2,"linestyle":0},"renkoStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae","borderUpColorProjection":"#a9dcc3","borderDownColorProjection":"#f5a6ae","wickUpColor":"#26a69a","wickDownColor":"#ef5350"},"lineStyle":{"color":"#2962FF","linewidth":2,"linestyle":0},"kagiStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"},"pbStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae","borderUpColorProjection":"#a9dcc3","borderDownColorProjection":"#f5a6ae"},"rangeStyle":{"upColor":"#26a69a","downColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"}}}}' ) }, "/ToI": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return o })), i.d(t, "a", (function() { return a })); var s = i("Eyy1"), r = i("3u3j"); class n extends r.a { constructor(e, t, i, s) { super(e, t, s), this._sourcePaneRemoved = !1, this._targetPaneIndex = e.panes() .indexOf(i) } redo() { const e = this._chartModel.panes()[this._initialPaneIndex], t = this._chartModel.panes()[this._targetPaneIndex], i = e !== t, r = this._targetPriceScale(t), n = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this ._sourceId)), o = this._chartModel.children(n, !0); for (const e of o) i ? (this._chartModel.detachSource(e), t.addDataSource(e, r, !1)) : t.move(e, r); i ? (this._sourcePaneRemoved = this._chartModel.detachSource(n), t .addDataSource(n, r, !1)) : t.move(n, r); const a = t.priceScalePosition(r); t.movePriceScale(r, a, this._targetPriceScaleIndex(n)), this._chartModel .fullUpdate() } undo() { this._sourcePaneRemoved && this._chartModel.createPane(this._initialPaneIndex); const e = this._chartModel.panes()[this._initialPaneIndex], t = e !== this._chartModel.panes()[this._targetPaneIndex], i = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this ._sourceId)); let r = e.getPriceScaleById(this._initialPriceScaleId); null === r && (r = e.createPriceScaleAtPosition(this._initialPriceScalePosition, this._initialPriceScaleIndex)); const n = this._chartModel.children(i, !0); for (const i of n) t ? (this._chartModel.detachSource(i), e.addDataSource(i, r, !1)) : e.move(i, r); t ? (this._chartModel.detachSource(i), e.addDataSource(i, r, !1)) : e.move(i, r), Object(s.ensureNotNull)(i.priceScale()).restoreState(this ._originalPriceScaleState()), this._chartModel.fullUpdate() } } class o extends n { constructor(e, t, i, s, r) { super(e, t, i, r), this._targetPriceScalePosition = s } _targetPriceScale(e) { const t = e.createPriceScaleAtPosition(this._targetPriceScalePosition); return t.restoreState(this._newPriceScaleState("overlay" === this ._targetPriceScalePosition)), t } _targetPriceScaleIndex(e) { return e === this._chartModel.mainSeries() ? 0 : void 0 } } class a extends n { constructor(e, t, i, s, r) { super(e, t, i, r), this._targetPriceScaleId = s.id() } _targetPriceScale(e) { return Object(s.ensureNotNull)(e.getPriceScaleById(this._targetPriceScaleId)) } _targetPriceScaleIndex(e) {} } }, "/Y2c": function(e, t, i) { "use strict"; (function(t) { var s = i("Eyy1").assert, r = i("jofe").createDeferredPromise, n = (i("qFKp").CheckMobile, i("VNzU").layouts), o = i("Zo2/"), a = i("qFKp").supportTouch, l = i("qFKp").isIE, c = i("qFKp").isEdge, h = i("x8jL").createUndoHistory, u = i("mMWL"), d = i("lxNp"), p = i("/3z9"), _ = i("FQhm"), m = i("PzPU"), f = i("Kxc7"), g = i("ijBy").SetChartLayoutCommand, b = i("hY0g"), v = i("HySD").ResizerDetacherState, S = i("HV/F").delegateToPromise, y = i("sEk5"), w = i("lJvs"), P = i("txPx").getLogger("Chart.ChartWidgetCollection"), C = (i("JWMC").trackEvent, i("wamh").ChangeToolBarsThemeUndoCommand); const { getCurrentTheme: x } = i("EsvI"); var T = i("dfhE"), I = i("ufwo").rangesAreEqual, M = i("0psP").GeneralChartPropertiesRenderer, O = i("NSoL").clientSnapshot, L = i("pPtI").setLastUsedResolution, A = i("TCfT").CompareDialogRenderer, E = i("mNbo").isOnMobileAppPage, k = i("E3Wt"), D = k.applyIndicatorsToAllChartsImpl, V = k.applyIndicatorToAllChartsImpl, B = k.lineToolsAndGroupsDTOsImpl, R = k.getStateForChartImpl, N = k.getAsyncStateForChartImpl, j = k.resetLineToolsInvalidatedImpl, F = k.applyLineToolUpdateNotificationImpl, W = k.createClipboardHandler, H = k.chartsSymbolsImpl, U = { saveChartEnabled: !0, takeScreenshotEnabled: !0, publishedChartsEnabled: !0 }; e.exports = function(e) { var k = this, z = Object.assign({}, U, e), G = 1, q = 2, Y = 0, K = 0, J = new b, Z = z.readOnly || !1, X = [], $ = 0, Q = new b, ee = new b, te = null, ie = "s", se = new b, re = [], ne = !1, oe = !1, ae = !1, le = new b(!1), ce = new b(!1), he = new b(!1), ue = new b(TVSettings.getBool("chart.syncCrosshair", !0)), de = d.createGroup({ desc: "Layout" }), pe = null, _e = ue.value(); ue.subscribe((function(e) { _e = e = !!e, TVSettings.setValue("chart.syncCrosshair", e); for (var t = 0; t < X.length; ++t) { var i = X[t].chartWidget; i.hasModel() && i.model().lightUpdate() } })); var me = new b(ie), fe = z.resizerBridge.width, ge = z.resizerBridge.height, be = null; void 0 !== z.padding && (q = z.padding), void 0 !== z.topOffset && (G = z .topOffset), void 0 !== z.edge && (Y = z.edge), void 0 !== z.border && ( K = z.border); var ve = z.widgetOptions || {}, Se = z.metaInfo || {}, ye = { id: new b(Se.id || null), name: new b(Se.name), description: new b(Se.description), username: new b(Se.username), uid: new b(Se.uid), lastModified: new b(Se.lastModified) }, we = h(); we.onChange().subscribe(null, (function(e) { _.emit("undo_redo_state_changed", e) })); var Pe = z.resizerBridge.container.value(), Ce = r(), xe = new t, Te = new t, Ie = new t; function Me() { X.forEach((function(e) { e.chartWidget.onZoom().unsubscribeAll(this) })) } function Oe() { X.forEach((function(e) { e.chartWidget.onScroll().unsubscribeAll(this) })) } var Le, Ae = null, Ee = null, ke = null; z.seriesControlBarEnabled && (Le = Y + K + "px", (Ae = document.createElement( "div")).style.left = Le, Ae.style.right = Le, Ae.style.bottom = Le, Ae.classList.add("chart-toolbar", "chart-controls-bar"), Pe.appendChild( Ae), Promise.all([i.e("react"), i.e(1), i.e(6), i.e(8), i.e(11), i .e(12), i.e(13), i.e(14), i.e(28), i.e(29), i.e(41), i.e(43), i .e(48), i.e(73), i.e(0), i.e(5), i.e(7), i.e(10), i.e(38), i.e( "chart-bottom-toolbar") ]).then(i.bind(null, "MfqI")).then(({ BottomToolbarRenderer: e }) => { var i = z.resizerBridge, s = [i.container.spawn(), i.width.spawn(), i.height .spawn() ], r = i.container.value(), n = new t, o = function() { n.fire() }; s.forEach((function(e) { e.subscribe(o) })), Ee = new e(Ae, n, (function() { var e = r.getBoundingClientRect(), t = Re(); return t.top = e.top + t.top, t.left = e.left + t.left, t }), k, ChartApiInstance, ve, z.seriesControlBar), ke = function() { null !== Ee && (Ee.destroy(), Ee = null, Ae.remove(), Ae = null), s.forEach((function(e) { e.destroy() })), n.destroy() } })); var De = new M(k), Ve = new A(k); function Be() { return { undoHistory: we, chartWidgetsDefs: X, chartsCountToSave: Ne, actualLayoutCount: je, savedChartWidgetOptions: re, activeChartWidget: J, options: z, parent: Pe, toastsFactory: null } } function Re() { var e = Y + K, t = Ae ? Ae.offsetHeight : 0; return { width: fe.value() - 2 * e, height: ge.value() - G - t - e, top: G, left: e } } function Ne() { return je() } function je() { return n[ie].count } function Fe(e, t, i, s, r) { return R(Be(), e, t, i, s, r) } function We() { var e; e = be ? [be] : X.slice(0, te.count).filter((function(e) { return !e.hiddenInLayout.value() })); for (var t = 0; t < e.length; t++) He(e[t], t, e.length) } function He(e, t, i) { var s = te.sizer(Re(), t, i, q + K); s.width = Math.max(Math.round(s.width), 0), s.height = Math.max(Math.round(s .height), 0), s.top = Math.round(s.top), s.left = Math.round(s .left), e.metrics = s; var r = e.container.value(); r && (r.style.width = s.width + "px", r.style.height = s.height + "px", r .style.top = s.top + "px", r.style.left = s.left + "px"), e.width.setValue(s.width), e.height .setValue(s.height) } function Ue(e) { return e.rdState.owner.value() !== e } function ze() { return Promise.resolve(null) } function Ge(e) { var t; e = Object.assign({ chartWidgetCollection: k, isActive: 0 === X.length, barsMarksContainersFactory: qe, undoHistory: we, readOnly: Z, initialLoading: ae, getToasts: ze }, e || {}), void 0 !== gt && (e.customLegendWidgetFactories = new Map( gt)); var i = document.createElement("div"); i.classList.add("chart-container"), i.style.position = "absolute", i.style .overflow = "hidden", Pe.appendChild(i), (l || c) && (i.style .touchAction = "none", i.style.msTouchAction = "none"), z .className && i.addClass(z.className); var s = { alive: new b(!0), container: new b(i), width: new b, height: new b, hiddenInLayout: new b(!1), visible: new b, rdState: new v, requestFullscreen: function() { Q.value() && (Ye(s), J.setValue(s.chartWidget)) }, exitFullscreen: function() { J.value() === s.chartWidget && Ye(null) }, detachable: Q, fullscreenable: Q, fullscreen: new b }; function r() { s.visible.setValue(!s.hiddenInLayout.value() && z.resizerBridge.visible .value()) } s.rdState.pushOwner(s), X.push(s), s.hiddenInLayout.subscribe((function() { s.chartWidget.setVisible(!s.hiddenInLayout.value()), r() })), z.resizerBridge.visible.subscribe(r), r(), function(e) { for (var t = 0, i = 0, s = 0; s < te.count; s++) { X[s] && Ue(X[s]) || (X[s] === e && (i = t), t++) } He(e, i, t) }(s), Object.assign(e, s.rdState.bridge()); var n = e.content ? e.content.chartId : Je(Ke); return s.chartWidget = t = new o.ChartWidget(e, n, ye.uid.value()), pe && s .chartWidget.setSaveChartService(pe), e.containsData ? t .finishInitWithoutConnect() : t.connect(), t.withModel(null, ( function() { var e = t.model().model(); ft.forEach((function(t, i) { e.addCustomSource(i, t.factory, t.layer) })) })), et(), tt(), xe.fire(t), t } function qe(e) { var t = [], i = new y(e); t.push(i); var s = new w(e); return t.push(s), t } function Ye(e) { be !== e && (be = e, Qe(ie)) } function Ke(e) { return X.some((function(t) { return t.chartWidget && t.chartWidget.id() === e })) } function Je(e) { for (var t = 1; e("" + t);) t++; return "" + t } function Ze() { X.every(e => e.chartWidget.hasModel()) && (et(), _.emit("layout_changed")) } function Xe(e, t) { const i = Ge(Object.assign({}, ve, re.shift() || function() { const e = J.value(); if (e) { const t = e.state(); return t.chartId = Je(Ke), t .shouldBeSavedEvenIfHidden = !1, { content: t } } }(), 0 === e || le.value() ? void 0 : { defSymbol: null })); return i.modelCreated().subscribe(null, t || Ze, !0), i } function $e(e) { e.hiddenInLayout.setValue(!0); const t = e.container.value(); t.parentNode && t.parentNode.removeChild(t), e.fullscreen.setValue(!1) } function Qe(e) { e in n || (e = "s"), Me(), Oe(); var t = ie, i = n[e].count; _.emit("layout_about_to_be_changed", e), me.setValue(e), ie = e, te = n[e]; for (var s = i; s < X.length; s++) { Ue(r = X[s]) && r.rdState.bridge().attach() } t !== e && be && (be = null), be && J.setValue(be.chartWidget); for (s = 0; s < i || s < X.length; s++) { var r = X[s]; if (be ? be === r : s < i && (!r || !Ue(r))) { if (r) { if (Pe.appendChild(r.container.value()), r.hiddenInLayout .setValue(!1), oe) { var o = re.shift(); o && (ne = !0, r.chartWidget.loadContent(o.content, ae), ne = !1) } } else Xe(s), r = X[s]; r.container.value().classList.toggle("multiple", i > 1), r .fullscreen.setValue(be === r) } else r && $e(r) } We(), et(), function() { for (var e = te.count, t = e, i = 0; i < e; i++) X[i] && Ue(X[i]) && t--; ee.setValue(t), Q.setValue(t > 1) }(), Ze(), X.forEach((function(e) { e.chartWidget.onZoom().subscribe(this, (function(e) { Te.fire(e) })) })), X.forEach((function(e) { e.chartWidget.onScroll().subscribe(this, (function() { Ie.fire() })) })), ee.value() < 1 && i > 0 && X[i - 1].rdState.bridge().attach() } function et() { var e = Math.min(te.count, X.length) - 1; if (e < 0) J.deleteValue(); else { var t = $; t < 0 && (t = 0), t > e && (t = e), J.setValue(X[t].chartWidget) } } function tt() { for (var e = X.length; e--;) { var t = e === $; X[e].container.value().classList.toggle("active", t), X[e].container .value().classList.toggle("inactive", !t) } } function it(e) {} fe.subscribe(We), ge.subscribe(We), this.updateLayout = We; var st = new t, rt = new b, nt = new b, ot = null; function at(e) { var t = e.mainSeries().properties(); t.style.subscribe(null, lt), lt(t.style), e.model() .onSelectedSourceChanged().subscribe(null, ct), ct(e.selection() .allSources()) } function lt(e) { rt.setValue(e.value()) } function ct() { var e = ot.model(); nt.setValue(e.selection().allSources()) } function ht(e) { for (var t = !1, i = 0; i < X.length; i++) { var s = X[i].chartWidget; if (s.hasModel()) s.model().mainSeries().properties().symbol.value() !== e && (t || (we.beginUndoMacro("Change Symbol"), t = !0), s .setSymbol(e)) } t && we.endUndoMacro() } J.subscribe((function(e) { if (e) { for (var t, i = X.length; i--;) if (X[i].chartWidget === e) { t = i; break } if (!isFinite(t)) throw new Error( "Cannot make detached ChartWidget active"); if ($ !== t) { be && (Ue(X[t]) || (be = X[t])), $ = t, tt(); for (i = X.length; i--;) X[i].chartWidget !== e && X[i] .chartWidget.setActive(!1); yt(), e.setActive(!0) }! function(e) { if (ot !== e) { if (ot && (ot.modelCreated().unsubscribe(null, at), ot.hasModel())) { var t = ot.model(); t.mainSeries().properties().style.unsubscribe( null, lt), t.model() .onSelectedSourceChanged().unsubscribe(null, ct), ot = null } e && (ot = e, e.hasModel() ? at(e.model()) : e .modelCreated().subscribe(null, at)) } }(e) } }), { callWithLast: !0 }); var ut = !1, dt = !1; function pt(e) { var t = Math.max(1, window.devicePixelRatio || 1); if (e && e.onlyActiveChart || be) return { layout: "s", hidpiRatio: t, theme: x().name, charts: [J.value().images(e)] }; for (var i = [], s = te.count, r = { showCollapsedStudies: (e = e || {}).showCollapsedStudies, status: e.status }, n = 0; n < X.length && n < s; n++) i.push(X[n].chartWidget.images( r)); return { layout: ie, hidpiRatio: t, theme: x().name, charts: i } } function _t() { const e = { snapshotUrl: z.snapshotUrl }; const t = E("any"); return (t ? m.getImageOfChartSilently : m.copyToClipboardImageOfChart)(k, e) .then((function(e) { return _.emit("onScreenshotReady", e), t || _.emit( "onServerScreenshotCopiedToClipboard"), e })) } function mt(e) { if (0 !== X.length) { for (var t = X.length; t--;) X[t].chartWidget.setActive(!1); X[$].chartWidget.setActive(e) } } Z || (de.add({ desc: "Switch active chart", hotkey: 9, handler: function() {} }), de.add({ desc: "Switch active chart", hotkey: p.Modifiers.Shift + 9, handler: function() {} })), z.takeScreenshotEnabled && (de.add({ desc: "Screenshot server", hotkey: p.Modifiers.Alt + 83, handler: function() { _t() } }), E("any") || (de.add({ desc: "Download client screenshot", hotkey: p.Modifiers.Mod + p.Modifiers.Alt + 83, handler: function() { m.downloadClientScreenshot(k) } }), de.add({ desc: "Copy client screenshot", hotkey: p.Modifiers.Mod + p.Modifiers.Shift + 83, handler: function() { m.copyToClipboardClientScreenshot(k).then(() => { _.emit( "onClientScreenshotCopiedToClipboard" ) }) } }))), z.saveChartEnabled && de.add({ desc: "Save Chart Layout", hotkey: p.Modifiers.Mod + 83, handler: function() { st.fire() } }); var ft = new Map, gt = new Map; const bt = W(Be()); function vt(e) { if (f.enabled("charting_library_base")) return e; if ("s" === e || ve.containsData || Z || (void 0)((void 0) .MULTIPLE_CHARTS) && (void 0)((void 0).MULTIPLE_CHARTS).limit >= n[ e] .count) return e; return "s" } function St(e, t) { if (oe = !0, ae = Boolean(t), re = [], e) { e.charts || (e = { layout: "s", charts: [e] }); var i = new Set; e.charts.forEach((function(e) { e.chartId && i.add(e.chartId) })), e.charts.forEach((function(e) { if (!e.chartId) { var t = Je((function(e) { return i.has(e) })); i.add(t), e.chartId = t } })), ie = vt(e.layout || "s"); for (var s = 0; s < e.charts.length; s++) { var r = e.charts[s]; re.push({ content: r }) } e.symbolLock && le.setValue(!0), e.intervalLock && ce.setValue(!0), e .trackTimeLock && he.setValue(!0) } Qe(ie), u.init(), u.tool.subscribe(wt), u.tool.subscribe(yt), oe = !1, ae = !1 } function yt() { var e = J.value(); X.forEach((function(t) { t.chartWidget !== e && t.chartWidget .updateCrossHairPositionIfNeeded() })), e && e.updateCrossHairPositionIfNeeded() } function wt() { X.forEach((function(e) { e.chartWidget.onToolChanged() })) } z.globalEvents && bt.listen(), Object.assign(this, { createChartWidget: Ge, getAll: function() { return X.map((function(e) { return e.chartWidget })) }, destroy: function() { mt(!1), null !== ke && (ke(), ke = null), Me(), Oe(), X .forEach((function(e) { void 0 !== e.timingsMeter && e.timingsMeter .destroy(), e.chartWidget.destroy() })), z.resizerBridge.remove(), window .removeEventListener("resize", We), u.tool.unsubscribe( yt), u.tool.unsubscribe(wt), Ce.resolve(), Pe .remove(), ft.clear(), gt.clear(), de.destroy(), bt && bt.destroy() }, layout: me.readonly(), setLayout: Qe, activeChartWidget: J, viewMode: se, activeChartStyle: rt.readonly(), setChartStyleToWidget: function(e, t) { t || (t = J.value()), t && function(e, t) { var i = e.model(), s = i.mainSeries().properties().style; i.setChartStyleProperty(s, t, "Change Series Style") }(t, e) }, selectedSources: nt.readonly(), metaInfo: ye, state: function(e, t, i, s) { for (var r = [], n = Ne(), o = 0; o < n; o++) { var a = Fe(o, e, t, i, s); a && r.push(a) } var l = { name: k.metaInfo.name.value(), layout: ie, charts: r }; return le.value() && (l.symbolLock = 1), ce.value() && (l .intervalLock = 1), he.value() && (l.trackTimeLock = 1), l }, lineToolsAndGroupsDTOs: function() { return B(Be()) }, resetLineToolsInvalidated: function(e, t) { return j(Be(), e, t) }, applyLineToolUpdateNotification: F.bind(null, X), asyncState: function() { for (var e, t = [], i = Ne(), s = 0; s < i; s++) t.push((e = s, N(Be(), e))); return Promise.all(t).then((function(e) { for (var t = { charts: [] }, i = 0; i < e.length; i++) t.charts .push(e[i]); return t })) }, readOnly: function() { return Z }, onZoom: function() { return Te }, onScroll: function() { return Ie }, lock: { symbol: le, setSymbolLockWithUndo: function(e) { if (e !== le.value()) { if (we.beginUndoMacro("Symbol Lock"), e) for (var t = J.value(), i = t.getSymbol(), s = 0; s < X.length; s++) { var r = X[s].chartWidget; r !== t && (r.getSymbol() !== i && r .setSymbol(i)) } we.setWatchedValue(le, e, "Symbol Lock"), we .endUndoMacro() } }, interval: ce, setIntervalLockWithUndo: function(e) { if (e !== ce.value()) { if (we.beginUndoMacro("Interval Lock"), e) for (var t = J.value(), i = t.getResolution(), s = 0; s < X.length; s++) { var r = X[s].chartWidget; r !== t && (r.getResolution() !== i && r .setResolution(i)) } we.setWatchedValue(ce, e, "Resolution Lock"), we .endUndoMacro() } }, crosshair: ue, trackTime: he, setTrackTimeWithUndo: function(e) { he.value() !== e && we.setWatchedValue(he, e, "Track Time") } }, setSymbol: function(e) { le.value() ? ht(e) : J.value().setSymbol(e) }, setResolution: function(e) { ne || dt || ut || function(e) { if (L(e), ut = !0, ce.value()) { for (var t = !1, i = 0; i < X.length; i++) { var s = X[i].chartWidget; s.model().mainSeries().properties().interval .value() !== e && (t || (we .beginUndoMacro( "Change Resolution"), t = !0 ), s.setResolution(e)) } t && we.endUndoMacro() } else J.value().setResolution(e); ut = !1 }(e) }, setTimeFrame: function(e) { if (!ne && !dt) { if (dt = !0, ce.value()) for (var t = 0; t < X.length; t++) { var i, s = X[t].chartWidget; null !== (i = s.model().model() .appliedTimeFrame().value()) && I(i, e) || s.loadRange(e) } else null !== (i = J.value().model().model() .appliedTimeFrame().value()) && I(i, e) || J .value().loadRange(e); dt = !1 } }, updateLayout: We, setChartLayoutWithUndo: function(e) { return e = vt(e), me.value() !== e && (we.pushUndoCommand( new g(k, e)), !0) }, images: pt, clientSnapshot: function(e) { const t = { hideResolution: e && e.hideResolution }, i = e && e.hideResolution; let s = e; return O(pt({ showCollapsedStudies: !0, status: t, hideResolution: i }), s) }, tags: function() { for (var e = [], t = 0; t < X.length && t < te.count; t++) e = e.concat(X[t].chartWidget.tags()); return e = (e = Array.from(new Set(e))).map((function(e) { return e.toLowerCase().replace(/\W+/g, "-") .replace(/-+/g, "-").replace(/^-|-$/g, "") })) }, syncCrosshair: function(e, t, i, s) { if (i || _e) for (var r = te.count, n = 0; n < X.length && n < r; n++) { var o = X[n].chartWidget; o !== t && (X[n].rdState.bridge().visible.value() && o.hasModel() && o.model().model() .setExternalPosition(e, s)) } }, syncScroll: function(e, t) { if (he.value()) { var i = te.count; we.beginUndoMacro("Sync Time"); for (var s = 0; s < X.length && s < i; s++) { var r = X[s].chartWidget; if (r.hasModel()) { var n = r.model().model(); if (n === t) continue; n.syncTimeWithModel(t, e) } } we.endUndoMacro() } }, setSymbolAll: ht, clearChartMetaInfo: function() { ye.id.setValue(null), ye.uid.setValue(void 0), ye.name .setValue(void 0) }, takeScreenshot: function() { var e = { snapshotUrl: z.snapshotUrl }; return m.getImageOfChartSilently(k, e).then((function(e) { return _.emit("onScreenshotReady", e), e })) }, takeServerScreenshot: _t, loadContent: St, purgeUnusedWidgets: function() { for (var e = n[ie].count; e < X.length; e++) X[e] .chartWidget.destroy(); X.splice(n[ie].count) }, applyOverrides: function(e) { for (var t = 0; t < X.length; t++) X[t].chartWidget .applyOverrides(e) }, applyStudiesOverrides: function(e) { for (var t = 0; t < X.length; t++) X[t].chartWidget .applyStudiesOverrides(e) }, switchChart: it, startFullscreen: function() { z.resizerBridge.requestFullscreen() }, exitFullscreen: function() { z.resizerBridge.exitFullscreen() }, destroyPromise: function() { return Ce.promise() }, chartWidgetCreated: function() { return xe }, saveKeysPressed: function() { return st }, getContainer: function() { return Pe }, onWidget: ve.onWidget, applyTheme: function(e, t, i, s, r, n, o) { void 0 === n && (n = !0); const a = x().name; return Promise.all(t ? [J.value()] : X.concat(re).map((e, t) => e.chartWidget ? e.chartWidget : new Promise(e => { const i = Xe(t, () => e(i)); $e(X[t]) }))).then(t => { o ? (r && new C(a, s, n).redo(), t.forEach(( function(t) { t.model().model() .restoreTheme(e, i, o) }))) : (we.beginUndoMacro( "Apply Chart Theme"), r && we .pushUndoCommand(new C(a, s, n)), t .forEach((function(t) { t.model().model() .restoreTheme(e, i) })), we.endUndoMacro()) }) }, applyIndicatorsToAllCharts: function(e) { D(Be(), e) }, applyIndicatorsToAllChartsAvailable: function() { return !Z && je() > 1 }, applyIndicatorToAllCharts: function(e, t, i, s) { V(Be(), e, t, i, s) }, setActive: mt, inlineChartsCount: ee.readonly(), revertToInline: function() { Ye(null); for (var e = 0; e < X.length; e++) X[e].rdState.bridge() .attach() }, chartMarketStatuses: function() { return X.map((function(e) { return "-" })) }, chartSeriesStatuses: function() { return X.map((function(e) { var t = e.chartWidget.hasModel() ? e .chartWidget.model().mainSeries() .status() : null; return (null === t ? "" : T .SERIES_STATUS_TEXT[t]) + " (" + t + ")" })) }, undoHistory: we, applyPreferencesToAllCharts: function(e) {}, getToasts: ze, addCustomSource: function(e, t, i) { s(!ft.has(e), "Cannot create the same custom source multiple times" ), ft.set(e, { factory: t, layer: i }); for (var r = 0; r < X.length; ++r) { var n = X[r].chartWidget; n.hasModel() && n.model().model().addCustomSource(e, t, i) } }, removeCustomSource: function(e) { s(ft.has(e), "Cannot remove not created custom source"), ft .delete(e); for (var t = 0; t < X.length; ++t) { var i = X[t].chartWidget; i.hasModel() && i.model().model().removeCustomSource(e) } }, addCustomWidgetToLegend: function(e, t) { s(!gt.has(e), "Cannot create the same custom widget in legend multiple times" ), gt.set(e, t); for (var i = 0; i < X.length; ++i) X[i].chartWidget .addCustomWidgetToLegend(e, t) }, setViewMode: function(e) { se.setValue(e) }, moveActiveChartWithUndo: function(e) {}, activeChartCanBeMoved: function() { return !1 }, generalPropertiesDefinitions: function() { return J.value().generalPropertiesDefinitions() }, reconnectChartApi: function(e) { (void 0)(e) }, setBroker: function(e) { 0 }, setSaveChartService: function(e) { pe = e; for (var t = 0; t < X.length; ++t) { X[t].chartWidget.setSaveChartService(e) } }, getCompareDialogRenderer: function() { return Ve }, getChartPropertiesDialogRenderer: function() { return De }, clipboard: bt, chartsSymbols: function() { return H(Be()) } }), St(z.content, !0), me.subscribe((function() { tt() })), me.hook = function(e) { return e === this.value() ? e : vt(e) }, Z && (me.writeLock = !0), window.addEventListener("resize", We); var Pt = 0; function Ct() { 0 === --Pt && _.emitOnce("onChartReady") } if (X.forEach((function(e) { if (e) { Pt++; var t = e.chartWidget; t.withModel(null, (function() { z.metaInfo && t.model().model() .setChartSaveTime(1e3 * z.metaInfo .lastModified); var e = t.model().mainSeries(); if (e.bars().size() > 0 || e.isStatusBad()) Ct(); else { var i = e.dataEvents(), s = function() { Ct(), i.barReceived() .unsubscribe(null, s), i .completed().unsubscribe( null, s), i.error() .unsubscribe(null, s) }; i.barReceived().subscribe(null, s), i .completed().subscribe(null, s), i .error().subscribe(null, s) } })) } })), a()) { var xt = u.tool.setValue; u.tool.setValue = function() { k.selectedSources.value() && k.activeChartWidget.value().model() .lineBeingCreated() && k.activeChartWidget.value().model() .cancelCreatingLine(), xt.apply(u.tool, arguments) } } Promise.all(X.map((function(e) { return S(e.chartWidget.modelCreated()).promise }))).then((function() { return Promise.all(X.map((function(e) { return S(e.chartWidget.model().mainSeries() .dataEvents().symbolResolved()) .promise }))) })).then((function() { window.saver && window.is_authenticated && z.widgetOptions .justCloned && window.saver.saveChartSilently() })).catch(P.logError.bind(P)) } }).call(this, i("aIyQ")) }, "/YGI": function(e, t, i) { "use strict"; i.r(t); var s, r = i("0YCj"), n = i.n(r); ! function(e) { e.StudyCannotBeChild = "cannot_be_child", e.StubWasRemoved = "stub_was_removed", e .CannotGetMetainfo = "cannot_get_metainfo", e.Cancelled = "cancelled", e.Unknown = "unknown" }(s || (s = {})); var o = i("txPx"); i.d(t, "StudyInserter", (function() { return l })); const a = Object(o.getLogger)("Chart.Studies.StudyInserter"); class l { constructor(e, t, i) { this._parentSource = void 0, this._propsState = void 0, this._preferredPriceScale = void 0, this._allowChangeCurrency = !1, this._allowChangeUnit = !1, this ._paneSize = void 0, this._forceOverlay = !1, this._studyMetaInfoRepository = t, this._inserterImpl = i, this._studyDescriptor = e } setParentSource(e) { this._parentSource = e || void 0 } setPaneSize(e) { this._paneSize = e } setPreferredPriceScale(e) { this._preferredPriceScale = e } setAllowChangeCurrency(e) { this._allowChangeCurrency = e } setAllowChangeUnit(e) { this._allowChangeUnit = e } setForceOverlay(e) { this._forceOverlay = e } setPropertiesState(e) { this._propsState = e } setTargetPriceScaleMode(e) { this._targetPriceScaleMode = e } async insert(e, t) { const i = void 0 !== (r = this._inserterImpl).createStub && void 0 !== r .removeStub ? this._inserterImpl.createStub() : null; var r; let n, o = !0; try { n = await this._studyMetaInfoRepository.findById(this._studyDescriptor) } catch (e) { return a.logWarn("Cannot get study " + JSON.stringify(this._studyDescriptor)), Promise.reject(s.CannotGetMetainfo) } finally { null !== i && (o = this._inserterImpl.removeStub(i)) } if (!o) return Promise.reject(s.StubWasRemoved); if (void 0 !== t && t.cancelled) return Promise.reject(s.Cancelled); if (!this._canApplyStudyToParent(n)) return Promise.reject(s.StudyCannotBeChild); const l = { ...n.defaults.inputs }, c = void 0 !== e ? await e(l, n.inputs, n) : {}; if (void 0 !== t && t.cancelled) return Promise.reject(s.Cancelled); const h = this._insertStudy(n, c); return null === h ? Promise.reject(s.Unknown) : h } _insertStudy(e, t) { return this._inserterImpl.createStudy(e, t, null, this._propsState, this ._forceOverlay, this._parentSource, this._preferredPriceScale, this ._allowChangeCurrency, this._allowChangeUnit, this._paneSize, this ._targetPriceScaleMode) } _canApplyStudyToParent(e) { return void 0 === this._parentSource || n.a.canBeChild(e) } } }, "/bs+": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return n })); var s = i("E6p6"); function r(e, t, i) { if (i.isDays()) return t; if (e.moveTo(1e3 * t), i.isIntraday()) { const i = e.indexOfBar(1e3 * t); if (i < 0) throw new Error(t + " is out of the instrument session "); return e.endOfBar(i) / 1e3 } return e.startOfBar(s.SessionStage.LASTBAR_SESSION) / 1e3 } function n(e, t, i) { if (i.isDays()) return t; const s = 1e3 * t - 1; if (e.moveTo(s), i.isIntraday()) { const i = e.indexOfBar(s); if (i < 0) throw new Error(t + " is out of the instrument session "); return e.startOfBar(i) / 1e3 } return t = e.startOfBar(0) / 1e3 } }, "/hKg": function(e, t, i) { "use strict"; i.r(t), i.d(t, "PaneRendererCandles", (function() { return l })); var s = i("Eyy1"), r = i("VdBB"), n = i("gAom"), o = i("Zp/P"), a = i("ExCE"); class l extends a.a { constructor(e) { super(), this._barSpacing = 1, this._barWidth = 1, this._borderVisible = !1, this._barBorderWidth = 1, this._wickVisible = !1, this._bodyVisible = !0, this._borderColor = void 0, this._wickColor = void 0, this._hittest = void 0, e && this.setData(e) } setData(e) { this._bars = e.bars, this._barSpacing = e.barSpacing, this._borderVisible = e .borderVisible, this._bodyVisible = e.bodyVisible, this._wickVisible = e .wickVisible, this._borderColor = e.borderColor, this._wickColor = e .wickColor, this._hittest = e.hittest } hitTest(e) { return this._wickVisible || this._borderVisible || this._bodyVisible ? super .hitTest(e) : null } draw(e, t) { if (0 === this._bars.length) return; const i = t.pixelRatio; if (this._barWidth = Object(o.optimalCandlestickWidth)(this._barSpacing, i), this._barWidth >= 2) { Math.floor(i) % 2 != this._barWidth % 2 && this._barWidth-- } this._wickVisible && this._drawWicks(e, i), this._borderVisible && this ._drawBorder(e, i), this._bodyVisible && this._drawCandles(e, i) } _getTolerance() { return Object(o.interactionTolerance)().series + this._barBorderWidth / 2 } _getBarSpacing() { return this._barSpacing } _getHitTest() { return this._hittest || new r.HitTestResult(r.HitTestResult.REGULAR) } _isPointAtBar(e, t, i) { const s = this._bodyVisible || this._borderVisible, r = this._wickVisible; if (!s && !r) return !1; if (s) { const s = r ? Math.min(e.high, e.low) : Math.min(e.open, e.close), n = r ? Math.max(e.high, e.low) : Math.max(e.open, e.close); return s - i <= t && t <= n + i } { const s = Math.min(e.open, e.close), r = Math.max(e.open, e.close); return e.high - i <= t && t <= s + i || r - i <= t && t <= e.low + i } } _drawWicks(e, t) { const i = this._bars; let r = "", n = Math.min(Math.floor(t), Math.floor(this._barSpacing * t)); n = Math.max(Math.floor(t), Math.min(n, this._barWidth)); const o = Math.floor(.5 * n); let a = null; for (const l of i) { const i = l.wickColor ? l.wickColor : Object(s.ensureDefined)(this ._wickColor); i !== r && (e.fillStyle = i, r = i); const c = Math.round(Math.min(l.open, l.close) * t), h = Math.round(Math.max(l.open, l.close) * t), u = Math.round(l.high * t), d = Math.round(l.low * t); let p = Math.round(t * l.time) - o; const _ = p + n - 1; null !== a && (p = Math.max(a + 1, p), p = Math.min(p, _)); const m = _ - p + 1; e.fillRect(p, u, m, c - u), e.fillRect(p, h + 1, m, d - h), a = _ } } _calculateBorderWidth(e) { let t = Math.floor(1 * e); this._barWidth <= 2 * t && (t = Math.floor(.5 * (this._barWidth - 1))); const i = Math.max(Math.floor(e), t); return this._barWidth <= 2 * i ? Math.max(Math.floor(e), Math.floor(1 * e)) : i } _drawBorder(e, t) { let i = ""; const r = this._calculateBorderWidth(t); let o = null; for (const a of this._bars) { if (a.borderColor !== i && (e.fillStyle = a.borderColor ? a.borderColor : Object(s.ensureDefined)(this._borderColor), i = a.borderColor), this ._bodyVisible && a.hollow) continue; let l = Math.round(a.time * t) - Math.floor(.5 * this._barWidth); const c = l + this._barWidth - 1, h = Math.round(Math.min(a.open, a.close) * t), u = Math.round(Math.max(a.open, a.close) * t); if (null !== o && (l = Math.max(o + 1, l), l = Math.min(l, c)), this ._barSpacing * t > 2 * r) Object(n.fillRectInnerBorder)(e, l, h, c - l + 1, u - h + 1, r); else { const t = c - l + 1; e.fillRect(l, h, t, u - h + 1) } o = c } } _drawCandles(e, t) { let i = ""; const s = this._calculateBorderWidth(t); for (const r of this._bars) { if (this._borderVisible && this._barWidth <= 2 * s && !r.hollow) continue; let o = Math.round(Math.min(r.open, r.close) * t), a = Math.round(Math.max(r.open, r.close) * t), l = Math.round(r.time * t) - Math.floor(.5 * this._barWidth), c = l + this._barWidth - 1; if (r.color !== i) { const t = r.color; e.fillStyle = t, i = t } if (r.hollow) e.fillStyle = r.color, Object(n.fillRectInnerBorder)(e, l, o, c - l + 1, a - o + 1, s); else { if (this._borderVisible && (l += s, o += s, c -= s, a -= s), o > a) continue; e.fillRect(l, o, c - l + 1, a - o + 1) } } } } }, "/kal": function(e, t) { e.exports = '' }, "/qn+": function(e, t, i) { "use strict"; i.r(t), i.d(t, "convertPropertyToWatchedValue", (function() { return n })); var s = i("hY0g"), r = i.n(s); function n(e) { const t = new r.a(e.value()); let i = !1; e.subscribe(t, () => { i || (i = !0, t.setValue(e.value()), i = !1) }); const s = () => { i || (i = !0, e.setValue(t.value()), i = !1) }; return t.subscribe(s), t.spawn(() => { e.unsubscribeAll(t), t.unsubscribe(s) }) } }, "/tGj": function(e, t, i) { "use strict"; function s(e) { return e.symbolSource() === e } i.r(t), i.d(t, "isSymbolSource", (function() { return s })) }, "/z0S": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("Kxc7"); function r(e, t) { s.enabled("saveload_requires_authentication") ? window.runOrSignIn(e, t) : e() } }, "08i5": function(e, t, i) { "use strict"; var s, r; i.r(t), i.d(t, "AlertStatus", (function() { return s })), i.d(t, "Direction", (function() { return r })), function(e) { e[e.Waiting = 0] = "Waiting", e[e.Success = 1] = "Success", e[e.Failure = 2] = "Failure" }(s || (s = {})), function(e) { e[e.Up = 1] = "Up", e[e.Down = 2] = "Down" }(r || (r = {})) }, "0C7r": function(e, t, i) { "use strict"; i.r(t), i.d(t, "intervalsVisibilitiesDefaults", (function() { return s })); const s = { ticks: !0, seconds: !0, secondsFrom: 1, secondsTo: 59, minutes: !0, minutesFrom: 1, minutesTo: 59, hours: !0, hoursFrom: 1, hoursTo: 24, days: !0, daysFrom: 1, daysTo: 366, weeks: !0, weeksFrom: 1, weeksTo: 52, months: !0, monthsFrom: 1, monthsTo: 12, ranges: !0 } }, "0F0w": function(e, t, i) { "use strict"; i.r(t); var s = i("aIyQ"), r = i.n(s), n = i("Eyy1"), o = i("hY0g"), a = i.n(o), l = i("e3/o"), c = i("txPx"); const h = Object(c.getLogger)("ChartApi.AbstractSession"); var u = i("ogJP"); i.d(t, "ChartSession", (function() { return d })); Object(c.getLogger)("ChartSession"); class d extends class { constructor(e, t, i) { this._isConnected = new a.a(!1), this._state = 0, this._isConnectForbidden = !1, this._sessionId = "", this._sessionIdChanged = new r.a, this._chartApi = e, this ._sessionPrefix = t, this._shouldReconnectAfterCriticalError = i } destroy() { this._logNormal("Destroying session"), this._isConnected.unsubscribe(), this .disconnect(), this._sessionIdChanged.destroy(), delete this._chartApi, this ._logNormal("Session has been destroyed") } isConnected() { return this._isConnected } sessionId() { return this._sessionId } onSessionIdChanged() { return this._sessionIdChanged } connect() { 0 === this._state && (Object(n.assert)(!this._isConnectForbidden, "Cannot call connect because it is forbidden at this moment"), this ._setSessionId(`${this._sessionPrefix}_${Object(l.randomHash)()}`), this ._logNormal("Connecting session - wait until transport stay connected"), this._state = 1, this._chartApi.createSession(this._sessionId, this)) } disconnect() { 0 !== this._state && (Object(n.assert)("" !== this._sessionId, "sessionId must not be invalid"), this._logNormal( "Disconnecting session..."), this._forbidConnectWhile(() => { this._chartApi.connected() && this._sendRemoveSession(), this ._processDestroyingOnServer() })) } onMessage(e) { switch (e.method) { case "connected": return void this._onChartApiConnected(); case "disconnected": return void this._onChartApiDisconnected(); case "critical_error": const t = String(e.params[0]), i = String(e.params[1]); return void this._onCriticalError(t, i) } this._onMessage(e) } _getChartApi() { return this._chartApi } _generateLogMessage(e) { return `[${this._sessionId}] ${e}` } _onCriticalError(e, t) { this._logError(`Critical error. Reason=${e}, info=${t}.`), this._forbidConnectWhile( () => { this._processDestroyingOnServer() }), this._shouldReconnectAfterCriticalError ? (this._logNormal( "Reconnecting after critical error..."), this.connect()) : this._logNormal( "Reconnecting after critical error skipped") } _onChartApiConnected() { Object(n.assert)(1 === this._state, "Session is not registered"), this._logNormal( "Transport is connected. Creating session on the server"), this ._sendCreateSession(), this._state = 2, this._isConnected.setValue(!0) } _onChartApiDisconnected() { this._logNormal("Transport is disconnected. Reconnecting..."), this ._forbidConnectWhile(() => { this._processDestroyingOnServer() }), this.connect() } _setSessionId(e) { const t = this._sessionId; this._logNormal(`Changing sessionId: old=${t}, new=${e}`), this._sessionId = e, this ._sessionIdChanged.fire(e, t) } _logNormal(e) { h.logNormal(this._generateLogMessage(e)) } _logError(e) { h.logError(this._generateLogMessage(e)) } _processDestroyingOnServer() { this._state = 0, this._isConnected.setValue(!1), this._chartApi.removeSession(this ._sessionId), this._setSessionId("") } _forbidConnectWhile(e) { this._isConnectForbidden = !0, e(), this._isConnectForbidden = !1 } } { constructor(e, t = !1) { super(e, "cs", !1), this._sessionDisabled = !1, this._handler = null, this ._criticalError = new r.a, this._disableStatistics = t } destroy() { this._criticalError.destroy(), this._handler = null, super.destroy() } serverTimeOffset() { return this._getChartApi().serverTimeOffset() } switchTimezone(e) { return this._getChartApi().switchTimezone(this.sessionId(), e) } defaultResolutions() { return this._getChartApi().defaultResolutions() } availableCurrencies() { return this._getChartApi().availableCurrencies() } availableUnits() { return this._getChartApi().availableUnits() } resolveSymbol(e, t, i) { return this._getChartApi().resolveSymbol(this.sessionId(), e, t, i) } requestFirstBarTime(e, t, i) { return this._getChartApi().requestFirstBarTime(this.sessionId(), e, t, i) } createSeries(e, t, i, s, r, n, o) { return this._getChartApi().createSeries(this.sessionId(), e, t, i, s, r, n, o) } modifySeries(e, t, i, s, r, n) { return this._getChartApi().modifySeries(this.sessionId(), e, t, i, s, r, n) } removeSeries(e) { return !!this.isConnected().value() && this._getChartApi().removeSeries(this .sessionId(), e) } requestMoreData(e, t, i) { return "number" == typeof e ? this._getChartApi().requestMoreData(this.sessionId(), e) : this._getChartApi().requestMoreData(this.sessionId(), e, t, i) } requestMoreTickmarks(e, t, i) { return Object(u.isNumber)(e) ? this._getChartApi().requestMoreTickmarks(this .sessionId(), e) : this._getChartApi().requestMoreTickmarks(this .sessionId(), e, t, i) } requestMetadata(e, t) { (() => { this._getChartApi().requestMetadata(this.sessionId(), e, t) })() } isCanCreateStudy(e) { return this._getChartApi().isCanCreateStudy(e) } createStudy(e, t, i, s, r, n, o) { return this._getChartApi().createStudy(this.sessionId(), e, t, i, s, r, n, o) } rebindStudy(e, t, i, s, r, n, o) { return this._getChartApi().rebindStudy(this.sessionId(), e, t, i, s, r, n, o) } modifyStudy(e, t, i, s) { return this._getChartApi().modifyStudy(this.sessionId(), e, t, i, s) } removeStudy(e, t) { return this._getChartApi().removeStudy(this.sessionId(), e, t) } createPointset(e, t, i, s, r, n) { return this._getChartApi().createPointset(this.sessionId(), e, t, i, s, r, n) } modifyPointset(e, t, i, s) { return this._getChartApi().modifyPointset(this.sessionId(), e, t, i, s) } removePointset(e) { return this._getChartApi().removePointset(this.sessionId(), e) } setVisibleTimeRange(e, t, i, s, r, n) { this._getChartApi().setVisibleTimeRange(this.sessionId(), e, t, i, s, !0, r, n) } criticalError() { return this._criticalError } connect(e = null) { null !== e && (this._handler = e), super.connect() } setHandler(e) { this._handler = e } connected() { return this.isConnected().value() && !this._sessionDisabled } disable() { this._sessionDisabled = !0 } chartApi() { return this._getChartApi() } _sendCreateSession() { Object.keys(this).forEach(e => { /^(s|st|symbol_)\d+$/.test(e) && delete this[e] }), this._getChartApi().chartCreateSession(this.sessionId(), this ._disableStatistics) } _sendRemoveSession() { this._getChartApi().chartDeleteSession(this.sessionId()) } _onMessage(e) { this._handler && this._handler(e) } _onCriticalError(e, t) { this._criticalError.fire(e, t), super._onCriticalError(e, t) } } }, "0Pxc": function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("GEp6").distanceToLine, n = i("hfHJ"), o = n.rotationMatrix, a = n.scalingMatrix, l = n.translationMatrix, c = n.transformPoint, h = i("Ss5c").LineDataSource, u = i("Ocx9").DefaultProperty, d = i("j3hX").LineToolColorsProperty; class p extends h { constructor(e, t) { super(e, t || p.createProperties()), this.version = p.version, i.e("lt-pane-views") .then(i.t.bind(null, "dKqZ", 7)).then(({ ArcPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } startChanging(e, t) { if (super.startChanging(e, t), 0 === e || 1 === e) { var i = this.pointToScreenPoint(this._points[0])[0], n = this.pointToScreenPoint(this._points[1])[0], o = this.pointToScreenPoint(this._points[2])[0]; this._dist = r(i, n, o).distance; var a = n.subtract(i), l = new s(-a.y, a.x), c = i.add(n).scaled(.5); o.subtract(c).dotProduct(l) < 0 && (this._dist = -this._dist) } } pointsCount() { return 3 } name() { return "Arc" } hasEditableCoordinates() { return !1 } setPoint(e, t) { var i = Object.assign({}, t), n = this.pointToScreenPoint(this._points[0])[0], h = this.pointToScreenPoint(this._points[1])[0], u = this.pointToScreenPoint(this._points[2])[0]; switch (e) { case 0: n = this.pointToScreenPoint(i)[0]; var d = h.subtract(n), p = n.add(h).scaled(.5); m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(this._dist)), u = this.screenPointToPoint(u), this._points[0] = i, this._points[2] = u; break; case 1: var _ = r(n, h, u).distance; d = (h = this.pointToScreenPoint(i)[0]).subtract(n), p = n.add(h).scaled( .5); m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(this._dist)), u = this.screenPointToPoint(u), this._points[1] = i, this._points[2] = u; break; case 2: i = this.pointToScreenPoint(i)[0]; var m; _ = r(n, h, i).distance, d = h.subtract(n), p = n.add(h).scaled(.5); m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(_)); var f = p.add(m.scaled(-_)), g = d.length(), b = d.x / g, v = d.y / g, S = Math.acos(b); v < 0 && (S = -S); var y = l(-p.x, -p.y); i = c(y, i); var w = c(y, u); y = o(-S), i = c(y, i), w = c(y, w), y = a(1, g / (2 * _)), i = c(y, i), w = c(y, w); var P = i.y * w.y >= 0 ? new s(u.x, u.y) : new s(f.x, f.y); P = this.screenPointToPoint(P), this._points[2] = P } this.normalizePoints() } migrateVersion(e, t, i) { if (1 === e && 2 === this._points.length) { var s = (2 * this._points[0].price + 3 * this._points[1].price) / 5; this._points.append({ price: s, index: this._points[1].index }) } if (1 === e && 2 === this._timePoint.length) { var r = { price: s = (2 * this._timePoint[0].price + 3 * this._timePoint[1] .price) / 5, offset: this._timePoint[1].offset, time_t: this._timePoint[1].time_t }; this._timePoint.append(r) } } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D"))) .GeneralFiguresDefinitionsViewModel } static createProperties(e) { var t = new u("linetoolarc", e); return p._configureProperties(t), t } static _configureProperties(e) { h._configureProperties(e), e.addChild("linesColors", new d([e.color])) } } p.version = 2, t.LineToolArc = p }, "0YCj": function(e, t, i) { "use strict"; (function(e, t) { i("Eyy1").assert; var s = i("txPx").getLogger("Chart.Study.MetaInfo"), r = i("9iCb").applyOverridesToStudyDefaults, n = {}; function o(e) { TradingView.merge(this, { palettes: {}, inputs: [], plots: [], graphics: {}, defaults: {} }), TradingView.merge(this, e); var t = e.fullId || e.id; TradingView.merge(this, o.parseIdString(t)), this.name = this.id } o.VERSION_STUDY_ARG_SOURCE = 41, o.METAINFO_FORMAT_VERSION_SOS_V2 = 42, o .VERSION_PINE_PROTECT_TV_4164 = 43, o.CURRENT_METAINFO_FORMAT_VERSION = 52, o .VERSION_NEW_STUDY_PRECISION_FORMAT = 46, o.CHILD_STUDY_ALLOWED_PLOT_TYPES = [ "line" ], o.canPlotBeSourceOfChildStudy = function(e) { return o.CHILD_STUDY_ALLOWED_PLOT_TYPES.includes(e) }, o.CHILD_STUDY_EXCLUDE_IDS = ["CorrelationCoefficient@tv-basicstudies", "Correlation - Log@tv-basicstudies-1" ], o.CHILD_STUDY_PARENT_EXCLUDE_IDS = [], o.FilledArea = {}, o.FilledArea .TYPE_PLOTS = "plot_plot", o.FilledArea.TYPE_HLINES = "hline_hline", o.versionOf = function(e) { var t = "_metainfoVersion" in e && isNumber(e._metainfoVersion) ? e ._metainfoVersion : 0; return t < 0 && s.logError("Metainfo format version cannot be negative: " + t), t }, o.parseIdString = function(e) { var t = {}; if (-1 === e.indexOf("@")) t.shortId = e, t.packageId = "tv-basicstudies", t .id = e + "@" + t.packageId, t.version = 1; else { var i = e.split("@"); t.shortId = i[0]; var s = i[1].split("-"); if (3 === s.length) t.packageId = s.slice(0, 2).join("-"), t.id = t .shortId + "@" + t.packageId, t.version = s[2]; else if (1 === s.length && "decisionbar" === s[0]) t.packageId = "les-" + s[ 0], t.id = t.shortId + "@" + t.packageId, t.version = 1; else { if (1 !== s.length) throw new Error("unexpected study id:" + e); t.packageId = "tv-" + s[0], t.id = t.shortId + "@" + t.packageId, t .version = 1 } } if (t.fullId = t.id + "-" + t.version, "tv-scripting" === t.packageId) { var r = t.shortId; if (0 === r.indexOf("Script$") || 0 === r.indexOf("StrategyScript$")) { var n = r.indexOf("_"); t.productId = n >= 0 ? r.substring(0, n) : t.packageId } else t.productId = t.packageId } else t.productId = t.packageId; return t }, o.getPackageName = function(e) { return (/^[^@]+@([^-]+-[^-]+)/.exec(e || "") || [0, "tv-basicstudies"])[1] }, o.cutDollarHash = function(e) { var t = e.indexOf("$"), i = e.indexOf("@"); return -1 === t ? e : e.substr(0, t) + (i >= 0 ? e.substr(i) : "") }, o.hasUserIdSuffix = function(e) { return /^USER;[\d\w]+;\d+$/.test(e) }, o.isStandardPine = function(e) { return /^(Strategy)?Script\$STD;.*@tv-scripting$/.test(e) }, o.getSourceIdByInputs = function(e, t) { if (!Array.isArray(e) || !t) return null; for (var i = 0; i < e.length; ++i) { var s = e[i]; if (o.isSourceInput(s) && "string" == typeof t[s.id]) { var r = t[s.id]; return ~r.indexOf("$") && (r = r.split("$")[0]), r } } return null }, o.getSourceInputIds = function(e) { for (var t = [], i = e.inputs, s = 0; s < i.length; ++s) { var r = i[s]; o.isSourceInput(r) && t.push(r.id) } return t }, o.setChildStudyMetaInfoPropertiesSourceId = function(t, i, s) { for (var r = 0; r < t.inputs.length; ++r) { var n = t.inputs[r]; if (o.isSourceInput(n) && (s instanceof e && s.inputs && s.inputs[n.id])) { var a = s.inputs[n.id].value(); if (a.indexOf("$") > 0) { var l = a.replace(/^[^\$]+/, i); s.inputs[n.id].setValue(l) } } } }, o.patchChildStudyMetaInfoState = function(e) { e.state && function e(t) { if ("object" == typeof t) for (var i in t) "string" == typeof t[i] && /^[^\$]+\$\d+$/.test(t[ i]) ? t[i] = t[i].replace(/^[^\$]+/, "{pid}") : e(t[i]) }(e.state.inputs), e.state.isChildStudy = !0 }, o.prototype.parseValue = function(e, t) { return "bool" === e ? TradingView.parseBool(t) : t }, o.prototype.defaultInputs = function() { for (var e = [], t = 0; t < this.inputs.length; t++) e.push(this.inputs[t] .defval); return e }, o.prototype.state = function(e) { var t = {}; for (var i in this) this.hasOwnProperty(i) && (t[i] = this[i], !0 !== e && "id" === i && (t[i] += "-" + this.version)); return t }, o.prototype.symbolInputId = function() { var e = this.inputs.filter((function(e) { return "symbol" === e.type })); return e.length > 0 ? e[0].id : null }, o.prototype.createDefaults = function() { if (this.defaults) { var e = TradingView.clone(this.defaults); e.precision = "default"; var t = o.getStudyPropertyRootName(this); defaults.create(t, e) } }, o.prototype.removeDefaults = function() { defaults.remove(o.getStudyPropertyRootName(this)) }, o.findStudyMetaInfoByDescription = function(e, t) { if (e) { for (var i = 0; i < e.length; ++i) if (e[i].description.toLowerCase() === t.toLowerCase()) return e[i]; throw new Error("unexpected study id:" + t) } throw new Error("There is no studies metainfo") }, o.isParentSourceId = function(e) { return "string" == typeof e && /^[^\$]+\$\d+$/.test(e) }, o.isSourceInput = function(e) { return e.id && (("source" === e.id || "src" === e.id) && ("text" === e.type || "source" === e.type) || "source" === e.type) }, o.getChildSourceInputTitles = function(e, t, i) { var s = {}; if (t.plots && t.plots.length && e.options && e.options.length) for (var r, n, a, l = 0; l < e.options.length; ++l) n = (r = e.options[ l]) && +r.split("$")[1], (a = isFinite(n) && t.plots[n]) && ~o .CHILD_STUDY_ALLOWED_PLOT_TYPES.indexOf(a.type) && (s[r] = t.styles && t .styles[a.id] && t.styles[a.id].title || a.id, i && (s[r] = i + ": " + s[r])); return s }; var a = new Map([ ["AnchoredVWAP@tv-basicstudies", "linetoolanchoredvwap"], ["RegressionTrend@tv-basicstudies", "linetoolregressiontrend"] ]); o.getStudyPropertyRootName = function(e) { var t = a.get(e.id); if (void 0 !== t) return t; var i = "study_" + e.id; return e.pine && e.pine.version && (i += "_" + e.pine.version.replace(".", "_")), i }, o.getStudyPropertyRootNameById = function(e) { var t = a.get(e); return void 0 !== t ? t : "study_" + e }, o.overrideDefaults = function(e) { 0 !== e.length && r(n, e, (function(e) { return TradingView.defaultProperties[o.getStudyPropertyRootName( e)] || null })) }, o.mergeDefaultsOverrides = function(e) { TradingView.merge(n, e) }, o.isScriptStrategy = function(e) { if (e.extra && e.extra.kind) return e.extra.kind === TVScript.Kinds.STRATEGY; if (!0 === e.isTVScriptStrategy) return !0; var t = e.TVScriptSourceCode || e.scriptSource; return !!t && TVScript.isStrategy(t) }, o.getOrderedInputIds = function(e) { for (var t = [], i = e.inputs, s = 0; s < i.length; ++s) { var r = i[s]; t.push(r.id) } return t }, o.canBeChild = function(e) { if (e && "string" == typeof e) return !0; if (!e || e.extra && !o.isAllowedSourceInputsCount(e.extra.sourceInputsCount) || !0 === e.canNotBeChild || !1 === e.canBeChild || ~o.CHILD_STUDY_EXCLUDE_IDS .indexOf(e.id)) return !1; for (var t = e.inputs, i = 0, s = 0; s < t.length; ++s) o.isSourceInput(t[s]) && ++i; return o.isAllowedSourceInputsCount(i) }, o.isAllowedSourceInputsCount = function(e) { return 1 === e }, o.canHaveChildren = function(e) { if (e) { if (e.isTVScriptStrategy || e.TVScriptSourceCode && TVScript.isStrategy(e .TVScriptSourceCode)) return !1; if (e.id && !~o.CHILD_STUDY_PARENT_EXCLUDE_IDS.indexOf(e.id) && Array .isArray(e.plots)) for (var t = 0; t < e.plots.length; ++t) if (~o.CHILD_STUDY_ALLOWED_PLOT_TYPES.indexOf(e.plots[t].type)) return !0 } return !1 }, TradingView.StudyMetaInfo = o, t && t.exports && (t.exports = o) }).call(this, i("tc+8"), i("YuTi")(e)) }, "0psP": function(e, t, i) { "use strict"; i.r(t), i.d(t, "GeneralChartPropertiesRenderer", (function() { return r })); var s = i("sQaR"); class r extends s.a { constructor(e) { super(), this._dialog = null, this._subscribe = e => { this._setVisibility(e) }, this._chartWidgetCollection = e } show() { const e = this._chartWidgetCollection, t = e.activeChartWidget.value(); return t.generalPropertiesDefinitions().then(s => Promise.all([i.e("redux"), i .e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i .e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(19), i .e(21), i.e(22), i.e(23), i.e(26), i.e(29), i.e(33), i.e(34), i .e(35), i.e(36), i.e(39), i.e(45), i.e(68), i.e(87), i.e(0), i .e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e( 25), i.e(27), i.e(30), i.e(31), i.e(32), i.e(37), i.e(44), i .e("general-chart-properties-dialog") ]).then(i.bind(null, "PI1I")).then(i => { var r, n; const o = new i.GeneralChartPropertiesDialogRenderer({ chartWidgetCollection: e, propertyPages: s, activePageId: this._activePageId, model: t.model() }); return null === (r = this._dialog) || void 0 === r || r.hide(), null === (n = this._dialog) || void 0 === n || n.visible() .unsubscribe(this._subscribe), this._dialog = o, o.visible() .subscribe(this._subscribe), o.show(), this._activePageId = void 0, o })) } hide() { var e; null === (e = this._dialog) || void 0 === e || e.hide() } isVisible() { return this.visible().value() } focusOnText() {} setActivePage(e) { this._activePageId = e } } }, "0qMc": function(e, t, i) { "use strict"; i.r(t), i.d(t, "lineToolsLocalizedNames", (function() { return r })); i("YFKU"); var s = i("+GxX"); const r = { LineTool5PointsPattern: window.t("XABCD Pattern"), LineToolABCD: window.t("ABCD Pattern"), LineToolArc: window.t("Arc"), LineToolArrow: window.t("Arrow"), LineToolArrowMarkDown: window.t("Arrow Mark Down"), LineToolArrowMarkLeft: window.t("Arrow Mark Left"), LineToolArrowMarkRight: window.t("Arrow Mark Right"), LineToolArrowMarkUp: window.t("Arrow Mark Up"), LineToolBalloon: window.t("Balloon"), LineToolBarsPattern: window.t("Bars Pattern"), LineToolBezierCubic: window.t("Double Curve"), LineToolBezierQuadro: window.t("Curve"), LineToolBrush: window.t("Brush"), LineToolCallout: window.t("Callout"), LineToolCircleLines: window.t("Cyclic Lines"), LineToolCypherPattern: window.t("Cypher Pattern"), LineToolDateAndPriceRange: window.t("Date and Price Range"), LineToolDateRange: window.t("Date Range"), LineToolDisjointAngle: window.t("Disjoint Channel"), LineToolElliottCorrection: window.t("Elliott Correction Wave (ABC)"), LineToolElliottDoubleCombo: window.t("Elliott Double Combo Wave (WXY)"), LineToolElliottImpulse: window.t("Elliott Impulse Wave (12345)"), LineToolElliottTriangle: window.t("Elliott Triangle Wave (ABCDE)"), LineToolElliottTripleCombo: window.t("Elliott Triple Combo Wave (WXYXZ)"), LineToolEllipse: window.t("Ellipse"), LineToolExtended: window.t("Extended Line"), LineToolFibChannel: window.t("Fib Channel"), LineToolFibCircles: window.t("Fib Circles"), LineToolFibRetracement: window.t("Fib Retracement"), LineToolFibSpeedResistanceArcs: window.t("Fib Speed Resistance Arcs"), LineToolFibSpeedResistanceFan: window.t("Fib Speed Resistance Fan"), LineToolFibSpiral: window.t("Fib Spiral"), LineToolFibTimeZone: window.t("Fib Time Zone"), LineToolFibWedge: window.t("Fib Wedge"), LineToolFlagMark: window.t("Flag Mark"), LineToolImage: window.t("Image"), LineToolFlatBottom: window.t("Flat Top/Bottom"), LineToolAnchoredVWAP: window.t("Anchored VWAP"), LineToolGannComplex: window.t("Gann Square"), LineToolGannFixed: window.t("Gann Square Fixed"), LineToolGannFan: window.t("Gann Fan"), LineToolGannSquare: window.t("Gann Box"), LineToolHeadAndShoulders: window.t("Head and Shoulders"), LineToolHorzLine: window.t("Horizontal Line"), LineToolHorzRay: window.t("Horizontal Ray"), LineToolIcon: window.t("Icon"), LineToolInsidePitchfork: window.t("Inside Pitchfork"), LineToolNote: window.t("Note"), LineToolNoteAbsolute: window.t("Anchored Note"), LineToolSignpost: window.t("Signpost"), LineToolParallelChannel: window.t("Parallel Channel"), LineToolPitchfan: window.t("Pitchfan"), LineToolPitchfork: window.t("Pitchfork"), LineToolPolyline: window.t("Polyline"), LineToolPath: window.t("Path"), LineToolPrediction: window.t("Forecast"), LineToolPriceLabel: window.t("Price Label"), LineToolArrowMarker: window.t("Arrow Marker"), LineToolPriceRange: window.t("Price Range"), LineToolProjection: window.t("Projection"), LineToolRay: window.t("Ray"), LineToolRectangle: window.t("Rectangle"), LineToolRegressionTrend: window.t("Regression Trend"), LineToolRiskRewardLong: window.t("Long Position"), LineToolRiskRewardShort: window.t("Short Position"), LineToolFixedRangeVolumeProfile: window.t("Fixed Range Volume Profile"), LineToolRotatedRectangle: window.t("Rotated Rectangle"), LineToolSchiffPitchfork: window.t("Modified Schiff Pitchfork"), LineToolSchiffPitchfork2: window.t("Schiff Pitchfork"), LineToolSineLine: window.t("Sine Line"), LineToolText: window.t("Text", { context: "tool" }), LineToolTextAbsolute: window.t("Anchored Text"), LineToolThreeDrivers: window.t("Three Drives Pattern"), LineToolTimeCycles: window.t("Time Cycles"), LineToolTrendAngle: window.t("Trend Angle"), LineToolTrendBasedFibExtension: window.t("Trend-Based Fib Extension"), LineToolTrendBasedFibTime: window.t("Trend-Based Fib Time"), LineToolTrendLine: window.t("Trend Line"), LineToolInfoLine: window.t("Info Line"), LineToolTriangle: window.t("Triangle"), LineToolTrianglePattern: window.t("Triangle Pattern"), LineToolVertLine: window.t("Vertical Line"), LineToolCrossLine: window.t("Cross Line"), LineToolHighlighter: window.t("Highlighter"), LineToolPriceNote: window.t("Price Note"), LineToolVbPFixed: window.t("Volume Profile Fixed Range") }; Object(s.isFeatureEnabled)("remove-line-tool-ghost-feed") || (r.LineToolGhostFeed = window.t( "Ghost Feed")) }, "1AAW": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("hY0g"), r = i.n(s); function n(e, ...t) { const i = (...t) => e(...t.map(e => e.value())), s = new r.a(i(...t)), n = () => s.setValue(i(...t)), o = t.map(e => e.spawn()); for (const e of o) e.subscribe(n); return s.readonly().spawn(() => o.forEach(e => e.destroy())) } }, "1ANp": function(e, t, i) { "use strict"; i.r(t), i.d(t, "navigationButtonsVisibilityKey", (function() { return r })), i.d(t, "property", (function() { return n })), i.d(t, "availableValues", (function() { return o })), i.d(t, "actualBehavior", (function() { return a })); var s = i("+jnJ"); const r = "NavigationButtons.visibility", { property: n, availableValues: o, actualBehavior: a } = Object(s.a)(r) }, "1IXQ": function(e, t, i) { "use strict"; i("jJ9X"); var s = i("aO4+").Point, r = i("/3z9"), n = i("qFKp").CheckMobile, o = i("7KDR"), a = o.Action, l = o.Separator, c = i("ikwP").hardResizeCanvas, h = i("S8xo").MouseEventHandler, u = i("YmeR").ActionBinder, d = i("T6Of").LimitedPrecisionNumericFormatter, p = i("HZKX").createLinesAction, _ = i("xzdg").PriceAxisWidgetBase, m = i("Kxc7"), f = window.t("Merge All Scales Into One"); class g extends _ { constructor(e, t, i, s, r, n, o, a) { super(e, t, i, r, n, s, a), this._axisInfo = o, this._offset = 0, this .restoreDefaultCursor(), this.update(), this._mouseEventHandler = new h(this ._topCanvasBinding.canvas, this, { treatVertTouchDragAsPageScroll: !1, treatHorzTouchDragAsPageScroll: !0 }), this.contextMenu = null, this.actions = null } destroy() { null !== this.actions && this.actions.reset && this.actions.reset.destroy(), this ._mouseEventHandler.destroy(), super.destroy() } dataSourceAtPoint(e, t) { var i = this._grouppedSources(), r = i.sources.concat(Array.from(i.topLevelSources)).concat(this._pane.state() .customSources()), n = null, o = null; if (!this._priceScale) return null; function a(e, t) { var i = o ? o.result() : 0; e.result() > i && (o = e, n = t) } for (var l = new s(e, t), c = this._pane.state(), h = r.length - 1; h >= 0; --h) { var u = r[h], d = u.priceAxisViews(c, this._priceScale); if (d && 0 !== d.length) for (var p = d.length - 1; p >= 0; --p) { var _ = d[p].renderer(); if (null !== _ && void 0 !== _.hitTest) { var m = _.hitTest(l, this._size.w, this._isLeft ? "left" : "right"); null !== m && a(m, u) } } } return n } _initActions(e) { if (this._pane.hasState() && null === this.actions) { this.actions = {}; var t = this, s = this._pane.chart().model(); this.actions.reset = new a({ label: window.t("Reset Price Scale"), icon: i("LdoW"), shortcut: "Alt+R", shortcutHint: r.humanReadableHash(r.Modifiers.Alt + 82), statName: "ResetScale", onExecute: g.prototype.reset.bind(this) }), this.actions.setAutoScale = new a({ label: window.t("Auto (Fits Data To Screen)"), checkable: !0, checked: !0, statName: "ToggleAutoScale", onExecute: function() { s.togglePriceScaleAutoScaleMode(t.priceScale()), t ._updateScalesActions() } }), this.actions.setPercentage = new a({ label: window.t("Percent", { context: "scale_menu" }), checkable: !0, checked: this.priceScale().isPercentage(), statName: "TogglePercantage", onExecute: function() { s.togglePriceScalePercentageScaleMode(t.priceScale()), t ._updateScalesActions() } }), this.actions.setIndexedTo100 = new a({ label: window.t("Indexed to 100", { context: "scale_menu" }), checkable: !0, checked: this.priceScale().isIndexedTo100(), statName: "ToggleIndexedTo100", onExecute: function() { s.togglePriceScaleIndexedTo100ScaleMode(t.priceScale()), t ._updateScalesActions() } }), this.actions.setLog = new a({ label: window.t("Logarithmic", { context: "scale_menu" }), checkable: !0, checked: this.priceScale().isLog(), statName: "ToggleLogScale", onExecute: function() { s.togglePriceScaleLogScaleMode(t.priceScale()), t ._updateScalesActions() } }), this.actions.setRegular = new a({ label: window.t("Regular", { context: "scale_menu" }), checkable: !0, checked: this.priceScale().isRegular(), statName: "ToggleRegularScale", onExecute: function() { s.setPriceScaleRegularScaleMode(t.priceScale()), t ._updateScalesActions() } }), this.actions.alignLabels = new a({ label: window.t("No Overlapping Labels", { context: "scale_menu" }), checkable: !0, checked: !1, statName: "TogglePreciseLabels" }), this.actions.alignLabels.binding = new u(this.actions.alignLabels, this .priceScale().properties().alignLabels, this._pane.chart().model(), "No Overlapping Labels"), this.actions.invertScale = new a({ label: window.t("Invert Scale", { context: "scale_menu" }), checkable: !0, checked: this.priceScale().isInverted(), statName: "Invert Scale", onExecute: function() { s.invertPriceScale(t.priceScale()), t._updateScalesActions() } }), this._updateScalesActions() } } _logAction() { return this._isMainSeriesAxis() ? this._pane.chart().actions().logSeriesScale : this .actions.setLog } _percentageAction() { return this._isMainSeriesAxis() ? this._pane.chart().actions().percentSeriesScale : this.actions.setPercentage } _indexedTo100Action() { return this._isMainSeriesAxis() ? this._pane.chart().actions() .indexedTo100SeriesScale : this.actions.setIndexedTo100 } _autoScaleAction() { return this._isMainSeriesAxis() ? this._pane.chart().actions().autoSeriesScale : this.actions.setAutoScale } _regularScaleAction() { return this._isMainSeriesAxis() ? this._pane.chart().actions().regularSeriesScale : this.actions.setRegular } _lockScaleAction() { var e = this._pane.chart().actions().lockSeriesScale, t = v(this.priceScale(), this._pane.chart().model().model() .mainSeriesScaleRatio()); return e.update({ hint: t }), e } _invertAction() { return this._isMainSeriesAxis() ? this._pane.chart().actions().invertSeriesScale : this.actions.invertScale } _isMainSeriesAxis() { return this.priceScale().hasMainSeries() } _updateMainSeriesScalesActions() { this._isMainSeriesAxis() && null !== this.actions && this._updateScalesActions() } _updateScalesActions() { var e = this.priceScale(), t = this._isMainSeriesAxis(), i = e.mainSource().properties(), s = t && e.isLockScale(), r = t && i.style.value() === TradingView.Series.STYLE_PNF; this.actions.setRegular.update({ checked: e.isRegular(), disabled: s || r }), this.actions.setPercentage.update({ checked: e.isPercentage(), disabled: s || r }), this.actions.setIndexedTo100.update({ checked: e.isIndexedTo100(), disabled: s || r }), this.actions.setLog.update({ checked: e.isLog(), disabled: s || r }), this.actions.setAutoScale.update({ checked: e.isAutoScale(), disabled: e.properties().autoScaleDisabled.value() }) } _createMergeScalesAction() { var e = this._pane.chart().actions(), t = this._pane.chart().model().model().priceScaleSlotsCount(); if (t.left + t.right === 1) return 0 === t.left ? e.moveScaleToLeft : e .moveScaleToRight; var i = []; return i.push(e.mergeLeftScalesAction), i.push(e.mergeRightScalesAction), new a({ label: f, subItems: i }) } getContextMenuActions() { this._initActions(); var e = this._pane.chart().actions(), t = []; if (t.push(this.actions.reset, new l, this._autoScaleAction()), this ._isMainSeriesAxis() && t.push(this._lockScaleAction()), t.push(e .scaleSeriesOnly, this._invertAction(), new l, this._regularScaleAction(), this._percentageAction(), this._indexedTo100Action(), this._logAction(), new l), n.any() || (t.push(this._createMergeScalesAction()), t.push(new l)), !m.enabled("fundamental_widget")) { t.push(new a({ label: window.t("Labels"), subItems: [e.showSymbolLabelsAction, e.showSeriesLastValue, null, null, e.showHighLowPriceLabels, e .showAverageClosePriceLabel, null, e .showStudyPlotNamesAction, e.showStudyLastValue, null, null, this.actions.alignLabels ].filter(Boolean) })) } return t.push(p(this._pane.chart())), this._options.countdownEnabled && t.push(e .showCountdown), this._options.currencyConversionEnabled && t.push(e .showCurrency), this._options.unitConversionEnabled && t.push(e.showUnit), this._pane.chart().model().crossHairSource().isMenuEnabled() && t.push(e .addPlusButton), !TradingView.onWidget() && m.enabled( "show_chart_property_page") && m.enabled("chart_property_page_scales") && e .scalesProperties && t.push(new l, e.scalesProperties), t } setSizeAndOffset(e, t) { if (e.w < 0 || e.h < 0) throw new Error( "Try to set invalid size to PriceAxisWidget " + JSON.stringify(e)); this._size.equals(e) || (this._size = e, this._canvasBinding.resizeCanvas({ width: e.w, height: e.h }), this._topCanvasBinding.resizeCanvas({ width: e.w, height: e.h }), this._cell.style.width = e.w + "px", this._cell.style.height = e.h + "px", this._cell.style.minWidth = e.w + "px"), this._offset !== t && (this ._offset = t, this._cell.style.left = t + "px") } getWidth() { return this._size.w } update() {} hardResetCanvas() { null !== this._size && (c(this._canvasBinding, this._size), c(this ._topCanvasBinding, this._size)) } _isMainPane() { return this._pane.state().containsMainSeries() } restoreDefaultCursor() { this.setCursor("") } setCursor(e) { var t = ""; "grabbing" !== e && "ns-resize" !== e || (t = "price-axis--cursor-" + e), this ._currentCursorClassName !== t && (this._currentCursorClassName && this._cell .classList.remove(this._currentCursorClassName), t && this._cell.classList .add(t), this._currentCursorClassName = t, this._cell.style.cursor) } axisInfo() { return this._axisInfo } } function b(e) { var t = new d(e); return function(e, i) { return isNumber(i) && !e.isLog() ? t.format(i) : "" } } var v = b(4); e.exports = { PriceAxisWidget: g, scaleRatioForContextMenuTransformer: b } }, "1Wlv": function(e, t, i) { "use strict"; (function(e) { var s = i("Yj6H").PriceScaleBase, r = i("7ktv").PriceDataSource, n = i("Qb4w").PriceRange, o = i("e3/o").randomHash, a = i("3ClC").isStudy, l = i("TTFo"), c = l.fromLog, h = l.toLog; class u extends s { constructor(t, i) { super(i), this._scalesProperties = t, this.m_scrollStartPoint = null; var s = this; this._modeChanged = new e, this._properties.isInverted.listeners() .subscribe(this, u.prototype._onIsInvertedChanged), this._properties .listeners().subscribe(null, (function() { if (s.mainSource() && s.mainSource().model()) { var e = s.mainSource().model().paneForSource(s .mainSource()); s.mainSource().model().updatePane(e) } })), this._scalesProperties.listeners().subscribe(this, (function() { this._marksCache = null })), this.setId(o()) } _convertPriceRangeFromLog(e) { if (null === e) return null; var t = c(e.minValue()), i = c(e.maxValue()); return new n(t, i) } _convertPriceRangeToLog(e) { if (null === e) return null; var t = h(e.minValue()), i = h(e.maxValue()); return new n(t, i) } _canConvertPriceRangeFromLog(e) { if (null === e) return !1; var t = c(e.minValue()), i = c(e.maxValue()); return isFinite(t) && isFinite(i) } mode() { return { autoScale: this._properties.autoScale.value(), lockScale: this._properties.lockScale.value(), percentage: this._properties.percentage.value(), indexedTo100: this._properties.indexedTo100.value(), log: this._properties.log.value() } } setMode(e) { var t = {}, i = this.mode(), s = this._properties.state(), r = null; void 0 !== e.autoScale && e.autoScale !== s.autoScale && (t.autoScale = e .autoScale, this._setAutoScaleValueWithDependentProperties(e .autoScale)), void 0 !== e.lockScale && e.lockScale !== s .lockScale && (t.lockScale = e.lockScale, this ._setLockScaleValueWithDependentProperties(e.lockScale)), void 0 !== e.percentage && e.percentage !== s.percentage && (t.percentage = e .percentage, this._setPercentageValueWithDependentProperties(e .percentage), this._invalidatedForRange.isValid = !1), void 0 !== e.indexedTo100 && e.indexedTo100 !== s.indexedTo100 && (t .indexedTo100 = e.indexedTo100, this ._setIndexedTo100ValueWithDependentProperties(e.indexedTo100), this ._invalidatedForRange.isValid = !1), void 0 !== e.log && e.log !== s .log && (t.log = e.log, this._setLogValueWithDependentProperties(e .log)), s.log && !this._properties.log.value() && (this ._canConvertPriceRangeFromLog(this.m_priceRange) ? null !== (r = this._convertPriceRangeFromLog(this.m_priceRange)) && this .setPriceRange(r) : this.properties().autoScale.setValue(!0)), !s .log && this._properties.log.value() && null !== (r = this ._convertPriceRangeToLog(this.m_priceRange)) && this.setPriceRange( r), s.autoScale !== this._properties.autoScale.value() && this ._properties.autoScale.listeners().fire(this._properties.autoScale), s .autoScaleDisabled !== this._properties.autoScaleDisabled.value() && this._properties.autoScaleDisabled.listeners().fire(this._properties .autoScaleDisabled), s.lockScale !== this._properties.lockScale .value() && this._properties.lockScale.listeners().fire(this._properties .lockScale), s.percentage !== this._properties.percentage.value() && (this._properties.percentage.listeners().fire(this._properties .percentage), this.updateFormatter()), s.indexedTo100 !== this ._properties.indexedTo100.value() && (this._properties.indexedTo100 .listeners().fire(this._properties.indexedTo100), this .updateFormatter()), s.percentageDisabled !== this._properties .percentageDisabled.value() && this._properties.percentageDisabled .listeners().fire(this._properties.percentageDisabled), s.log !== this ._properties.log.value() && this._properties.log.listeners().fire(this ._properties.log), s.logDisabled !== this._properties.logDisabled .value() && this._properties.logDisabled.listeners().fire(this ._properties.logDisabled), void 0 === t.log && void 0 === t .percentage && void 0 === t.lockScale && void 0 === t.autoScale && void 0 === t.indexedTo100 || this._modeChanged.fire(i, this.mode()) } modeChanged() { return this._modeChanged } fontSize() { return this._scalesProperties.fontSize.value() } isEmpty() { return this._makeSureItIsValid(), 0 === this.m_height || !this .m_priceRange || this.m_priceRange.isEmpty() } startScroll(e) { this.isAutoScale() || null === this.m_scrollStartPoint && null === this ._priceRangeSnapshot && (this.isEmpty() || (this.m_scrollStartPoint = e, this._priceRangeSnapshot = this.priceRange().clone())) } scrollTo(e) { if (!this.isAutoScale() && null !== this.m_scrollStartPoint) { var t = this.priceRange().length() / (this.internalHeight() - 1), i = e - this.m_scrollStartPoint; this.isInverted() && (i *= -1); var s = i * t, r = this._priceRangeSnapshot.clone(); r.shift(s), this.setPriceRange(r, !0), this._marksCache = null } } endScroll() { this.isAutoScale() || null !== this.m_scrollStartPoint && (this .m_scrollStartPoint = null, this._priceRangeSnapshot = null) } _onIsInvertedChanged() { this._marksCache = null, this._markBuilder.rebuildTickMarks() } canDetachSource(e) { return this.m_dataSources.some((function(t) { return t !== e && t instanceof r && !(a(t) && t .isLinkedToSeries()) })) } } t.PriceScale = u }).call(this, i("aIyQ")) }, "1pHB": function(e, t) { e.exports = '' }, "2+aH": function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("aO4+"), n = i("fgLi"), o = i("hY0g"), a = i.n(o), l = i("HGP3"), c = i("KcY8"), h = i("Ulff"); class u extends c.a { constructor(e, t, i) { super(), this._source = e, this._priceScale = t, this._priceProvider = i } setHitTestData(e) { this._hitTestData = e } additionalPadding(e) { return 0 } _updateRendererData(e, t, i) { e.visible = !1, t.visible = !1; const s = this._priceScale.mainSource(), r = null !== s ? s.firstValue() : null; if (!this._isVisible() || this._priceScale.isEmpty() || null === r) return; const n = this._priceProvider(this._priceScale); if (null === n) return; i.background = this._bgColor(), i.textColor = this.generateTextColor(i .background); const o = this.additionalPadding(this._priceScale.fontSize()); i.additionalPaddingTop = o, i.additionalPaddingBottom = o, i.coordinate = this ._priceScale.priceToCoordinate(n, r), e.text = this._priceScale.formatPrice( n, r), e.visible = !0, t.visible = !0, t.hitTestData = this._hitTestData } } const d = { normalBgColor: l.colorsPalette["color-cold-gray-750"], hoveredBgColor: l.colorsPalette["color-cold-gray-600"] }, p = { normalBgColor: l.colorsPalette["color-cold-gray-900"], hoveredBgColor: l.colorsPalette["color-cold-gray-650"] }; class _ extends u { additionalPadding(e) { return 2 / 12 * e } _isVisible() { return this._source.visible && null !== this._source.pane } _bgColor() { return this._getThemedColors().normalBgColor } _updateRendererData(e, t, i) { const s = t.visible; super._updateRendererData(e, t, i), this._source.isHovered() ? t.backgroung = this ._getThemedColors().hoveredBgColor : t.backgroung = void 0, s || (t.visible = s) } _getThemedColors() { return this._source.model().isDark() ? d : p } } class m extends u { _isVisible() { return null !== this._source.measurePane() } _bgColor() { return h.a.common } } var f = i("mMWL"), g = i("YFKU"), b = i("FQhm"), v = i("KtbP"), S = i("JWMC"), y = (i("7KDR"), i("5VQP")), w = (i("Kxc7"), i("/tGj")); function P(e) { const t = e.priceScale(); return null === t ? 0 : t.isPercentage() || t.isIndexedTo100() ? 2 : 1 } class C extends v.PanePriceAxisView { constructor(e, t, i, s, r) { super(e, t, s), this._crossHairMenuCachedState = null, this._hasActions = !1, this._tooltipText = null, this._gaOrigin = "CH menu", this ._crosshairPriceAxisView = e, e.setPaneRendererLabelIcon(0), this ._crosshair = t, this._scale = i, this._options = r } _updateImpl(e, t) { super._updateImpl(e, t); const i = this._crosshair.y, s = this._chartModel.properties().scalesProperties.fontSize.value(), r = this._chartModel.timeScale().width(), n = this._crosshair.model().priceAxisRendererOptions(), o = s + 2 * this._crosshairPriceAxisView.additionalPadding(s) + n .paddingTop + n.paddingBottom, a = o, l = i - o / 2, c = r - a, h = this._crosshair.pane, u = this._mainDataSourceOnPane(), d = u && u.symbolSource(), p = !!d && (d.isConvertedToOtherCurrency() || d.isConvertedToOtherUnit()); if (null !== u) { const e = P(u), t = u.idForAlert(), i = this._crossHairMenuCachedState; null !== i && i.id === t && i.priceScale === e && i .isCurrencyOrUnitConverted === p || (this ._updateTooltipAndActionsAvaliability(u, e, p), this ._crossHairMenuCachedState = { id: t, priceScale: e, isCurrencyOrUnitConverted: p }) } const _ = null !== u && Object(w.isSymbolSource)(u) ? u.symbol() : null, m = Boolean(_) || !1; this._crosshairPriceAxisView.setPaneLabelVisible(m); const f = null !== h && 0 !== h.leftPriceScales().length && m, g = null !== h && 0 !== h.rightPriceScales().length && m, b = r - a / 2, v = this._tooltipText ? { text: this._tooltipText, rect: { x: b, y: l, w: 0, h: 0 } } : void 0; this._data = { left: f, right: g, xl: 0, xr: c, y: l, containerWidth: a, containerHeight: o, clickHandler: this._handleClick.bind(this), tooltip: v }, this._crosshairPriceAxisView.setHitTestData(this._data) } _priceScale() { return this._scale } _updateTooltipAndActionsAvaliability(e, t, i) { this._tooltipText = null, this._hasActions = !1; if (!(1 === t)) return; const s = !i && !1; let r = 0; s && r++; let n = 0; 1 === r && (s ? (n = 1, this._tooltipText = window.t("Add Alert")) : this ._tooltipText = window.t("Add Horizontal Line")), this ._crosshairPriceAxisView.setPaneRendererLabelIcon(n), this._hasActions = 0 !== r } _handleClick(e, t, i) { Object(S.trackEvent)(this._gaOrigin, "click"); const s = this._mainDataSourceOnPane(), r = null !== s && Object(w.isSymbolSource)(s) ? s.symbol() : null, n = { pageX: i.pageX, pageY: i.pageY, clientX: i.clientX, clientY: i.clientY, screenX: i.screenX, screenY: i.screenY, price: this._crosshair.price, symbol: r }; b.emit("onPlusClick", n) } _getMenuItems(e) { return Promise.resolve([]) } _createAlertMenuItems(e) { return Promise.resolve([]) } _createTradingMenuItems() { return Promise.resolve([]) } _createAddHorizontalLineMenuItem() { return [] } _getActionAddAlert(e) { return null } _getActionAddHorizontalLine(e) { return null } _getValue(e, t) { const i = e.priceScale(), s = e.firstValue(); if (null === i || null === s) return null; return i.isPercentage() || i.isIndexedTo100() ? null : i.coordinateToPrice(t, s) } _formatValue(e, t) { return t.formatter().format(e) } _addAlert(e, t) {} _addHorizontalLineTool(e, t) {} _showContextMenu(e, t, i, r) { const n = "left" === r; setTimeout(() => { y.ContextMenuManager.createMenu(e).then(e => { e.show((e, t) => { const r = Object(s.ensureDefined)(this ._data), o = Object(s.ensureNotNull)(i.view) .innerHeight, a = n ? r.xl : r.xr, l = i.localX - a, c = { left: i.clientX - l, right: i.clientX - l + r .containerWidth, top: i.clientY - r.containerHeight / 2, bottom: i.clientY + r .containerHeight / 2 }; return { clientX: n ? c.left : c.right - e, clientY: o < c.bottom + t ? c.top - t : c.bottom } }) }) }) } _mainDataSourceOnPane() { const e = this._crosshair.pane; return null !== e ? e.mainDataSource() : null } } var x = i("Tmoa"), T = i("8Uy/"), I = i("VaSN"), M = i("jFln"), O = i("VdBB"), L = i("gAom"); class A { constructor(e) { this._data = e } hitTest(e) { return void 0 === this._data.clickHandler ? null : new O.HitTestResult(O .HitTestResult.CUSTOM, { clickHandler: this._data.clickHandler, tapHandler: this._data.clickHandler }) } draw(e, t) { const i = t.pixelRatio, s = this._data.vertLinesVisible, r = this._data.horzLinesVisible; if (!s && !r) return; e.save(), e.lineWidth = Math.max(1, Math.floor(this._data.lineWidth * i)), e .strokeStyle = this._data.color, e.fillStyle = this._data.color, e.lineCap = "butt", Object(M.setLineStyle)(e, this._data.lineStyle); const n = Math.round(this._data.x * i), o = Math.round(this._data.y * i), a = Math.ceil(this._data.w * i), l = Math.ceil(this._data.h * i); s && n >= 0 && Object(L.drawVerticalLine)(e, n, 0, l), r && o >= 0 && Object(L .drawHorizontalLine)(e, o, 0, a), this._data.drawCenter && (e.beginPath(), e .arc(n, o, Math.round(3 * i), 0, 2 * Math.PI, !0), e.fillStyle = this._data .color, e.fill()), e.restore() } } var E = i("CW80"); const k = l.colorsPalette["color-tv-blue-500"], D = l.colorsPalette["color-tv-blue-500"]; class V { constructor(e, t) { this._rendererData = {}, this._renderer = new A(this._rendererData), this._source = e, this._pane = t } update() {} renderer(e, t) { const i = this._source.selectPointMode().value(), r = this._source.visible && (this._source.areLinesVisible || i) && !this._source .linesShouldBeHidden(), n = this._rendererData; if (!r || null === this._pane) return null; const o = this._source.paneForPointSelect(), a = null !== o ? this._source.pane === o && this._pane === o : this._pane === this._source.pane; if (i && this._source.isOnHoveredChartWidget() && a) { const e = Object(s.ensureNotNull)(this._source.pointToSelect()); n.color = k, n.lineWidth = 1, n.lineStyle = T.LINESTYLE_SOLID, n .horzLinesVisible = !0, n.vertLinesVisible = !0, n.drawCenter = !0, "time" === e ? (n.horzLinesVisible = !1, n.drawCenter = !1) : "price" === e && (n.vertLinesVisible = !1, n.drawCenter = !1) } else { const e = this._source.properties(), t = this._source.model().currentTool(), i = Object(I.lastEventIsTouch)() && (Object(E.isLineToolName)(t) || Object(f .toolIsMeasure)(t)); let s; s = i ? D : e.childs().color.value(); const r = e.childs().transparency.value(); !i && r > 0 && (s = Object(x.generateColor)(s, r)), n.color = s, n .horzLinesVisible = this._pane === this._source.pane, n.vertLinesVisible = ! 0, n.lineWidth = e.childs().width.value(), n.lineStyle = e.childs().style .value(), n.drawCenter = i && this._pane === this._source.pane } return n.w = this._pane.width(), n.h = this._pane.height(), n.x = void 0 !== this ._source.lockedX && isFinite(this._source.lockedX) && this._source.lockedX || this._source.x, n.y = this._source.y, this._renderer } } var B = i("IjC5"); const R = { backgroundColor: Object(x.generateColor)(l.colorsPalette["color-tv-blue-500"], 70), borderColor: Object(x.generateColor)(l.colorsPalette["color-tv-blue-500"], 20) }; class N { constructor(e) { this._renderer = new B.RectangleRenderer, this._rectangle = null, this._crosshair = e } update() { const e = this._crosshair.selection(); null !== e && null !== this._crosshair.pane ? this._rectangle = this._crosshair.pane .logicalRectToPixels(e) : this._rectangle = null } renderer(e, t) { if (!this._rectangle) return null; const i = { backcolor: R.backgroundColor, color: R.borderColor, fillBackground: !0, linewidth: 1, points: [this._rectangle.min, this._rectangle.max], extendLeft: !1, extendRight: !1 }; return this._renderer.setData(i), this._renderer } } var j = i("Ialn"), F = i("GH0z"), W = i("5C6T"), H = i("nda6"), U = i("nEwK"), z = i("pJOz"), G = i("qgcf"), q = i("Zy3/"), Y = i("a7Ha"), K = i("zDbI"); const J = Object(g.t)("{count} bars"), Z = Object(g.t)("Vol"), X = new F.PercentageFormatter, $ = new H.TimeSpanFormatter, Q = new U.VolumeFormatter, ee = Object(l.getHexColorByName)("color-tv-blue-500"), te = { bgColorPositive: Object(x.generateColor)(ee, 80), bgColorNegative: "rgba(239,83,80,0.2)", colorPositive: "#1E53E5", colorNegative: "#EF5350", labelBgColorPositive: ee, labelBgColorNegative: "#EF5350" }; class ie { constructor(e, t) { this._pipFormatter = null, this._lastSymbolInfo = null, this._horzTrenRenderer = new z.TrendLineRenderer, this._vertTrenRenderer = new z.TrendLineRenderer, this ._bgRenderer = new B.RectangleRenderer, this._labelRenderer = new G .TextRenderer, this._p1 = null, this._p2 = null, this._label = null, this ._source = e, this._pane = t } update() { const [e, t] = this._source.measurePoints(); if (void 0 === t) return this._p1 = null, void(this._p2 = null); const i = Object(s.ensureNotNull)(this._source.measurePane()), n = e.price, o = t.price, a = t.price - n, l = t.index - e.index, c = Object(j.forceLTRStr)("" + l), h = Object(s.ensureNotNull)(i.mainDataSource()); let u = Object(s.ensureNotNull)(h.formatter()).format(a); if (Math.abs(n) > 1e-8) { const e = a / Math.abs(n); u += " (" + X.format(100 * e) + ")" } const d = Object(j.forceLTRStr)(u); this._label = d + "\n" + J.format({ count: c }); const p = Object(s.ensureNotNull)(h.firstValue()), _ = this._source.model().timeScale().indexToCoordinate(e.index), m = this._source.model().timeScale().indexToCoordinate(t.index), f = i.defaultPriceScale().priceToCoordinate(n, p), g = i.defaultPriceScale().priceToCoordinate(o, p); this._p1 = new r.Point(_, f), this._p2 = new r.Point(m, g); const b = this._source.model().timeScale().indexToUserTime(e.index), v = this._source.model().timeScale().indexToUserTime(t.index); let S = null; if (null !== b && null !== v) { const e = this._pane.model().mainSeries().symbolInfo(); null !== e && e !== this._lastSymbolInfo && (this._pipFormatter = new W .PipFormatter(e.pricescale, e.minmov, e.type, e.minmove2), this ._lastSymbolInfo = e), S = (v.valueOf() - b.valueOf()) / 1e3 } const y = this._pipFormatter ? this._pipFormatter.format(a) : null, w = null !== y ? " , " + y : "", P = null !== S ? $.format(S) : null, C = null !== P ? ", " + Object(j.startWithLTR)(P) : ""; this._label = Object(j.forceLTRStr)(d + w) + "\n" + J.format({ count: c }) + C; const x = this._source.measureVolume(); Number.isNaN(x) || (this._label += `\n${Z} ${Q.format(x)}`); const I = o < n ? te.bgColorNegative : te.bgColorPositive, M = o < n ? te.colorNegative : te.colorPositive, O = o < n ? te.labelBgColorNegative : te.labelBgColorPositive, L = { points: [this._p1, this._p2], linewidth: 0, fillBackground: !0, color: I, backcolor: I, extendLeft: !1, extendRight: !1 }; this._bgRenderer.setData(L); const A = this._p1.add(this._p2).scaled(.5); { const e = Math.round(A.y), t = new r.Point(this._p1.x, e), i = new r.Point(this._p2.x, e), s = { points: [t, i], color: M, linewidth: 1, linestyle: T.LINESTYLE_SOLID, extendleft: !1, extendright: !1, leftend: Y.LineEnd.Normal, rightend: Math.abs(t.x - i.x) >= 50 ? Y.LineEnd.Arrow : Y.LineEnd.Normal }; this._horzTrenRenderer.setData(s) } { const e = Math.round(A.x), t = new r.Point(e, this._p1.y), i = new r.Point(e, this._p2.y), s = { points: [t, i], color: M, linewidth: 1, linestyle: T.LINESTYLE_SOLID, extendleft: !1, extendright: !1, leftend: Y.LineEnd.Normal, rightend: Math.abs(t.y - i.y) >= 50 ? Y.LineEnd.Arrow : Y.LineEnd.Normal }; this._vertTrenRenderer.setData(s) } const E = { x: 0, y: 10 }, k = .5 * (this._p1.x + this._p2.x), D = this._p2.y, V = new r.Point(k, D), B = (R = Object(s.ensureNotNull)(this._label), { points: [V], text: R, color: "#FFFFFF", horzAlign: "center", vertAlign: "middle", font: K.CHART_FONT_FAMILY, offsetX: E.x, offsetY: E.y, bold: !1, italic: !1, fontsize: 12, padding: 8, highlightBorder: !1, backgroundColor: O, backgroundTransparency: 10, backgroundVertInflate: 5, backgroundHorzInflate: 5, backgroundRoundRect: 4 }); var R; this._labelRenderer.setData(B); const N = this._labelRenderer.measure(), F = Object(G.calculateLabelPosition)(N, this._p1, this._p2, E, this._pane .height()); this._labelRenderer.setPoints([F]) } renderer() { if (null === this._p1 || null === this._p2) return null; const e = new q.CompositeRenderer; return e.append(this._bgRenderer), e.append(this._horzTrenRenderer), e.append(this ._vertTrenRenderer), e.append(this._labelRenderer), e } } var se = i("cPgM"); class re extends se.ScaledPaneRenderer { constructor(e) { super(), this._data = e } hitTest(e) { return null } _drawImpl(e) { e.translate(this._data.x - this._data.width / 2, this._data.y - this._data .height / 2), e.strokeStyle = "rgba(153,153,153,.3)", e.lineWidth = 2, e .beginPath(), this._drawShackle(e), e.stroke(), e.closePath(), e .strokeStyle = "rgba(153,153,153,.7)", e.lineWidth = 1, e.beginPath(), e .rect(0, this._data.height - this._data.bodyHeight + .5, this._data.width, this._data.bodyHeight), e.closePath(), e.stroke(), e.translate(0, -1), e .strokeStyle = "#777", e.beginPath(), this._drawShackle(e), e.stroke(), e .closePath(), e.fillStyle = "rgba(255,255,255,.7)", e.beginPath(), e.rect(1, this._data.height - this._data.bodyHeight + 1.5, this._data.width - 2, this._data.bodyHeight - 2), e.fill(), e.beginPath(), e.rect(.5, this ._data.height - this._data.bodyHeight + 1, this._data.width - 1, this ._data.bodyHeight - 1), e.stroke(), e.closePath(), e.fillStyle = "#777", e.fillRect(this._data.width / 2 - .5, this._data.height - this._data .bodyHeight / 2, 1, 2) } _drawShackle(e) { const t = (this._data.width - 3) / 2, i = this._data.height - this._data.bodyHeight; e.moveTo(1.5, t), e.arc(this._data.width / 2, t, t, Math.PI, 2 * Math.PI), i > t && (e.moveTo(1.5, t), e.lineTo(1.5, i), e.moveTo(this._data.width - 1.5, t), e.lineTo(this._data.width - 1.5, i)) } } class ne { constructor(e, t, i) { this._horzVisible = !1, this._source = e, this._pane = t, this._axis = i || "x" } update() {} renderer(e, t) { const i = this._source.visible && this._source.areLinesVisible, r = Object(f.lockTimeAxis)().value(), n = i && this._horzVisible, o = i || r; if ("y" === this._axis && !n || !o) return null; const a = "y" === this._axis ? this._pane.width() - 4.5 : Object(s.ensureDefined)( this._source.lockedX) + 1, l = "y" === this._axis ? this._source.y : this._pane.height() - 5.5 - 1; return new re({ x: a, y: l, width: 9, height: 11, bodyHeight: 7 }) } } var oe = i("qFKp"), ae = i("aIyQ"), le = i.n(ae), ce = i("GDWD"), he = i("ivNn"), ue = i("4miz"); const de = window.t("n/a"); class pe extends ue.b { constructor(e) { super(), this._invalidated = !0, this._dateItem = new ue.a(window.t("Date"), ""), this._timeItem = new ue.a(window.t("Time"), ""), this._model = e, this ._items.push(this._dateItem), this._items.push(this._timeItem) } update() { this._invalidated = !0 } items() { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._items } _updateImpl() { const e = this._model.mainSeries().isDWM(); if (this._timeItem.setVisible(!e), this._timeItem.setValue(de), this._dateItem .setValue(de), this._model.timeScale().isEmpty()) return; let t = this._model.crossHairSource().appliedIndex(); if (!Object(he.isNumber)(t)) { const e = this._model.mainSeries().data().last(); if (null === e) return; t = e.index } const i = this._model.timeScale().indexToUserTime(t); null !== i && (this._dateItem.setValue(this._model.dateFormatter().format(i)), e || this._timeItem.setValue(this._model.timeFormatter().format(i))) } } var _e = i("cgFQ"); class me extends _e.a { constructor(e, t, i = !1) { super(e), this._indexProvider = t, this._highlighted = i } _getBgColor() { const e = this._model.isDark(); return this._highlighted ? h.a.common : e ? l.colorsPalette[ "color-cold-gray-750"] : l.colorsPalette["color-cold-gray-900"] } _getIndex() { return this._model.crossHairSource().visible ? this._indexProvider() : null } } var fe = i("585y"); i.d(t, "Crosshair", (function() { return be })); const ge = { menuEnabled: !1, menuForMainSourceOnly: !1, disableTradingMenuActions: !1, disableDrawHorizLineMenuAction: !1 }; class be extends n.DataSource { constructor(e, t, i) { super(), this.pane = null, this.price = NaN, this.index = NaN, this.visible = ! 0, this.areLinesVisible = !0, this.x = NaN, this.y = NaN, this ._measuringEnabled = new le.a, this._measurePane = null, this ._startMeasurePoint = null, this._endMeasurePoint = null, this ._lastValidMeasurePoint = null, this._isOnHoveredChartWidget = !1, this ._selectPointMode = new a.a(!1), this._selectionPane = null, this ._selectionView = new N(this), this._selectionStartPoint = null, this ._measurePaneView = null, this._timeLockPaneView = null, this ._priceAxisViews = new Map, this._panePriceAxisViews = new Map, this ._startMeasurePriceAxisViews = new Map, this._endMeasurePriceAxisViews = new Map, this._originX = NaN, this._originY = NaN, this._subscribed = !1, this._movedDelegate = new le.a, this._pointSelectedDelegate = new le.a, this ._requestedPoint = null, this._paneForRequestedPoint = null, this ._volumeCalculator = null, this._model = e, this._options = Object .assign({}, ge, i || {}), this._linesShouldBeHidden = this._model .readOnly(), this._dataWindowView = new pe(e), this.setSelectionEnabled(!1); const r = e => t => t === Object(s.ensureNotNull)(this._measurePane) .defaultPriceScale() ? e() : null; this._currentPosPriceProvider = e => { const t = Object(s.ensureNotNull)(this.pane); if (e === t.defaultPriceScale()) return this.price; const i = Object(s.ensureNotNull)(t.defaultPriceScale().mainSource()) .firstValue(); if (null === i) return null; const r = t.defaultPriceScale().priceToCoordinate(this.price, i), n = Object(s.ensureNotNull)(e.mainSource()).firstValue(); return null === n ? null : e.coordinateToPrice(r, n) }, this._startMeasurePriceProvider = r(() => Object(s.ensureNotNull)(this ._startMeasurePoint).price), this._endMeasurePriceProvider = r(() => Object(s.ensureNotNull)(this ._lastMeasurePoint()).price), this._properties = t; this._timeAxisView = new me(e, () => this.appliedIndex(), !1), this ._startMeasureTimeAxisView = new me(e, () => Object(s.ensureNotNull)(this ._startMeasurePoint).index, !0), this._endMeasureTimeAxisView = new me( e, () => Object(s.ensureNotNull)(this._lastMeasurePoint()).index, !0), e .readOnly() || f.cursorTool.subscribe(e => this.areLinesVisible = "arrow" !== e, { callWithLast: !0 }) } destroy() { null !== this._volumeCalculator && this._volumeCalculator.destroy() } moved() { return this._movedDelegate } originX() { return this._originX } originY() { return this._originY } saveOriginCoords(e, t) { this._originX = e, this._originY = t } clearOriginCoords() { this._originX = NaN, this._originY = NaN } currentPoint() { return new r.Point(this.x, this.y) } model() { return this._model } appliedIndex() { return Number.isFinite(this.lockedIndex) ? this.lockedIndex : this.index } startMeasurePoint() { return this._startMeasurePoint || null } endMeasurePoint() { return this._endMeasurePoint || null } measureVolume() { if (null === this._volumeCalculator) return NaN; const [e, t] = this.measurePoints(); return void 0 === t ? NaN : this._volumeCalculator.volume(e.index, t.index) } measurePane() { return this._measurePane || null } startMeasuring(e, t) { this._startMeasurePoint = e, this._measurePane = t, this._measuringEnabled.fire( !0), t.containsMainSeries() && (Object(s.assert)(null === this ._volumeCalculator), this._volumeCalculator = new fe.a(this.model() .mainSeries())) } finishMeasure(e) { this._endMeasurePoint = e } clearMeasure() { delete this._measurePane, delete this._startMeasurePoint, delete this ._endMeasurePoint, delete this._lastValidMeasurePoint, this._model .lightUpdate(), null !== this._volumeCalculator && (this._volumeCalculator .destroy(), this._volumeCalculator = null), this._measuringEnabled.fire( !1) } measuringEnabled() { return this._measuringEnabled } measurePoints() { this.updateAllViews(); const e = [Object(s.ensureNotNull)(this._startMeasurePoint)], t = this._lastMeasurePoint(); return null !== t && e.push(t), e } startSelection(e) { this._selectionStartPoint = this.currentLogicalPoint(), this._selectionPane = e } clearSelection() { this._selectionStartPoint = null, this._selectionPane = null } selection() { return this._selectionStartPoint ? { p1: this._selectionStartPoint, p2: this.currentLogicalPoint() } : null } currentLogicalPoint() { return { index: this.appliedIndex(), price: this.price } } selectPointMode() { return this._selectPointMode } cancelRequestSelectPoint() { this._selectPointMode.value() && this._setSelectPointModeState(!1) } requestSelectPoint(e, t) { Object(s.assert)(!this._selectPointMode.value(), "Point already requested"), t && (Object(s.assert)(-1 !== this._model.panes().indexOf(t), "Chartmodel doesn't contains specified pane"), this ._paneForRequestedPoint = t, this._model.panesCollectionChanged() .subscribe(this, this._paneCollectionChanged)), this._requestedPoint = e, this._setSelectPointModeState(!0) } onPointSelected() { return this._pointSelectedDelegate } trySelectCurrentPoint() { const e = Object(s.ensureNotNull)(this._requestedPoint); if (!this._model.mainSeries().bars().contains(this.index) && "price" !== e) return; const t = Object(s.ensureNotNull)(this.pane); if (this._paneForRequestedPoint && this._paneForRequestedPoint !== t) return; let i, r; if ("price" === e || (i = this._model.timeScale().indexToTimePoint(this.index), null !== i)) { if ("time" !== e) { const e = t.mainDataSource(); if (null === e) return; const i = e.firstValue(), s = e.priceScale(); if (null === i || null === s) return; r = s.coordinateToPrice(this.y, i) } this._setSelectPointModeState(!1), this._pointSelectedDelegate.fire({ time: i, price: r }, t) } } isOnHoveredChartWidget() { return this._isOnHoveredChartWidget } setOnHoveredChartWidget(e) { this._isOnHoveredChartWidget = e } clearPosition() { this.visible = !1, this.index = NaN, this.price = NaN, this.x = NaN, this.y = NaN, this.pane = null, this.clearOriginCoords() } setPosition(e, t, i) { return this._subscribed || (this._model.mainSeries().onRestarted().subscribe( this, this.clearMeasure), this._subscribed = !0), this .setLockedPosition(i), this.visible = !0, this._tryToUpdateViews(e, t, i) } setLinesShouldBeHidden(e) { this._linesShouldBeHidden = e } linesShouldBeHidden() { return this._linesShouldBeHidden } handleContextMenuEvent(e) { this._selectPointMode.value() && this._setSelectPointModeState(!1) } properties() { return this._properties } priceAxisViews(e, t) { const i = null === this._requestedPoint || "time" !== this._requestedPoint || ! this._isOnHoveredChartWidget, s = []; return this.pane === e && i && s.push(this._createPriceAxisViewOnDemand(this ._priceAxisViews, this._panePriceAxisViews, e, t, this ._currentPosPriceProvider, _, !0)[0]), this._startMeasurePoint && s .push(this._createPriceAxisViewOnDemand(this._startMeasurePriceAxisViews, null, e, t, this._startMeasurePriceProvider, m)[0]), this ._lastMeasurePoint() && s.push(this._createPriceAxisViewOnDemand(this ._endMeasurePriceAxisViews, null, e, t, this ._endMeasurePriceProvider, m)[0]), s } timeAxisViews() { const e = [], t = null === this._requestedPoint || "price" !== this._requestedPoint || ! this._isOnHoveredChartWidget; return !this._linesShouldBeHidden && (this.visible || Object(f.lockTimeAxis)() .value()) && t && e.push(this._timeAxisView), this._startMeasurePoint && e.push(this._startMeasureTimeAxisView), this._lastMeasurePoint() && e.push( this._endMeasureTimeAxisView), e } paneViews(e) { if (void 0 === e) return null; const t = [new V(this, e)]; if (e === this._selectionPane && t.push(this._selectionView), e === this ._measurePane && (null === this._measurePaneView && (this._measurePaneView = new ie(this, e)), this._measurePaneView.update(), t.push(this ._measurePaneView)), ce.addPlusButtonProperty.value()) { const i = e === this.pane, s = !oe.CheckMobile.any() || window.screen.width >= 320, r = f.tool.value(), n = Object(E.isLineToolName)(r), o = null !== this._model.lineBeingEdited() || null !== this._model .lineBeingCreated() || this._model.sourcesBeingMoved().length > 0 || null !== this._model.customSourceBeingMoved() || Object(f.toolIsMeasure) (r); if (i && this._isOnHoveredChartWidget && !this._selectPointMode.value() && s && !n && !o) { const i = e.mainDataSource(); if (null !== i) { const s = i.priceScale(); if (null !== s) { const i = this._createPriceAxisViewOnDemand(this ._priceAxisViews, this._panePriceAxisViews, e, s, this ._currentPosPriceProvider, _, !0)[1]; null !== i && t.push(i) } } } } return Object(f.lockTimeAxis)().value() && (null === this._timeLockPaneView && ( this._timeLockPaneView = new ne(this, e)), t.push(this ._timeLockPaneView)), t } dataWindowView() { return this._dataWindowView } updateAllViews() { this._priceAxisViews.forEach(e => { e.forEach(e => e.update()) }), this._panePriceAxisViews.forEach(e => { e.forEach(e => e.update()) }), this._startMeasurePoint && (this._startMeasurePriceAxisViews.forEach( e => { e.forEach(e => e.update()) }), this._startMeasureTimeAxisView.update()), this ._lastMeasurePoint() && (this._endMeasurePriceAxisViews.forEach(e => { e.forEach(e => e.update()) }), this._endMeasureTimeAxisView.update()), this._timeAxisView.update(), this._selectionView.update(), this._dataWindowView.update() } setLockedPosition(e) { delete this.lockedIndex, delete this.lockedX, e !== this._measurePane && Object( f.lockTimeAxis)().value() && (this.lockedIndex = this._model.timeScale() .points().roughIndex(f.lockTimeAxisTime.value()), null !== this .lockedIndex && (this.lockedX = this._model.timeScale() .indexToCoordinate(this.lockedIndex))) } isMenuEnabled() { return this._options.menuEnabled } isHoveredEnabled() { return ce.addPlusButtonProperty.value() } isHovered() { return this._model.hoveredSource() === this } pointToSelect() { return this._requestedPoint } paneForPointSelect() { return this._paneForRequestedPoint } _lastMeasurePoint() { return this._endMeasurePoint ? this._endMeasurePoint : (null !== this.pane && this._measurePane === this.pane && (this._lastValidMeasurePoint = { price: this._model.magnet().align(this.price, this.index, this .pane), index: this.index }), this._lastValidMeasurePoint || null) } _createPriceAxisViewOnDemand(e, t, i, r, n, o, a = !1) { let l = e.get(i), c = null !== t ? t.get(i) : void 0; void 0 === l && (l = new Map, e.set(i, l), this._options.menuEnabled && null !== t && (c = new Map, t.set(i, c)), a && i.onDestroyed().subscribe(this, () => this._onPaneDestroyed(i))); let h = l.get(r); if (void 0 === h) { if (h = new o(this, r, n), l.set(r, h), void 0 !== c) { const e = new C(h, this, r, this._model, this._options); c.set(r, e) } a && r.lastSourceRemoved().subscribe(this, () => this._onPriceScaleCleared( r)) } let u = null; return void 0 !== c && (u = Object(s.ensureDefined)(c.get(r))), [h, u] } _onPaneDestroyed(e) { e.onDestroyed().unsubscribeAll(this), this._priceAxisViews.delete(e), this ._panePriceAxisViews.delete(e), this._startMeasurePriceAxisViews.delete(e), this._endMeasurePriceAxisViews.delete(e) } _onPriceScaleCleared(e) { e.lastSourceRemoved().unsubscribeAll(this), this._priceAxisViews.forEach(t => t .delete(e)), this._panePriceAxisViews.forEach(t => t.delete(e)), this ._startMeasurePriceAxisViews.forEach(t => t.delete(e)), this ._endMeasurePriceAxisViews.forEach(t => t.delete(e)) } _tryToUpdateViews(e, t, i) { return !!this._tryToUpdateData(e, t, i) && (this.updateAllViews(), this ._movedDelegate.fire({ index: this.index, price: this.price }), !0) } _tryToUpdateData(e, t, i) { const r = this.x, n = this.y, o = this.price, a = this.index, l = this.pane, c = this._priceScaleByPane(i); if (this.index = e, this.x = isNaN(e) ? NaN : this._model.timeScale() .indexToCoordinate(e), null !== c && null !== i) { this.pane = i, this.price = t; const e = Object(s.ensureNotNull)(i.mainDataSource()).firstValue(); this.y = null === e ? NaN : c.priceToCoordinate(t, e) } else this.pane = null, this.price = NaN, this.y = NaN; return r !== this.x || n !== this.y || a !== this.index || o !== this.price || l !== this.pane } _priceScaleByPane(e) { return e && !e.defaultPriceScale().isEmpty() ? e.defaultPriceScale() : null } _setSelectPointModeState(e) { e || (this._requestedPoint = null, this._paneForRequestedPoint && (this ._paneForRequestedPoint = null, this._model.panesCollectionChanged() .unsubscribe(this, this._paneCollectionChanged))), this._selectPointMode .setValue(e), this._model.lightUpdate() } _paneCollectionChanged(e) { const t = this._paneForRequestedPoint; null !== t && -1 === e.indexOf(t) && this.cancelRequestSelectPoint() } } }, "22xp": function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("9uLv"), n = i("txPx"), o = i("//lZ"), a = i("aIyQ"), l = i.n(a), c = i("Kxc7"), h = i("Hr11"), u = i("ogJP"), d = i("FIi8"), p = i("ZJKN"); class _ { constructor(e, t) { Object(s.assert)(e <= t, "The left value should be greater than or equal to the right value"), this ._left = e, this._right = t } left() { return this._left } right() { return this._right } length() { return this._right - this._left + 1 } contains(e) { return this._left <= e && e <= this._right } equals(e) { return this._left === e.left() && this._right === e.right() } static compare(e, t) { return null === e || null === t ? e === t : e.equals(t) } } const m = Object(n.getLogger)("Chart.TimePoints"); class f { constructor() { this._zoffset = 0, this._items = [] } clear() { this._zoffset = 0, this._items = [] } size() { return this._items.length } firstIndex() { return this._offsetToIndex(0) } lastIndex() { return this._offsetToIndex(this._items.length - 1) } merge(e, t, i) { if (0 === i.length) return m.logError( "merge: 'values' does not contain any time points"), []; if (t > this._zoffset && e + t > 0) return m.logError( "merge: when the first time point index is updated, we should fill the time points starting from the first one" ), []; if (0 === this._items.length) return this._items = i, this._zoffset = t, [{ change: "rebuild", index: this._validOffsetToIndex(0) }]; const s = e + this._zoffset; if (s < 0) { const r = Math.abs(s); if (i.length < r) return m.logError( "merge: 'values' does not contain enough time points to fill in the new items. 'index': " + e.toString() + ", previous 'zoffset': " + this._zoffset.toString() + ", new 'zoffset': " + t.toString() + ", 'values.length': " + i .length), []; this._items = new Array(r).concat(this._items), this._zoffset = t; for (let s = 0; s < i.length; ++s) this._items[e + s + t] = i[s]; return [{ change: "rebuild", index: this._validOffsetToIndex(0) }] } const r = []; let n = s; for (; n < this._items.length && n - s < i.length; ++n) this._items[n] = i[n - s], r .push({ change: "update", index: this._validOffsetToIndex(n), value: i[n - s] }); const o = s + i.length; if (o > this._items.length) { const e = o - this._items.length; for (let t = n; t < n + e; ++t) { const e = this._items.length; this._items.push(i[t - s]), r.push({ change: "append", index: this._validOffsetToIndex(e), value: i[t - s] }) } } else { for (let e = o; e < this._items.length; ++e) r.push({ change: "remove", index: this._validOffsetToIndex(e), value: this._items[e] }); this._items.length = o } return this._zoffset = t, r } addTail(e, t) { for (let i = t ? 1 : 0; i < e.length; i++) this._items.push(e[i]) } remove(e) { const t = this._indexToOffset(e); if (null === t) return []; const i = this._items.splice(t), s = []; for (let t = 0; t < i.length; t++) s.push({ change: "remove", index: e + t, value: i[t] }); return s } valueAt(e) { const t = this._indexToOffset(e); return null !== t ? this._items[t] : null } indexOf(e, t) { if (this._items.length < 1) return null; if (e > this._items[this._items.length - 1]) return t ? this._validOffsetToIndex( this._items.length - 1) : null; for (let i = 0; i < this._items.length; ++i) { if (e === this._items[i]) return this._validOffsetToIndex(i); if (e < this._items[i]) return t ? this._validOffsetToIndex(i) : null } return null } state() { return { items: this._items, zoffset: this._zoffset } } restoreState(e) { null !== e && (this._items = e.items, this._zoffset = e.zoffset) } roughTime(e, t = null) { const i = this.valueAt(e); if (null !== i) return i; const s = this._items; if (!s.length || s.length < 2) return null; const r = s.length - 1, n = this._validOffsetToIndex(0), o = this._validOffsetToIndex(r), a = s[0], l = s[r], c = (l - a) / (o - n); if (e < n) { return a - (n - e) * c } if (e > o) { const i = e - o; if (i < 500 && null != t) return t(l, i); return l + i * c } return null } roughIndex(e, t = null) { const i = this._items; if (!i.length || i.length < 2) return null; const s = i.length - 1, r = this._validOffsetToIndex(0), n = this._validOffsetToIndex(s), o = i[0], a = i[s]; if (e >= o && e <= a) return this.closestIndexLeft(e); const l = (a - o) / (n - r); if (e < o) { const t = o - e; return r - Math.round(t / l) } if (e > a) { const i = e - a; let s = Math.trunc(i / l); if (s < 500 && null !== t) { const i = t(a, e); i.success && (s = i.result) } return n + s } return null } closestIndexLeft(e) { const t = this._items; if (!t.length) return null; if (Number.isNaN(e)) return null; let i = t.length - 1; if (e >= t[i]) return this._validOffsetToIndex(i); let s = 0; const r = t[s]; if (e < r) return null; if (e === r) return this._validOffsetToIndex(s); for (; i > s + 1;) { const r = s + i >> 1, n = t[r]; if (n > e) i = r; else { if (!(n < e)) return n === e ? this._validOffsetToIndex(r) : null; s = r } } return this._validOffsetToIndex(s) } _validOffsetToIndex(e) { return e - this._zoffset } _offsetToIndex(e) { return 0 <= e && e < this.size() ? this._validOffsetToIndex(e) : null } _indexToOffset(e) { const t = e + this._zoffset; return 0 <= t && t < this.size() ? t : null } } var g = i("tc+8"), b = i.n(g); const v = new Map([ [0, .1], [11, .1], [1, .35], [9, .35], [12, .35], [8, .35] ]); class S { constructor(e, t) { this._styleSpecificRanges = new Map, this._logicalRange = e, this._defaultStyle = t } strictRange(e) { if (null === this._logicalRange) return null; void 0 === e && (e = this._defaultStyle); let t = this._styleSpecificRanges.get(e); if (void 0 === t) { const i = (v.get(e) || 0) / 2; t = new p.BarsRange(Math.floor(this._logicalRange.left() + i), Math.ceil(this ._logicalRange.right() - i)), this._styleSpecificRanges.set(e, t) } return t } logicalRange() { return this._logicalRange } isValid() { return null !== this._logicalRange } static invalid() { return new S(null, 1) } } var y = i("Ocx9"), w = i("GhVi"), P = i("8OdW"); class C { constructor(e, t = 50) { this._actualSize = 0, this._usageTick = 1, this._oldestTick = 1, this._cache = new Map, this._tick2Labels = new Map, this._format = e, this._maxSize = t } format(e) { const t = this._cache.get(e.valueOf()); if (void 0 !== t) return t.string; if (this._actualSize === this._maxSize) { const e = this._tick2Labels.get(this._oldestTick); this._tick2Labels.delete(this._oldestTick), this._cache.delete(Object(s .ensureDefined)(e)), this._oldestTick++, this._actualSize-- } const i = this._format(e); return this._cache.set(e.valueOf(), { string: i, tick: this._usageTick }), this._tick2Labels.set(this._usageTick, e.valueOf()), this._actualSize++, this._usageTick++, i } } var x = i("iboI"), T = i("YFKU"); let I; var M = i("kcTO"); i.d(t, "TimeScale", (function() { return k })); const O = { preserveBarSpacing: !1, lockVisibleTimeRangeOnResize: !1, rightBarStaysOnScroll: !0, minBarSpacing: .5 }, L = c.enabled("low_density_bars"), A = L ? 1 : 5, E = Object(n.getLogger)("Chart.TimeScale"); class k { constructor(e, t) { this._width = 0, this._widthChanged = new l.a, this._rightOffset = 10, this ._rightOffsetChanged = new l.a, this._maxRightOffsetChanged = new l.a, this ._defaultRightOffsetProperty = new b.a(10), this._baseIndex = null, this ._leftEdgeIndex = null, this._barSpacingChanged = new l.a, this._barSpacing = 6, this._visibleBars = S.invalid(), this._visibleBarsInvalidated = !0, this ._visibleBarsChanged = new l.a, this._logicalRangeChanged = new l.a, this ._points = new f, this._tickMarks = new w.Tickmarks, this._onScroll = new l.a, this._resetDelegate = new l.a, this._scrollStartPoint = null, this ._scaleStartPoint = null, this._commonTransitionStartState = null, this ._formattedBySpan = new Map, this._requestingMoreData = !1, this ._requestedTickmarksCount = 0, this._endOfData = !1, this._options = Object(d .deepExtend)({}, O, t), this._model = e, this._scalesProperties = e .properties().scalesProperties, this._defaultRightOffsetProperty.listeners() .subscribe(this, e => { this.setRightOffset(e.value()) }), this._options.preserveBarSpacing && (this._barSpacing = this ._scalesProperties.childs().barSpacing.value() || 6), this ._barSpacingChanged.subscribe(this, this._maxRightOffsetOnChanged), this ._widthChanged.subscribe(this, this._maxRightOffsetOnChanged) } destroy() { this._barSpacingChanged.unsubscribeAll(this), this._barSpacingChanged.destroy(), this._widthChanged.unsubscribeAll(this), this._widthChanged.destroy() } isEmpty() { return 0 === this._width || 0 === this._points.size() } update(e, t, i, s) { this._visibleBarsInvalidated = !0, i.length > 0 && this._points.merge(e, t, i), this ._tickMarks.merge(s), this._correctOffset() } addTail(e, t, i) { this._tickMarks.removeTail(t); const r = e.params, n = Object(s.ensureDefined)(this._tickMarks.maxIndex) + (i ? 0 : 1); for (let e = 0; e < r.marks.length; e++) r.marks[e].index = n + e; this._tickMarks.addTail(r.marks), this._points.addTail(r.changes, i); const o = this._rightOffset - r.changes.length; this._updateRightOffset(o) } state(e) { const t = { m_barSpacing: this.barSpacing(), m_rightOffset: e ? this._rightOffset : this._defaultRightOffsetProperty .value() }; return e && (t.points = this._points.state(), t.tickmarks = this._tickMarks.state(), t.width = this._width), t } restoreState(e, t) { if (void 0 === e.m_barSpacing) return void E.logDebug( "restoreState: invalid state"); if (void 0 === e.m_rightOffset) return void E.logDebug( "restoreState: invalid state"); let i = e.m_barSpacing; const s = e.m_rightOffset < 0 && !t ? this.rightOffsetDefaultValue() : e .m_rightOffset, r = s < 0 ? this.rightOffsetDefaultValue() : Math.round(s); this._defaultRightOffsetProperty.setValue(r), this._rightOffset = s, t && (this ._requestedTickmarksCount = 1 / 0, this._endOfData = !0, this._points .restoreState(e.points || null), this._tickMarks.restoreState(e.tickmarks || null), e.width && this._width > 0 && (i *= this._width / e.width)), this._tryToUpdateBarSpacing(this ._barSpacing, i), this._correctOffset(), this._rightOffsetChanged.fire(this ._rightOffset) } marks() { if (this.isEmpty()) return null; const e = this._barSpacing, t = 5 * ((this._scalesProperties.childs().fontSize.value() || 0) + 4), i = Math.round(t / e), r = Object(s.ensureNotNull)(this.visibleBarsStrictRange()), n = Math.max(r.firstBar(), r.firstBar() - i), o = Math.max(r.lastBar(), r.lastBar() - i), a = this._tickMarks.build(e, t), l = []; for (const e of a) { if (!(n <= e.index && e.index <= o)) continue; const t = this._tickMarks.indexToTime(e.index); null !== t && l.push({ coord: this.indexToCoordinate(e.index), label: this.formatLabel(t, e.span), span: e.span, major: e.label >= P.DAY_SPAN }) } return l } visibleBarsStrictRange() { return this._visibleBarsInvalidated && (this._visibleBarsInvalidated = !1, this ._updateVisibleBars()), this._visibleBars.strictRange() } visibleBarsStrictRangeChanged() { return this._visibleBarsChanged } logicalRangeChanged() { return this._logicalRangeChanged } tickMarks() { return this._tickMarks } points() { return this._points } width() { return this._width } setWidth(e, t) { if (!Number.isFinite(e) || e <= 0) return void E.logWarn( "setWidth: invalid argument: " + e); if (this._width === e) return; if (this._visibleBarsInvalidated = !0, (t || this._options .lockVisibleTimeRangeOnResize) && this._width) { const t = this._barSpacing * e / this._width; this._tryToUpdateBarSpacing(this._barSpacing, t) } if (null !== this._leftEdgeIndex) { if (Object(s.ensureNotNull)(this.visibleBarsStrictRange()).firstBar() <= this ._leftEdgeIndex) { const t = this._width - e; this._rightOffset -= Math.round(t / this._barSpacing) + 1 } } this._width = e, this._widthChanged.fire(e); const i = this._rightOffset; this._correctOffset(), this._rightOffset !== i && this._rightOffsetChanged.fire(this ._rightOffset), this._requestMoreData() } setLeftEdgeFix(e) { this._leftEdgeIndex = e; const t = this.visibleBarsStrictRange(); if (null === t) return; const i = t.firstBar() - e; if (i < 0) { const e = this._rightOffset - i - 1; this.scrollToOffsetAnimated(e, 500) } } indexToCoordinate(e) { if (this.isEmpty()) return 0; if (!Object(u.isInteger)(e)) return 0; const t = this.baseIndex() + this._rightOffset - e; return this._width - (t + .5) * this._barSpacing - 1 } indexToUserTime(e) { return this._tickMarks.indexToTime(e) } timePointToIndex(e) { return this._points.indexOf(e, !0) } indexToTimePoint(e) { return this._points.valueAt(e) } timeToCoordinate(e) { const t = this._points.closestIndexLeft(e); if (null === t) return null; const i = Object(s.ensureNotNull)(this._points.valueAt(t)), r = this.indexToCoordinate(t); if (r <= 0 || r >= this._width) return null; const n = this.barSpacing(), o = this.baseIndex(), a = r + (e - i) / (Object(s.ensureNotNull)(this._points.valueAt(o)) - Object(s .ensureNotNull)(this._points.valueAt(o - 1))) * n + 1; return a <= 0 || a >= this._width ? null : a } barIndexesToCoordinates(e) { const t = this.baseIndex(); for (const i of e) { const e = i.time, s = t + this._rightOffset - e, r = this._width - (s + .5) * this._barSpacing - 1; i.time = r, i.exactTime = r } } timedValuesToCoordinates(e) { const t = this.baseIndex() + this._rightOffset, i = this._width - t * this._barSpacing - .5 * this._barSpacing - 1; for (const t of e) t.x = i + t.x * this._barSpacing } indexesToCoordinates(e, t) { if (this.isEmpty()) return; void 0 === t && (t = e.length); const i = this.baseIndex() + this._rightOffset, s = this._width - i * this._barSpacing - .5 * this._barSpacing - 1, r = this._barSpacing, n = e; for (let i = 0; i < t; ++i) Object(u.isInteger)(e[i]) ? n[i] = s + e[i] * r : n[i] = 0 } rightOffsetForTimePoint(e) { const t = this.timeToCoordinate(e); return null === t ? null : this._rightOffsetForCoordinate(t) } scrollToRealtime(e, t) { let i = this._defaultRightOffsetProperty.value(); i < 0 && (i = this.rightOffsetDefaultValue()); const s = () => { void 0 !== t && t(), this._requestMoreData() }; if (e) { const e = this._rightOffset, t = this.maxRightOffset(); t > 0 && i > t && (i = t); const n = this._model; Object(o.doAnimate)({ from: e, to: i, duration: 1e3, easing: r.c.easeInOutQuint, onComplete: s, onStep: (e, t) => { this._visibleBarsInvalidated = !0, this._updateRightOffset( t), n.recalculateAllPanes(), n.lightUpdate(), n .recalcVisibleRangeStudies() } }) } else this._visibleBarsInvalidated = !0, this._updateRightOffset(i), s() } scrollToOffsetAnimated(e, t) { if (!isFinite(e)) throw new RangeError( "offset is required and must be finite number"); const i = void 0 === t ? 400 : t; if (!isFinite(i) || i <= 0) throw new RangeError( "animationDuration (optional) must be finite positive number"); const s = this._rightOffset, r = Date.now(), n = () => { this._visibleBarsInvalidated = !0; const t = (Date.now() - r) / i; if (t >= 1) return this._updateRightOffset(e), this ._visibleBarsInvalidated = !0, this._model.recalculateAllPanes(), void this._model.lightUpdate(); const o = s + (e - s) * t; this._updateRightOffset(o), this._model.recalculateAllPanes(), setTimeout(n, 20) }; n() } defaultRightOffsetProperty() { return this._defaultRightOffsetProperty } rightOffsetDefaultValue() { return 10 } barSpacing() { return this._barSpacing } setBarSpacing(e) { Number.isFinite(e) ? (e = this.getValidBarSpacing(e), this._tryToUpdateBarSpacing( this._barSpacing, e) && (this._correctOffset(), this._options .preserveBarSpacing && (Object(y.saveDefaultProperties)(!0), this ._scalesProperties.childs().barSpacing.setValue(this._barSpacing), Object(y.saveDefaultProperties)(!1)))) : E.logWarn( "setBarSpacing: invalid argument: " + e) } barSpacingChanged() { return this._barSpacingChanged } getValidBarSpacing(e) { return null == e && (e = this.barSpacing()), e < this.minBarSpacing() ? this .minBarSpacing() : e > this.maxBarSpacing() ? this.maxBarSpacing() : e } isValidBarSpacing(e) { return e >= this.minBarSpacing() && e <= this.maxBarSpacing() } preserveBarSpacing() { return this._options.preserveBarSpacing } normalizeBarIndex(e) { let t = 0, i = 0; const r = this.baseIndex(), n = Object(s.ensureNotNull)(this._points.firstIndex()); return e < n ? (t = Object(s.ensureNotNull)(this._points.valueAt(n)), i = e - n) : e > r ? (t = Object(s.ensureNotNull)(this._points.valueAt(r)), i = e - r) : (t = Object(s.ensureNotNull)(this._points.valueAt(e)), i = 0), { time_t: t, offset: i } } denormalizeTimePoint(e) { const t = this._points.indexOf(e.time_t, !1); if (null !== t) return t + e.offset } rightOffset() { return this._rightOffset } rightOffsetChanged() { return this._rightOffsetChanged } minRightOffset() { const e = this.points().firstIndex(), t = this._baseIndex; if (null === e || null === t) return null; if (null !== this._leftEdgeIndex) { const e = this.width() / this._barSpacing; return this._leftEdgeIndex - t + e - 1 } return e - t - 1 + A } maxRightOffset() { return this.width() / this._barSpacing - A } maxRightOffsetChanged() { return this._maxRightOffsetChanged } onReset() { return this._resetDelegate } scrollStartPoint() { return this._scrollStartPoint } baseIndex() { return this._baseIndex || 0 } zoom(e, t, i) { if (!Number.isFinite(e) || !Number.isFinite(t)) return void E.logWarn( `zoom: invalid arguments: ${e}, ${t}, ${i}`); const s = this.coordinateToIndex(e), r = this.barSpacing(), n = r + t * (r / 10); this.setBarSpacing(n); (void 0 !== i ? !i : this._options.rightBarStaysOnScroll) || this.setRightOffset( this.rightOffset() - .5 + (s - this._coordinateToFloatIndex(e))), this ._requestMoreData() } zoomToBarsRange(e, t) { if (null !== this._leftEdgeIndex && (e = Math.max(e, this._leftEdgeIndex)), t <= e) return; const i = this.baseIndex(), s = this._rightOffset; this._rightOffset = t - i; const r = Math.max(t - e + 1, A); this.setBarSpacing(this.width() / r), this._visibleBarsInvalidated = !0, this ._correctOffset(), this._rightOffset !== s && this._rightOffsetChanged.fire(this ._rightOffset), this._requestMoreData() } coordinateToIndex(e) { return Math.ceil(this._coordinateToFloatIndex(e)) } coordinateToVisibleIndex(e) { let t; if (0 === e) { const e = this._coordinateToFloatIndex(-1); t = Math.floor(e) + 1 } else t = this.coordinateToIndex(e); const i = this.visibleBarsStrictRange(); return null === i || i.contains(t) || (t = Math.min(Math.max(i.firstBar(), t), i .lastBar())), t } canZoomIn() { return this.barSpacing() < this.maxBarSpacing() } canZoomOut() { return this.barSpacing() > this._options.minBarSpacing } minBarSpacing() { return this._options.minBarSpacing } maxBarSpacing() { return L ? this.width() : 50 } resetRightOffset() { this.setRightOffset(this._defaultRightOffsetProperty.value()) } reset() { this._visibleBarsInvalidated = !0, this._points = new f, this._scrollStartPoint = null, this._scaleStartPoint = null, this._clearCommonTransitionsStartState(), this._tickMarks.reset(), this._leftEdgeIndex = null, this._resetDelegate.fire(), this.disconnect() } disconnect() { this._requestingMoreData = !1, this._requestedTickmarksCount = 0, this ._endOfData = !1 } setBaseIndex(e) { Number.isFinite(e) ? (this._visibleBarsInvalidated = !0, this._baseIndex = e, this ._correctOffset()) : E.logDebug("setBaseIndex: invalid argument: " + e) } setRightOffset(e) { Number.isFinite(e) ? (this._visibleBarsInvalidated = !0, this._updateRightOffset( e)) : E.logWarn("setRightOffset: invalid argument: " + e) } correctBarSpacing() { this.isEmpty() || this.points().size() < this.width() / this.barSpacing() && (this .setRightOffset(this._defaultRightOffsetProperty.value()), this .setBarSpacing(this.width() / (this.points().size() + this.rightOffset()))) } logicalRange() { return this._visibleBarsInvalidated && (this._visibleBarsInvalidated = !1, this ._updateVisibleBars()), this._visibleBars.logicalRange() } restoreDefault() { this._visibleBarsInvalidated = !0, this.setBarSpacing(6), this.resetRightOffset(), this._requestMoreData() } restoreRightOffsetPropertyToDefault() { this._defaultRightOffsetProperty.setValue(this.rightOffsetDefaultValue()) } startScale(e) { this._scrollStartPoint && this.endScroll(), null === this._scaleStartPoint && null === this._commonTransitionStartState && ( this.isEmpty() || (this._scaleStartPoint = e, this ._saveCommonTransitionsStartState())) } scaleTo(e) { if (null === this._commonTransitionStartState) return; const t = Object(h.clamp)(this._width - e, 0, this._width), i = Object(h.clamp)(this._width - Object(s.ensureNotNull)(this ._scaleStartPoint), 0, this._width); 0 !== t && 0 !== i && this.setBarSpacing(this._commonTransitionStartState .barSpacing * t / i) } endScale() { null !== this._scaleStartPoint && (this._scaleStartPoint = null, this ._clearCommonTransitionsStartState(), this._requestMoreData()) } startScroll(e) { null === this._scrollStartPoint && null === this._commonTransitionStartState && ( this.isEmpty() || (this._scrollStartPoint = e, this ._saveCommonTransitionsStartState())) } scrollTo(e) { if (this._visibleBarsInvalidated = !0, null === this._scrollStartPoint) return; const t = (this._scrollStartPoint - e) / this.barSpacing(), i = Object(s.ensureNotNull)(this._commonTransitionStartState).rightOffset + t; this._updateRightOffset(i), this._onScroll.fire() } endScroll() { null !== this._scrollStartPoint && (this._scrollStartPoint = null, this ._clearCommonTransitionsStartState(), this._requestMoreData()) } formatLabel(e, t) { let i = this._formattedBySpan.get(t); return void 0 === i && (i = new C(e => this.formatLabelImpl(e, t)), this ._formattedBySpan.set(t, i)), i.format(new Date(e)) } formatLabelImpl(e, t) { if (!(e && e instanceof Date)) return "incorrect time"; const i = function(e, t) { if (e < P.MINUTE_SPAN && t) return "TimeWithSeconds"; if (e < P.DAY_SPAN && t) return "Time"; if (e < P.WEEK_SPAN) return "DayOfMonth"; if (e < P.MONTH_SPAN) return "DayOfMonth"; if (e < P.YEAR_SPAN) return "Month"; return "Year" }(t, !this._model.mainSeries().isDWM()); return null !== x.customFormatters.tickMarkFormatter ? x.customFormatters .tickMarkFormatter(e, i) : function(e, t) { switch (t) { case "TimeWithSeconds": return Object(M.numberToStringWithLeadingZero)(e.getUTCHours(), 2) + ":" + Object(M.numberToStringWithLeadingZero)(e.getUTCMinutes(), 2) + ":" + Object(M.numberToStringWithLeadingZero)(e .getUTCSeconds(), 2); case "Time": return Object(M.numberToStringWithLeadingZero)(e.getUTCHours(), 2) + ":" + Object(M.numberToStringWithLeadingZero)(e.getUTCMinutes(), 2); case "DayOfMonth": return e.getUTCDate().toString(); case "Month": return (void 0 === I && (I = [Object(T.t)("Jan"), Object(T.t)( "Feb"), Object(T.t)("Mar"), Object(T.t)("Apr"), Object(T.t)("May", { context: "short" }), Object(T.t)("Jun"), Object(T.t)("Jul"), Object(T .t)("Aug"), Object(T.t)("Sep"), Object(T.t)( "Oct"), Object(T.t)("Nov"), Object(T.t)("Dec") ]), I)[e.getUTCMonth()]; case "Year": return e.getUTCFullYear().toString() } }(e, i) } onScroll() { return this._onScroll } invalidateVisibleBars() { this._visibleBarsInvalidated = !0 } onTimeScaleCompleted(e) { if (this._requestingMoreData = !1, this._endOfData = e, c.enabled( "fix_left_edge") && this._endOfData) { const e = this._points.firstIndex(); null !== e && this.setLeftEdgeFix(e) } this._requestMoreData() } requestMoreHistoryPoints(e) { this._requestHistoryPoints(e) } _requestMoreData() { this._requestFutureTickmarksIfNeeded(), this._requestHistoryPointsIfNeeded() } _requestFutureTickmarksIfNeeded() { if (this.isEmpty() || !this._model.chartApi().isConnected().value()) return; const e = this.visibleBarsStrictRange(); if (null === e) return; const t = e.lastBar() - Object(s.ensureNotNull)(this._points.lastIndex()); if (t <= this._requestedTickmarksCount) return; const i = t - this._requestedTickmarksCount; this._requestedTickmarksCount = t, this._model.chartApi().requestMoreTickmarks(i) } _requestHistoryPointsIfNeeded() { if (this.isEmpty()) return; if (this._endOfData) return void E.logNormal( "Skipping loading more data due end of data state"); const e = this.visibleBarsStrictRange(); if (null === e) return; const t = Object(s.ensureNotNull)(this._points.firstIndex()) - e.firstBar(); t <= 0 || this._requestHistoryPoints(t) } _requestHistoryPoints(e) { this._model.chartApi().isConnected().value() && (this._requestingMoreData ? E .logNormal("Skipping loading more data due active loading") : (this ._requestingMoreData = !0, this._model.chartApi().requestMoreData(e))) } _updateVisibleBars() { const e = this._visibleBars; if (this.isEmpty()) return void(this._visibleBars.isValid() && (this._visibleBars = S.invalid(), this._visibleBarsChanged.fire(null, e.strictRange()), this._logicalRangeChanged.fire(null, e.logicalRange()))); const t = this.baseIndex(), i = this.width() / this._barSpacing, s = this._rightOffset + t, r = s - i + 1; Number.isFinite(r) && Number.isFinite(s) ? (this._visibleBars = new S(new _(r, s), this._model.mainSeries().style()), p.BarsRange.compare(e.strictRange(), this._visibleBars.strictRange()) || this._visibleBarsChanged.fire(this ._visibleBars.strictRange(), e.strictRange()), _.compare(e .logicalRange(), this._visibleBars.logicalRange()) || this ._logicalRangeChanged.fire(this._visibleBars.logicalRange(), e .logicalRange())) : E.logWarn( `updateVisibleBars error: baseIndex: ${t}, barSpacing: ${this._barSpacing}, rightOffset: ${this._rightOffset}` ) } _rightOffsetForCoordinate(e) { return (this._width - 1 - e) / this._barSpacing } _correctOffset() { const e = this.maxRightOffset(); this._rightOffset > e && (this._rightOffset = e, this._visibleBarsInvalidated = !0); const t = this.minRightOffset(); null !== t && this._rightOffset < t && (this._rightOffset = t, this ._visibleBarsInvalidated = !0) } _tryToUpdateBarSpacing(e, t) { return e !== t && (this._visibleBarsInvalidated = !0, this._barSpacing = t, this ._barSpacingChanged.fire(t), !0) } _coordinateToFloatIndex(e) { const t = this._rightOffsetForCoordinate(e), i = this.baseIndex() + this.rightOffset() - t; return Math.round(1e6 * i) / 1e6 } _saveCommonTransitionsStartState() { this._commonTransitionStartState = { barSpacing: this.barSpacing(), rightOffset: this.rightOffset() } } _clearCommonTransitionsStartState() { this._commonTransitionStartState = null } _maxRightOffsetOnChanged() { this._maxRightOffsetChanged.fire(this.maxRightOffset()) } _updateRightOffset(e) { const t = this._rightOffset; this._rightOffset = e, this._correctOffset(), this._rightOffset !== t && this ._rightOffsetChanged.fire(this._rightOffset) } } }, "23IT": function(e, t, i) { "use strict"; var s, r; function n(e) { return "line" === e.type } function o(e) { return "shapes" === e.type } function a(e) { return "chars" === e.type } function l(e) { return "arrows" === e.type } function c(e) { return "dataoffset" === e.type } function h(e) { return "ohlc_open" === e.type } function u(e) { return "ohlc_high" === e.type } function d(e) { return "ohlc_low" === e.type } function p(e) { return "ohlc_close" === e.type } function _(e) { return h(e) || u(e) || d(e) || p(e) } function m(e) { return "colorer" === e.type } function f(e) { return "bar_colorer" === e.type } function g(e) { return "bg_colorer" === e.type } function b(e) { return "text_colorer" === e.type } function v(e) { return "ohlc_colorer" === e.type } function S(e) { return "wick_colorer" === e.type } function y(e) { return "border_colorer" === e.type } function w(e) { return "up_colorer" === e.type } function P(e) { return "down_colorer" === e.type } function C(e) { return "alertcondition" === e.type } function x(e) { return "Plot" !== e } function T(e) { return "ohlc_bars" === e.plottype } function I(e) { return "ohlc_candles" === e.plottype } function M(e) { return m(e) || f(e) || g(e) || c(e) || v(e) || C(e) || w(e) || P(e) || y(e) || S(e) || b(e) } function O(e) { return m(e) || b(e) || f(e) || c(e) || v(e) || S(e) || y(e) || w(e) || P(e) || C(e) } i.r(t), i.d(t, "LineStudyPlotStyle", (function() { return s })), i.d(t, "isLinePlot", (function() { return n })), i.d(t, "isShapesPlot", (function() { return o })), i.d(t, "isCharsPlot", (function() { return a })), i.d(t, "isArrowsPlot", (function() { return l })), i.d(t, "isDataOffsetPlot", (function() { return c })), i.d(t, "isOhlcOpenPlot", (function() { return h })), i.d(t, "isOhlcHighPlot", (function() { return u })), i.d(t, "isOhlcLowPlot", (function() { return d })), i.d(t, "isOhlcClosePlot", (function() { return p })), i.d(t, "isOhlcPlot", (function() { return _ })), i.d(t, "isColorerPlot", (function() { return m })), i.d(t, "isBarColorerPlot", (function() { return f })), i.d(t, "isBgColorerPlot", (function() { return g })), i.d(t, "isTextColorerPlot", (function() { return b })), i.d(t, "isOhlcColorerPlot", (function() { return v })), i.d(t, "isCandleWickColorerPlot", (function() { return S })), i.d(t, "isCandleBorderColorerPlot", (function() { return y })), i.d(t, "isUpColorerPlot", (function() { return w })), i.d(t, "isDownColorerPlot", (function() { return P })), i.d(t, "isAlertConditionPlot", (function() { return C })), i.d(t, "isPlotTitleDefined", (function() { return x })), i.d(t, "isOhlcPlotStyleBars", (function() { return T })), i.d(t, "isOhlcPlotStyleCandles", (function() { return I })), i.d(t, "PlotSymbolSize", (function() { return r })), i.d(t, "isPlotWithTechnicalValues", (function() { return M })), i.d(t, "isNonVisualPlot", (function() { return O })), function(e) { e[e.Line = 0] = "Line", e[e.Histogram = 1] = "Histogram", e[e.Cross = 3] = "Cross", e[e .Area = 4] = "Area", e[e.Columns = 5] = "Columns", e[e.Circles = 6] = "Circles", e[e.LineWithBreaks = 7] = "LineWithBreaks", e[e.AreaWithBreaks = 8] = "AreaWithBreaks", e[e.StepLine = 9] = "StepLine", e[e.StepLineWithDiamonds = 10] = "StepLineWithDiamonds" }(s || (s = {})), function(e) { e.Auto = "auto", e.Tiny = "tiny", e.Small = "small", e.Normal = "normal", e.Large = "large", e.Huge = "huge" }(r || (r = {})) }, "25b6": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return n })), i.d(t, "d", (function() { return o })), i.d(t, "c", (function() { return a })), i.d(t, "a", (function() { return l })); const s = /[<"'&>]/g, r = e => `&#${e.charCodeAt(0)};`; function n(e) { return e.replace(s, r) } function o(e = "") { return e.replace(/(<([^>]+)>)/gi, "") } function a(e = "") { return e.replace(/\s+/g, "") } function l(e = "") { return e.replace(/\b\w/g, e => e.toUpperCase()) } }, "29fS": function(e, t, i) { "use strict"; i.r(t), i.d(t, "PaneRendererBars", (function() { return n })); var s = i("Zp/P"), r = i("ExCE"); class n extends r.a { constructor(e) { super(), this._bars = e.bars, this._barSpacing = e.barSpacing, this ._dontDrawOpen = e.dontDrawOpen, this._thinBars = e.thinBars } draw(e, t) { e.save(); const i = t.pixelRatio; if (this._barWidth = this._calcBarWidth(i), this._barWidth >= 2) { Math.max(1, Math.floor(i)) % 2 != this._barWidth % 2 && this._barWidth-- } this._barLineWidth = this._thinBars ? Math.min(this._barWidth, Math.floor(i)) : this._barWidth; let s = null; const r = this._barLineWidth <= this._barWidth && this._barSpacing >= Math .floor(1.5 * t.pixelRatio); for (const t of this._bars) { s !== t.color && (e.fillStyle = t.color, s = t.color); const n = Math.floor(.5 * this._barLineWidth), o = Math.round(t.time * i), a = o - n, l = this._barLineWidth, c = a + l - 1, h = Math.min(t.high, t.low), u = Math.max(t.high, t.low), d = Math.round(h * i) - n, p = Math.round(u * i) + n, _ = Math.max(p - d, this._barLineWidth); e.fillRect(a, d, l, _); const m = Math.ceil(1.5 * this._barWidth); if (r) { const s = o - m, r = o + m, h = Math.min(a - s, r - c); if (!this._dontDrawOpen) { let r = Math.max(d, Math.round(t.open * i) - n), o = r + l - 1; o > d + _ - 1 && (o = d + _ - 1, r = o - l + 1), e.fillRect(s, r, h, o - r + 1) } let u = Math.max(d, Math.round(t.close * i) - n), p = u + l - 1; p > d + _ - 1 && (p = d + _ - 1, u = p - l + 1), e.fillRect(c + 1, u, h, p - u + 1) } } e.restore() } _getTolerance() { const e = this._calcBarWidth(1), t = this._thinBars ? Math.min(e, 1) : e; return Object(s.interactionTolerance)().series + t / 2 } _getBarSpacing() { return this._barSpacing } _calcBarWidth(e) { const t = Math.floor(e); return Math.max(t, Math.floor(Object(s.optimalBarWidth)(this._barSpacing, e))) } } }, "2EnG": function(e, t, i) { "use strict"; i.r(t), i.d(t, "StandardPivotPointsImageCache", (function() { return n })); var s = i("ikwP"), r = i("Eyy1"); class n { constructor(e, t, i, r) { this._priceAxisFontSize = 11, this._prices = [], this._labelWidth = 0, this ._paneRenderParams = e, this._recreateCanvasAndContext(new s.Size(0, 0)), this .reset({ font: t, fontSize: i, backColors: r }) } destroy() { delete this._canvas, delete this._cache } canvas() { return this._canvas } reset(e) { this._renderParams = e, this._prices = [], this._cache.font = e.fontSize + "px " + e .font, this._labelWidth = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5", "/" ].reduce((e, t) => { const i = this._cache.measureText(t).width; return Math.max(i, e) }, 0) } rowHeight() { return this._priceAxisFontSize + 4 } labelRectByIndex(e) { return { left: 0, top: Math.round(this._topByIndex(e)), width: Math.round(this._labelWidth + 4), height: Math.round(this._renderParams.fontSize + 8) } } setPrices(e) { let t = !1; const i = (e, t) => { const i = void 0 === e, s = void 0 === t; return (!i && !s || i === s) && Object(r.ensureDefined)(e).formatted === Object(r.ensureDefined)(t).formatted }; if (e.length !== this._prices.length) t = !0; else for (let s = 0; s < this._prices.length; s++) if (!i(this._prices[s], e[s])) { t = !0; break } if (t) { const t = this._labelWidth + 6, i = this._renderParams.fontSize, r = Math.max(e.length, 22) * (i + 8); this._recreateCanvasAndContext(new s.Size(t, r)), this._prices = e, this._cache .save(), Object(s.drawScaled)(this._cache, this._paneRenderParams .pixelRatio, () => { this._cache.translate(.5, .5), this._cache.font = this._renderParams.fontSize + "px " + this ._renderParams.font, this._cache.textBaseline = "middle"; for (let e = 0; e < this._prices.length; e++) { if (!this._prices[e]) continue; const t = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5" ][e]; this._cache.fillStyle = this._renderParams.backColors[e], this ._cache.fillText(t, 0, this._centerByIndex(e)), this._cache .fillText("/", 0, this._centerByIndex(e + 11)) } }), this._cache.restore(), this._prices = e } } _recreateCanvasAndContext(e) { this._canvas = document.createElement("canvas"), this._canvas.width = e.w * this ._paneRenderParams.pixelRatio, this._canvas.height = e.h * this ._paneRenderParams.pixelRatio, this._cache = Object(r.ensureNotNull)(this ._canvas.getContext("2d")) } _centerByIndex(e) { return Math.round((e + .5) * (this._renderParams.fontSize + 8)) } _topByIndex(e) { return Math.round(e * (this._renderParams.fontSize + 8)) } } }, "2bPF": function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("7KDR").Action, n = i("Ocx9").DefaultProperty, o = i("k9/m").PlotRowSearchMode, a = i("Ye2/").LineToolBarsPatternMode; class l extends s { constructor(e, t) { var s = t || l.createProperties(); super(e, s), s.mirrored.listeners().subscribe(this, l.prototype.mirror), s.flipped .listeners().subscribe(this, l.prototype.flip), this._scaleCoeff = 1, this .version = l.version, this._pattern = [], this._properties.mode.listeners() .subscribe(this, l.prototype.onModeChanged), i.e("lt-pane-views").then(i.t.bind( null, "c6sA", 7)).then(({ BarsPatternPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } isSynchronizable() { return !1 } onModeChanged() { var e = this.patternPriceDiff(); e *= this._pressCoeff, this._points[1].price = this._timePoint[1].price = this ._points[0].price + e } additionalActions(e) { var t = this; return [new r({ checked: this.properties().mirrored.value(), checkable: !0, label: window.t("Mirrored"), payload: { target: this }, onExecute: function(t) { var i = t.getPayload().target; e.setProperty(i.properties().mirrored, !i.properties() .mirrored.value(), "Bats Pattern Mirroring"), i .updateAllViews(), i._model.updateSource(i) } }), new r({ checked: this.properties().flipped.value(), checkable: !0, label: window.t("Flipped"), payload: { target: this }, onExecute: function(t) { var i = t.getPayload().target; e.setProperty(i.properties().flipped, !i.properties() .flipped.value(), "Bats Pattern Flipping"), i .updateAllViews(), i._model.updateSource(i) } }), new r({ checkable: !0, label: window.t("Restore Size"), onExecute: function(i) { var s = t.points()[0], r = t.patternPriceDiff(), n = s.price + r, o = s.index + t._pattern.length - 1; e.startChangingLinetool(t, { price: n, index: o }, 1, {}), e.changeLinePoint({ price: n, index: o }, {}), e.endChangingLinetool() } })] } pointsCount() { return 2 } _preparePoint(e, t) { e = this._alignPointToRangeOfActualData(e); var i = this._model.mainSeries(); this.properties().mode.value() === a.Bars ? e.price = i.bars().valueAt(e.index)[ TradingView.HIGH_PLOT] : e.price = i.bars().valueAt(e.index)[TradingView .CLOSE_PLOT]; var r = this.priceScale(), n = this.ownerSource().firstValue(), o = .05 * r.height(), l = r.priceToCoordinate(e.price, n) - o; return e.price = r.coordinateToPrice(l, n), s.prototype._preparePoint.call(this, e, t) } state(e) { var t = s.prototype.state.call(this, e); return t.pattern = this._pattern, t } restoreData(e) { e.pattern && (this._pattern = e.pattern) } name() { return "Bars Pattern" } hasEditableCoordinates() { return !1 } cloneData(e) { this._pattern = TradingView.clone(e._pattern) } mirror() { for (var e = this._pattern, t = e[0][TradingView.HIGH_PLOT], i = Math.min(e[0][ TradingView.LOW_PLOT ], e[0][TradingView.HIGH_PLOT]), s = Math.max(e[0][TradingView.LOW_PLOT], e[ 0][TradingView.HIGH_PLOT]), r = 1; r < e.length; r++) i = Math.min(i, e[r][ TradingView.LOW_PLOT ]), s = Math.max(s, e[r][TradingView.HIGH_PLOT]); if (i < s) { var n = (i + s) / 2, o = function(e) { return n - (e - n) }; for (r = 0; r < e.length; r++) e[r][TradingView.HIGH_PLOT] = o(e[r][TradingView .HIGH_PLOT ]), e[r][TradingView.LOW_PLOT] = o(e[r][TradingView.LOW_PLOT]), e[r][ TradingView.OPEN_PLOT ] = o(e[r][TradingView.OPEN_PLOT]), e[r][TradingView.CLOSE_PLOT] = o(e[r][ TradingView.CLOSE_PLOT ]) } var a = e[0][TradingView.HIGH_PLOT] - t, l = e[e.length - 1][TradingView.LOW_PLOT] - e[0][TradingView.HIGH_PLOT]; this._points[0].price += a, this._points[1].price = this._points[0].price + l, this .updateAllViews() } flip() { this._points[0].price = this._points[1].price; for (var e = 0; e < this._pattern.length / 2; e++) { var t = this._pattern[e]; this._pattern[e] = this._pattern[this._pattern.length - e - 1], this._pattern[ this._pattern.length - e - 1] = t } var i = this._pattern[this._pattern.length - 1][TradingView.LOW_PLOT] - this ._pattern[0][TradingView.HIGH_PLOT]; this._points[1].price = this._points[0].price + i, this.updateAllViews() } firstPatternPrice() { var e = parseInt(this.properties().mode.value(), 10); if (e === a.LineHL2) return (this._pattern[0][TradingView.HIGH_PLOT] + this ._pattern[0][TradingView.LOW_PLOT]) / 2; var t = { 0: TradingView.HIGH_PLOT, 1: TradingView.CLOSE_PLOT, 2: TradingView.OPEN_PLOT, 3: TradingView.OPEN_PLOT, 4: TradingView.HIGH_PLOT, 5: TradingView.LOW_PLOT } [e]; return this._pattern[0][t] } lastPatternPrice() { var e = parseInt(this.properties().mode.value(), 10); if (e === a.LineHL2) return (this._pattern[this._pattern.length - 1][TradingView .HIGH_PLOT ] + this._pattern[this._pattern.length - 1][TradingView.LOW_PLOT]) / 2; var t = { 0: TradingView.LOW_PLOT, 1: TradingView.CLOSE_PLOT, 2: TradingView.CLOSE_PLOT, 3: TradingView.OPEN_PLOT, 4: TradingView.HIGH_PLOT, 5: TradingView.LOW_PLOT } [e]; return this._pattern[this._pattern.length - 1][t] } patternPriceDiff() { return this.lastPatternPrice() - this.firstPatternPrice() } pressCoeff() { var e = this.patternPriceDiff(), t = this.points()[0].price, i = (this.points()[1].price - t) / e; return this._pressCoeff = i, i } addPoint(e, t) { var i = s.prototype.addPoint.call(this, e, t, !0); if (i) { var r = Math.min(this.points()[0].index, this.points()[1].index), n = Math.max(this.points()[0].index, this.points()[1].index), a = this._model.mainSeries().nearestIndex(r, o.NearestRight), l = this._model.mainSeries().nearestIndex(n, o.NearestLeft); this.points()[0].index > this.points()[1].index && (this._points[0].price = this ._points[1].price), this._pattern = []; for (var c = a; c <= l; c++) { var h = this._model.mainSeries().data().valueAt(c); this._pattern.push(TradingView.clone(h)) } if (this._pattern.length > 0) { var u = this.patternPriceDiff(); this._points[1].price = this._points[0].price + u, this._points[1].index = this._points[0].index + (l - a), this .normalizePoints(), this.createServerPoints() } } return i } setPoint(e, t, i) { 1 === e && t.index <= this._points[0].index && (t.index = this._points[0].index + 1), 0 === e && t.index >= this._points[1].index && (t.index = this._points[ 1] .index - 1), super.setPoint(e, t, i) } migrateVersion(e, t, i) { if (1 === e && this._pattern.length > 0) { var s = this.patternPriceDiff(); 2 === this._timePoint.length && (this._timePoint[1].price = this._timePoint[0] .price + s), 2 === this._points.length && (this._points[1].price = this ._points[0].price + s) } } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "8ioM"))) .BarsPatternDefinitionsViewModel } static createProperties(e) { var t = new n("linetoolbarspattern", e); return l._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e), e.addExclusion("mirrored"), e.addExclusion("flipped") } } l.version = 2, t.LineToolBarsPattern = l }, "2cgs": function(e, t, i) { "use strict"; var s = i("ocLq"); JSServer.studyLibrary = [{ name: "Accumulation/Distribution", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Accumulation/Distribution", shortDescription: "Accum/Dist", is_price_study: !1, inputs: [], id: "Accumulation/Distribution@tv-basicstudies-1", scriptIdPart: "", name: "Accumulation/Distribution", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t, i, r) { return s.Std.or(s.Std.and(s.Std.eq(e, t), s.Std.eq(e, i)), s.Std.eq( t, i)) ? 0 : (2 * e - i - t) / (t - i) * r }, this.main = function(e, t) { this._context = e, this._input = t; var i = this.f_0(s.Std.close(this._context), s.Std.high(this ._context), s.Std.low(this._context), s.Std.volume(this ._context)); return [s.Std.cum(i, this._context)] } } }, { name: "Accumulative Swing Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "ASI", histogramBase: 0, joinPoints: !1 } }, description: "Accumulative Swing Index", shortDescription: "ASI", is_price_study: !1, inputs: [{ id: "in_0", name: "Limit Move Value", defval: 10, type: "float", min: .1, max: 1e5 }], id: "Accumulative Swing Index@tv-basicstudies-1", scriptIdPart: "", name: "Accumulative Swing Index", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t) { var i = t.new_var(s.Std.open(t)), r = t.new_var(s.Std.high(t)), n = t.new_var(s.Std.low(t)), o = t.new_var(s.Std.close(t)), a = s.Std.abs(r - o.get(1)), l = s.Std.abs(n - o.get(1)), c = s.Std.abs(r - n), h = s.Std.abs(o.get(1) - i.get(1)), u = s.Std.max(a, l), d = s.Std.iff(a >= s.Std.max(l, c), a - .5 * l + .25 * h, s.Std .iff(l >= s.Std.max(a, c), l - .5 * a + .25 * h, c + .25 * h)); return s.Std.iff(0 === d, 0, (o - o.get(1) + .5 * (o - i) + .25 * (o .get(1) - i.get(1))) / d * u / e * 50) }, this.f_1 = function(e, t) { var i = this.f_0(e, t); return s.Std.cum(i, t) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0); return [this.f_1(i, this._context)] } } }, { name: "Advance/Decline", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Advance/Decline", shortDescription: "AD", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 10, type: "integer", min: 1, max: 2e3 }], id: "Advance/Decline@tv-basicstudies-1", scriptIdPart: "", name: "Advance/Decline", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t) { return s.Std.gt(e, t) }, this.f_1 = function(e, t) { return s.Std.lt(e, t) }, this.f_2 = function(e, t) { return 0 === t ? e : e / t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this.f_0(s.Std.close(this._context), s.Std.open(this ._context)), n = this._context.new_var(r), o = s.Std.sum(n, i, this._context), a = this.f_1(s.Std.close(this._context), s.Std.open(this ._context)), l = this._context.new_var(a), c = s.Std.sum(l, i, this._context); return [this.f_2(o, c)] } } }, { name: "Arnaud Legoux Moving Average", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9, in_1: .85, in_2: 6 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Arnaud Legoux Moving Average", shortDescription: "ALMA", is_price_study: !0, inputs: [{ id: "in_0", name: "Window Size", defval: 9, type: "integer", min: 0, max: 5e3 }, { id: "in_1", name: "Offset", defval: .85, type: "float", min: -1e12, max: 1e12 }, { id: "in_2", name: "Sigma", defval: 6, type: "float", min: -1e12, max: 1e12 }], id: "Arnaud Legoux Moving Average@tv-basicstudies-1", scriptIdPart: "", name: "Arnaud Legoux Moving Average", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._input(2), a = this._context.new_var(i); return [s.Std.alma(a, r, n, o)] } } }, { name: "Aroon", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FB8C00" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "Upper", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Lower", histogramBase: 0, joinPoints: !1 } }, description: "Aroon", shortDescription: "Aroon", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 14, type: "integer", min: 1, max: 2e3 }], id: "Aroon@tv-basicstudies-1", scriptIdPart: "", name: "Aroon", format: { precision: 2, type: "percent" } }, constructor: function() { this.f_0 = function(e, t) { return 100 * (e + t) / t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.high(this._context), n = i + 1, o = this._context.new_var(r), a = s.Std.highestbars(o, n, this._context), l = this.f_0(a, i), c = s.Std.low(this._context), h = this._context.new_var(c), u = s.Std.lowestbars(h, n, this._context); return [l, this.f_0(u, i)] } } }, { name: "Average Price", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, id: "AveragePrice@tv-basicstudies-1", scriptIdPart: "", name: "Average Price", description: "Average Price", shortDescription: "Average Price", is_price_study: !0, plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#2196F3" } }, inputs: {} }, styles: { plot_0: { title: "Plot" } }, inputs: [], format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { return this._context = e, this._input = t, [s.Std.ohlc4(this ._context)] } } }, { name: "Average Directional Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF5252" } }, inputs: { in_0: 14, in_1: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "ADX", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Average Directional Index", shortDescription: "ADX", is_price_study: !1, inputs: [{ id: "in_0", name: "ADX Smoothing", defval: 14, type: "integer", min: -1e12, max: 1e12 }, { id: "in_1", name: "DI Length", defval: 14, type: "integer", min: -1e12, max: 1e12 }], id: "average_directional_Index@tv-basicstudies-1", scriptIdPart: "", name: "Average Directional Index", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e) { var t = this._context.new_var(s.Std.high(this._context)), i = s.Std.change(t), r = this._context.new_var(s.Std.low(this._context)), n = -s.Std.change(r), o = this._context.new_var(s.Std.tr(void 0, this._context)), a = s.Std.rma(o, e, this._context), l = this._context.new_var(s.Std.and(s.Std.gt(i, n), s.Std.gt(i, 0)) ? i : 0), c = s.Std.fixnan(100 * s.Std.rma(l, e, this._context) / a, this ._context), h = this._context.new_var(s.Std.and(s.Std.gt(n, i), s.Std.gt(n, 0)) ? n : 0); return [c, s.Std.fixnan(100 * s.Std.rma(h, e, this._context) / a, this._context)] }, this.f_1 = function(e, t) { var i = this.f_0(e), r = i[0], n = i[1], o = r + n, a = this._context.new_var(s.Std.abs(r - n) / (s.Std.eq(o, 0) ? 1 : o)); return [100 * s.Std.rma(a, t, this._context)] }, this.main = function(e, t) { return this._context = e, this._input = t, this._context .setMinimumAdditionalDepth(this._input(0) + this._input(1)), this.f_1(this._input(0), this._input(1)) } } }, { name: "Average True Range", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#B71C1C" } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Average True Range", shortDescription: "ATR", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 14, type: "integer", min: 1, max: 2e3 }], id: "Average True Range@tv-basicstudies-1", scriptIdPart: "", name: "Average True Range", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.tr(this._context), n = this._context.new_var(r); return [s.Std.rma(n, i, this._context)] } } }, { name: "Awesome Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 1, trackPrice: !1, transparency: 0, visible: !0, color: "#000080" } }, palettes: { palette_0: { colors: { 0: { color: "#F44336", width: 1, style: 0 }, 1: { color: "#009688", width: 1, style: 0 } } } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", palette: "palette_0", target: "plot_0", type: "colorer" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Awesome Oscillator", shortDescription: "AO", is_price_study: !1, palettes: { palette_0: { colors: { 0: { name: "Color 0" }, 1: { name: "Color 1" } } } }, inputs: [], id: "Awesome Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Awesome Oscillator", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e - t }, this.f_1 = function(e) { return s.Std.le(e, 0) ? 0 : 1 }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.hl2(this._context), r = this._context.new_var(i), n = s.Std.sma(r, 5, this._context), o = this._context.new_var(i), a = s.Std.sma(o, 34, this._context), l = this.f_0(n, a), c = l, h = this._context.new_var(l), u = s.Std.change(h); return [c, this.f_1(u)] } } }, { name: "Balance of Power", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF5252" } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Balance of Power", shortDescription: "Balance of Power", is_price_study: !1, inputs: [], id: "Balance of Power@tv-basicstudies-1", scriptIdPart: "", name: "Balance of Power", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t, i, s) { return (e - t) / (i - s) }, this.main = function(e, t) { return this._context = e, this._input = t, [this.f_0(s.Std.close( this._context), s.Std.open(this._context), s.Std .high(this._context), s.Std.low(this._context))] } } }, { name: "Bollinger Bands", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 95, visible: !0 } }, inputs: { in_0: 20, in_1: 2 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Median", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Upper", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Lower", histogramBase: 0, joinPoints: !1 } }, description: "Bollinger Bands", shortDescription: "BB", is_price_study: !0, filledAreas: [{ id: "fill_0", objAId: "plot_1", objBId: "plot_2", type: "plot_plot", title: "Plots Background" }], inputs: [{ id: "in_0", name: "length", defval: 20, type: "integer", min: 1, max: 1e4 }, { id: "in_1", name: "mult", defval: 2, type: "float", min: .001, max: 50 }], id: "Bollinger Bands@tv-basicstudies-1", scriptIdPart: "", name: "Bollinger Bands", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e * t }, this.f_1 = function(e, t) { return e + t }, this.f_2 = function(e, t) { return e - t }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._context.new_var(i), a = s.Std.sma(o, r, this._context), l = this._context.new_var(i), c = s.Std.stdev(l, r, this._context), h = this.f_0(n, c); return [a, this.f_1(a, h), this.f_2(a, h)] } } }, { name: "Bollinger Bands %B", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#26A69A" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 1 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], filledAreasStyle: { fill_0: { color: "#26A69A", transparency: 90, visible: !0 } }, inputs: { in_0: 20, in_1: 2 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Bollinger Bands %B", shortDescription: "BB %B", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "length", defval: 20, type: "integer", min: 1, max: 1e4 }, { id: "in_1", name: "mult", defval: 2, type: "float", min: .001, max: 50 }], id: "Bollinger Bands %B@tv-basicstudies-1", scriptIdPart: "", name: "Bollinger Bands %B", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t) { return e * t }, this.f_1 = function(e, t) { return e + t }, this.f_2 = function(e, t) { return e - t }, this.f_3 = function(e, t, i) { return (e - t) / (i - t) }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._context.new_var(i), a = s.Std.sma(o, r, this._context), l = this._context.new_var(i), c = s.Std.stdev(l, r, this._context), h = this.f_0(n, c), u = this.f_1(a, h), d = this.f_2(a, h); return [this.f_3(i, d, u)] } } }, { name: "Bollinger Bands Width", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, inputs: { in_0: 20, in_1: 2 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Bollinger Bands Width", shortDescription: "BBW", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 20, type: "integer", min: 1, max: 1e4 }, { id: "in_1", name: "mult", defval: 2, type: "float", min: .001, max: 50 }], id: "Bollinger Bands Width@tv-basicstudies-1", scriptIdPart: "", name: "Bollinger Bands Width", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t) { return e * t }, this.f_1 = function(e, t) { return e + t }, this.f_2 = function(e, t) { return e - t }, this.f_3 = function(e, t, i) { return (e - t) / i }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._context.new_var(i), a = s.Std.sma(o, r, this._context), l = this._context.new_var(i), c = s.Std.stdev(l, r, this._context), h = this.f_0(n, c), u = this.f_1(a, h), d = this.f_2(a, h); return [this.f_3(u, d, a)] } } }, { name: "Chaikin Money Flow", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 20 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Chaikin Money Flow", shortDescription: "CMF", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "length", defval: 20, type: "integer", min: 1, max: 2e3 }], id: "Chaikin Money Flow@tv-basicstudies-1", scriptIdPart: "", name: "Chaikin Money Flow", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t, i, r) { return s.Std.or(s.Std.and(s.Std.eq(e, t), s.Std.eq(e, i)), s.Std.eq( t, i)) ? 0 : (2 * e - i - t) / (t - i) * r }, this.f_1 = function(e, t) { return e / t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this.f_0(s.Std.close(this._context), s.Std.high(this ._context), s.Std.low(this._context), s.Std.volume(this ._context)), n = this._context.new_var(r), o = s.Std.sum(n, i, this._context), a = s.Std.volume(this._context), l = this._context.new_var(a), c = s.Std.sum(l, i, this._context); return [this.f_1(o, c)] } } }, { name: "Chaikin Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#EC407A" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 3, in_1: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Chaikin Oscillator", shortDescription: "Chaikin Osc", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "short", defval: 3, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "long", defval: 10, type: "integer", min: 1, max: 2e3 }], id: "Chaikin Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Chaikin Oscillator", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t) { return e - t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.accdist(this._context), o = this._context.new_var(n), a = s.Std.ema(o, i, this._context), l = this._context.new_var(n), c = s.Std.ema(l, r, this._context); return [this.f_0(a, c)] } } }, { name: "Chaikin Volatility", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Chaikin Volatility@tv-basicstudies-1", scriptIdPart: "", name: "Chaikin Volatility", description: "Chaikin Volatility", shortDescription: "Chaikin Volatility", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#AB47BC" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { periods: 10, rocLookback: 10 } }, styles: { plot_0: { title: "Plot" } }, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "periods", type: "integer", name: "Periods" }, { id: "rocLookback", type: "integer", name: "Rate of Change Lookback" }], format: { type: "volume" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.rocLookback = this._input(1) }, this.main = function(e, t) { this._context = e, this._input = t, this._context .setMinimumAdditionalDepth(this.period + this.rocLookback); var i = this._context.new_var(s.Std.high(this._context) - s.Std.low( this._context)), r = this._context.new_var(s.Std.ema(i, this.period, this ._context)); return [s.Std.roc(r, this.rocLookback)] } } }, { name: "Chande Kroll Stop", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, inputs: { in_0: 10, in_1: 1, in_2: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "Long", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Short", histogramBase: 0, joinPoints: !1 } }, description: "Chande Kroll Stop", shortDescription: "Chande Kroll Stop", is_price_study: !0, inputs: [{ id: "in_0", name: "p", defval: 10, type: "integer", min: 1, max: 4999 }, { id: "in_1", name: "x", defval: 1, type: "integer", min: 1, max: 1e12 }, { id: "in_2", name: "q", defval: 9, type: "integer", min: 1, max: 1e12 }], id: "Chande Kroll Stop@tv-basicstudies-1", scriptIdPart: "", name: "Chande Kroll Stop", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t, i) { return e - t * i }, this.f_1 = function(e, t, i) { return e + t * i }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2), o = s.Std.high(this._context), a = this._context.new_var(o), l = s.Std.highest(a, i, this._context), c = s.Std.atr(i, this._context), h = this.f_0(l, r, c), u = this._context.new_var(o), d = s.Std.lowest(u, i, this._context), p = this.f_1(d, r, c), _ = this._context.new_var(h), m = s.Std.highest(_, n, this._context), f = this._context.new_var(p); return [s.Std.lowest(f, n, this._context), m] } } }, { name: "Chande Momentum Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Chande Momentum Oscillator", shortDescription: "ChandeMO", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 9, type: "integer", min: 1, max: 2e3 }], id: "Chande Momentum Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Chande Momentum Oscillator", format: { type: "price", precision: 2 } }, constructor: function() { this.f_0 = function(e) { return s.Std.ge(e, 0) ? e : 0 }, this.f_1 = function(e) { return s.Std.ge(e, 0) ? 0 : -e }, this.f_2 = function(e, t) { return 100 * e / t }, this.f_3 = function(e, t) { return this.f_2(e - t, e + t) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.close(this._context), n = this._context.new_var(r), o = s.Std.change(n), a = this.f_0(o), l = this.f_1(o), c = this._context.new_var(a), h = s.Std.sum(c, i, this._context), u = this._context.new_var(l), d = s.Std.sum(u, i, this._context); return [this.f_3(h, d)] } } }, { name: "Chop Zone", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 5, trackPrice: !1, transparency: 0, visible: !0, color: "#000080" } }, palettes: { palette_0: { colors: { 0: { color: "#26C6DA", width: 1, style: 0 }, 1: { color: "#43A047", width: 1, style: 0 }, 2: { color: "#A5D6A7", width: 1, style: 0 }, 3: { color: "#009688", width: 1, style: 0 }, 4: { color: "#D50000", width: 1, style: 0 }, 5: { color: "#E91E63", width: 1, style: 0 }, 6: { color: "#FF6D00", width: 1, style: 0 }, 7: { color: "#FFB74D", width: 1, style: 0 }, 8: { color: "#FDD835", width: 1, style: 0 } } } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", palette: "palette_0", target: "plot_0", type: "colorer" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Chop Zone", shortDescription: "Chop Zone", is_price_study: !1, palettes: { palette_0: { colors: { 0: { name: "Color 0" }, 1: { name: "Color 1" }, 2: { name: "Color 2" }, 3: { name: "Color 3" }, 4: { name: "Color 4" }, 5: { name: "Color 5" }, 6: { name: "Color 6" }, 7: { name: "Color 7" }, 8: { name: "Color 8" } }, valToIndex: { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 } } }, inputs: [], id: "chop_zone@tv-basicstudies-1", scriptIdPart: "", name: "Chop Zone", format: { precision: 0, type: "price" } }, constructor: function() { this.f_0 = function() { var e = s.Std.close(this._context), t = s.Std.hlc3(this._context), i = this._context.new_var(s.Std.high(this._context)), r = s.Std.highest(i, 30, this._context), n = s.Std.lowest(i, 30, this._context), o = 25 / (r - n) * n, a = this._context.new_var(e), l = this._context.new_var(s.Std.ema(a, 34, this._context)), c = (l.get(1) - l.get(0)) / t * o, h = s.Std.sqrt(1 + c * c), u = s.Std.round(180 * s.Std.acos(1 / h) / 3.141592653589793), d = s.Std.iff(s.Std.gt(c, 0), -u, u), p = s.Std.and(s.Std.gt(d, -2.14), s.Std.le(d, -.71)) ? 7 : 8, _ = s.Std.and(s.Std.gt(d, -3.57), s.Std.le(d, -2.14)) ? 6 : p, m = s.Std.and(s.Std.gt(d, -5), s.Std.le(d, -3.57)) ? 5 : _, f = s.Std.le(d, -5) ? 4 : m, g = s.Std.and(s.Std.lt(d, 2.14), s.Std.ge(d, .71)) ? 3 : f, b = s.Std.and(s.Std.lt(d, 3.57), s.Std.ge(d, 2.14)) ? 2 : g, v = s.Std.and(s.Std.lt(d, 5), s.Std.ge(d, 3.57)) ? 1 : b; return [1, s.Std.ge(d, 5) ? 0 : v] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_0() } } }, { name: "Choppiness Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 61.8 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 38.2 }], filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 90, visible: !0 } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Choppiness Index", shortDescription: "CHOP", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "length", defval: 14, type: "integer", min: 1, max: 2e3 }], id: "Choppiness Index@tv-basicstudies-1", scriptIdPart: "", name: "Choppiness Index", format: { type: "price", precision: 2 } }, constructor: function() { this.f_0 = function(e, t, i, r) { return 100 * s.Std.log10(e / (t - i)) / r }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.atr(1, this._context), n = this._context.new_var(r), o = s.Std.sum(n, i, this._context), a = s.Std.high(this._context), l = this._context.new_var(a), c = s.Std.highest(l, i, this._context), h = s.Std.low(this._context), u = this._context.new_var(h), d = s.Std.lowest(u, i, this._context), p = s.Std.log10(i); return [this.f_0(o, c, d, p)] } } }, { name: "Commodity Channel Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, smoothedMA: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !1 } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 100 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: -100 }], filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 90, visible: !0 } }, inputs: { in_0: 20, smoothingLine: "SMA", smoothingLength: 20 } }, plots: [{ id: "plot_0", type: "line" }, { id: "smoothedMA", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, smoothedMA: { title: "Smoothed MA", histogramBase: 0, joinPoints: !1 } }, description: "Commodity Channel Index", shortDescription: "CCI", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "length", defval: 20, type: "integer", min: 1, max: 2e3 }, { id: "smoothingLine", name: "Smoothing Line", defval: "SMA", type: "text", options: ["SMA", "EMA", "WMA"] }, { id: "smoothingLength", name: "Smoothing Length", defval: 20, type: "integer", min: 1, max: 1e4 }], id: "Commodity Channel Index@tv-basicstudies-1", scriptIdPart: "", name: "Commodity Channel Index", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t, i) { return (e - t) / (.015 * i) }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.hlc3(this._context), r = this._input(0), n = this._input(1), o = this._input(2); this._context.setMinimumAdditionalDepth(r + o); var a, l = this._context.new_var(i), c = s.Std.sma(l, r, this._context), h = this._context.new_var(i), u = s.Std.dev(h, r, this._context), d = this.f_0(i, c, u), p = this._context.new_var(d); return "EMA" === n ? a = s.Std.ema(p, o, this._context) : "WMA" === n ? a = s.Std.wma(p, o, this._context) : "SMA" === n && (a = s .Std.sma(p, o, this._context)), [d, a] } } }, { name: "Connors RSI", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 70 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 30 }], filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 90, visible: !0 } }, inputs: { in_0: 3, in_1: 2, in_2: 100 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "CRSI", histogramBase: 0, joinPoints: !1 } }, description: "Connors RSI", shortDescription: "CRSI", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "RSI Length", defval: 3, type: "integer", min: 1 }, { id: "in_1", name: "UpDown Length", defval: 2, type: "integer", min: 1 }, { id: "in_2", name: "ROC Length", defval: 100, type: "integer", min: 1 }], id: "Connors RSI@tv-basicstudies-1", scriptIdPart: "", name: "Connors RSI", format: { precision: 2, type: "price" } }, constructor: function() { var e; this.f_1 = function(e, t, i) { var r = i.new_var(s.Std.max(s.Std.change(e), 0)); return s.Std.rma(r, t, i) }, this.f_2 = function(e, t, i) { var r = i.new_var(-s.Std.min(s.Std.change(e), 0)); return s.Std.rma(r, t, i) }, this.f_3 = (e = 0, function(t) { var i = t.get(0), r = t.get(1); return e = i === r ? 0 : i > r ? s.Std.nz(e) <= 0 ? 1 : s.Std .nz(e) + 1 : s.Std.nz(e) >= 0 ? -1 : s.Std.nz(e) - 1, this ._context.new_var(e) }), this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._context.new_var(i), n = this._input(0), o = this._input(1), a = this._input(2); this._context.setMinimumAdditionalDepth(a); var l = s.Std.rsi(this.f_1(r, n, this._context), this.f_2(r, n, this ._context)), c = this.f_3(r), h = s.Std.rsi(this.f_1(c, o, this._context), this.f_2(c, o, this ._context)), u = this._context.new_var(s.Std.roc(r, 1)), d = s.Std.percentrank(u, a); return [s.Std.avg(l, h, d)] } } }, { name: "Coppock Curve", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10, in_1: 14, in_2: 11 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Coppock Curve", shortDescription: "Coppock Curve", is_price_study: !1, inputs: [{ id: "in_0", name: "WMA Length", defval: 10, type: "integer", min: -1e12, max: 5e3 }, { id: "in_1", name: "Long RoC Length", defval: 14, type: "integer", min: 1, max: 4999 }, { id: "in_2", name: "Short RoC Length", defval: 11, type: "integer", min: 1, max: 4999 }], id: "Coppock Curve@tv-basicstudies-1", scriptIdPart: "", name: "Coppock Curve", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e + t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2); this._context.setMinimumAdditionalDepth(i + Math.max(r, n)); var o = s.Std.close(this._context), a = this._context.new_var(o), l = s.Std.roc(a, r), c = this._context.new_var(o), h = s.Std.roc(c, n), u = this.f_0(l, h), d = this._context.new_var(u); return [s.Std.wma(d, i, this._context)] } } }, { name: "Correlation Coeff", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 4, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: "AAPL", in_1: 20 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Correlation Coefficient", shortDescription: "CC", is_price_study: !1, inputs: [{ id: "in_0", name: "sym", defval: "AAPL", type: "symbol" }, { id: "in_1", name: "length", defval: 20, type: "integer", min: 1, max: 2e3 }], id: "Correlation Coeff@tv-basicstudies-1", scriptIdPart: "", name: "Correlation Coeff", format: { precision: 2, type: "price" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this._context.new_sym(this ._input(0), s.Std.period(this._context)) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_unlimited_var(this._context.symbol.time), r = (this._input(0), s.Std.period(this._context), s.Std.close( this._context)), n = this._input(1); this._context.select_sym(1); var o = this._context.new_unlimited_var(this._context.symbol.time), a = s.Std.close(this._context), l = this._context.new_unlimited_var(a); this._context.select_sym(0); var c = l.adopt(o, i, 0), h = this._context.new_var(r), u = this._context.new_var(c); return [s.Std.correlation(h, u, n, this._context)] } } }, { name: "Correlation - Log", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Correlation - Log@tv-basicstudies-1", scriptIdPart: "", name: "Correlation - Log", description: "Correlation - Log", shortDescription: "Correlation - Log", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#2196F3" } }, inputs: { instrument: "INTC", instrument2: "AMZN", periods: 25 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "instrument", name: "Instrument 1", type: "symbol", defval: "INTC", confirm: !0 }, { id: "instrument2", name: "Instrument 2", type: "symbol", defval: "AMZN", confirm: !0 }, { id: "periods", name: "Periods", type: "integer", defval: 25 }], format: { precision: 2, type: "price" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this._context.new_sym(this ._input(0), s.Std.period(this._context)), this._context .new_sym(this._input(1), s.Std.period(this._context)), this .period = this._input(2) }, this.correlationLog = function(e, t, i, r) { var n = s.Std.sma(e, i, r), o = s.Std.sma(t, i, r), a = r.new_var(e.get() * t.get()); return (s.Std.sma(a, i, r) - n * o) / Math.sqrt(s.Std.variance2(e, n, i) * s.Std.variance2(t, o, i)) }, this.main = function(e, t) { this._context = e, this._input = t, this._context.select_sym(1); var i = this._context.new_var(this._context.symbol.time); this._context.select_sym(2); var r = this._context.new_var(s.Std.close(this._context)), n = this._context.new_var(s.Std.log(r.get() / r.get(1))), o = this._context.new_var(this._context.symbol.time); this._context.select_sym(1); var a = this._context.new_var(s.Std.close(this._context)), l = this._context.new_var(s.Std.log(a.get() / a.get(1))), c = this._context.new_var(n.adopt(o, i, 0)), h = this.correlationLog(l, c, this.period, this._context); return [s.Std.round(1e3 * h) / 1e3] } } }, { name: "Detrended Price Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 21, in_1: !1 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "DPO", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Detrended Price Oscillator", shortDescription: "DPO", is_price_study: !1, is_hidden_study: !1, id: "detrended_price_oscillator@tv-basicstudies-1", bands: [{ id: "hline_0", name: "Zero", isHidden: !1 }], inputs: [{ id: "in_0", name: "Period", defval: 21, type: "integer", min: 1, max: 1e12 }, { id: "in_1", name: "isCentered", defval: !1, type: "bool" }], scriptIdPart: "", name: "Detrended Price Oscillator", format: { type: "price", precision: 2 } }, constructor: function() { this.f_0 = function() { var e = this._input(0), t = this._input(1), i = Math.floor(e / 2 + 1); this._context.setMinimumAdditionalDepth(e + i); var r = this._context.new_var(s.Std.close(this._context)), n = this._context.new_var(s.Std.sma(r, e, this._context)), o = this._context.new_var(s.Std.close(this._context)).get(i) - n, a = s.Std.close(this._context) - n.get(i); return [t ? o : a, t ? -i : 0] }, this.main = function(e, t) { this._context = e, this._input = t; var i = this.f_0(); return [{ value: i[0], offset: i[1] }] } } }, { name: "Directional Movement Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F50057" } }, inputs: { in_0: 14, in_1: 14 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "+DI", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "-DI", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "ADX", histogramBase: 0, joinPoints: !1 } }, description: "Directional Movement", shortDescription: "DMI", is_price_study: !1, inputs: [{ id: "in_0", name: "DI Length", defval: 14, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "ADX Smoothing", defval: 14, type: "integer", min: 1, max: 50 }], id: "Directional Movement Index@tv-basicstudies-1", scriptIdPart: "", name: "Directional Movement Index", format: { precision: 4, type: "price" } }, constructor: function() { this.f_0 = function(e) { return -e }, this.f_1 = function(e, t) { return s.Std.and(s.Std.gt(e, t), s.Std.gt(e, 0)) ? e : 0 }, this.f_2 = function(e, t) { return 100 * e / t }, this.f_3 = function(e, t) { return e + t }, this.f_4 = function(e, t, i) { return s.Std.abs(e - t) / (s.Std.eq(i, 0) ? 1 : i) }, this.f_5 = function(e) { return 100 * e }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1); this._context.setMinimumAdditionalDepth(i + r); var n = s.Std.high(this._context), o = this._context.new_var(n), a = s.Std.change(o), l = s.Std.low(this._context), c = this._context.new_var(l), h = s.Std.change(c), u = this.f_0(h), d = s.Std.tr(this._context), p = this._context.new_var(d), _ = s.Std.rma(p, i, this._context), m = this.f_1(a, u), f = this._context.new_var(m), g = s.Std.rma(f, i, this._context), b = this.f_2(g, _), v = s.Std.fixnan(b, this._context), S = this.f_1(u, a), y = this._context.new_var(S), w = s.Std.rma(y, i, this._context), P = this.f_2(w, _), C = s.Std.fixnan(P, this._context), x = this.f_3(v, C), T = this.f_4(v, C, x), I = this._context.new_var(T), M = s.Std.rma(I, r, this._context); return [v, C, this.f_5(M)] } } }, { name: "Donchian Channels", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 95, visible: !0 } }, inputs: { in_0: 20 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Lower", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Upper", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Basis", histogramBase: 0, joinPoints: !1 } }, description: "Donchian Channels", shortDescription: "DC", is_price_study: !0, filledAreas: [{ id: "fill_0", objAId: "plot_1", objBId: "plot_0", type: "plot_plot", title: "Plots Background" }], inputs: [{ id: "in_0", name: "length", defval: 20, type: "integer", min: 1, max: 2e3 }], id: "Donchian Channels@tv-basicstudies-1", scriptIdPart: "", name: "Donchian Channels", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.low(this._context), n = this._context.new_var(r), o = s.Std.lowest(n, i, this._context), a = s.Std.high(this._context), l = this._context.new_var(a), c = s.Std.highest(l, i, this._context); return [o, c, s.Std.avg(c, o)] } } }, { name: "Double Exponential Moving Average", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" } }, inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Double EMA", shortDescription: "DEMA", is_price_study: !0, inputs: [{ id: "in_0", name: "length", defval: 9, type: "integer", min: 1, max: 1e4 }], id: "Double Exponential Moving Average@tv-basicstudies-1", scriptIdPart: "", name: "Double Exponential Moving Average", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return 2 * e - t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0); this._context.setMinimumAdditionalDepth(2 * i); var r = s.Std.close(this._context), n = this._context.new_var(r), o = s.Std.ema(n, i, this._context), a = this._context.new_var(o), l = s.Std.ema(a, i, this._context); return [this.f_0(o, l)] } } }, { name: "Ease of Movement", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" } }, inputs: { in_0: 1e4, in_1: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Ease Of Movement", shortDescription: "EOM", is_price_study: !1, inputs: [{ id: "in_0", name: "Divisor", defval: 1e4, type: "integer", min: 1, max: 1e9 }, { id: "in_1", name: "length", defval: 14, type: "integer", min: 1, max: 2e3 }], id: "Ease of Movement@tv-basicstudies-1", scriptIdPart: "", name: "Ease of Movement", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t, i, s, r) { return e * t * (i - s) / r }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.hl2(this._context), o = this._context.new_var(n), a = s.Std.change(o), l = this.f_0(i, a, s.Std.high(this._context), s.Std.low(this ._context), s.Std.volume(this._context)), c = this._context.new_var(l); return [s.Std.sma(c, r, this._context)] } } }, { name: "Elders Force Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F44336" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 13 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Elder's Force Index", shortDescription: "EFI", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "length", defval: 13, type: "integer", min: 1, max: 2e3 }], id: "Elders Force Index@tv-basicstudies-1", scriptIdPart: "", name: "Elders Force Index", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t) { return e * t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.close(this._context), n = this._context.new_var(r), o = s.Std.change(n), a = this.f_0(o, s.Std.volume(this._context)), l = this._context.new_var(a); return [s.Std.ema(l, i, this._context)] } } }, { name: "EMA Cross", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" }, plot_2: { linestyle: 0, linewidth: 4, plottype: 3, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9, in_1: 26 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Short", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Long", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Crosses", histogramBase: 0, joinPoints: !1 } }, description: "EMA Cross", shortDescription: "EMA Cross", is_price_study: !0, inputs: [{ id: "in_0", name: "Short", defval: 9, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Long", defval: 26, type: "integer", min: 1, max: 2e3 }], id: "EMA Cross@tv-basicstudies-1", scriptIdPart: "", name: "EMA Cross", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e ? t : s.Std.na() }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.close(this._context), o = this._context.new_var(n), a = s.Std.ema(o, i, this._context), l = this._context.new_var(n), c = s.Std.ema(l, r, this._context), h = a, u = c, d = s.Std.cross(a, c, this._context); return [h, u, this.f_0(d, a)] } } }, { name: "Envelopes", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 95, visible: !0 } }, inputs: { in_0: 20, in_1: 10, in_2: 10, in_3: "Simple", in_4: "close" } }, plots: [{ id: "plot_1", type: "line" }, { id: "plot_0", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Average", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Upper", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Lower", histogramBase: 0, joinPoints: !1 } }, description: "Envelopes", shortDescription: "Envelopes", is_price_study: !0, filledAreas: [{ id: "fill_0", objAId: "plot_1", objBId: "plot_2", type: "plot_plot", title: "Plots Background" }], inputs: [{ id: "in_0", name: "Length", defval: 20, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Upper Percentage", defval: 2, type: "float", min: 0 }, { id: "in_2", name: "Lower Percentage", defval: 2, type: "float", min: 0 }, { id: "in_3", name: "Method", type: "text", defval: "Simple", options: ["Simple", "Exponential", "Weighted"] }, { id: "in_4", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }], id: "Envelope@tv-basicstudies-1", scriptIdPart: "", name: "Envelopes", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e * (1 + t) }, this.f_1 = function(e, t) { return e * (1 - t) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_var(s.Std[this._input(4)](this._context)), r = s.Std.sma(i, this._input(0), this._context); return "Exponential" === this._input(3) ? r = s.Std.ema(i, this ._input(0), this._context) : "Weighted" === this._input( 3) && (r = s.Std.wma(i, this._input(0), this._context)), [ this .f_0(r, this._input(1) / 100), r, this.f_1(r, this._input( 2) / 100) ] } } }, { name: "Standard Error", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Standard Error@tv-basicstudies-1", scriptIdPart: "", name: "Standard Error", description: "Standard Error", shortDescription: "Standard Error", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF6D00" } }, inputs: { length: 14 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "length", type: "integer", name: "Length" }], format: { precision: 2, type: "price" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0) }, this.main = function(e, t) { this._context = e, this._input = t; for (var i, r, n = this._context.new_var(s.Std.close(this ._context)), o = 0, a = 0, l = 0; l < this.period; l++) o += l + 1, a += n.get(l); i = o / this.period, r = a / this.period; var c = 0, h = 0, u = 0; for (l = 0; l < this.period; l++) u += Math.pow(r - n.get(l), 2), h += (i - l - 1) * (r - n.get(l)), c += Math.pow(i - l - 1, 2); return h = Math.pow(h, 2), [Math.sqrt((u - h / c) / (this.period - 2))] } } }, { name: "Standard Error Bands", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !0, id: "Standard Error Bands@tv-basicstudies-1", scriptIdPart: "", name: "Standard Error Bands", description: "Standard Error Bands", shortDescription: "Standard Error Bands", plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, transparency: 0, trackPrice: !1, color: "#2196F3" }, plot_1: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#FF6D00" }, plot_2: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#2196F3" } }, filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 95, visible: !0 } }, inputs: { periods: 21, errors: 2, method: "Simple", averagePeriods: 3 } }, styles: { plot_0: { title: "Plot 1" }, plot_1: { title: "Plot 2" }, plot_2: { title: "Plot 3" } }, filledAreas: [{ id: "fill_0", objAId: "plot_0", objBId: "plot_2", type: "plot_plot", title: "Background" }], inputs: [{ id: "periods", type: "integer", name: "Periods" }, { id: "errors", type: "float", name: "Standard Errors" }, { id: "method", name: "Method", type: "text", defval: "Simple", options: ["Simple", "Exponential", "Weighted"] }, { id: "averagePeriods", type: "integer", name: "Averaging Periods" }], format: { type: "inherit" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.errorDeviation = this._input(1), this.maMethod = this ._input(2), this.averagePeriod = this._input(3) }, this.main = function(e, t) { this._context = e, this._input = t; for (var i, r, n = this._context.new_var(s.Std.close(this ._context)), o = 0, a = 0, l = 0; l < this.period; l++) o += l + 1, a += n.get(l); i = o / this.period, r = a / this.period; var c = 0, h = 0, u = 0; for (l = 0; l < this.period; l++) u += Math.pow(r - n.get(l), 2), h += (i - l - 1) * (r - n.get(l)), c += Math.pow(i - l - 1, 2); h = Math.pow(h, 2); var d, p, _, m = Math.sqrt((u - h / c) / (this.period - 2)), f = s.Std.linreg(n, this.period, 0), g = this._context.new_var(f + this.errorDeviation * m), b = this._context.new_var(f), v = this._context.new_var(f - this.errorDeviation * m); return "Simple" === this.maMethod ? (d = s.Std.sma(g, this .averagePeriod, this._context), p = s.Std.sma(b, this .averagePeriod, this._context), _ = s.Std.sma(v, this .averagePeriod, this._context)) : "Exponential" === this .maMethod ? (d = s.Std.ema(g, this.averagePeriod, this ._context), p = s.Std.ema(b, this.averagePeriod, this ._context), _ = s.Std.ema(v, this.averagePeriod, this ._context)) : (d = s.Std.wma(g, this.averagePeriod, this ._context), p = s.Std.wma(b, this.averagePeriod, this ._context), _ = s.Std.wma(v, this.averagePeriod, this ._context)), [d, p, _] } } }, { name: "Fisher Transform", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, bands: [{ color: "#E91E63", linestyle: 2, linewidth: 1, visible: !0, value: 1.5 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: .75 }, { color: "#E91E63", linestyle: 2, linewidth: 1, visible: !0, value: 0 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: -.75 }, { color: "#E91E63", linestyle: 2, linewidth: 1, visible: !0, value: -1.5 }], inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "Fisher", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_1: { title: "Trigger", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Fisher Transform", shortDescription: "Fisher", is_price_study: !1, bands: [{ id: "hline_0", name: "Level", isHidden: !1 }, { id: "hline_1", name: "Level", isHidden: !1 }, { id: "hline_2", name: "Level", isHidden: !1 }, { id: "hline_3", name: "Level", isHidden: !1 }, { id: "hline_4", name: "Level", isHidden: !1 }], inputs: [{ id: "in_0", name: "Length", defval: 9, type: "integer", min: 1, max: 1e12 }], id: "fisher_transform@tv-basicstudies-1", scriptIdPart: "", name: "Fisher Transform", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e) { var t = s.Std.lt(e, -.99) ? -.999 : e; return [s.Std.gt(e, .99) ? .999 : t] }, this.f_1 = function() { var e = this._input(0), t = this._context.new_var(s.Std.hl2(this._context)), i = s.Std.highest(t, e, this._context), r = this._context.new_var(s.Std.hl2(this._context)), n = s.Std.lowest(r, e, this._context), o = this._context.new_var(), a = this.f_0(.66 * ((s.Std.hl2(this._context) - n) / s.Std.max( i - n, .001) - .5) + .67 * s.Std.nz(o.get(1))); o.set(a[0]); var l = this._context.new_var(); l.set(.5 * s.Std.log((1 + o.get(0)) / s.Std.max(1 - o.get(0), .001)) + .5 * s.Std.nz(l.get(1))); var c = l.get(1); return [l.get(0), c] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_1() } } }, { name: "Historical Volatility", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Historical Volatility", shortDescription: "HV", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 10, type: "integer", min: 1, max: 1e12 }], id: "historical_volatility@tv-basicstudies-1", scriptIdPart: "", name: "Historical Volatility", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function() { var e = this._input(0), t = s.Std.or(s.Std.isintraday(this._context), s.Std.and(s.Std .isdaily(this._context), s.Std.eq(s.Std.interval(this ._context), 1))) ? 1 : 7, i = this._context.new_var(s.Std.close(this._context)), r = this._context.new_var(s.Std.log(s.Std.close(this._context) / i.get(1))); return [100 * s.Std.stdev(r, e, this._context) * s.Std.sqrt(365 / t)] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_0() } } }, { name: "Hull MA", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Hull Moving Average", shortDescription: "HMA", is_price_study: !0, inputs: [{ id: "in_0", name: "length", defval: 9, type: "integer", min: 1, max: 1e4 }], id: "Hull MA@tv-basicstudies-1", scriptIdPart: "", name: "Hull MA", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return 2 * e - t }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = r / 2; this._context.setMinimumAdditionalDepth(Math.ceil(r + n)); var o = this._context.new_var(i), a = s.Std.wma(o, n, this._context), l = this._context.new_var(i), c = s.Std.wma(l, r, this._context), h = this.f_0(a, c), u = s.Std.sqrt(r), d = s.Std.round(u), p = this._context.new_var(h); return [s.Std.wma(p, d, this._context)] } } }, { name: "Ichimoku Cloud", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#B71C1C" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" }, plot_3: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#A5D6A7" }, plot_4: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#EF9A9A" } }, palettes: { palette_0: { colors: { 0: { color: "#43A047", width: 1, style: 0 }, 1: { color: "#F44336", width: 1, style: 0 } } } }, filledAreasStyle: { fill_0: { color: "#000080", transparency: 90, visible: !0 } }, inputs: { in_0: 9, in_1: 26, in_2: 52, in_3: 26 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }, { id: "plot_3", type: "line" }, { id: "plot_4", type: "line" }, { id: "plot_5", palette: "palette_0", target: "fill_0", type: "colorer" }], styles: { plot_0: { title: "Conversion Line", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_1: { title: "Base Line", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_2: { title: "Lagging Span", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_3: { title: "Lead 1", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_4: { title: "Lead 2", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Ichimoku Cloud", shortDescription: "Ichimoku", is_price_study: !0, is_hidden_study: !1, id: "Ichimoku Cloud@tv-basicstudies-1", palettes: { palette_0: { colors: { 0: { name: "Color 0" }, 1: { name: "Color 1" } }, valToIndex: { 0: 0, 1: 1 } } }, filledAreas: [{ id: "fill_0", objAId: "plot_3", objBId: "plot_4", type: "plot_plot", title: "Plots Background", isHidden: !1, palette: "palette_0" }], inputs: [{ id: "in_0", name: "Conversion Line Periods", defval: 9, type: "integer", min: 1, max: 1e12 }, { id: "in_1", name: "Base Line Periods", defval: 26, type: "integer", min: 1, max: 1e12 }, { id: "in_2", name: "Lagging Span 2 Periods", defval: 52, type: "integer", min: 1, max: 1e12 }, { id: "in_3", name: "Displacement", defval: 26, type: "integer", min: 1, max: 1e12 }], scriptIdPart: "", name: "Ichimoku Cloud", format: { type: "inherit" } }, constructor: function() { this.donchian = function(e) { var t = this._context.new_var(s.Std.low(this._context)), i = this._context.new_var(s.Std.high(this._context)); return s.Std.avg(s.Std.lowest(t, e, this._context), s.Std.highest(i, e, this._context)) }, this.f_1 = function() { var e = this._input(0), t = this._input(1), i = this._input(2), r = this._input(3), n = this.donchian(e), o = this.donchian(t), a = s.Std.avg(n, o), l = this.donchian(i); return [n, o, s.Std.close(this._context), a, l, 1 - r, r - 1, r - 1, s.Std.gt(a, l) ? 0 : 1 ] }, this.main = function(e, t) { this._context = e, this._input = t; var i = this.f_1(); return [i[0], i[1], { value: i[2], offset: i[5] }, { value: i[3], offset: i[6] }, { value: i[4], offset: i[7] }, i[8]] } } }, { name: "Keltner Channels", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 95, visible: !0 } }, inputs: { in_0: !0, in_1: 20, in_2: 1 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Upper", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Middle", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Lower", histogramBase: 0, joinPoints: !1 } }, description: "Keltner Channels", shortDescription: "KC", is_price_study: !0, filledAreas: [{ id: "fill_0", objAId: "plot_0", objBId: "plot_2", type: "plot_plot", title: "Plots Background" }], inputs: [{ id: "in_0", name: "useTrueRange", defval: !0, type: "bool" }, { id: "in_1", name: "length", defval: 20, type: "integer", min: 1, max: 2e3 }, { id: "in_2", name: "mult", defval: 1, type: "float", min: -1e12, max: 1e12 }], id: "Keltner Channels@tv-basicstudies-1", scriptIdPart: "", name: "Keltner Channels", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t, i, s) { return e ? t : i - s }, this.f_1 = function(e, t, i) { return e + t * i }, this.f_2 = function(e, t, i) { return e - t * i }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._input(2), a = this._context.new_var(i), l = s.Std.ema(a, n, this._context), c = this.f_0(r, s.Std.tr(this._context), s.Std.high(this ._context), s.Std.low(this._context)), h = this._context.new_var(c), u = s.Std.ema(h, n, this._context); return [this.f_1(l, u, o), l, this.f_2(l, u, o)] } } }, { name: "Klinger Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Signal", histogramBase: 0, joinPoints: !1 } }, description: "Klinger Oscillator", shortDescription: "Klinger Oscillator", is_price_study: !1, inputs: [], id: "Klinger Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Klinger Oscillator", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t) { return s.Std.ge(e, 0) ? t : -t }, this.f_1 = function(e, t) { return e - t }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.hlc3(this._context); this._context.setMinimumAdditionalDepth(66); var r = this._context.new_var(i), n = s.Std.change(r), o = this.f_0(n, s.Std.volume(this._context)), a = this._context.new_var(o), l = s.Std.ema(a, 34, this._context), c = this._context.new_var(o), h = s.Std.ema(c, 55, this._context), u = this.f_1(l, h), d = this._context.new_var(u); return [u, s.Std.ema(d, 13, this._context)] } } }, { name: "Know Sure Thing", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#009688" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F44336" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 10, in_1: 15, in_2: 20, in_3: 30, in_4: 10, in_5: 10, in_6: 10, in_7: 15, in_8: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "KST", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Signal", histogramBase: 0, joinPoints: !1 } }, description: "Know Sure Thing", shortDescription: "KST", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "roclen1", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "roclen2", defval: 15, type: "integer", min: 1, max: 2e3 }, { id: "in_2", name: "roclen3", defval: 20, type: "integer", min: 1, max: 2e3 }, { id: "in_3", name: "roclen4", defval: 30, type: "integer", min: 1, max: 2e3 }, { id: "in_4", name: "smalen1", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_5", name: "smalen2", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_6", name: "smalen3", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_7", name: "smalen4", defval: 15, type: "integer", min: 1, max: 2e3 }, { id: "in_8", name: "siglen", defval: 9, type: "integer", min: 1, max: 2e3 }], id: "Know Sure Thing@tv-basicstudies-1", scriptIdPart: "", name: "Know Sure Thing", format: { type: "price", precision: 4 } }, constructor: function() { this.f_0 = function(e, t, i, s) { return e + 2 * t + 3 * i + 4 * s }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2), o = this._input(3), a = this._input(4), l = this._input(5), c = this._input(6), h = this._input(7), u = this._input(8); this._context.setMinimumAdditionalDepth(Math.max(a + i, l + r, c + n, h + o) + u); var d = s.Std.close(this._context), p = i, _ = this._context.new_var(d), m = s.Std.roc(_, p), f = a, g = this._context.new_var(m), b = s.Std.sma(g, f, this._context), v = r, S = this._context.new_var(d), y = s.Std.roc(S, v), w = l, P = this._context.new_var(y), C = s.Std.sma(P, w, this._context), x = n, T = this._context.new_var(d), I = s.Std.roc(T, x), M = c, O = this._context.new_var(I), L = s.Std.sma(O, M, this._context), A = o, E = this._context.new_var(d), k = s.Std.roc(E, A), D = h, V = this._context.new_var(k), B = s.Std.sma(V, D, this._context), R = this.f_0(b, C, L, B), N = this._context.new_var(R); return [R, s.Std.sma(N, u, this._context)] } } }, { name: "Least Squares Moving Average", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 25, in_1: 0 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Least Squares Moving Average", shortDescription: "LSMA", is_price_study: !0, inputs: [{ id: "in_0", name: "Length", defval: 25, type: "integer", min: 1, max: 1e12 }, { id: "in_1", name: "Offset", defval: 0, type: "integer", min: -1e12, max: 1e12 }], id: "Least Squares Moving Average@tv-basicstudies-1", scriptIdPart: "", name: "Least Squares Moving Average", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.close(this._context), o = this._context.new_var(n); return [s.Std.linreg(o, i, r)] } } }, { name: "Linear Regression Curve", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Linear Regression Curve", shortDescription: "LRC", is_price_study: !0, inputs: [{ id: "in_0", name: "Length", defval: 9, type: "integer", min: 1, max: 2e3 }], id: "Linear Regression Curve@tv-basicstudies-1", scriptIdPart: "", name: "Linear Regression Curve", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._context.new_var(i); return [s.Std.linreg(n, r, 0)] } } }, { name: "Linear Regression Slope", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Linear Regression Slope@tv-basicstudies-1", scriptIdPart: "", name: "Linear Regression Slope", description: "Linear Regression Slope", shortDescription: "Linear Regression Slope", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF5252" } }, inputs: { periods: 14 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", type: "integer", name: "Periods" }], format: { precision: 2, type: "price" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0) }, this.linregSlope = function(e, t, i) { var s, r, n, o = 0, a = 0, l = 0, c = 0; for (s = 0; s < t; ++s) o += n = t - 1 - s + 1, a += r = e.get(s), l += n * n, c += r * n; return (t * c - o * a) / (t * l - o * o) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_var(s.Std.close(this._context)); return [this.linregSlope(i, this.period, 0)] } } }, { name: "MA Cross", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_2: { linestyle: 0, linewidth: 4, plottype: 3, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9, in_1: 26 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Short", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Long", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Crosses", histogramBase: 0, joinPoints: !1 } }, description: "MA Cross", shortDescription: "MA Cross", is_price_study: !0, inputs: [{ id: "in_0", name: "Short", defval: 9, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Long", defval: 26, type: "integer", min: 1, max: 2e3 }], id: "MA Cross@tv-basicstudies-1", scriptIdPart: "", name: "MA Cross", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e ? t : s.Std.na() }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.close(this._context), o = this._context.new_var(n), a = s.Std.sma(o, i, this._context), l = this._context.new_var(n), c = s.Std.sma(l, r, this._context), h = a, u = c, d = s.Std.cross(a, c, this._context); return [h, u, this.f_0(d, a)] } } }, { name: "MA with EMA Cross", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#43A047" }, plot_2: { linestyle: 0, linewidth: 4, plottype: 3, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10, in_1: 10 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "MA", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "EMA", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Crosses", histogramBase: 0, joinPoints: !1 } }, description: "MA with EMA Cross", shortDescription: "MA/EMA Cross", is_price_study: !0, inputs: [{ id: "in_0", name: "Length MA", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Length EMA", defval: 10, type: "integer", min: 1, max: 2e3 }], id: "MA with EMA Cross@tv-basicstudies-1", scriptIdPart: "", name: "MA with EMA Cross", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e ? t : s.Std.na() }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.close(this._context), o = this._context.new_var(n), a = s.Std.sma(o, i, this._context), l = this._context.new_var(n), c = s.Std.ema(l, r, this._context), h = a, u = c, d = s.Std.cross(a, c, this._context); return [h, u, this.f_0(d, a)] } } }, { name: "Mass Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Mass Index", shortDescription: "Mass Index", is_price_study: !1, inputs: [{ id: "in_0", name: "length", defval: 10, type: "integer", min: 1, max: 2e3 }], id: "Mass Index@tv-basicstudies-1", scriptIdPart: "", name: "Mass Index", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t) { return e - t }, this.f_1 = function(e, t) { return e / t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this.f_0(s.Std.high(this._context), s.Std.low(this ._context)), n = this._context.new_var(r), o = s.Std.ema(n, 9, this._context), a = this._context.new_var(o), l = s.Std.ema(a, 9, this._context), c = this.f_1(o, l), h = this._context.new_var(c); return [s.Std.sum(h, i, this._context)] } } }, { name: "McGinley Dynamic", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "McGinley Dynamic", shortDescription: "McGinley Dynamic", is_price_study: !0, is_hidden_study: !1, id: "mcginley_dynamic@tv-basicstudies-1", inputs: [{ id: "in_0", name: "length", defval: 14, type: "integer", min: 1, max: 1e12 }], scriptIdPart: "", name: "McGinley Dynamic", format: { type: "inherit" } }, constructor: function() { this.f_0 = function() { var e = this._input(0), t = s.Std.close(this._context), i = this._context.new_var(t), r = s.Std.ema(i, e, this._context), n = this._context.new_var(), o = n.get(1) + (t - n.get(1)) / (e * s.Std.pow(t / n.get(1), 4)); return n.set(s.Std.na(n.get(1)) ? r : o), [n.get(0)] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_0() } } }, { name: "Median Price", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, id: "Median Price@tv-basicstudies-1", scriptIdPart: "", name: "Median Price", description: "Median Price", shortDescription: "Median Price", is_price_study: !0, plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF6D00" } }, inputs: {} }, styles: { plot_0: { title: "Plot" } }, inputs: [], format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { return this._context = e, this._input = t, [s.Std.hl2(this ._context)] } } }, { name: "Momentum", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 10, in_1: "close" } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Mom", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Momentum", shortDescription: "Mom", is_price_study: !1, inputs: [{ id: "in_0", name: "Length", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }], id: "Momentum@tv-basicstudies-1", scriptIdPart: "", name: "Momentum", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std[this._input(1)](this._context), n = this._context.new_var(r).get(i); return [n ? r - n : null] } } }, { name: "Money Flow Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#7E57C2" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 80 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 20 }], filledAreasStyle: { fill_0: { color: "#7E57C2", transparency: 90, visible: !0 } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Money Flow Index", shortDescription: "MFI", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "Length", defval: 14, type: "integer", min: 1, max: 2e3 }], id: "Money Flow@tv-basicstudies-1", scriptIdPart: "", name: "Money Flow Index", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t, i) { return e * (s.Std.le(t, 0) ? 0 : i) }, this.f_1 = function(e, t, i) { return e * (s.Std.ge(t, 0) ? 0 : i) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.hlc3(this._context), n = this._context.new_var(r), o = s.Std.change(n), a = this.f_0(s.Std.volume(this._context), o, r), l = this._context.new_var(a), c = s.Std.sum(l, i, this._context), h = this.f_1(s.Std.volume(this._context), o, r), u = this._context.new_var(h), d = s.Std.sum(u, i, this._context); return [s.Std.rsi(c, d)] } } }, { name: "Moving Average", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, smoothedMA: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !1 } }, inputs: { length: 9, source: "close", offset: 0, smoothingLine: "SMA", smoothingLength: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "smoothedMA", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, smoothedMA: { title: "Smoothed MA", histogramBase: 0, joinPoints: !1 } }, description: "Moving Average", shortDescription: "MA", is_price_study: !0, inputs: [{ id: "length", name: "Length", defval: 9, type: "integer", min: 1, max: 1e4 }, { id: "source", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }, { id: "offset", name: "Offset", defval: 0, type: "integer", min: -1e4, max: 1e4 }, { id: "smoothingLine", name: "Smoothing Line", defval: "SMA", type: "text", options: ["SMA", "EMA", "WMA"] }, { id: "smoothingLength", name: "Smoothing Length", defval: 9, type: "integer", min: 1, max: 1e4 }], id: "Moving Average@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std[this._input(1)](this._context), r = this._input(0), n = this._input(2), o = this._input(3), a = this._input(4); this._context.setMinimumAdditionalDepth(r + a); var l, c = this._context.new_var(i), h = s.Std.sma(c, r, this._context), u = this._context.new_var(h); return "EMA" === o ? l = s.Std.ema(u, a, this._context) : "WMA" === o ? l = s.Std.wma(u, a, this._context) : "SMA" === o && (l = s .Std.sma(u, a, this._context)), [{ value: h, offset: n }, { value: l, offset: n }] } } }, { name: "Moving Average Channel", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 90, visible: !0 } }, inputs: { in_0: 20, in_1: 20, in_2: 0, in_3: 0 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "Upper", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Lower", histogramBase: 0, joinPoints: !1 } }, filledAreas: [{ id: "fill_0", objAId: "plot_0", objBId: "plot_1", type: "plot_plot", title: "Plots Background" }], description: "Moving Average Channel", shortDescription: "MAC", is_price_study: !0, inputs: [{ id: "in_0", name: "Upper Length", defval: 20, type: "integer", min: 1, max: 1e4 }, { id: "in_1", name: "Lower Length", defval: 20, type: "integer", min: 1, max: 1e4 }, { id: "in_2", name: "Upper Offset", defval: 0, type: "integer", min: -1e4, max: 1e4 }, { id: "in_3", name: "Lower Offset", defval: 0, type: "integer", min: -1e4, max: 1e4 }], id: "Moving Average Channel@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Channel", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.high(this._context), r = s.Std.low(this._context), n = this._input(0), o = this._input(1), a = this._input(2), l = this._input(3), c = this._context.new_var(i), h = this._context.new_var(r); return [{ value: s.Std.sma(c, n, this._context), offset: a }, { value: s.Std.sma(h, o, this._context), offset: l }] } } }, { name: "Moving Average Convergence/Divergence", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 5, trackPrice: !1, transparency: 0, visible: !0, color: "#FF5252" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, palettes: { palette_0: { colors: { 0: { color: "#26A69A", width: 1, style: 0 }, 1: { color: "#B2DFDB", width: 1, style: 0 }, 2: { color: "#FFCDD2", width: 1, style: 0 }, 3: { color: "#FF5252", width: 1, style: 0 } } } }, inputs: { in_0: 12, in_1: 26, in_3: "close", in_2: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }, { id: "plot_3", palette: "palette_0", target: "plot_0", type: "colorer" }], styles: { plot_0: { title: "Histogram", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "MACD", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Signal", histogramBase: 0, joinPoints: !1 } }, description: "MACD", shortDescription: "MACD", is_price_study: !1, palettes: { palette_0: { colors: { 0: { name: "Color 0" }, 1: { name: "Color 1" }, 2: { name: "Color 2" }, 3: { name: "Color 3" } } } }, inputs: [{ id: "in_0", name: "fastLength", defval: 12, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "slowLength", defval: 26, type: "integer", min: 1, max: 2e3 }, { id: "in_3", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }, { id: "in_2", name: "signalLength", defval: 9, type: "integer", min: 1, max: 50 }], id: "Moving Average Convergence/Divergence@tv-basicstudies-1", scriptIdPart: "", name: "MACD", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e - t }, this.f_1 = function(e) { var t = e > 0 ? 1 : 3, i = s.Std.change(this._context.new_var(e)); return t - (s.Std.le(i, 0) ? 0 : 1) }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std[this._input(2)](this._context), r = this._input(0), n = this._input(1), o = this._input(3); this._context.setMinimumAdditionalDepth(Math.max(r, n) + o); var a = this._context.new_var(i), l = s.Std.ema(a, r, this._context), c = this._context.new_var(i), h = s.Std.ema(c, n, this._context), u = this.f_0(l, h), d = this._context.new_var(u), p = s.Std.ema(d, o, this._context), _ = this.f_0(u, p); return [_, u, p, this.f_1(_)] } } }, { name: "Moving Average Exponential", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, smoothedMA: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !1 } }, inputs: { length: 9, source: "close", offset: 0, smoothingLine: "SMA", smoothingLength: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "smoothedMA", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, smoothedMA: { title: "Smoothed MA", histogramBase: 0, joinPoints: !1 } }, description: "Moving Average Exponential", shortDescription: "EMA", is_price_study: !0, inputs: [{ id: "length", name: "Length", defval: 9, type: "integer", min: 1, max: 1e4 }, { id: "source", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }, { id: "offset", name: "Offset", defval: 0, type: "integer", min: -1e4, max: 1e4 }, { id: "smoothingLine", name: "Smoothing Line", defval: "SMA", type: "text", options: ["SMA", "EMA", "WMA"] }, { id: "smoothingLength", name: "Smoothing Length", defval: 9, type: "integer", min: 1, max: 1e4 }], id: "Moving Average Exponential@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Exponential", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std[this._input(1)](this._context), r = this._input(0), n = this._input(2), o = this._input(3), a = this._input(4); this._context.setMinimumAdditionalDepth(r + a); var l, c = this._context.new_var(i), h = s.Std.ema(c, r, this._context), u = this._context.new_var(h); return "EMA" === o ? l = s.Std.ema(u, a, this._context) : "WMA" === o ? l = s.Std.wma(u, a, this._context) : "SMA" === o && (l = s .Std.sma(u, a, this._context)), [{ value: h, offset: n }, { value: l, offset: n }] } } }, { name: "Moving Average Weighted", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9, in_1: "close", in_2: 0 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Moving Average Weighted", shortDescription: "WMA", is_price_study: !0, inputs: [{ id: "in_0", name: "Length", defval: 9, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }, { id: "in_2", name: "Offset", defval: 0, type: "integer", min: -1e4, max: 1e4 }], id: "Moving Average Weighted@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Weighted", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std[this._input(1)](this._context), r = this._input(0), n = this._input(2), o = this._context.new_var(i); return [{ value: s.Std.wma(o, r, this._context), offset: n }] } } }, { name: "Moving Average Double", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, id: "Moving Average Double@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Double", description: "Moving Average Double", shortDescription: "Moving Average Double", is_price_study: !0, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF6D00" }, plot_1: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#2196F3" } }, inputs: { firstPeriods: 14, secondPeriods: 21, method: "Simple" } }, styles: { plot_0: { title: "Plot 1" }, plot_1: { title: "Plot 2" } }, inputs: [{ id: "firstPeriods", name: "1st Period", type: "integer", defval: 14, min: 1, max: 1e4 }, { id: "secondPeriods", name: "2nd Period", type: "integer", defval: 21, min: 1, max: 1e4 }, { id: "method", name: "Method", type: "text", defval: "Simple", options: ["Simple", "Exponential", "Weighted"] }], format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i, r, n = this._context.new_var(s.Std.close(this._context)); return "Exponential" === this._input(2) ? (i = s.Std.ema(n, this ._input(0), this._context), r = s.Std.ema(n, this ._input(1), this._context)) : "Weighted" === this._input( 2) ? (i = s.Std.wma(n, this._input(0), this._context), r = s .Std .wma(n, this._input(1), this._context)) : (i = s.Std.sma(n, this._input(0), this._context), r = s.Std.sma(n, this ._input(1), this._context)), [i, r] } } }, { name: "Moving Average Triple", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !0, id: "Moving Average Triple@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Triple", description: "Moving Average Triple", shortDescription: "Moving Average Triple", plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, transparency: 0, trackPrice: !1, color: "#FF6D00" }, plot_1: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#2196F3" }, plot_2: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#26C6DA" } }, inputs: { firstPeriods: 14, secondPeriods: 21, thirdPeriods: 35, method: "Simple" } }, styles: { plot_0: { title: "Plot 1" }, plot_1: { title: "Plot 2" }, plot_2: { title: "Plot 3" } }, inputs: [{ id: "firstPeriods", name: "1st Period", type: "integer", defval: 14, min: 1, max: 1e4 }, { id: "secondPeriods", name: "2nd Period", type: "integer", defval: 21, min: 1, max: 1e4 }, { id: "thirdPeriods", name: "3rd Period", type: "integer", defval: 35, min: 1, max: 1e4 }, { id: "method", name: "Method", type: "text", defval: "Simple", options: ["Simple", "Exponential", "Weighted"] }], format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i, r, n, o = this._context.new_var(s.Std.close(this._context)); return "Exponential" === this._input(3) ? (i = s.Std.ema(o, this ._input(0), this._context), r = s.Std.ema(o, this ._input(1), this._context), n = s.Std.ema(o, this ._input(2), this._context)) : "Weighted" === this._input( 3) ? (i = s.Std.wma(o, this._input(0), this._context), r = s .Std .wma(o, this._input(1), this._context), n = s.Std.wma(o, this._input(2), this._context)) : (i = s.Std.sma(o, this ._input(0), this._context), r = s.Std.sma(o, this ._input(1), this._context), n = s.Std.sma(o, this ._input(2), this._context)), [i, r, n] } } }, { name: "Moving Average Adaptive", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !0, id: "Moving Average Adaptive@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Adaptive", description: "Moving Average Adaptive", shortDescription: "Moving Average Adaptive", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, transparency: 0, trackPrice: !1, color: "#AB47BC" } }, inputs: { periods: 10 } }, styles: { plot_0: { title: "Plot 1" } }, inputs: [{ id: "periods", name: "Period", type: "integer", defval: 10, min: 1, max: 1e4 }], format: { type: "inherit" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.periods = this._input(0) }, this.ama = function(e, t) { var i = this.periods, r = this._context.new_var(), n = e.get(), o = s.Std.stdev(t, i, this._context), a = s.Std.log(n / e.get(i)) / (o * Math.sqrt(i)), l = .1 * Math.abs(a), c = (n - r.get(1)) * l + r.get(1); return r.set(isNaN(c) ? n : c), c }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_var(s.Std.close(this._context)), r = this._context.new_var(s.Std.log(i.get() / i.get(1))); return [this.ama(i, r)] } } }, { name: "Moving Average Hamming", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !0, id: "Moving Average Hamming@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Hamming", description: "Moving Average Hamming", shortDescription: "Moving Average Hamming", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, transparency: 0, trackPrice: !1, color: "#4CAF50" } }, inputs: { periods: 10 } }, styles: { plot_0: { title: "Plot 1" } }, inputs: [{ id: "periods", name: "Period", type: "integer", defval: 10, min: 1, max: 1e4 }], format: { type: "inherit" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.periods = this._input(0); for (var i = [], s = 0, r = 1; r <= this.periods; ++r) { var n = Math.sin((1 + r) / this.periods * Math.PI / 2); i.unshift(n), s += n } this.hmaFactors = i, this.hmaFactorsSum = s }, this.hma = function(e) { for (var t = this.periods, i = 0, s = 0; s < t; ++s) i += e.get(t - s - 1) * this.hmaFactors[s]; return i /= this.hmaFactorsSum }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_var(s.Std.close(this._context)); return [this.hma(i)] } } }, { name: "Moving Average Multiple", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !0, id: "Moving Average Multiple@tv-basicstudies-1", scriptIdPart: "", name: "Moving Average Multiple", description: "Moving Average Multiple", shortDescription: "Moving Average Multiple", plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }, { id: "plot_3", type: "line" }, { id: "plot_4", type: "line" }, { id: "plot_5", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, transparency: 0, trackPrice: !1, color: "#9C27B0" }, plot_1: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#FF6D00" }, plot_2: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#43A047" }, plot_3: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#26C6DA" }, plot_4: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#F50057" }, plot_5: { linestyle: 0, visible: !0, linewidth: 1, transparency: 0, plottype: 0, trackPrice: !1, color: "#2196F3" } }, inputs: { firstPeriods: 14, secondPeriods: 21, thirdPeriods: 35, fourthPeriods: 50, fifthPeriods: 100, sixthPeriods: 200, method: "Simple" } }, styles: { plot_0: { title: "Plot 1" }, plot_1: { title: "Plot 2" }, plot_2: { title: "Plot 3" }, plot_3: { title: "Plot 4" }, plot_4: { title: "Plot 5" }, plot_5: { title: "Plot 6" } }, inputs: [{ id: "firstPeriods", name: "1st Period", type: "integer", defval: 14, min: 1, max: 1e4 }, { id: "secondPeriods", name: "2nd Period", type: "integer", defval: 21, min: 1, max: 1e4 }, { id: "thirdPeriods", name: "3rd Period", type: "integer", defval: 35, min: 1, max: 1e4 }, { id: "fourthPeriods", name: "4th Period", type: "integer", defval: 50, min: 1, max: 1e4 }, { id: "fifthPeriods", name: "5th Period", type: "integer", defval: 100, min: 1, max: 1e4 }, { id: "sixthPeriods", name: "6th Period", type: "integer", defval: 200, min: 1, max: 1e4 }, { id: "method", name: "Method", type: "text", defval: "Simple", options: ["Simple", "Exponential", "Weighted"] }], format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i, r, n, o, a, l, c = this._context.new_var(s.Std.close(this ._context)); return "Exponential" === this._input(6) ? (i = s.Std.ema(c, this ._input(0), this._context), r = s.Std.ema(c, this ._input(1), this._context), n = s.Std.ema(c, this ._input(2), this._context), o = s.Std.ema(c, this ._input(3), this._context), a = s.Std.ema(c, this ._input(4), this._context), l = s.Std.ema(c, this ._input(5), this._context)) : "Weighted" === this._input( 6) ? (i = s.Std.wma(c, this._input(0), this._context), r = s .Std .wma(c, this._input(1), this._context), n = s.Std.wma(c, this._input(2), this._context), o = s.Std.wma(c, this ._input(3), this._context), a = s.Std.wma(c, this ._input(4), this._context), l = s.Std.wma(c, this ._input(5), this._context)) : (i = s.Std.sma(c, this ._input(0), this._context), r = s.Std.sma(c, this ._input(1), this._context), n = s.Std.sma(c, this ._input(2), this._context), o = s.Std.sma(c, this ._input(3), this._context), a = s.Std.sma(c, this ._input(4), this._context), l = s.Std.sma(c, this ._input(5), this._context)), [i, r, n, o, a, l] } } }, { name: "Majority Rule", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Majority Rule@tv-basicstudies-1", scriptIdPart: "", name: "Majority Rule", description: "Majority Rule", shortDescription: "Majority Rule", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF5252" } }, inputs: { rollingPeriod: 14 } }, styles: { plot_0: { title: "Majority Rule" } }, inputs: [{ id: "rollingPeriod", type: "integer", name: "Rolling Period" }], format: { precision: 2, type: "price" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.rollingPeriod = this ._input(0) }, this.main = function(e, t) { this._context = e, this._input = t; var i, r = s.Std.close(this._context); return i = r > this._context.new_var(r).get(1) ? 1 : 0, [100 * s.Std .sma(this._context.new_var(i), this.rollingPeriod, this ._context) ] } } }, { name: "Net Volume", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Net Volume", shortDescription: "Net Volume", is_price_study: !1, inputs: [], id: "Net Volume@tv-basicstudies-1", scriptIdPart: "", name: "Net Volume", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t, i) { return s.Std.gt(e, 0) ? t : s.Std.lt(i, 0) ? -t : 0 * t }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._context.new_var(i), n = s.Std.change(r); return [this.f_0(n, s.Std.volume(this._context), n)] } } }, { name: "On Balance Volume", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, smoothedMA: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !1 } }, inputs: { smoothingLine: "SMA", smoothingLength: 9 } }, plots: [{ id: "plot_0", type: "line" }, { id: "smoothedMA", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, smoothedMA: { title: "Smoothed MA", histogramBase: 0, joinPoints: !1 } }, description: "On Balance Volume", shortDescription: "OBV", is_price_study: !1, inputs: [{ id: "smoothingLine", name: "Smoothing Line", defval: "SMA", type: "text", options: ["SMA", "EMA", "WMA"] }, { id: "smoothingLength", name: "Smoothing Length", defval: 9, type: "integer", min: 1, max: 1e4 }], id: "On Balance Volume@tv-basicstudies-1", scriptIdPart: "", name: "On Balance Volume", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t, i) { return s.Std.gt(e, 0) ? t : s.Std.lt(i, 0) ? -t : 0 * t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.close(this._context), o = this._context.new_var(n), a = s.Std.change(o), l = this.f_0(a, s.Std.volume(this._context), a), c = s.Std.cum(l, this._context); this._context.setMinimumAdditionalDepth(r); var h, u = this._context.new_var(c); return "EMA" === i ? h = s.Std.ema(u, r, this._context) : "WMA" === i ? h = s.Std.wma(u, r, this._context) : "SMA" === i && (h = s .Std.sma(u, r, this._context)), [c, h] } } }, { name: "Parabolic SAR", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 3, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: .02, in_1: .02, in_2: .2 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Parabolic SAR", shortDescription: "SAR", is_price_study: !0, inputs: [{ id: "in_0", name: "start", defval: .02, type: "float", min: -1e12, max: 1e12 }, { id: "in_1", name: "increment", defval: .02, type: "float", min: -1e12, max: 1e12 }, { id: "in_2", name: "maximum", defval: .2, type: "float", min: -1e12, max: 1e12 }], id: "Parabolic SAR@tv-basicstudies-1", scriptIdPart: "", name: "Parabolic SAR", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2); return [s.Std.sar(i, r, n, this._context)] } } }, { name: "Price Channel", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F50057" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F50057" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 20, in_1: 0 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Highprice Line", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Lowprice Line", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Centerprice Line", histogramBase: 0, joinPoints: !1 } }, description: "Price Channel", shortDescription: "PC", is_price_study: !0, inputs: [{ id: "in_0", name: "Length", defval: 20, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Offset Length", defval: 0, type: "integer", min: 1, max: 2e3 }], id: "Price Channel@tv-basicstudies-1", scriptIdPart: "", name: "Price Channel", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.high(this._context), r = this._context.new_var(i), n = s.Std.low(this._context), o = this._context.new_var(n), a = this._input(0), l = this._input(1), c = s.Std.highest(r, a, this._context), h = s.Std.lowest(o, a, this._context); return [{ value: c, offset: l }, { value: h, offset: l }, { value: s.Std.avg(c, h), offset: l }] } } }, { name: "Price Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#009688" } }, inputs: { in_0: 10, in_1: 21 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Price Oscillator", shortDescription: "PPO", is_price_study: !1, inputs: [{ id: "in_0", name: "shortlen", defval: 10, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "longlen", defval: 21, type: "integer", min: 1, max: 2e3 }], id: "Price Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Price Oscillator", format: { type: "price", precision: 2 } }, constructor: function() { this.f_0 = function(e, t) { return (e - t) / t * 100 }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._context.new_var(i), a = s.Std.sma(o, r, this._context), l = this._context.new_var(i), c = s.Std.sma(l, n, this._context); return [this.f_0(a, c)] } } }, { name: "Price Volume Trend", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: {} }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "PVT", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Price Volume Trend", shortDescription: "PVT", is_price_study: !1, is_hidden_study: !1, id: "price_volume_trend@tv-basicstudies-1", inputs: [], scriptIdPart: "", name: "Price Volume Trend", format: { type: "volume" } }, constructor: function() { this.f_0 = function() { var e = this._context.new_var(s.Std.close(this._context)); return [s.Std.cum(s.Std.change(e) / e.get(1) * s.Std.volume(this ._context), this._context)] }, this.main = function(e, t) { return this._context = e, this._input = t, [this.f_0()[0]] } } }, { name: "Rate Of Change", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "ROC", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Rate Of Change", shortDescription: "ROC", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero Line", isHidden: !1 }], inputs: [{ id: "in_0", name: "length", defval: 9, type: "integer", min: 1, max: 1e12 }], id: "rate_of_change@tv-basicstudies-1", scriptIdPart: "", name: "Rate Of Change", format: { precision: 2, type: "price" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_var(s.Std.close(this._context)), r = this._input(0); return [100 * (i.get(0) - i.get(r)) / i.get(r)] } } }, { name: "Relative Strength Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#7E57C2" }, smoothedMA: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !1 } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 70 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 30 }], filledAreasStyle: { fill_0: { color: "#7E57C2", transparency: 90, visible: !0 } }, inputs: { length: 14, smoothingLine: "SMA", smoothingLength: 14 } }, plots: [{ id: "plot_0", type: "line" }, { id: "smoothedMA", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, smoothedMA: { title: "Smoothed MA", histogramBase: 0, joinPoints: !1 } }, description: "Relative Strength Index", shortDescription: "RSI", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "length", name: "Length", defval: 14, type: "integer", min: 1, max: 2e3 }, { id: "smoothingLine", name: "Smoothing Line", defval: "SMA", type: "text", options: ["SMA", "EMA", "WMA"] }, { id: "smoothingLength", name: "Smoothing Length", defval: 14, type: "integer", min: 1, max: 1e4 }], id: "Relative Strength Index@tv-basicstudies-1", scriptIdPart: "", name: "Relative Strength Index", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e) { return s.Std.max(e, 0) }, this.f_1 = function(e) { return -s.Std.min(e, 0) }, this.f_2 = function(e, t) { return s.Std.eq(e, 0) ? 100 : s.Std.eq(t, 0) ? 0 : 100 - 100 / (1 + t / e) }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._input(2); this._context.setMinimumAdditionalDepth(r + o); var a, l = this._context.new_var(i), c = s.Std.change(l), h = this.f_0(c), u = this._context.new_var(h), d = s.Std.rma(u, r, this._context), p = this.f_1(c), _ = this._context.new_var(p), m = s.Std.rma(_, r, this._context), f = this.f_2(m, d), g = this._context.new_var(f); return "EMA" === n ? a = s.Std.ema(g, o, this._context) : "WMA" === n ? a = s.Std.wma(g, o, this._context) : "SMA" === n && (a = s .Std.sma(g, o, this._context)), [{ value: f }, { value: a }] } } }, { name: "Relative Vigor Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#009688" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F44336" } }, inputs: { in_0: 10 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "RVGI", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Signal", histogramBase: 0, joinPoints: !1 } }, description: "Relative Vigor Index", shortDescription: "RVGI", is_price_study: !1, inputs: [{ id: "in_0", name: "Length", defval: 10, type: "integer", min: 1, max: 2e3 }], id: "Relative Vigor Index@tv-basicstudies-1", scriptIdPart: "", name: "Relative Vigor Index", format: { precision: 4, type: "price" } }, constructor: function() { this.f_0 = function(e, t) { return e - t }, this.f_1 = function(e, t) { return e / t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this.f_0(s.Std.close(this._context), s.Std.open(this ._context)), n = this._context.new_var(r), o = s.Std.swma(n, this._context), a = this._context.new_var(o), l = s.Std.sum(a, i, this._context), c = this.f_0(s.Std.high(this._context), s.Std.low(this ._context)), h = this._context.new_var(c), u = s.Std.swma(h, this._context), d = this._context.new_var(u), p = s.Std.sum(d, i, this._context), _ = this.f_1(l, p), m = this._context.new_var(_); return [_, s.Std.swma(m, this._context)] } } }, { name: "Relative Volatility Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#7E57C2" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 80 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 20 }], filledAreasStyle: { fill_0: { color: "#7E57C2", transparency: 90, visible: !0 } }, inputs: { in_0: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Relative Volatility Index", shortDescription: "RVI", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "length", defval: 10, type: "integer", min: 1, max: 2e3 }], id: "Relative Volatility Index@tv-basicstudies-1", scriptIdPart: "", name: "Relative Volatility Index", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t) { return s.Std.le(e, 0) ? 0 : t }, this.f_1 = function(e, t) { return s.Std.gt(e, 0) ? 0 : t }, this.f_2 = function(e, t) { return e / (e + t) * 100 }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0); this._context.setMinimumAdditionalDepth(i + 12); var r = s.Std.close(this._context), n = this._context.new_var(r), o = s.Std.stdev(n, i, this._context), a = this._context.new_var(r), l = s.Std.change(a), c = this.f_0(l, o), h = this._context.new_var(c), u = s.Std.ema(h, 14, this._context), d = this.f_1(l, o), p = this._context.new_var(d), _ = s.Std.ema(p, 14, this._context); return [this.f_2(u, _)] } } }, { name: "SMI Ergodic Indicator/Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 1, trackPrice: !1, transparency: 0, visible: !0, color: "#FF5252" } }, inputs: { in_0: 5, in_1: 20, in_2: 5 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Indicator", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Signal", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Oscillator", histogramBase: 0, joinPoints: !1 } }, description: "SMI Ergodic Indicator/Oscillator", shortDescription: "SMIIO", is_price_study: !1, inputs: [{ id: "in_0", name: "shortlen", defval: 5, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "longlen", defval: 20, type: "integer", min: 1, max: 2e3 }, { id: "in_2", name: "siglen", defval: 5, type: "integer", min: 1, max: 2e3 }], id: "SMI Ergodic Indicator/Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "SMI Ergodic Indicator/Oscillator", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t) { return e - t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2); this._context.setMinimumAdditionalDepth(i + r + n); var o = s.Std.close(this._context), a = this._context.new_var(o), l = s.Std.tsi(a, i, r, this._context), c = this._context.new_var(l), h = s.Std.ema(c, n, this._context); return [l, h, this.f_0(l, h)] } } }, { name: "Smoothed Moving Average", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#673AB7" } }, inputs: { in_0: 7, in_1: "close" } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Smoothed Moving Average", shortDescription: "SMMA", is_price_study: !0, inputs: [{ id: "in_0", name: "Length", defval: 7, type: "integer", min: 1, max: 1e12 }, { id: "in_1", name: "Source", defval: "close", type: "source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"] }], id: "smoothed_moving_average@tv-basicstudies-1", scriptIdPart: "", name: "Smoothed Moving Average", format: { type: "inherit" } }, constructor: function() { this.f_0 = function() { var e = this._input(0), t = s.Std[this._input(1)](this._context); return [s.Std.smma(t, e, this._context)] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_0() } } }, { name: "Standard Deviation", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, id: "Standard Deviation@tv-basicstudies-1", scriptIdPart: "", name: "Standard Deviation", description: "Standard Deviation", shortDescription: "Standard Deviation", is_price_study: !1, plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#009688" } }, inputs: { periods: 5, deviations: 1 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", name: "Periods", type: "integer" }, { id: "deviations", name: "Deviations", type: "float" }], format: { precision: 2, type: "price" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._context.new_var(s.Std.close(this._context)); return [s.Std.stdev(n, i, this._context) * r] } } }, { name: "Stochastic", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 80 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 20 }], filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 90, visible: !0 } }, inputs: { in_0: 14, in_1: 1, in_2: 3 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "%K", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "%D", histogramBase: 0, joinPoints: !1 } }, description: "Stochastic", shortDescription: "Stoch", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "K", defval: 14, type: "integer", min: 1, max: 1e4 }, { id: "in_1", name: "D", defval: 1, type: "integer", min: 1, max: 1e4 }, { id: "in_2", name: "smooth", defval: 3, type: "integer", min: 1, max: 1e4 }], id: "Stochastic@tv-basicstudies-1", scriptIdPart: "", name: "Stochastic", format: { precision: 2, type: "price" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2); this._context.setMinimumAdditionalDepth(i + r + n); var o = s.Std.close(this._context), a = s.Std.high(this._context), l = s.Std.low(this._context), c = this._context.new_var(o), h = this._context.new_var(a), u = this._context.new_var(l), d = s.Std.stoch(c, h, u, i, this._context), p = this._context.new_var(d), _ = s.Std.sma(p, r, this._context), m = this._context.new_var(_); return [_, s.Std.sma(m, n, this._context)] } } }, { name: "Stochastic RSI", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#FF6D00" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 80 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 20 }], filledAreasStyle: { fill_0: { color: "#2196F3", transparency: 90, visible: !0 } }, inputs: { in_0: 14, in_1: 14, in_2: 3, in_3: 3 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "%K", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "%D", histogramBase: 0, joinPoints: !1 } }, description: "Stochastic RSI", shortDescription: "Stoch RSI", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "lengthRSI", defval: 14, type: "integer", min: 1, max: 1e4 }, { id: "in_1", name: "lengthStoch", defval: 14, type: "integer", min: 1, max: 1e4 }, { id: "in_2", name: "smoothK", defval: 3, type: "integer", min: 1, max: 1e4 }, { id: "in_3", name: "smoothD", defval: 3, type: "integer", min: 1, max: 1e4 }], id: "Stochastic RSI@tv-basicstudies-1", scriptIdPart: "", name: "Stochastic RSI", format: { precision: 2, type: "price" } }, constructor: function() { this.f_1 = function(e, t, i) { var r = i.new_var(s.Std.max(s.Std.change(e), 0)); return s.Std.rma(r, t, i) }, this.f_2 = function(e, t, i) { var r = i.new_var(-s.Std.min(s.Std.change(e), 0)); return s.Std.rma(r, t, i) }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._input(1), o = this._input(2), a = this._input(3); e.setMinimumAdditionalDepth(r + n + o + a); var l = this._context.new_var(i), c = s.Std.rsi(this.f_1(l, r, this._context), this.f_2(l, r, this ._context)), h = this._context.new_var(c), u = this._context.new_var(c), d = this._context.new_var(c), p = s.Std.stoch(h, u, d, n, this._context), _ = this._context.new_var(p), m = s.Std.sma(_, o, this._context), f = this._context.new_var(m); return [m, s.Std.sma(f, a, this._context)] } } }, { name: "TRIX", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F44336" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 18 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "TRIX", histogramBase: 0, joinPoints: !1 } }, description: "TRIX", shortDescription: "TRIX", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "length", defval: 18, type: "integer", min: 1, max: 2e3 }], id: "TRIX@tv-basicstudies-1", scriptIdPart: "", name: "TRIX", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e) { return s.Std.log(e) }, this.f_1 = function(e) { return 1e4 * e }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0); e.setMinimumAdditionalDepth(3 * i); var r = this.f_0(s.Std.close(this._context)), n = this._context.new_var(r), o = s.Std.ema(n, i, this._context), a = this._context.new_var(o), l = s.Std.ema(a, i, this._context), c = this._context.new_var(l), h = s.Std.ema(c, i, this._context), u = this._context.new_var(h), d = s.Std.change(u); return [this.f_1(d)] } } }, { name: "Triple EMA", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 9 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Triple EMA", shortDescription: "TEMA", is_price_study: !0, inputs: [{ id: "in_0", name: "length", defval: 9, type: "integer", min: 1, max: 1e4 }], id: "Triple EMA@tv-basicstudies-1", scriptIdPart: "", name: "Triple EMA", format: { type: "inherit" } }, constructor: function() { this.f_0 = function(e, t, i) { return 3 * (e - t) + i }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0); this._context.setMinimumAdditionalDepth(3 * i); var r = s.Std.close(this._context), n = this._context.new_var(r), o = s.Std.ema(n, i, this._context), a = this._context.new_var(o), l = s.Std.ema(a, i, this._context), c = this._context.new_var(l), h = s.Std.ema(c, i, this._context); return [this.f_0(o, l, h)] } } }, { name: "True Strength Indicator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#E91E63" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 25, in_1: 13, in_2: 13 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "True Strength Indicator", shortDescription: "True Strength Indicator", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "long", defval: 25, type: "integer", min: 1, max: 4999 }, { id: "in_1", name: "short", defval: 13, type: "integer", min: 1, max: 4999 }, { id: "in_2", name: "siglen", defval: 13, type: "integer", min: 1, max: 4999 }], id: "True Strength Indicator@tv-basicstudies-1", scriptIdPart: "", name: "True Strength Indicator", format: { precision: 4, type: "price" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2); this._context.setMinimumAdditionalDepth(this._input(0) + this ._input(1) + this._input(2)); var o = s.Std.close(this._context), a = this._context.new_var(o), l = s.Std.tsi(a, r, i, this._context), c = this._context.new_var(l); return [l, s.Std.ema(c, n, this._context)] } } }, { name: "Trend Strength Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Trend Strength Index@tv-basicstudies-1", scriptIdPart: "", name: "Trend Strength Index", description: "Trend Strength Index", shortDescription: "Trend Strength Index", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF5252" } }, inputs: { periods: 14 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", type: "integer", name: "Periods" }], format: { type: "inherit" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.invertedPeriod = 1 / this.period, this.sumX = (this .period - 1) * this.period / 2, this.sumXX = (this.period - 1) * this.period * (2 * this.period - 1) / 6, this .invertedPeriodSumXSumX = this.invertedPeriod * this.sumX * this .sumX }, this.trendStrengthIndex = function() { for (var e = this._context.new_var(s.Std.close(this._context)), t = s.Std.sum(e, this.period, this._context), i = 0, r = 0, n = 0; n < this.period; n++) { var o = e.get(n); r += (this.period - 1 - n) * o, i += o * o } var a = r - this.invertedPeriod * this.sumX * t, l = (this.sumXX - this.invertedPeriodSumXSumX) * (i - this .invertedPeriod * t * t); return l < 0 ? 0 == a ? 0 : a > 0 ? 1 : -1 : a / (l = Math.sqrt(l)) }, this.main = function(e, t) { return this._context = e, this._input = t, [this .trendStrengthIndex() ] } } }, { name: "Typical Price", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, id: "TypicalPrice@tv-basicstudies-1", scriptIdPart: "", name: "Typical Price", description: "Typical Price", shortDescription: "Typical Price", is_price_study: !0, plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF6D00" } }, inputs: {} }, styles: { plot_0: { title: "Plot" } }, inputs: [], format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { return this._context = e, this._input = t, [s.Std.hlc3(this ._context)] } } }, { name: "Ultimate Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#F44336" } }, inputs: { in_0: 7, in_1: 14, in_2: 28 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "UO", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Ultimate Oscillator", shortDescription: "UO", is_price_study: !1, inputs: [{ id: "in_0", name: "length7", defval: 7, type: "integer", min: 1, max: 1e12 }, { id: "in_1", name: "length14", defval: 14, type: "integer", min: 1, max: 1e12 }, { id: "in_2", name: "length28", defval: 28, type: "integer", min: 1, max: 1e12 }], id: "ultimate_oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Ultimate Oscillator", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t, i) { var r = this._context.new_var(e), n = this._context.new_var(t); return [s.Std.sum(r, i, this._context) / s.Std.sum(n, i, this ._context)] }, this.f_1 = function() { var e = this._input(0), t = this._input(1), i = this._input(2), r = this._context.new_var(s.Std.close(this._context)), n = s.Std.max(s.Std.high(this._context), r.get(1)), o = this._context.new_var(s.Std.close(this._context)), a = s.Std.min(s.Std.low(this._context), o.get(1)), l = s.Std.close(this._context) - a, c = n - a, h = this.f_0(l, c, e), u = this.f_0(l, c, t), d = this.f_0(l, c, i); return [100 * (4 * h[0] + 2 * u[0] + d[0]) / 7] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_1() } } }, { name: "Volatility Close-to-Close", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Volatility Close-to-Close@tv-basicstudies-1", scriptIdPart: "", name: "Volatility Close-to-Close", description: "Volatility Close-to-Close", shortDescription: "Volatility Close-to-Close", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#2196F3" } }, inputs: { periods: 10, daysPerYear: 252 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", name: "Periods", type: "integer", defval: 10 }, { id: "daysPerYear", name: "Days Per Year", type: "integer", defval: 252 }], format: { precision: 2, type: "percent" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.daysPerYear = this._input(1) }, this.stdev = function(e, t, i) { var r = this.variance(e, t, i); return s.Std.sqrt(r) }, this.variance = function(e, t, i) { var r = s.Std.sma(e, t, i); return this.variance2(e, r, t) }, this.variance2 = function(e, t, i) { var s, r, n = 0; for (s = 0; s < i; s++) n += (r = e.get(s) - t) * r; return n / (i - 1) }, this.standardHistVol = function() { var e = this._context.new_var(s.Std.close(this._context)), t = this._context.new_var(s.Std.log(e.get() / e.get(1))); return 100 * this.stdev(t, this.period, this._context) * s.Std.sqrt( this.daysPerYear) }, this.main = function(e, t) { return this._context = e, this._input = t, [this.standardHistVol()] } } }, { name: "Volatility Zero Trend Close-to-Close", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Volatility Zero Trend Close-to-Close@tv-basicstudies-1", scriptIdPart: "", name: "Volatility Zero Trend Close-to-Close", description: "Volatility Zero Trend Close-to-Close", shortDescription: "Volatility Zero Trend Close-to-Close", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#2196F3" } }, inputs: { periods: 10, daysPerYear: 252 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", name: "Periods", type: "integer", min: 0, max: 1e4 }, { id: "daysPerYear", name: "Days Per Year", type: "integer" }], format: { precision: 2, type: "percent" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.daysPerYear = this._input(1) }, this.volatliityZTCTC = function() { this._context.setMinimumAdditionalDepth(this._input(0) + 1); for (var e = this._context.new_var(s.Std.close(this._context)), t = this._context.new_var(e.symbol.time), i = Math.sqrt((t.get( 0) - t.get(1)) / 864e5 / this.daysPerYear), r = Math .log(s.Std.close(this._context) / e.get(1)), n = this ._context.new_var(r / i), o = this._context.new_var(Math .pow(n, 2)), a = 0, l = 0; l < this.period; l++) a += o .get(l); return 100 * Math.sqrt(a / this.period) }, this.main = function(e, t) { return this._context = e, this._input = t, [this.volatliityZTCTC()] } } }, { name: "Volatility O-H-L-C", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !1, id: "Volatility O-H-L-C@tv-basicstudies-1", scriptIdPart: "", name: "Volatility O-H-L-C", description: "Volatility O-H-L-C", shortDescription: "Volatility O-H-L-C", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF5252" } }, inputs: { periods: 10, marketClosedPercentage: 0, daysPerYear: 252 } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", type: "integer", name: "Periods" }, { id: "marketClosedPercentage", type: "float", name: "Market Closed Percentage", min: 0, max: .999 }, { id: "daysPerYear", type: "integer", name: "Days Per Year" }], format: { precision: 2, type: "percent" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.marketClosedPercentage = this._input(1), this.daysPerYear = this._input(2), this.secondsPerYear = 86400 * this.daysPerYear }, this.square = function(e) { return e * e }, this.volatilityOHLC = function() { var e = this._context.new_var(Math.log(s.Std.open(this._context))), t = this._context.new_var(Math.log(s.Std.high(this._context))), i = this._context.new_var(Math.log(s.Std.low(this._context))), r = this._context.new_var(Math.log(s.Std.close(this._context))), n = this._context.new_var(s.Std.close(this._context)), o = this._context.new_var(n.symbol.time), a = (o.get(0) - o.get(1)) / 1e3, l = .5 * this.square(t.get() - i.get()); l -= (Math.log(4) - 1) * this.square(r.get() - e.get()), this .marketClosedPercentage > 0 && (l = .12 * this.square(e.get() - r.get(1)) / this.marketClosedPercentage + .88 * l / (1 - this.marketClosedPercentage)), l /= a, l *= this .secondsPerYear; var c = this._context.new_var(l); return 100 * Math.sqrt(s.Std.sum(c, this.period, this._context) / this.period) }, this.main = function(e, t) { return this._context = e, this._input = t, [this.volatilityOHLC()] } } }, { name: "Volatility Index", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, is_price_study: !0, id: "Volatility Index@tv-basicstudies-1", scriptIdPart: "", name: "Volatility Index", description: "Volatility Index", shortDescription: "Volatility Index", plots: [{ id: "plot_0", type: "line" }], defaults: { styles: { plot_0: { linestyle: 0, visible: !0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, color: "#FF5252" } }, inputs: { periods: 10, atrMult: 3, method: "Wilder Smoothing" } }, styles: { plot_0: { title: "Plot" } }, inputs: [{ id: "periods", name: "Periods", type: "integer" }, { id: "atrMult", name: "ATR Mult", type: "float" }, { id: "method", name: "Method", type: "text", defval: "Exponential", options: ["Exponential", "Wilder Smoothing"] }], format: { type: "inherit" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._input = t, this.period = this._input(0), this.atrMult = this._input(1), this.maMethod = this._input(2), this.nextsar = null, this.position = null, this.sic = null, this .bars = [], this.count = 0, this.lastSar = null, this._context .setMinimumAdditionalDepth("Exponential" === this.maMethod ? 2 * this.period + 2 : this.period) }, this.computeATR = function() { var e = s.Std.high(this._context) - s.Std.low(this._context), t = s.Std.high(this._context) - this.bars[this.bars.length - 2], i = this.bars[this.bars.length - 2] - s.Std.low(this._context); return this.tr = Math.max(e, t, i), "Exponential" === this .maMethod ? this.atr = s.Std.ema(this._context.new_var(this.tr), this.period, this._context) : this.atr = this.tr / this .period + (1 - 1 / this.period) * this.atr, this.atr * this.atrMult }, this.calculateVolatility = function() { if (s.Std.close(this._context) === this.bars[this.bars.length - 1]) return this.lastSar; if (this.bars.push(s.Std.close(this._context)), 1 === this.count) this.atr = s.Std.high(this._context) - s.Std.low(this._context), this.sic = s.Std.close(this._context); else if (this.count < this.period) { var e = s.Std.high(this._context) - s.Std.low(this._context), t = s.Std.high(this._context) - this.bars[this.bars.length - 2], i = this.bars[this.bars.length - 2] - s.Std.low(this ._context); this.atr += Math.max(e, t, i), s.Std.close(this._context) > this .sic && (this.sic = s.Std.close(this._context)) } else if (this.count === this.period) { e = s.Std.high(this._context) - s.Std.low(this._context), t = s .Std.high(this._context) - this.bars[this.bars.length - 2], i = this.bars[this.bars.length - 2] - s.Std.low(this ._context); this.atr += Math.max(e, t, i), this.atr *= 1 / this.period, s .Std.close(this._context) > this.sic && (this.sic = s.Std .close(this._context)), this.position = "LONG", this .nextsar = this.sic - this.atr * this.atrMult } else { var r = this.nextsar; "LONG" === this.position ? s.Std.close(this._context) < r ? ( this.position = "SHORT", this.sic = s.Std.close(this ._context), this.nextsar = this.sic + this .computeATR()) : (this.position = "LONG", this.sic = Math.max(s.Std.close(this._context), this.sic), this .nextsar = this.sic - this.computeATR()) : "SHORT" === this.position && (s.Std.close(this._context) > r ? (this .position = "LONG", this.sic = s.Std.close(this ._context), this.nextsar = this.sic - this .computeATR()) : (this.position = "SHORT", this .sic = Math.min(s.Std.close(this._context), this .sic), this.nextsar = this.sic + this .computeATR())), this.lastSar = r } return this.count++, r }, this.main = function(e, t) { return this._context = e, this._input = t, this._context.select_sym( 0), [this.calculateVolatility()] } } }, { name: "VWAP", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: 0, transparency: 0, visible: !0, color: "#2196F3" } } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "VWAP", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "VWAP", shortDescription: "VWAP", is_price_study: !0, inputs: [], id: "VWAP@tv-basicstudies-1", scriptIdPart: "", name: "VWAP", format: { type: "inherit" } }, constructor: function() { this.f_1 = function(e) { e.hist = null, e.add_hist() }, this.init = function(e, t) { this._isNewSession = null }, this.main = function(e, t) { this._context = e, this._input = t; var i = e.new_var(), r = e.new_var(), n = this._context.symbol.time; return n && (null === this._isNewSession && (this._isNewSession = s .Std.createNewSessionCheck(e)), this._isNewSession(n) && (this.f_1(i), this.f_1(r))), i.set(s.Std.nz(i.get(1)) + s .Std.hlc3(this._context) * s.Std.volume(this._context)), r .set(s.Std.nz(r.get(1)) + s.Std.volume(this._context)), [i.get( 0) / r.get(0)] } } }, { name: "VWMA", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 20 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "VWMA", shortDescription: "VWMA", is_price_study: !0, inputs: [{ id: "in_0", name: "len", defval: 20, type: "integer", min: 1, max: 1e4 }], id: "VWMA@tv-basicstudies-1", scriptIdPart: "", name: "VWMA", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.close(this._context), r = this._input(0), n = this._context.new_var(i); return [s.Std.vwma(n, r, this._context)] } } }, { name: "Volume Oscillator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: 0 }], inputs: { in_0: 5, in_1: 10 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Volume Oscillator", shortDescription: "Volume Osc", is_price_study: !1, bands: [{ id: "hline_0", name: "Zero" }], inputs: [{ id: "in_0", name: "shortlen", defval: 5, type: "integer", min: 1, max: 4999 }, { id: "in_1", name: "longlen", defval: 10, type: "integer", min: 1, max: 4999 }], id: "Volume Oscillator@tv-basicstudies-1", scriptIdPart: "", name: "Volume Oscillator", format: { precision: 2, type: "percent" } }, constructor: function() { this.f_0 = function(e, t) { return 100 * (e - t) / t }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = s.Std.volume(this._context), o = this._context.new_var(n), a = s.Std.ema(o, i, this._context), l = this._context.new_var(n), c = s.Std.ema(l, r, this._context); return [this.f_0(a, c)] } } }, { name: "Vortex Indicator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#E91E63" } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }], styles: { plot_0: { title: "VI +", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_1: { title: "VI -", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "Vortex Indicator", shortDescription: "VI", is_price_study: !1, is_hidden_study: !1, id: "vortex_indicator@tv-basicstudies-1", inputs: [{ id: "in_0", name: "Period", defval: 14, type: "integer", min: 2, max: 1e12 }], scriptIdPart: "", name: "Vortex Indicator", format: { precision: 4, type: "price" } }, constructor: function() { this.f_0 = function() { var e = this._input(0), t = this._context.new_var(s.Std.low(this._context)), i = this._context.new_var(s.Std.abs(s.Std.high(this._context) - t.get(1))), r = s.Std.sum(i, e, this._context), n = this._context.new_var(s.Std.high(this._context)), o = this._context.new_var(s.Std.abs(s.Std.low(this._context) - n .get(1))), a = s.Std.sum(o, e, this._context), l = this._context.new_var(s.Std.atr(1, this._context)), c = s.Std.sum(l, e, this._context); return [r / c, a / c] }, this.main = function(e, t) { return this._context = e, this._input = t, this.f_0() } } }, { name: "Willams %R", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#7E57C2" } }, bands: [{ color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: -20 }, { color: "#787B86", linestyle: 2, linewidth: 1, visible: !0, value: -80 }], filledAreasStyle: { fill_0: { color: "#7E57C2", transparency: 90, visible: !0 } }, inputs: { in_0: 14 } }, plots: [{ id: "plot_0", type: "line" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Williams %R", shortDescription: "%R", is_price_study: !1, bands: [{ id: "hline_0", name: "UpperLimit" }, { id: "hline_1", name: "LowerLimit" }], filledAreas: [{ id: "fill_0", objAId: "hline_0", objBId: "hline_1", type: "hline_hline", title: "Hlines Background" }], inputs: [{ id: "in_0", name: "length", defval: 14, type: "integer", min: 1, max: 2e3 }], id: "Willams %R@tv-basicstudies-1", scriptIdPart: "", name: "Willams %R", format: { precision: 2, type: "price" } }, constructor: function() { this.f_0 = function(e, t, i) { return 100 * (e - t) / (t - i) }, this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = s.Std.high(this._context), n = this._context.new_var(r), o = s.Std.highest(n, i, this._context), a = s.Std.low(this._context), l = this._context.new_var(a), c = s.Std.lowest(l, i, this._context); return [this.f_0(s.Std.close(this._context), o, c)] } } }, { name: "Williams Alligator", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" }, plot_1: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#E91E63" }, plot_2: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#66BB6A" } }, inputs: { in_0: 21, in_1: 13, in_2: 8, in_3: 8, in_4: 5, in_5: 3 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", type: "line" }, { id: "plot_2", type: "line" }], styles: { plot_0: { title: "Jaw", histogramBase: 0, joinPoints: !1 }, plot_1: { title: "Teeth", histogramBase: 0, joinPoints: !1 }, plot_2: { title: "Lips", histogramBase: 0, joinPoints: !1 } }, description: "Williams Alligator", shortDescription: "Alligator", is_price_study: !0, inputs: [{ id: "in_0", name: "Jaw Length", defval: 21, type: "integer", min: 1, max: 2e3 }, { id: "in_1", name: "Teeth Length", defval: 13, type: "integer", min: 1, max: 2e3 }, { id: "in_2", name: "Lips Length", defval: 8, type: "integer", min: 1, max: 2e3 }, { id: "in_3", name: "Jaw Offset", defval: 8, type: "integer", min: 1, max: 2e3 }, { id: "in_4", name: "Teeth Offset", defval: 5, type: "integer", min: 1, max: 2e3 }, { id: "in_5", name: "Lips Offset", defval: 3, type: "integer", min: 1, max: 2e3 }], id: "Williams Alligator@tv-basicstudies-1", scriptIdPart: "", name: "Williams Alligator", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = this._input(2), o = this._input(3), a = this._input(4), l = this._input(5), c = s.Std.hl2(this._context); return [{ value: s.Std.smma(c, i, this._context), offset: o }, { value: s.Std.smma(c, r, this._context), offset: a }, { value: s.Std.smma(c, n, this._context), offset: l }] } } }, { name: "Williams Fractals", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, defaults: { styles: { plot_0: { plottype: "shape_triangle_down", visible: !0, location: "BelowBar", transparency: 0, color: "#F44336" }, plot_1: { plottype: "shape_triangle_up", visible: !0, location: "AboveBar", transparency: 0, color: "#009688" } }, inputs: { in_0: 2 } }, plots: [{ id: "plot_0", type: "shapes" }, { id: "plot_1", type: "shapes" }], styles: { plot_0: { title: "Down fractals", isHidden: !1 }, plot_1: { title: "Up fractals", isHidden: !1 } }, description: "Williams Fractal", shortDescription: "Fractals", is_price_study: !0, is_hidden_study: !1, id: "Williams Fractals@tv-basicstudies-1", inputs: [{ id: "in_0", name: "Periods", defval: 2, type: "integer", min: 2, max: 1e12 }], scriptIdPart: "", name: "Williams Fractals", isCustomIndicator: !0, format: { type: "inherit" } }, constructor: function() { this.f_0 = function() { for (var e = this._input(0), t = this._context.new_var(s.Std.high( this._context)), i = !0, r = !0, n = !0, o = !0, a = !0, l = !0, c = 1; c <= e; c++) i = s.Std.and(i, s.Std.lt(t.get( e - c), t.get(e))), r = s.Std.and(r, s.Std.lt(t.get(e + c), t.get(e))), n = s.Std.and(n, s.Std.and(s.Std.le(t.get(e + 1), t.get(e)), s.Std.lt(t.get(e + c + 1), t.get(e)))), o = s .Std.and(o, s.Std.and(s.Std.le(t.get(e + 1), t.get(e)), s.Std .and(s.Std.le(t.get(e + 2), t.get(e)), s.Std.lt(t.get( e + c + 2), t.get(e))))), a = s.Std.and(a, s.Std.and(s .Std.le(t.get(e + 1), t.get(e)), s.Std.and(s.Std.le(t .get(e + 2), t.get(e)), s.Std.and(s.Std.le(t .get(e + 3), t.get(e)), s.Std.lt(t.get(e + c + 3), t.get(e)))))), l = s.Std.and(l, s.Std.and(s.Std .le(t.get(e + 1), t.get(e)), s.Std.and(s.Std.le(t.get( e + 2), t.get(e)), s.Std.and(s.Std.le(t.get(e + 3), t.get(e)), s.Std.and(s.Std.le(t.get(e + 4), t.get(e)), s.Std.lt(t.get(e + c + 4), t.get(e))))))); var h = s.Std.or(r, s.Std.or(n, s.Std.or(o, s.Std.or(a, l)))), u = s.Std.and(i, h), d = this._context.new_var(s.Std.low(this._context)), p = 1, _ = 1, m = 1, f = 1, g = 1, b = 1; for (c = 1; c <= e; c++) p = s.Std.and(p, s.Std.gt(d.get(e - c), d .get(e))), _ = s.Std.and(_, s.Std.gt(d.get(e + c), d.get( e))), m = s.Std.and(m, s.Std.and(s.Std.ge(d.get(e + 1), d .get(e)), s.Std.gt(d.get(e + c + 1), d.get(e)))), f = s.Std .and(f, s.Std.and(s.Std.ge(d.get(e + 1), d.get(e)), s.Std.and(s .Std.ge(d.get(e + 2), d.get(e)), s.Std.gt(d.get(e + c + 2), d.get(e))))), g = s.Std.and(g, s.Std.and(s.Std .ge(d.get(e + 1), d.get(e)), s.Std.and(s.Std.ge(d.get( e + 2), d.get(e)), s.Std.and(s.Std.ge(d.get(e + 3), d.get(e)), s.Std.gt(d.get(e + c + 3), d .get(e)))))), b = s.Std.and(b, s.Std.and(s.Std.ge(d.get( e + 1), d.get(e)), s.Std.and(s.Std.ge(d.get(e + 2), d.get(e)), s.Std.and(s.Std.ge(d.get(e + 3), d .get(e)), s.Std.and(s.Std.ge(d.get(e + 4), d .get(e)), s.Std.gt(d.get(e + c + 4), d .get(e))))))); var v = s.Std.or(_, s.Std.or(m, s.Std.or(f, s.Std.or(g, b)))); return [s.Std.and(p, v), u] }, this.main = function(e, t) { this._context = e, this._input = t; var i = this.f_0(); return [{ value: i[0], offset: -this._input(0) }, { value: i[1], offset: -this._input(0) }] } } }, { name: "Guppy Multiple Moving Average", metainfo: { isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, description: "Guppy Multiple Moving Average", shortDescription: "GMMA", is_price_study: !0, id: "Guppy Multiple Moving Average@tv-basicstudies-1", _metainfoVersion: 52, format: { type: "inherit" }, defaults: { inputs: { traderEMA1Length: 3, traderEMA2Length: 5, traderEMA3Length: 8, traderEMA4Length: 10, traderEMA5Length: 12, traderEMA6Length: 15, investorEMA1Length: 30, investorEMA2Length: 35, investorEMA3Length: 40, investorEMA4Length: 45, investorEMA5Length: 50, investorEMA6Length: 60 }, styles: { traderEMA1: { color: "#00FFFF", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 15, visible: !0 }, traderEMA2: { color: "#00FFFF", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 12, visible: !0 }, traderEMA3: { color: "#00FFFF", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 9, visible: !0 }, traderEMA4: { color: "#00FFFF", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 6, visible: !0 }, traderEMA5: { color: "#00FFFF", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 3, visible: !0 }, traderEMA6: { color: "#00FFFF", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0 }, investorEMA1: { color: "#FF0000", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 15, visible: !0 }, investorEMA2: { color: "#FF0000", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 12, visible: !0 }, investorEMA3: { color: "#FF0000", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 9, visible: !0 }, investorEMA4: { color: "#FF0000", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 6, visible: !0 }, investorEMA5: { color: "#FF0000", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 3, visible: !0 }, investorEMA6: { color: "#FF0000", linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !0 } } }, inputs: [{ defval: 3, id: "traderEMA1Length", max: 1e3, min: 1, name: "Trader EMA 1 length", type: "integer" }, { defval: 5, id: "traderEMA2Length", max: 1e3, min: 1, name: "Trader EMA 2 length", type: "integer" }, { defval: 8, id: "traderEMA3Length", max: 1e3, min: 1, name: "Trader EMA 3 length", type: "integer" }, { defval: 10, id: "traderEMA4Length", max: 1e3, min: 1, name: "Trader EMA 4 length", type: "integer" }, { defval: 12, id: "traderEMA5Length", max: 1e3, min: 1, name: "Trader EMA 5 length", type: "integer" }, { defval: 15, id: "traderEMA6Length", max: 1e3, min: 1, name: "Trader EMA 6 length", type: "integer" }, { defval: 30, id: "investorEMA1Length", max: 1e3, min: 1, name: "Investor EMA 1 length", type: "integer" }, { defval: 35, id: "investorEMA2Length", max: 1e3, min: 1, name: "Investor EMA 2 length", type: "integer" }, { defval: 40, id: "investorEMA3Length", max: 1e3, min: 1, name: "Investor EMA 3 length", type: "integer" }, { defval: 45, id: "investorEMA4Length", max: 1e3, min: 1, name: "Investor EMA 4 length", type: "integer" }, { defval: 50, id: "investorEMA5Length", max: 1e3, min: 1, name: "Investor EMA 5 length", type: "integer" }, { defval: 60, id: "investorEMA6Length", max: 1e3, min: 1, name: "Investor EMA 6 length", type: "integer" }], plots: [{ id: "traderEMA1", type: "line" }, { id: "traderEMA2", type: "line" }, { id: "traderEMA3", type: "line" }, { id: "traderEMA4", type: "line" }, { id: "traderEMA5", type: "line" }, { id: "traderEMA6", type: "line" }, { id: "investorEMA1", type: "line" }, { id: "investorEMA2", type: "line" }, { id: "investorEMA3", type: "line" }, { id: "investorEMA4", type: "line" }, { id: "investorEMA5", type: "line" }, { id: "investorEMA6", type: "line" }], styles: { traderEMA1: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Trader EMA 1" }, traderEMA2: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Trader EMA 2" }, traderEMA3: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Trader EMA 3" }, traderEMA4: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Trader EMA 4" }, traderEMA5: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Trader EMA 5" }, traderEMA6: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Trader EMA 6" }, investorEMA1: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Investor EMA 1" }, investorEMA2: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Investor EMA 2" }, investorEMA3: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Investor EMA 3" }, investorEMA4: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Investor EMA 4" }, investorEMA5: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Investor EMA 5" }, investorEMA6: { histogramBase: 0, isHidden: !1, joinPoints: !1, title: "Investor EMA 6" } } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._context.new_var(s.Std.close(this._context)), r = this._input(0), n = this._input(1), o = this._input(2), a = this._input(3), l = this._input(4), c = this._input(5), h = s.Std.ema(i, r, this._context), u = s.Std.ema(i, n, this._context), d = s.Std.ema(i, o, this._context), p = s.Std.ema(i, a, this._context), _ = s.Std.ema(i, l, this._context), m = s.Std.ema(i, c, this._context), f = this._input(6), g = this._input(7), b = this._input(8), v = this._input(9), S = this._input(10), y = this._input(11); return [h, u, d, p, _, m, s.Std.ema(i, f, this._context), s.Std.ema( i, g, this._context), s.Std.ema(i, b, this._context), s .Std.ema(i, v, this._context), s.Std.ema(i, S, this ._context), s.Std.ema(i, y, this._context) ] } } }] }, "2ijp": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("l4sv"), r = i("8Uy/"); class n { constructor() { this._lineRendererData = { y: 0, color: "rgba(0, 0, 0, 0)", linewidth: 1, linestyle: r.LINESTYLE_SOLID, visible: !1 }, this._lineRenderer = new s.HorizontalLineRenderer, this._invalidated = !0, this._lineRenderer.setData(this._lineRendererData) } update() { this._invalidated = !0 } renderer() { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._lineRenderer } } }, "2jXJ": function(e, t, i) { "use strict"; i.r(t), i.d(t, "supportedLineTools", (function() { return s })); const s = { cursor: { name: "cursor", onlySelectable: !0 }, dot: { name: "dot", onlySelectable: !0 }, arrow_cursor: { name: "arrow", onlySelectable: !0 }, eraser: { name: "eraser", onlySelectable: !0 }, measure: { name: "measure", onlySelectable: !0 }, zoom: { name: "zoom", onlySelectable: !0 }, brush: { name: "LineToolBrush" }, highlighter: { name: "LineToolHighlighter" }, text: { name: "LineToolText" }, anchored_text: { name: "LineToolTextAbsolute" }, note: { name: "LineToolNote" }, anchored_note: { name: "LineToolNoteAbsolute" }, signpost: { name: "LineToolSignpost" }, callout: { name: "LineToolCallout" }, balloon: { name: "LineToolBalloon" }, arrow_up: { name: "LineToolArrowMarkUp" }, arrow_down: { name: "LineToolArrowMarkDown" }, arrow_left: { name: "LineToolArrowMarkLeft" }, arrow_right: { name: "LineToolArrowMarkRight" }, price_label: { name: "LineToolPriceLabel" }, price_note: { name: "LineToolPriceNote" }, arrow_marker: { name: "LineToolArrowMarker" }, flag: { name: "LineToolFlagMark" }, vertical_line: { name: "LineToolVertLine" }, horizontal_line: { name: "LineToolHorzLine" }, cross_line: { name: "LineToolCrossLine" }, horizontal_ray: { name: "LineToolHorzRay" }, trend_line: { name: "LineToolTrendLine" }, info_line: { name: "LineToolInfoLine" }, trend_angle: { name: "LineToolTrendAngle" }, arrow: { name: "LineToolArrow" }, ray: { name: "LineToolRay" }, extended: { name: "LineToolExtended" }, parallel_channel: { name: "LineToolParallelChannel" }, disjoint_angle: { name: "LineToolDisjointAngle" }, flat_bottom: { name: "LineToolFlatBottom" }, pitchfork: { name: "LineToolPitchfork" }, schiff_pitchfork_modified: { name: "LineToolSchiffPitchfork" }, schiff_pitchfork: { name: "LineToolSchiffPitchfork2" }, inside_pitchfork: { name: "LineToolInsidePitchfork" }, pitchfan: { name: "LineToolPitchfan" }, gannbox: { name: "LineToolGannSquare" }, gannbox_square: { name: "LineToolGannComplex" }, gannbox_fixed: { name: "LineToolGannFixed" }, gannbox_fan: { name: "LineToolGannFan" }, fib_retracement: { name: "LineToolFibRetracement" }, fib_trend_ext: { name: "LineToolTrendBasedFibExtension" }, fib_speed_resist_fan: { name: "LineToolFibSpeedResistanceFan" }, fib_timezone: { name: "LineToolFibTimeZone" }, fib_trend_time: { name: "LineToolTrendBasedFibTime" }, fib_circles: { name: "LineToolFibCircles" }, fib_spiral: { name: "LineToolFibSpiral" }, fib_speed_resist_arcs: { name: "LineToolFibSpeedResistanceArcs" }, fib_wedge: { name: "LineToolFibWedge" }, fib_channel: { name: "LineToolFibChannel" }, xabcd_pattern: { name: "LineTool5PointsPattern" }, cypher_pattern: { name: "LineToolCypherPattern" }, abcd_pattern: { name: "LineToolABCD" }, triangle_pattern: { name: "LineToolTrianglePattern" }, "3divers_pattern": { name: "LineToolThreeDrivers" }, head_and_shoulders: { name: "LineToolHeadAndShoulders" }, elliott_impulse_wave: { name: "LineToolElliottImpulse" }, elliott_triangle_wave: { name: "LineToolElliottTriangle" }, elliott_triple_combo: { name: "LineToolElliottTripleCombo" }, elliott_correction: { name: "LineToolElliottCorrection" }, elliott_double_combo: { name: "LineToolElliottDoubleCombo" }, cyclic_lines: { name: "LineToolCircleLines" }, time_cycles: { name: "LineToolTimeCycles" }, sine_line: { name: "LineToolSineLine" }, long_position: { name: "LineToolRiskRewardLong" }, short_position: { name: "LineToolRiskRewardShort" }, forecast: { name: "LineToolPrediction" }, date_range: { name: "LineToolDateRange" }, price_range: { name: "LineToolPriceRange" }, date_and_price_range: { name: "LineToolDateAndPriceRange" }, bars_pattern: { name: "LineToolBarsPattern" }, ghost_feed: { name: "LineToolGhostFeed" }, projection: { name: "LineToolProjection" }, rectangle: { name: "LineToolRectangle" }, rotated_rectangle: { name: "LineToolRotatedRectangle" }, ellipse: { name: "LineToolEllipse" }, triangle: { name: "LineToolTriangle" }, polyline: { name: "LineToolPolyline" }, path: { name: "LineToolPath" }, curve: { name: "LineToolBezierQuadro" }, double_curve: { name: "LineToolBezierCubic" }, arc: { name: "LineToolArc" }, icon: { name: "LineToolIcon" }, regression_trend: { name: "LineToolRegressionTrend" }, fixed_range_volume_profile: { name: "LineToolFixedRangeVolumeProfile" } } }, "2jby": function(e, t, i) { "use strict"; i.r(t), i.d(t, "reorderCollection", (function() { return S })), i.d(t, "reorderDataSourcesStateZOrder", (function() { return y })), i.d(t, "reorderDataSourcesZOrder", (function() { return w })), i.d(t, "newLineToolZOrder", (function() { return x })), i.d(t, "newLineToolStateZOrder", (function() { return T })), i.d(t, "newStudyZOrder", (function() { return I })), i.d(t, "isReorderRequired", (function() { return L })), i.d(t, "moveAtIndex", (function() { return E })), i.d(t, "moveAfterItem", (function() { return k })), i.d(t, "moveBeforeItem", (function() { return D })), i.d(t, "moveAfterSource", (function() { return V })), i.d(t, "moveBeforeSource", (function() { return B })), i.d(t, "moveAfterSourceState", (function() { return R })), i.d(t, "moveBeforeSourceState", (function() { return N })); var s = i("CW80"), r = i("3ClC"), n = i("qJq3"), o = i("s1Gx"), a = i("Vs8b"), l = i("Y7w9"); function c(e) { return e instanceof n.Series } function h(e) { return Object(s.isLineTool)(e) && !e.isSpeciallyZOrderedSource() } function u(e) { return Object(r.isStudy)(e) && !e.isSpeciallyZOrderedSource() } function d(e, t) { return e.zorder - t.zorder } function p(e, t) { return e.zorder() - t.zorder() } function _(e, t) { Object(a.isMainSeriesState)(e) ? e.zorder = 0 : e.zorder = t } function m(e, t) { e.setZorder(t) } function f(e) { return e.zorder } function g(e) { return e.zorder() } function b(e, t, i, s, r, n, o) { let a = 0; for (let l = t; l >= 0; --l) { const t = e[l]; void 0 !== o && o(t) || (n(t) ? (r(t, i), a = Math.max(a, M(i)), s = i - 1, i -= 1e4, 0 === s && (i -= 1e4)) : (r(t, s), a = Math.max(a, O(s)), s -= 1)) } return a } function v(e, t, i, s, r, n, o) { let a = 0; for (let l = t; l < e.length; ++l) { const t = e[l]; void 0 !== o && o(t) || (n(t) ? (r(t, i), a = Math.max(a, M(i)), s = i + 1, 0 === (i += 1e4) && (s += 1e4)) : (r(t, s), a = Math.max(a, O(s)), s += 1)) } return a } function S(e, t, i, s, r, n) { let o = null; const a = []; for (const r of e) t(r) ? (a.push(r), o = r) : (i(r) || s(r)) && a.push(r); a.sort(n), null !== o && r(o, 0); const l = null === o ? -1 : a.indexOf(o), c = b(a, l - 1, -1e4, -1, r, i), h = v(a, l + 1, 1e4, 1, r, i); return Math.max(c, h) < .7 } function y(e) { return S(e, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, d) } function w(e) { return S(e, c, u, h, m, p) } function P(e, t) { const i = Math.floor(e / 1e4); let s = t.get(i); return void 0 === s && (s = [], t.set(i, s)), s } function C(e, t, i, s, r, n) { let o = -1 / 0, a = 1 / 0, l = 0; const c = new Map; for (let s = 0; s < e.length; ++s) { const n = e[s], h = r(n); t(n) ? (o = Math.max(o, h), P(h, c).push(n)) : i(n) && (h < 0 && (a = Math.min(a, h)), l = Math.max(l, h)) } if (n) { return Math.max(l, o) + 1 } if (o === -1 / 0) return a === 1 / 0 ? -1 : a - 1; if (o > 0 || o % 1e4 < -1) return o + 1; for (const e of P(o, c)) s(e, r(e) - 1); return o } function x(e, t) { return C(e, h, u, m, g, t) } function T(e, t) { return C(e, a.isLineToolState, a.isStudyState, _, f, t) } function I(e) { let t = -1e4; for (const i of e) u(i) && (t = Math.min(t, i.zorder() - 1e4)); return 0 === t ? -1e4 : t } function M(e) { return Math.abs(e / o.specialZOrderBase) } function O(e) { return Math.abs(e % 1e4 / 1e4) } function L(e, t) { return null !== e && M(e) >= .7 || null !== t && O(t) > .7 } function A(e, t) { const i = 1e4 * ((s = e / 1e4) >= 0 ? Math.ceil(s) : Math.floor(s)); var s; return i === e ? i + 1e4 * t : i } function E(e, t, i, s, r, n, a, c, h) { if (s(t[0])) return void(i < e.length && c(e[i]) < 0 ? v(e, i, 1e4, 1, a, r, s) : b(e, Math .max(0, Math.min(i - 1, e.length - 1)), -1e4, -1, a, r, s)); const { newItems: u, movedItemsStartIndex: d } = i > 0 ? Object(l.moveAfter)(e, t, i - 1) : Object(l.moveBefore)(e, t, 0), p = d, _ = d + t.length - 1, m = p > 0 ? c(u[p - 1]) : c(u[p]) - 1, f = _ < e.length - 1 ? c(u[_ + 1]) : c(u[_]) + 1; if (m >= 0 && f > 0) v(u, p, A(m, 1), m + 1, a, r, s); else if (f <= 0 && m < 0) b(u, _, A(f, -1), f - 1, a, r, s); else { let e = -o.specialZOrderBase; for (const t of u) s(t) ? e = 1 : (a(t, e), e += 1); S(u, s, r, n, a, h) } } function k(e, t, i, s, r, n, o, a, l) { const c = e.indexOf(i) + 1; E(e, t, c, s, r, n, o, a, l) } function D(e, t, i, s, r, n, o, a, l) { const c = e.indexOf(i); E(e, t, c, s, r, n, o, a, l) } function V(e, t, i) { k(e, t, i, c, u, h, m, g, p) } function B(e, t, i) { D(e, t, i, c, u, h, m, g, p) } function R(e, t, i) { k(e, t, i, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, f, d) } function N(e, t, i) { D(e, t, i, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, f, d) } }, "2kV1": function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyStatusView", (function() { return r })); var s = i("nBJD"); class r extends s.a { constructor(e) { super(e.statusProvider()) } color() { return this._statusProvider.color() } getSplitTitle() { return this._statusProvider.getSplitTitle() } update() { this._text = this._statusProvider.text() } } }, "2uTr": function(e, t, i) { "use strict"; function s(e) { return e + "…" } i.r(t), i.d(t, "appendEllipsis", (function() { return s })) }, "3/8U": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("HGP3"), r = i("Tmoa"); const n = Object(r.generateColor)(s.colorsPalette["color-tv-blue-500"], 75) }, "38az": function(e, t, i) { "use strict"; var s = i("k9/m").PlotRowSearchMode, r = i("Tmoa").rgbaFromInteger; function n() { this.backColorers = [] } function o(e) { n.call(this), this._series = e } function a(e, t) { n.call(this), this._study = e, this._plotIndex = t } n.prototype.barStyle = function(e, t, i) { for (var s = {}, r = this.backColorers.length - 1; r >= 0; r--) this.backColorers[r] .applyBarStyle(e, t, s, i); return this.applyBarStyle(e, t, s, i), s }, n.prototype.pushBackBarColorer = function(e) { this.backColorers.push(e) }, n.prototype.applyBarStyle = function(e, t, i) { throw new Error("This function is supposed to be reimplemented in a subclass") }, inherit(o, n), o.upColor = function(e, t) { switch (e.style.value()) { case TradingView.Series.STYLE_LINE: return e.lineStyle.color.value(); case TradingView.Series.STYLE_AREA: return e.areaStyle.linecolor.value(); case TradingView.Series.STYLE_BARS: return e.barStyle.upColor.value(); case TradingView.Series.STYLE_CANDLES: return e.candleStyle.upColor.value(); case TradingView.Series.STYLE_HOLLOW_CANDLES: return e.hollowCandleStyle.upColor.value(); case TradingView.Series.STYLE_HEIKEN_ASHI: return e.haStyle.upColor.value(); case TradingView.Series.STYLE_BASELINE: return e.baselineStyle.topLineColor.value(); case TradingView.Series.STYLE_HILO: return e.hiloStyle.color.value() } throw new Error("Unknown series style") }, o.downColor = function(e, t) { switch (e.style.value()) { case TradingView.Series.STYLE_LINE: return e.lineStyle.color.value(); case TradingView.Series.STYLE_AREA: return e.areaStyle.linecolor.value(); case TradingView.Series.STYLE_BARS: return e.barStyle.downColor.value(); case TradingView.Series.STYLE_CANDLES: return e.candleStyle.downColor.value(); case TradingView.Series.STYLE_HOLLOW_CANDLES: return e.hollowCandleStyle.downColor.value(); case TradingView.Series.STYLE_HEIKEN_ASHI: return e.haStyle.downColor.value(); case TradingView.Series.STYLE_BASELINE: return e.baselineStyle.bottomLineColor.value(); case TradingView.Series.STYLE_HILO: return e.hiloStyle.color.value() } throw new Error("Unknown series style") }, o.prototype._applyLineStyle = function(e, t, i, s, r) { i.barColor = o.upColor(r) }, o.prototype._applyAreaStyle = function(e, t, i, s, r) { i.barColor = o.upColor(r) }, o.prototype._applyBarStyle = function(e, t, i, s, r) { var n = o.upColor(r), a = o.downColor(r), l = this.findBar(e, !1, s); if (r.barStyle.barColorsOnPrevClose.value()) { var c = this.findPrevBar(e, !1, s); i.barColor = c[TradingView.CLOSE_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a, i .barBorderColor = c[TradingView.CLOSE_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a } else i.barColor = l[TradingView.OPEN_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a, i .barBorderColor = l[TradingView.OPEN_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a }, o.prototype._applyCandleStyle = function(e, t, i, s, r) { var n, a = o.upColor(r, t), l = o.downColor(r, t), c = r.candleStyle.borderUpColor ? r.candleStyle.borderUpColor.value() : r .candleStyle.borderColor.value(), h = r.candleStyle.borderDownColor ? r.candleStyle.borderDownColor.value() : r .candleStyle.borderColor.value(), u = r.candleStyle.wickUpColor ? r.candleStyle.wickUpColor.value() : r.candleStyle .wickColor.value(), d = r.candleStyle.wickDownColor ? r.candleStyle.wickDownColor.value() : r .candleStyle.wickColor.value(), p = this.findBar(e, !1, s); r.candleStyle.barColorsOnPrevClose.value() ? n = this.findPrevBar(e, !1, s)[TradingView .CLOSE_PLOT] <= p[TradingView.CLOSE_PLOT] : n = p[TradingView.OPEN_PLOT] <= p[ TradingView.CLOSE_PLOT]; i.barColor = n ? a : l, i.barBorderColor = n ? c : h, i.barWickColor = n ? u : d }, o.prototype._applyHollowCandleStyle = function(e, t, i, s, r) { var n = o.upColor(r, t), a = o.downColor(r, t), l = r.hollowCandleStyle.borderUpColor ? r.hollowCandleStyle.borderUpColor.value() : r.hollowCandleStyle.borderColor.value(), c = r.hollowCandleStyle.borderDownColor ? r.hollowCandleStyle.borderDownColor .value() : r.hollowCandleStyle.borderColor.value(), h = r.hollowCandleStyle.wickUpColor ? r.hollowCandleStyle.wickUpColor.value() : r .hollowCandleStyle.wickColor.value(), u = r.hollowCandleStyle.wickDownColor ? r.hollowCandleStyle.wickDownColor.value() : r.hollowCandleStyle.wickColor.value(), d = this.findBar(e, !1, s); this.findPrevBar(e, !1, s)[TradingView.CLOSE_PLOT] <= d[TradingView.CLOSE_PLOT] ? (i .barColor = n, i.barBorderColor = l, i.barWickColor = h) : (i.barColor = a, i .barBorderColor = c, i.barWickColor = u), i.isBarHollow = d[TradingView .OPEN_PLOT] <= d[TradingView.CLOSE_PLOT] }, o.prototype._applyHAStyle = function(e, t, i, s, r) { var n, a = o.upColor(r, t), l = o.downColor(r, t), c = r.haStyle.borderUpColor.value(), h = r.haStyle.borderDownColor.value(), u = r.haStyle.wickUpColor.value(), d = r.haStyle.wickDownColor.value(), p = this.findBar(e, t, s); r.haStyle.barColorsOnPrevClose.value() ? n = this.findPrevBar(e, t, s)[TradingView .CLOSE_PLOT] <= p[TradingView.CLOSE_PLOT] : n = p[TradingView.OPEN_PLOT] <= p[ TradingView.CLOSE_PLOT]; i.barColor = n ? a : l, i.barBorderColor = n ? c : h, i.barWickColor = n ? u : d }, o.prototype._applyBaseLineStyle = function(e, t, i, s, r) { var n = this.findBar(e, t, s), a = r.baselineStyle, l = this._series.priceScale(), c = Math.round(l.height() * (Math.abs(100 - a.baseLevelPercentage.value()) / 100)), h = this._series.firstValue(), u = l.coordinateToPrice(c, h); n[TradingView.CLOSE_PLOT] > u ? i.barColor = o.upColor(r, t) : i.barColor = o.downColor( r, t) }, o.prototype._applyHiLoStyle = function(e, t, i, s, r) { i.barColor = o.upColor(r, t), i.barBorderColor = r.hiloStyle.borderColor.value() }, o.prototype.applyBarStyle = function(e, t, i, s) { i || (i = {}), i.barColor = null, i.barBorderColor = null, i.barWickColor = null, i.isBarHollow = null, i.isBarUp = null, i.upColor = null, i.downColor = null, i.isTwoColorBar = null, i.isMergedBar = null; var r = this._series.properties(); switch (r.style.value()) { case TradingView.Series.STYLE_LINE: this._applyLineStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_AREA: this._applyAreaStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_BARS: this._applyBarStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_CANDLES: this._applyCandleStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_HOLLOW_CANDLES: this._applyHollowCandleStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_HEIKEN_ASHI: this._applyHAStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_BASELINE: this._applyBaseLineStyle(e, t, i, s, r); break; case TradingView.Series.STYLE_HILO: this._applyHiLoStyle(e, t, i, s, r) } return i }, o.prototype.getSeriesBars = function(e) { return e ? this._series.nsBars() : this._series.bars() }, o.prototype._findBarFieldValue = function(e, t, i) { var s = this.getSeriesBars(i).valueAt(e); if (null !== s) return s[t] }, o.prototype.findBar = function(e, t, i) { return i ? i.value : this.getSeriesBars(t).valueAt(e) || [] }, o.prototype.findPrevBar = function(e, t, i) { if (i && i.previousValue) return i.previousValue; var r = this._series.bars().search(e - 1, s.NearestLeft, TradingView.CLOSE_PLOT); return null !== r ? r.value : [] }, inherit(a, n), a.prototype.getBars = function() { return this._study.series().bars() }, a.prototype.firstColoredBar = function(e) { for (var t = e, i = 0; i < this.backColorers.length; i++) t = Math.min(t, this .backColorers[i].firstColoredBar(e)); var s = this.getOffset(this._plotIndex); t = Math.min(t, e + s); var r = this.getBars().firstIndex(); return Math.max(t, r) }, a.prototype.getOffset = function() { var e = this._study.metaInfo().plots[this._plotIndex]; return this._study.offset(e.id) }, a.prototype.applyBarStyle = function(e, t, i) { if (i || (i = {}), t) return i; var s = this._study.properties(); if (!s.visible.value()) return i; var n = this._study.metaInfo(), o = this._study.data(); if (!o || 0 === o.size()) return i; var a = n.plots[this._plotIndex], l = this.getOffset(); if (this._study.getMinFirstBarIndexForPlot(a.id) > e + l) return i; var c = s.styles[a.id]; if (c.visible && !c.visible.value()) return i; var h = o.valueAt(e - l); if (null === h) return i; var u = h[this._plotIndex + 1]; if (null == u) return i; if (u = Math.round(u), n.isRGB) i.barColor = r(u), i.upColor = i.barColor, i.downColor = i.barColor; else { var d = n.plots[this._plotIndex].palette, p = s.palettes[d], _ = n.palettes[d].valToIndex ? n.palettes[d].valToIndex[u] : u, m = p.colors[_].color.value(); i.barColor = m, i.upColor = m.color, i.downColor = m.color } return i }, t.SeriesBarColorer = o, t.StudyBarColorer = a }, "3ClC": function(e, t, i) { "use strict"; i.r(t); var s = i("0YCj"), r = i.n(s), n = i("GVHu"), o = i("PL0c"), a = i("cKqi"), l = i("YzC7"), c = i("TMWk"), h = i("8sOK"); class u extends n.Study { constructor(e, t, i, s) { super(e, t, i, s), this.properties().styles.vol_ma.visible.listeners() .subscribe(this, () => this.invalidateTitleCache()) } base() { return 1 } destroy() { this.properties().styles.vol_ma.visible.listeners().unsubscribeAll(this), super .destroy() } _titleInputs() { const e = { symbolsForDisplay: !0, skipHiddenInputs: !0, fakeInputsForDisplay: !0, asObject: !1 }; return this.properties().styles.vol_ma.visible.value() ? this.inputs(e) : this .inputs({ ...e, skippedInputs: ["length"] }) } } var d = i("Eyy1"), p = i("Qb4w"); class _ extends n.Study { priceRange(e, t) { let i = !1; this.graphics().hhists().forEach((e, t) => { i = i || this.properties().child("graphics").child("hhists").child( t).child("showValues").value() }); const s = function(e, t, i, s) { let r = null; return e.forEach((e, s) => { e.forEach(e => { e.firstBarTime <= i && e.lastBarTime >= t && ( null === r ? r = { low: { l: e.priceLow, h: e.priceHigh }, high: { h: e.priceHigh } } : (e.priceLow < r.low.l && (r.low.l = e.priceLow, r.low.h = e .priceHigh), r.high.h = Math .max(r.high.h, e.priceHigh))) }) }), null === r ? null : s ? new p.PriceRange(r.low.l - .8 * (r.low .h - r.low.l), r.high.h) : new p.PriceRange(r.low.l, r.high.h) }(this.graphics().hhists(), e, t, i); if (null === s) return null; const r = Object(d.ensureNotNull)(this.priceScale()); return r.isLog() ? new p.PriceRange(r.priceToLogical(s.minValue()), r .priceToLogical(s.maxValue())) : s } } function m(e, t = "shift", i) { return { studyConstructor: e, colorRotationMode: t, colorRotationComparator: i } } i.d(t, "isStudy", (function() { return g })), i.d(t, "isStudyStrategy", (function() { return b })), i.d(t, "isStudyStub", (function() { return v })), i.d(t, "isFundamentalStudy", (function() { return S })), i.d(t, "isESDStudy", (function() { return y })), i.d(t, "isFundamentalStudyMetaInfo", (function() { return w })), i.d(t, "createStudy", (function() { return C })), i.d(t, "studyColorRotationMode", (function() { return x })), i.d(t, "useSameColorRotationComparator", (function() { return I })); const f = { study_PivotPointsStandard: m(o.study_PivotPointsStandard), study_Overlay: m(a.study_Overlay, "loop"), study_Compare: m(l.a, "loop"), study_Volume: m(u), study_VbPVisible: m(class extends _ {}), study_ScriptWithDataOffset: m(c.study_ScriptWithDataOffset) }; for (const e in f) f.hasOwnProperty(e) && (TradingView[e] = f[e].studyConstructor); function g(e) { return e instanceof n.Study } function b(e) { return !1 } function v(e) { return e instanceof h.StudyStub } function S(e) { return e instanceof Fundamental } function y(e) { return !1 } function w(e) { return "study_Internal$STD;Fund_" === P(e) } function P(e) { const t = "study_" + (e.classId || e.shortId); return t.startsWith("study_Internal$STD;Fund_") ? "study_Internal$STD;Fund_" : t } function C(e, t, i, s, r) { const o = P(s), a = new(o in f ? f[o].studyConstructor : n.Study)(e, t, i, s); return void 0 !== r && a.setId(r), a } function x(e) { const t = P(e); return t in f ? f[t].colorRotationMode : void 0 === e.pine || r.a.isStandardPine(e.id) ? 1 !== e.plots.length ? "shift" : "loop" : null } function T(e, t) { return e.id === t.id && (s = t, ((i = e).pine ? i.pine.version : void 0) === (s.pine ? s .pine.version : void 0)); var i, s } function I(e) { const t = P(e); if (t in f) { const e = f[t].colorRotationComparator; if (void 0 !== e) return e } return T } }, "3UA0": function(e, t) { e.exports.tzData = { "America/New_York": { time: [-2717668562, -1633298400, -1615154400, -1601848800, -1583704800, -1570399200, -1551650400, -1536530400, -1523224800, -1504476e3, -1491775200, -1473026400, -1459720800, -1441576800, -1428271200, -1410127200, -1396821600, - 1378677600, -1365372e3, -1347228e3, -1333922400, -1315173600, -1301868e3, - 1283724e3, -1270418400, -1252274400, -1238968800, -1220824800, -1207519200, -1189375200, -1176069600, -1157320800, -114462e4, -1125871200, -1112565600, -1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800, -1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, - 905119200, -891813600, -880236e3, -76941e4, -765410400, -747266400, - 733960800, -715816800, -702511200, -684367200, -671061600, -652917600, - 639612e3, -620863200, -608162400, -589413600, -576108e3, -557964e3, - 544658400, -526514400, -513208800, -495064800, -481759200, -463615200, - 447285600, -431560800, -415836e3, -400111200, -384386400, -368661600, - 352936800, -337212e3, -321487200, -305762400, -289432800, -273708e3, - 257983200, -242258400, -226533600, -210808800, -195084e3, -179359200, - 163634400, -147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [-17762, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 18e3, -14400, -18e3 ] }, "America/Los_Angeles": { time: [-2717668378, -1633298400, -1615154400, -1601848800, -1583704800, -880236e3, - 769420800, -765410400, -687995940, -662680800, -620866800, -608162400, - 589417200, -576108e3, -557967600, -544658400, -526518e3, -513208800, - 495068400, -481759200, -463618800, -450309600, -431564400, -418255200, - 400114800, -386805600, -368665200, -355356e3, -337215600, -323906400, - 305766e3, -292456800, -273711600, -261007200, -242262e3, -226533600, - 210812400, -195084e3, -179362800, -163634400, -147913200, -13158e4, - 116463600, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [-28378, -28800, -25200, -28800, -25200, -28800, -25200, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800 ] }, "America/Chicago": { time: [-2717668236, -1633298400, -1615154400, -1601848800, -1583704800, -1563746400, -1551650400, -1538949600, -1520200800, -1504476e3, -1491775200, -1473026400, -1459720800, -1441576800, -1428271200, -1410127200, -1396821600, - 1378677600, -1365372e3, -1347228e3, -1333922400, -1315173600, -1301868e3, - 1283724e3, -1270418400, -1252274400, -1238968800, -1220824800, -1207519200, -1189375200, -1176069600, -1157320800, -114462e4, -1125871200, -1112565600, -1094421600, -1081116e3, -1067810400, -1045432800, -1031522400, -1018216800, -1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, - 905119200, -891813600, -880236e3, -769413600, -765410400, -747266400, - 733960800, -715816800, -702511200, -684367200, -671061600, -652917600, - 639612e3, -620863200, -608162400, -589413600, -576108e3, -557964e3, - 544658400, -526514400, -513208800, -495064800, -481759200, -463615200, - 447285600, -431560800, -415836e3, -400111200, -384386400, -368661600, - 352936800, -337212e3, -321487200, -305762400, -289432800, -273708e3, - 257983200, -242258400, -226533600, -210808800, -195084e3, -179359200, - 163634400, -147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [-21036, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, - 21600, -18e3, -21600 ] }, "America/Phoenix": { time: [-2717670498, -1633298400, -1615154400, -1601848800, -1583704800, -880236e3, - 820540740, -812678340, -796867140, -84405600, -68680800, 1924966800 ], offset: [-26898, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200 ] }, "America/Toronto": { time: [-2366755200, -1632088800, -1615154400, -1601771400, -1583712e3, -1567375200, -1554681600, -1534716e3, -1524088800, -1503266400, -149238e4, -1471816800, - 1460930400, -1440972e3, -1428876e3, -1409522400, -1397426400, -1378072800, - 1365976800, -1346623200, -1333922400, -1315173600, -1301868e3, -1283724e3, - 1270418400, -1252274400, -1238968800, -1220824800, -1207519200, -1188770400, -1176069600, -1157320800, -1144015200, -1125871200, -1112565600, - 1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800, - 1000072800, -986767200, -968018400, -955317600, -936568800, -880232400, - 76941e4, -765410400, -747266400, -733960800, -715824e3, -702518400, - 684374400, -671068800, -652924800, -634176e3, -620863200, -602719200, - 589413600, -576108e3, -557964e3, -544658400, -526514400, -513208800, - 495064800, -481759200, -463615200, -450309600, -431560800, -418255200, - 400111200, -384386400, -368661600, -352936800, -337212e3, -321487200, - 305762400, -289432800, -273708e3, -257983200, -242258400, -226533600, - 210808800, -195084e3, -179359200, -163634400, -147909600, -13158e4, - 11646e4, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400, - 5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 136346400, 152071200, 167796e3, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [-19052, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -14400, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, - 14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3 ] }, "America/Vancouver": { time: [-2713910400, -1632088800, -1615154400, -880236e3, -769420800, -765410400, - 747266400, -733960800, -715816800, -702511200, -684367200, -671061600, - 652917600, -639612e3, -620863200, -608162400, -589413600, -576108e3, - 557964e3, -544658400, -526514400, -513208800, -495064800, -481759200, - 463615200, -450309600, -431560800, -418255200, -400111200, -386805600, - 368661600, -355356e3, -337212e3, -323906400, -305762400, -292456800, - 273708e3, -261007200, -242258400, -226533600, -210808800, -195084e3, - 179359200, -163634400, -147909600, -13158e4, -11646e4, -100130400, - 84405600, -68680800, -52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 136346400, 152071200, 167796e3, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [-29548, -28800, -25200, -28800, -25200, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800 ] }, "America/Argentina/Buenos_Aires": { time: [-2372112e3, -1567468800, -1233446400, -1222992e3, -1205971200, -1194048e3, - 117288e4, -1162512e3, -1141344e3, -1130976e3, -1109808e3, -109944e4, - 1078272e3, -1067817600, -1046649600, -1036281600, -1015113600, -1004745600, -983577600, -973209600, -952041600, -941587200, -931046400, -900892800, - 890352e3, -83376e4, -82728e4, -752284800, -733795200, -197337600, - 190857600, -184204800, -164505600, -152668800, -132969600, -121132800, - 101433600, -86832e3, -71107200, -54777600, -39052800, -23328e3, -7603200, 128131200, 136598400, 596937600, 605059200, 624412800, 636508800, 656467200, 667958400, 687916800, 699408e3, 719366400, 731462400, 938908800, 952041600, 1198972800, 1205625600, 1224374400, 1237075200, 1924981200 ], offset: [-14028, -15408, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -7200, - 10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, - 10800, -10800, -10800, -7200, -10800, -7200, -10800 ] }, "America/El_Salvador": { time: [-1546300800, 546998400, 559699200, 578448e3, 591148800, 1924970400], offset: [-21408, -21600, -18e3, -21600, -18e3, -21600] }, "America/Sao_Paulo": { time: [-1767225600, -1206968400, -1191369600, -1175385600, -1159833600, -633830400, -622076400, -602294400, -59184e4, -570758400, -560217600, -539136e3, - 53136e4, -195436800, -184204800, -155174400, -150076800, -128908800, - 121132800, -99964800, -89596800, -68428800, -57974400, 499737600, 511228800, 530582400, 540259200, 562118400, 571190400, 592963200, 602035200, 624412800, 634694400, 656467200, 666748800, 687916800, 697593600, 719971200, 728438400, 750816e3, 761702400, 782265600, 793152e3, 813715200, 823996800, 84456e4, 856051200, 876096e3, 888710400, 908064e3, 919555200, 938908800, 951609600, 970963200, 982454400, 1003017600, 1013904e3, 1036281600, 1045353600, 1066521600, 1076803200, 1099353600, 1108857600, 1129420800, 1140307200, 1162684800, 1172361600, 119232e4, 1203206400, 1224374400, 1234656e3, 1255824e3, 1266710400, 1287273600, 129816e4, 1318723200, 1330214400, 1350777600, 1361059200, 1382227200, 1392508800, 1413676800, 1424563200, 1445126400, 1456012800, 1476576e3, 1487462400, 1508025600, 1518912e3, 1541289600, 1550361600, 1924981200 ], offset: [-11188, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, - 7200, -10800 ] }, "America/Bogota": { time: [-2707689600, -1739059200, 704851200, 733881600, 1924974e3], offset: [-17776, -17776, -18e3, -14400, -18e3] }, "America/Caracas": { time: [-2524521600, -1826755200, -157766400, 1197169200, 1462069800, 1924977600], offset: [-16064, -16060, -16200, -14400, -16200, -14400] }, "Europe/Moscow": { time: [-2840140800, -1688256e3, -165681e4, -1641340800, -1627956e3, -1618700400, - 1596416400, -1593804521, -1589846400, -1542416400, -1539478800, -1525305600, -1522713600, -1491177600, -1247529600, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 695786400, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1414288800, 1925002800 ], offset: [9017, 9017, 9079, 12679, 9079, 16279, 12679, 16279, 14400, 10800, 14400, 18e3, 14400, 10800, 7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800 ] }, "Europe/Athens": { time: [-2344636800, -1686095940, -1182988800, -1178150400, -906854400, -904867200, - 85725e4, -844473600, -828230400, -812419200, -552355200, -541641600, 166492800, 186195600, 198036e3, 213764400, 228880800, 244090800, 260330400, 275457600, 291805200, 307418400, 323395200, 338947200, 354682800, 370411200, 386132400, 401860800, 417582e3, 433310400, 449031600, 465364800, 481086e3, 496814400, 512535600, 528264e3, 543985200, 559713600, 575434800, 591163200, 606884400, 622612800, 638334e3, 654667200, 670388400, 686116800, 701838e3, 717566400, 733287600, 749016e3, 764737200, 780465600, 796186800, 811915200, 828241200, 846388800, 859690800, 877838400, 891140400, 909288e3, 92259e4, 941342400, 954039600, 972792e3, 985489200, 1004241600, 1017543600, 1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3 ], offset: [5692, 5692, 7200, 10800, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "Europe/Belgrade": { time: [-2713910400, -905821200, -85725e4, -844552800, -828219600, -812498400, - 79677e4, -777938400, -766616400, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [4920, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Berlin": { time: [-2422051200, -1693702800, -1680476400, -1663452e3, -1650142800, -1632002400, -1618693200, -938901600, -85725e4, -844552800, -828219600, -812498400, - 79677e4, -781048800, -776556e3, -765925200, -761173200, -748476e3, - 733266e3, -717627600, -714603600, -71037e4, -701902800, -684972e3, - 670453200, -654127200, -639003600, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [3208, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/London": { time: [-3852662400, -1691964e3, -1680469200, -1664143200, -1650142800, -1633903200, -1617483600, -1601848800, -1586034e3, -1570399200, -1552165200, -1538344800, -152253e4, -15075e5, -1490562e3, -1473631200, -1460926800, -1442786400, - 1428872400, -1410732e3, -1396213200, -1379282400, -1364763600, -1348437600, -1333314e3, -1315778400, -1301259600, -1284328800, -126981e4, -1253484e3, - 1238360400, -1221429600, -1206910800, -118998e4, -1175461200, -1159135200, - 1143406800, -1126476e3, -1111957200, -1095631200, -1080507600, -1063576800, -1049058e3, -1032127200, -1017608400, -1001282400, -986158800, -969228e3, - 950475600, -942012e3, -904514400, -896043600, -875484e3, -864594e3, - 844034400, -832539600, -812584800, -798066e3, -781048800, -772059600, - 764802e3, -748476e3, -733352400, -719445600, -717026400, -706741200, - 699483600, -687996e3, -668034e3, -654732e3, -636584400, -622072800, - 605739600, -590623200, -57429e4, -558568800, -542235600, -527119200, - 512600400, -496274400, -481150800, -46422e4, -449701200, -432165600, - 417646800, -401320800, -386197200, -369266400, -354747600, -337816800, - 323298e3, -306972e3, -291848400, -276732e3, -257979600, -245282400, - 22653e4, -213228e3, -195080400, -182383200, -163630800, -150933600, - 132181200, -119484e3, -100731600, -88034400, -68677200, -59004e3, -37238400, 57726e3, 69818400, 89175600, 101268e3, 120625200, 132717600, 152074800, 164167200, 183524400, 196221600, 214974e3, 227671200, 246423600, 259120800, 278478e3, 290570400, 309927600, 32202e4, 341377200, 354675600, 372823200, 386125200, 404272800, 417574800, 435722400, 449024400, 467776800, 481078800, 499226400, 512528400, 530676e3, 543978e3, 562125600, 575427600, 593575200, 606877200, 625629600, 638326800, 657079200, 670381200, 688528800, 701830800, 719978400, 733280400, 751428e3, 76473e4, 782877600, 796179600, 814327200, 828234e3, 846381600, 859683600, 877831200, 891133200, 909280800, 922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400, 1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3, 1111885200, 1130637600, 1143334800, 1162087200, 1174784400, 1193536800, 1206838800, 1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400, 1301187600, 131994e4, 1332637200, 1351389600, 1364691600, 1382839200, 1396141200, 1414288800, 1427590800, 1445738400, 1459040400, 1477792800, 149049e4, 1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600, 1585443600, 1603591200, 1616893200, 1635645600, 1648342800, 1667095200, 1679792400, 1698544800, 1711846800, 1729994400, 1743296400, 1761444e3, 1774746e3, 1792893600, 1806195600, 1824948e3, 1837645200, 1856397600, 1869094800, 1887847200, 1901149200, 1919296800, 1932598800 ], offset: [-75, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0 ] }, "Europe/Luxembourg": { time: [-2069712e3, -1692493200, -1680476400, -1662339600, -165015e4, -1632002400, - 1618693200, -1612656e3, -1604278800, -1585515600, -1574038800, -1552255200, -1539997200, -1520546400, -1507510800, -1490569200, -1473642e3, -1459116e3, -1444006800, -142767e4, -1411866e3, -1396220400, -1379293200, -1364770800, - 1348448400, -1333321200, -1316394e3, -1301266800, -1284339600, -126981e4, - 1253484e3, -1238360400, -1221429600, -1206910800, -1191189600, -1175461200, -1160344800, -1143406800, -1127685600, -1111957200, -1096840800, - 1080507600, -1063576800, -1049058e3, -1033336800, -1017608400, -1002492e3, - 986158800, -969228e3, -950475600, -942012e3, -935182800, -85725e4, - 844552800, -828219600, -812498400, -797979600, -781048800, -766616400, - 745452e3, -733266e3, 228880800, 244004400, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [1476, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Madrid": { time: [-2177453684, -1631926800, -1616886e3, -1601168400, -158535e4, -1442451600, - 142767e4, -1379293200, -1364770800, -1348448400, -1333321200, -1316390400, - 1301266800, -1284339600, -1269817200, -1026954e3, -1017615600, -1001898e3, - 999478800, -986083200, -951433200, -940208400, -873075600, -862614e3, - 842835600, -828313200, -811386e3, -796863600, -779936400, -765414e3, - 748486800, -733964400, -652323600, -639010800, 135126e3, 150253200, 166575600, 181702800, 196815600, 212547600, 22887e4, 243997200, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [-884, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Paris": { time: [-2486678340, -1855958340, -1689814800, -1680393600, -1665363600, -1648339200, -1635123600, -1616889600, -1604278800, -158544e4, -1574038800, -1552262400, -1539997200, -1520553600, -1507510800, -1490572800, -1470618e3, -1459123200, -1444006800, -1427673600, -1411952400, -1396224e3, -1379293200, -1364774400, -1348448400, -1333324800, -1316394e3, -1301270400, -1284339600, -1269820800, -1253494800, -1238371200, -1221440400, -1206921600, -1191200400, -1175472e3, -1160355600, -1143417600, -1127696400, -1111968e3, -1096851600, -1080518400, -1063587600, -1049068800, -1033347600, -1017619200, -1002502800, -986169600, -969238800, -950486400, -942012e3, -932432400, -85725e4, -844552800, - 828219600, -812498400, -800064e3, -796258800, -781048800, -766616400, 196822800, 212547600, 228880800, 244004400, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [561, 561, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Rome": { time: [-3252096e3, -2403562204, -1690761600, -168048e4, -1664755200, -1648944e3, - 163512e4, -1616889600, -1604275200, -1585526400, -1571011200, -1555286400, - 932428800, -85725e4, -844552800, -828219600, -812498400, -798066e3, - 781048800, -76671e4, -750895200, -733352400, -719452800, -70191e4, - 689205600, -670453200, -114048e3, -103161600, -81993600, -71708400, - 50544e3, -40258800, -18489600, -8204400, 1296e4, 23245200, 43804800, 54694800, 75859200, 86749200, 107913600, 118198800, 138758400, 149648400, 170812800, 181098e3, 202262400, 212547600, 233107200, 243997200, 265161600, 276051600, 296611200, 307501200, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [2996, 2996, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Warsaw": { time: [-2840140800, -1717027200, -1693702800, -1680476400, -1663452e3, -1650142800, -1632002400, -1618693200, -1600466400, -1587157200, -1501718400, -931730400, -85725e4, -844552800, -828219600, -812498400, -796600800, -778723200, - 762652800, -748483200, -733266e3, -715212e3, -701902800, -684972e3, - 670453200, -654127200, -639003600, -397090800, -386805600, -371084400, - 355356e3, -334191600, -323301600, -307580400, -291852e3, -271292400, - 260402400, -239842800, -228952800, -208393200, -197503200, -176338800, - 166053600, 228877200, 244000800, 260326800, 276055200, 291776400, 307504800, 323830800, 338954400, 354675600, 370404e3, 386125200, 401853600, 417574800, 433303200, 449024400, 465357600, 481078800, 496807200, 512528400, 528256800, 543978e3, 559706400, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [5040, 5040, 3600, 7200, 3600, 7200, 3600, 7200, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Istanbul": { time: [-2840140800, -1869868800, -1693699200, -168048e4, -1570406400, -1552176e3, - 1538352e3, -1522540800, -1507507200, -1490572800, -1440201600, -1428019200, -1409702400, -1396483200, -931046400, -922665600, -917827200, -892425600, - 875836800, -764726400, -744336e3, -733795200, -716428800, -701913600, - 684979200, -670464e3, -654134400, -639014400, -62208e4, -60696e4, - 590025600, -575510400, -235612800, -194832e3, -177724800, -165715200, 107917200, 121226400, 133927200, 152676e3, 164685600, 184125600, 196221600, 215575200, 228880800, 245815200, 260330400, 267926400, 428464800, 433908e3, 468122400, 482806800, 496720800, 512528400, 528256800, 543978e3, 559706400, 575427600, 591156e3, 606877200, 622605600, 638326800, 65466e4, 670381200, 686109600, 701830800, 717559200, 733280400, 749008800, 764125200, 780458400, 796179600, 811908e3, 828234e3, 846381600, 859683600, 877831200, 891133200, 909280800, 922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400, 1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3, 1111885200, 1130637600, 1143334800, 1162087200, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301281200, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396234800, 1414296e3, 1427598e3, 1446955200, 1459047600, 1473206400, 1925002800 ], offset: [6952, 7016, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 10800, 14400, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 10800 ] }, "Europe/Zurich": { time: [-3675196800, -2385244800, -904431600, -891122400, -872982e3, -859672800, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [2048, 1786, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Australia/Sydney": { time: [-2364076800, -1672531140, -1665352800, -883605600, -876088800, -860364e3, - 844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3, 120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200, 226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3, 341373600, 352263600, 372823200, 386737200, 404877600, 415767600, 436327200, 447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600, 562125600, 57483e4, 59418e4, 606279600, 625629600, 636519600, 657079200, 667969200, 688528800, 699418800, 719978400, 731473200, 752032800, 762922800, 783482400, 794372400, 814932e3, 828241200, 846381600, 859690800, 877831200, 891140400, 909280800, 92259e4, 941335200, 954039600, 967341600, 985489200, 1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800, 1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600, 1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4, 1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600, 1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400, 1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3, 1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800, 1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400, 1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200, 1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800 ], offset: [36292, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600 ] }, "Australia/Brisbane": { time: [-2366755200, -1672531140, -1665352800, -883605600, -876088800, -860364e3, - 844639200, -828309600, -813189600, 57722400, 68007600, 625629600, 636519600, 657079200, 667969200, 688528800, 699418800, 1925028e3 ], offset: [36728, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3 ] }, "Australia/Adelaide": { time: [-2364076800, -2230156800, -1672531140, -1665352800, -883605600, -876088800, - 860364e3, -844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3, 120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200, 226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3, 341373600, 352263600, 372823200, 384318e3, 404877600, 415767600, 436327200, 447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600, 562125600, 57483e4, 59418e4, 606279600, 625629600, 637729200, 657079200, 667969200, 688528800, 701233200, 719978400, 731473200, 752032800, 764132400, 783482400, 796186800, 814932e3, 828241200, 846381600, 859690800, 877831200, 891140400, 909280800, 92259e4, 941335200, 954039600, 972784800, 985489200, 1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800, 1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600, 1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4, 1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600, 1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400, 1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3, 1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800, 1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400, 1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200, 1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800 ], offset: [33260, 32400, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800 ] }, "Australia/ACT": { time: [-2364076800, -1672531140, -1665352800, -883605600, -876088800, -860364e3, - 844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3, 120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200, 226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3, 341373600, 352263600, 372823200, 386737200, 404877600, 415767600, 436327200, 447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600, 562125600, 57483e4, 59418e4, 606279600, 625629600, 636519600, 657079200, 667969200, 688528800, 699418800, 719978400, 731473200, 752032800, 762922800, 783482400, 794372400, 814932e3, 828241200, 846381600, 859690800, 877831200, 891140400, 909280800, 92259e4, 941335200, 954039600, 967341600, 985489200, 1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800, 1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600, 1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4, 1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600, 1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400, 1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3, 1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800, 1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400, 1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200, 1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800 ], offset: [36292, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600 ] }, "Asia/Almaty": { time: [-1441152e3, -1247529600, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 695786400, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1925013600 ], offset: [18468, 18e3, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 21600, 18e3, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600 ] }, "Asia/Ashkhabad": { time: [-1441152e3, -1247529600, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 695786400, 192501e4 ], offset: [14012, 14400, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 18e3, 14400, 18e3 ] }, "Asia/Tokyo": { time: [-2587678861, -683769600, -672274800, -654739200, -640825200, -620265600, - 609375600, -588816e3, -577926e3, 1925024400 ], offset: [33539, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400] }, "Asia/Taipei": { time: [-2335219200, -1017792e3, -766191600, -745804800, -733795200, -716860800, - 699580800, -683856e3, -670636800, -65232e4, -639100800, -620784e3, - 607564800, -589248e3, -576028800, -562896e3, -541728e3, -528681600, - 510192e3, -497145600, -478656e3, -465609600, -449798400, -433987200, - 418176e3, -402451200, -38664e4, -370915200, -355104e3, -339379200, - 323568e3, -302486400, -291945600, -270950400, -260409600, 134006400, 149817600, 165542400, 181353600, 299635200, 307584e3, 1925020800 ], offset: [29160, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800 ] }, "Asia/Singapore": { time: [-2177452800, -2038176e3, -1167609600, -1073001600, -894153600, -879638400, - 766972800, 378691200, 1925020800 ], offset: [24925, 24925, 25200, 26400, 26400, 27e3, 32400, 27e3, 28800] }, "Asia/Shanghai": { time: [-2177452800, -1600646400, -1585872e3, -933638400, -922060800, -908841600, - 888796800, -881020800, -767836800, -745804800, -733795200, -716860800, - 699580800, -683856e3, -670636800, -65232e4, -649987200, 515556e3, 527047200, 545191200, 558496800, 577245600, 589946400, 608695200, 622000800, 640144800, 653450400, 671594400, 6849e5, 1925020800 ], offset: [29143, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800 ] }, "Asia/Seoul": { time: [-1948752e3, -1830384e3, -767318400, -681177600, -672192e3, -654739200, - 640828800, -623376e3, -609379200, -588816e3, -577929600, -498096e3, - 462672e3, -451699200, -429753600, -418262400, -399513600, -387417600, - 368064e3, -355968e3, -336614400, -324518400, -305164800, -293068800, - 264902400, 547610400, 560919600, 57906e4, 592369200, 1925024400 ], offset: [30472, 30600, 32400, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 32400, 36e3, 32400, 36e3, 32400 ] }, "Asia/Tehran": { time: [-1704153600, -757382400, 247190400, 259286400, 277776e3, 283996800, 290822400, 306547200, 322444800, 338515200, 673228800, 685497600, 701222400, 71712e4, 732758400, 748656e3, 764294400, 780192e3, 795830400, 811728e3, 827366400, 843264e3, 858988800, 874886400, 890524800, 906422400, 922060800, 937958400, 953596800, 969494400, 985219200, 1001116800, 1016755200, 1032652800, 1048291200, 1064188800, 1079827200, 1095724800, 1111449600, 1127347200, 1206057600, 1221955200, 123768e4, 1253577600, 1269216e3, 1285113600, 1300752e3, 1316649600, 1332288e3, 1348185600, 1363910400, 1379808e3, 1395446400, 1411344e3, 1426982400, 144288e4, 1458518400, 1474416e3, 1490140800, 1506038400, 1521676800, 1537574400, 1553212800, 1569110400, 1584748800, 1600646400, 1616371200, 1632268800, 1647907200, 1663804800, 1679443200, 1695340800, 1710979200, 1726876800, 1742601600, 1758499200, 1774137600, 1790035200, 1805673600, 1821571200, 1837209600, 1853107200, 1868745600, 1884643200, 1900368e3, 1916265600, 1931904e3 ], offset: [12344, 12344, 12600, 14400, 18e3, 14400, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600 ] }, "Asia/Dubai": { time: [-1577923200, 1925006400], offset: [13272, 14400] }, "Asia/Kolkata": { time: [-3645216e3, -3155673600, -2019686400, -891561600, -872035200, -862617600, - 764121600, 1925011800 ], offset: [21208, 21200, 19270, 19800, 23400, 19800, 23400, 19800] }, "Asia/Hong_Kong": { time: [-2056663398, -900882e3, -891547200, -884217600, -761176800, -747878400, - 728508600, -717021e3, -697059e3, -683757e3, -668028600, -654726600, - 636579e3, -623277e3, -605129400, -591827400, -573679800, -559773e3, - 541625400, -528323400, -510179400, -498083400, -478729800, -466633800, - 446675400, -435184200, -415225800, -403129800, -383776200, -371680200, - 352326600, -340230600, -320877e3, -308781e3, -288822600, -277331400, - 257373e3, -245881800, -225923400, -213827400, -194473800, -182377800, - 163024200, -148509e3, -132784200, -117059400, -101334600, -85609800, - 69280200, -53555400, -37830600, -22105800, -6381e3, 9343800, 25068600, 40793400, 56518200, 72243e3, 88572600, 104297400, 120022200, 126070200, 151471800, 167196600, 182921400, 198646200, 214371e3, 295414200, 309324600, 1925020800 ], offset: [27402, 28800, 32400, 30600, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800 ] }, "Asia/Bangkok": { time: [-2840140800, -1570060800, 1925017200], offset: [24124, 24124, 25200] }, "Asia/Chongqing": { time: [-2177452800, -1600646400, -1585872e3, -933638400, -922060800, -908841600, - 888796800, -881020800, -767836800, -745804800, -733795200, -716860800, - 699580800, -683856e3, -670636800, -65232e4, -649987200, 515556e3, 527047200, 545191200, 558496800, 577245600, 589946400, 608695200, 622000800, 640144800, 653450400, 671594400, 6849e5, 1925020800 ], offset: [29143, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800 ] }, "Asia/Jerusalem": { time: [-2840140800, -1640995200, -933638400, -857347200, -844293600, -825811200, - 812678400, -794188800, -779846400, -762645600, -748303200, -731116800, - 681955200, -673228800, -667951200, -65232e4, -636415200, -62208e4, - 608936400, -59184e4, -572475600, -558568800, -542840400, -527724e3, - 514414800, -490838400, -482976e3, -459468e3, -451526400, -428544e3, - 418251600, -400024800, -387417600, 142387200, 150854400, 167184e3, 178675200, 334022400, 337654800, 452563200, 462243600, 482284800, 495590400, 516758400, 526435200, 545443200, 558489600, 576633600, 589334400, 609897600, 620784e3, 638323200, 651628800, 669772800, 683683200, 701827200, 715737600, 733708800, 747187200, 765158400, 778032e3, 796608e3, 810086400, 826848e3, 842832e3, 858902400, 874195200, 890352e3, 90504e4, 923018400, 936324e3, 955677600, 970794e3, 986778e3, 1001293200, 1017363600, 1033952400, 1048813200, 1065142800, 1081299600, 1095814800, 1112320800, 1128823200, 1143770400, 1159668e3, 117522e4, 1189908e3, 1206669600, 1223172e3, 1238119200, 1254016800, 1269568800, 1284256800, 1301623200, 1317520800, 1333072800, 1348365600, 1364522400, 1382839200, 1395972e3, 1414288800, 1427421600, 1445738400, 1458871200, 1477792800, 1490320800, 1509242400, 1521770400, 1540692e3, 1553824800, 1572141600, 1585274400, 1603591200, 1616724e3, 1635645600, 1648173600, 1667095200, 1679623200, 1698544800, 1711677600, 1729994400, 1743127200, 1761444e3, 1774576800, 1792893600, 1806026400, 1824948e3, 1837476e3, 1856397600, 1868925600, 1887847200, 190098e4, 1919296800, 1932429600 ], offset: [8454, 8440, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 14400, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "Asia/Kuwait": { time: [-719625600, 1925002800], offset: [11212, 10800] }, "Asia/Muscat": { time: [-1577923200, 1925006400], offset: [13272, 14400] }, "Asia/Qatar": { time: [-1577923200, 76204800, 1925002800], offset: [12368, 14400, 10800] }, "Asia/Riyadh": { time: [-719625600, 1925002800], offset: [11212, 10800] }, "Pacific/Auckland": { time: [-3192393600, -1330293600, -1320012e3, -1300658400, -1287352800, -1269208800, -1255903200, -1237759200, -1224453600, -1206309600, -1192399200, -117486e4, -1160949600, -1143410400, -1125871200, -1112565600, -1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800, -1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, -757382400, 152676e3, 162356400, 183520800, 195015600, 215575200, 226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3, 341373600, 352263600, 372823200, 384318e3, 404877600, 415767600, 436327200, 447217200, 467776800, 478666800, 499226400, 510116400, 530676e3, 541566e3, 562125600, 573620400, 59418e4, 60507e4, 623815200, 637729200, 655264800, 669178800, 686714400, 700628400, 718164e3, 732682800, 749613600, 764132400, 781063200, 795582e3, 812512800, 827031600, 844567200, 858481200, 876016800, 889930800, 907466400, 921985200, 938916e3, 953434800, 970365600, 984884400, 100242e4, 1016334e3, 1033869600, 1047783600, 1065319200, 1079838e3, 1096768800, 1111287600, 1128218400, 1142737200, 1159668e3, 1174186800, 1191117600, 1207450800, 1222567200, 1238900400, 1254016800, 127035e4, 1285466400, 1301799600, 1316916e3, 1333249200, 1348970400, 1365303600, 138042e4, 1396753200, 1411869600, 1428202800, 1443319200, 1459652400, 1474768800, 1491102e3, 1506218400, 1522551600, 1538272800, 1554606e3, 1569722400, 1586055600, 1601172e3, 1617505200, 1632621600, 1648954800, 1664071200, 1680404400, 1695520800, 1712458800, 1727575200, 1743908400, 1759024800, 1775358e3, 1790474400, 1806807600, 1821924e3, 1838257200, 1853373600, 1869706800, 1885428e3, 1901761200, 1916877600, 1933210800 ], offset: [41944, 41400, 45e3, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800 ] }, "Pacific/Chatham": { time: [-3192393600, -757382400, 152678700, 162359100, 183523500, 195018300, 215577900, 226467900, 247027500, 257917500, 278477100, 289367100, 309926700, 320816700, 341376300, 352266300, 372825900, 384320700, 404880300, 415770300, 436329900, 447219900, 467779500, 478669500, 499229100, 510119100, 530678700, 541568700, 562128300, 573623100, 594182700, 605072700, 623817900, 637731900, 655267500, 669181500, 686717100, 700631100, 718166700, 732685500, 749616300, 764135100, 781065900, 795584700, 812515500, 827034300, 844569900, 858483900, 876019500, 889933500, 907469100, 921987900, 938918700, 953437500, 970368300, 984887100, 1002422700, 1016336700, 1033872300, 1047786300, 1065321900, 1079840700, 1096771500, 1111290300, 1128221100, 1142739900, 1159670700, 1174189500, 1191120300, 1207453500, 1222569900, 1238903100, 1254019500, 1270352700, 1285469100, 1301802300, 1316918700, 1333251900, 1348973100, 1365306300, 1380422700, 1396755900, 1411872300, 1428205500, 1443321900, 1459655100, 1474771500, 1491104700, 1506221100, 1522554300, 1538275500, 1554608700, 1569725100, 1586058300, 1601174700, 1617507900, 1632624300, 1648957500, 1664073900, 1680407100, 1695523500, 1712461500, 1727577900, 1743911100, 1759027500, 1775360700, 1790477100, 1806810300, 1821926700, 1838259900, 1853376300, 1869709500, 1885430700, 1901763900, 1916880300, 1933213500 ], offset: [44028, 44100, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500 ] }, "Pacific/Fakaofo": { time: [-2177452800, 1325203200, 1925038800], offset: [-41096, -39600, 46800] }, "Pacific/Honolulu": { time: [-2334139200, -1157320800, -1155470400, -880236e3, -769429800, -765410400, - 712188e3, 1924956e3 ], offset: [-37886, -37800, -34200, -37800, -34200, -34200, -37800, -36e3] }, "America/Mexico_City": { time: [-1514763396, -1343091600, -1234828800, -1220317200, -1207180800, -1191369600, -975283200, -963187200, -917136e3, -907372800, -821923200, -810086400, - 627523200, -613008e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 989114400, 1001815200, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1175392800, 1193536800, 1207447200, 1224986400, 1238896800, 1256436e3, 1270346400, 1288490400, 1301796e3, 131994e4, 1333245600, 1351389600, 13653e5, 1382839200, 1396749600, 1414288800, 1428199200, 1445738400, 1459648800, 1477792800, 1491098400, 1509242400, 1522548e3, 1540692e3, 1554602400, 1572141600, 1586052e3, 1603591200, 1617501600, 1635645600, 1648951200, 1667095200, 1680400800, 1698544800, 1712455200, 1729994400, 1743904800, 1761444e3, 1775354400, 1792893600, 1806804e3, 1824948e3, 1838253600, 1856397600, 1869703200, 1887847200, 1901757600, 1919296800, 1933207200 ], offset: [-23796, -25200, -21600, -25200, -21600, -25200, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, - 18e3, -21600, -18e3, -21600, -18e3, -21600 ] }, "Africa/Cairo": { time: [-2185401600, -929836800, -923097600, -906163200, -892857600, -875836800, - 857779200, -844300800, -825811200, -812678400, -794188800, -779846400, - 762652800, -399081600, -38664e4, -368323200, -355104e3, -336783600, - 323643600, -305161200, -292021200, -273625200, -260485200, -242089200, - 228949200, -210553200, -197413200, -178930800, -165790800, -147394800, - 134254800, -115858800, -102632400, -84322800, -71096400, -52700400, - 39474e3, -21164400, -7938e3, 10371600, 23598e3, 41907600, 55134e3, 7353e4, 86756400, 105066e3, 118292400, 136602e3, 149828400, 168138e3, 181364400, 199760400, 212986800, 231296400, 244522800, 262832400, 276058800, 294368400, 307594800, 325990800, 339217200, 357526800, 370753200, 396406800, 402289200, 426819600, 433825200, 452221200, 465447600, 483757200, 496983600, 515293200, 528519600, 546829200, 560055600, 578451600, 591678e3, 610419600, 623214e3, 641523600, 65475e4, 673059600, 686286e3, 704682e3, 717908400, 736218e3, 749444400, 767754e3, 780980400, 799027200, 812332800, 830476800, 843782400, 861926400, 875232e3, 893376e3, 906681600, 925430400, 938736e3, 95688e4, 970185600, 988329600, 1001635200, 1019779200, 1033084800, 1051228800, 1064534400, 1083283200, 1096588800, 1114732800, 1128038400, 1146182400, 1158883200, 1177632e3, 1189123200, 1209081600, 1219968e3, 1240531200, 1250812800, 1272585600, 1281484800, 1284076800, 1285891200, 1400198400, 1403827200, 1406851200, 1411689600, 1924999200 ], offset: [7509, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "Africa/Johannesburg": { time: [-2458166400, -2109283200, -860968800, -845244e3, -829519200, -813794400, 1924999200 ], offset: [6720, 5400, 7200, 10800, 7200, 10800, 7200] }, "Asia/Kathmandu": { time: [-1577923200, 504921600, 1925012700], offset: [20476, 19800, 20700] }, "US/Mountain": { time: [-2717668796, -1633298400, -1615154400, -1601848800, -1583704800, -1570399200, -1551650400, -1538949600, -1534111200, -880236e3, -769417200, -765410400, - 147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800, -52956e3, - 37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [-25196, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, - 21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, - 25200 ] }, "Europe/Helsinki": { time: [-2890252800, -1535932800, -875664e3, -859762800, 354679200, 370407600, 386128800, 401857200, 417582e3, 433310400, 449031600, 465364800, 481086e3, 496814400, 512535600, 528264e3, 543985200, 559713600, 575434800, 591163200, 606884400, 622612800, 638334e3, 654667200, 670388400, 686116800, 701838e3, 717566400, 733287600, 749016e3, 764737200, 780465600, 796186800, 811915200, 828241200, 846388800, 859690800, 877838400, 891140400, 909288e3, 92259e4, 941342400, 954039600, 972792e3, 985489200, 1004241600, 1017543600, 1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3 ], offset: [5989, 5989, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "Europe/Stockholm": { time: [-2871676800, -2208988800, -1692493200, -1680476400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [4332, 3614, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Copenhagen": { time: [-2524521600, -2398291200, -1692493200, -1680483600, -935107200, -85725e4, - 844552800, -828219600, -812498400, -79677e4, -781048800, -769381200, - 747007200, -736376400, -715212e3, -706741200, -683157600, -675291600, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [3020, 3020, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Atlantic/Reykjavik": { time: [-1956614400, -1668214800, -1647212400, -1636678800, -161343e4, -1605142800, - 1581894e3, -1539565200, -153135e4, -968029200, -952293600, -942012e3, - 920239200, -909961200, -888789600, -877906800, -857944800, -846457200, - 826495200, -815007600, -795045600, -783558e3, -762991200, -752108400, - 731541600, -717634800, -700092e3, -686185200, -668642400, -654735600, - 636588e3, -623286e3, -605743200, -591836400, -573688800, -559782e3, - 542239200, -528332400, -510789600, -496882800, -47934e4, -465433200, - 447890400, -433983600, -415836e3, -401929200, -384386400, -370479600, - 352936800, -33903e4, -321487200, -307580400, -290037600, -276130800, - 258588e3, -244681200, -226533600, -212626800, -195084e3, -181177200, - 163634400, -149727600, -132184800, -118278e3, -100735200, -86828400, - 68680800, -54774e3, 1924992e3 ], offset: [-5280, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, - 3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, - 3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0 ] }, "Europe/Tallinn": { time: [-2840140800, -1638316800, -1632002400, -1618693200, -1593820800, -1535932800, -927936e3, -892944e3, -85725e4, -844552800, -828219600, -812498400, - 797644800, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909288e3, 92259e4, 941342400, 1017543600, 1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3 ], offset: [5940, 5940, 3600, 7200, 3600, 5940, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "Europe/Riga": { time: [-2840140800, -1632002400, -1618693200, -1601676e3, -1597266e3, -1377302400, - 928022400, -899510400, -85725e4, -844552800, -828219600, -812498400, - 79677e4, -795830400, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 843966e3, 859690800, 877838400, 891140400, 909288e3, 92259e4, 941342400, 985489200, 1004241600, 1017543600, 1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3 ], offset: [5794, 5794, 9394, 5794, 9394, 5794, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 3600, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "Europe/Vilnius": { time: [-2840140800, -1672531200, -1585094400, -1561248e3, -1553558400, -928195200, - 900115200, -85725e4, -844552800, -828219600, -812498400, -802137600, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891140400, 909284400, 922586400, 941338800, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3 ], offset: [6076, 5040, 5736, 3600, 7200, 3600, 10800, 7200, 3600, 7200, 3600, 7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 7200, 3600, 7200, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200 ] }, "America/Lima": { time: [-2524521600, -1938556800, -1009843200, -1002067200, -986774400, -971049600, - 955324800, -9396e5, 504921600, 512697600, 536457600, 544233600, 631152e3, 638928e3, 757382400, 765158400, 1924974e3 ], offset: [-18492, -18516, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3 ] }, "America/Santiago": { time: [-2524521600, -1892678400, -1688428800, -1619222400, -1593820800, -1336003200, -13176e5, -1304380800, -1286064e3, -1272844800, -1254528e3, -1241308800, - 1222992e3, -1209772800, -1191369600, -1178150400, -870566400, -865296e3, - 740534400, -736387200, -718070400, -713667600, -36633600, -23932800, - 3369600, 7516800, 24451200, 37756800, 55900800, 69206400, 87955200, 100656e3, 118195200, 132105600, 150854400, 163555200, 182304e3, 195609600, 213753600, 227059200, 245203200, 258508800, 277257600, 289958400, 308707200, 321408e3, 340156800, 353462400, 371606400, 384912e3, 403056e3, 416361600, 434505600, 447811200, 46656e4, 479260800, 498009600, 510710400, 529459200, 545184e3, 560908800, 574214400, 592358400, 605664e3, 624412800, 637113600, 653443200, 668563200, 687312e3, 700617600, 718761600, 732067200, 750211200, 763516800, 781660800, 794966400, 813715200, 826416e3, 845164800, 85968e4, 876614400, 88992e4, 906854400, 923184e3, 939513600, 952819200, 971568e3, 984268800, 1003017600, 1015718400, 1034467200, 1047168e3, 1065916800, 1079222400, 1097366400, 1110672e3, 1128816e3, 1142121600, 1160870400, 1173571200, 119232e4, 1206835200, 1223769600, 1237075200, 1255219200, 1270339200, 1286668800, 1304812800, 1313884800, 1335657600, 1346544e3, 1367107200, 1378598400, 1398556800, 1410048e3, 1463270400, 1471132800, 149472e4, 1502582400, 1526169600, 1534032e3, 1554595200, 1567900800, 1586044800, 1599350400, 1617494400, 16308e5, 1648944e3, 1662249600, 1680393600, 1693699200, 1712448e3, 1725753600, 1743897600, 1757203200, 1775347200, 1788652800, 1806796800, 1820102400, 1838246400, 1851552e3, 1870300800, 1883001600, 1901750400, 1915056e3, 19332e5 ], offset: [-16966, -16966, -18e3, -16966, -14400, -16966, -14400, -18e3, -14400, - 18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, - 10800, -14400, -18e3, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, - 14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, - 10800 ] }, "Asia/Bahrain": { time: [-1577923200, 76204800, 1925002800], offset: [12368, 14400, 10800] }, "Asia/Jakarta": { time: [-3231273600, -1451693568, -117288e4, -876614400, -766022400, -683856e3, - 620784e3, -189388800, 1925017200 ], offset: [25632, 25632, 26400, 27e3, 32400, 27e3, 28800, 27e3, 25200] }, "Africa/Lagos": { time: [-1588464e3, 1924995600], offset: [816, 3600] }, "Pacific/Norfolk": { time: [-2177452800, -599616e3, 152071200, 162961200, 1443924e3, 1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800, 1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400, 1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200, 1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800 ], offset: [40312, 40320, 41400, 45e3, 41400, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200 ] }, "America/Juneau": { time: [-3225169588, -2188987200, -880236e3, -769420800, -765410400, -21506400, - 5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 438998400, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3 ], offset: [54139, -32261, -28800, -25200, -25200, -28800, -25200, -28800, -25200, - 28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, - 25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, - 28800, -28800, -28800, -25200, -28800, -25200, -28800, -25200, -32400, - 32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, - 28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, - 32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, - 28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, - 32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, - 28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, - 32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, - 28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, - 32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, - 28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, - 32400, -28800, -32400, -28800, -32400 ] }, "Asia/Ho_Chi_Minh": { time: [-2004048e3, -1851552e3, -852080400, -782614800, -767836800, -718070400, - 457747200, -315622800, 171849600, 1925017200 ], offset: [25600, 25590, 25200, 28800, 32400, 25200, 28800, 25200, 28800, 25200] }, "Australia/Perth": { time: [-2337897600, -1672531140, -1665352800, -883605600, -876088800, -860364e3, - 844639200, 152071200, 162961200, 436327200, 447217200, 690343200, 699418800, 1165111200, 1174791600, 1193536800, 1206846e3, 1224986400, 1238295600, 1925020800 ], offset: [27804, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800 ] }, "Europe/Malta": { time: [-2403475200, -1690761600, -168048e4, -1664755200, -1648944e3, -163512e4, - 1616889600, -1604275200, -1585526400, -1571011200, -1555286400, -932428800, -85725e4, -844552800, -828219600, -812584800, -798066e3, -781048800, - 76671e4, -750895200, -733352400, -719452800, -70191e4, -689205600, - 670453200, -114048e3, -103161600, -81993600, -71708400, -50544e3, -40258800, -18489600, -8204400, 1296e4, 23245200, 43804800, 54694800, 75859200, 86749200, 102384e3, 118112400, 135734400, 148525200, 167191200, 180496800, 198640800, 211946400, 230090400, 243396e3, 26154e4, 274845600, 292989600, 306295200, 323316e3, 338349600, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [3484, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Amsterdam": { time: [-4260211200, -1693699200, -168048e4, -1663452e3, -1650142800, -1633212e3, - 1617483600, -1601157600, -1586034e3, -1569708e3, -1554584400, -1538258400, - 1523134800, -15075e5, -1490562e3, -1470175200, -1459112400, -1443996e3, - 1427662800, -1406671200, -1396213200, -1376949600, -1364763600, -1345413600, -1333314e3, -1313791200, -1301259600, -1282255200, -126981e4, -1250719200, - 1238360400, -1219183200, -1206910800, -1186956e3, -1175461200, -1156024800, -1143406800, -1124488800, -1111957200, -1092952800, -1080507600, - 1061330400, -1049058e3, -1029189600, -1025740800, -1017608400, -998258400, - 986158800, -966722400, -954104400, -935020800, -85725e4, -844552800, - 828219600, -812498400, -79677e4, -781048800, -766616400, 228880800, 244004400, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [1172, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 4800, 1200, 4800, 1200, 4800, 1200, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Brussels": { time: [-2840140800, -2450994150, -1740355200, -1693699200, -1680476400, -1663452e3, -1650142800, -1632002400, -1618693200, -1613822400, -1604278800, - 1585526400, -1574038800, -1552262400, -1539997200, -1520553600, -1507510800, -1490572800, -1473642e3, -1459123200, -1444006800, -1427673600, -1411952400, -1396224e3, -1379293200, -1364774400, -1348448400, -1333324800, -1316394e3, -1301259600, -1284328800, -126981e4, -1253484e3, -1238360400, -1221429600, - 1206910800, -1191189600, -1175461200, -1160344800, -1143406800, -1127685600, -1111957200, -1096840800, -1080507600, -1063576800, -1049058e3, -1033336800, -1017608400, -1002492e3, -986158800, -969228e3, -950475600, -942012e3, - 934664400, -85725e4, -844552800, -828219600, -812498400, -798066e3, - 781048800, -766616400, -745452e3, -733266e3, 228880800, 244004400, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [1050, 1050, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] }, "Europe/Lisbon": { time: [-1830386205, -1689555600, -1677798e3, -1667437200, -1647734400, -1635814800, -1616198400, -1604365200, -1584662400, -1572742800, -155304e4, -1541206800, -1521504e3, -1442451600, -1426809600, -1379293200, -1364774400, -1348448400, -1333324800, -1316394e3, -1301270400, -1284339600, -1269820800, -1221440400, -1206921600, -1191200400, -1175472e3, -1127696400, -1111968e3, -1096851600, -1080518400, -1063587600, -1049068800, -1033347600, -1017619200, - 1002502800, -986169600, -969238800, -950486400, -942022800, -922665600, - 906944400, -891129600, -877309200, -873680400, -864e6, -857952e3, - 845859600, -842835600, -831340800, -825897600, -81441e4, -810781200, - 799891200, -794448e3, -782960400, -779331600, -768441600, -762998400, - 749091600, -733363200, -717631200, -701902800, -686181600, -670453200, - 654732e3, -639003600, -591832800, -575499600, -559778400, -54405e4, - 528328800, -512600400, -496879200, -481150800, -465429600, -449701200, - 43398e4, -417646800, -401925600, -386197200, -370476e3, -354747600, - 339026400, -323298e3, -307576800, -291848400, -276127200, -260398800, - 244677600, -228344400, -212623200, -196894800, -181173600, -165445200, - 149724e3, -133995600, -118274400, 212547600, 228268800, 243997200, 260323200, 276051600, 291772800, 307504800, 323222400, 338954400, 354675600, 370404e3, 386125200, 401853600, 417578400, 433303200, 449024400, 465357600, 481078800, 496807200, 512528400, 528256800, 543978e3, 559706400, 575427600, 591156e3, 606877200, 622605600, 638326800, 65466e4, 670381200, 686109600, 701830800, 717559200, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846381600, 859683600, 877831200, 891133200, 909280800, 922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400, 1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3, 1111885200, 1130637600, 1143334800, 1162087200, 1174784400, 1193536800, 1206838800, 1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400, 1301187600, 131994e4, 1332637200, 1351389600, 1364691600, 1382839200, 1396141200, 1414288800, 1427590800, 1445738400, 1459040400, 1477792800, 149049e4, 1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600, 1585443600, 1603591200, 1616893200, 1635645600, 1648342800, 1667095200, 1679792400, 1698544800, 1711846800, 1729994400, 1743296400, 1761444e3, 1774746e3, 1792893600, 1806195600, 1824948e3, 1837645200, 1856397600, 1869094800, 1887847200, 1901149200, 1919296800, 1932598800 ], offset: [-2205, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0 ] }, "Europe/Dublin": { time: [-2821651200, -1691964e3, -1680469200, -1664143200, -1650142800, -1633903200, -1617483600, -1601848800, -1586034e3, -1570399200, -1552165200, -1538344800, -152253e4, -15075e5, -1490562e3, -1473631200, -1460926800, -1442786400, - 1428872400, -1410732e3, -1396213200, -1379282400, -1364763600, -1348437600, -1333314e3, -1315778400, -1301259600, -1284328800, -126981e4, -1253484e3, - 1238360400, -1221429600, -1206910800, -118998e4, -1175461200, -1159135200, - 1143406800, -1126476e3, -1111957200, -1095631200, -1080507600, -1063576800, -1049058e3, -1032127200, -1017608400, -1001282400, -986158800, -969228e3, - 950475600, -942012e3, -733352400, -719445600, -699483600, -684972e3, - 668034e3, -654732e3, -636584400, -622072800, -605739600, -590623200, - 57429e4, -558568800, -542235600, -527119200, -512600400, -496274400, - 481150800, -46422e4, -449701200, -432165600, -417646800, -401320800, - 386197200, -369266400, -354747600, -337816800, -323298e3, -306972e3, - 291848400, -276732e3, -257979600, -245282400, -22653e4, -213228e3, - 195080400, -182383200, -163630800, -150933600, -132181200, -119484e3, - 100731600, -88034400, -68677200, -59004e3, 57726e3, 69818400, 89175600, 101268e3, 120625200, 132717600, 152074800, 164167200, 183524400, 196221600, 214974e3, 227671200, 246423600, 259120800, 278478e3, 290570400, 309927600, 32202e4, 341377200, 354675600, 372823200, 386125200, 404272800, 417574800, 435722400, 449024400, 467776800, 481078800, 499226400, 512528400, 530676e3, 543978e3, 562125600, 575427600, 593575200, 606877200, 625629600, 638326800, 657079200, 670381200, 688528800, 701830800, 719978400, 733280400, 751428e3, 76473e4, 782877600, 796179600, 814327200, 828234e3, 846381600, 859683600, 877831200, 891133200, 909280800, 922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400, 1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3, 1111885200, 1130637600, 1143334800, 1162087200, 1174784400, 1193536800, 1206838800, 1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400, 1301187600, 131994e4, 1332637200, 1351389600, 1364691600, 1382839200, 1396141200, 1414288800, 1427590800, 1445738400, 1459040400, 1477792800, 149049e4, 1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600, 1585443600, 1603591200, 1616893200, 1635645600, 1648342800, 1667095200, 1679792400, 1698544800, 1711846800, 1729994400, 1743296400, 1761444e3, 1774746e3, 1792893600, 1806195600, 1824948e3, 1837645200, 1856397600, 1869094800, 1887847200, 1901149200, 1919296800, 1932598800 ], offset: [-1500, -1521, 2079, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0 ] }, "Europe/Oslo": { time: [-2366755200, -1691881200, -1680566400, -927507600, -85725e4, -844552800, - 828219600, -812498400, -79677e4, -781048800, -765320400, -340840800, - 324507600, -308786400, -293058e3, -277336800, -261608400, -245887200, - 230158800, -214437600, -198709200, -182988e3, -166654800, -147909600, - 135205200, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400, 1932602400 ], offset: [2580, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600 ] } } }, "3t3b": function(e, t, i) { "use strict"; i.r(t), i.d(t, "dateFormatProperty", (function() { return a })), i.d(t, "restoreDateFormatSettingsValue", (function() { return l })); var s = i("Vdly"), r = i("m/cY"), n = i("e1ZQ"); function o() { return s.getValue("date_format", Object(n.c)()) } const a = Object(r.a)(o()); function l() { a.setValue(Object(n.c)()), s.remove("date_format") } s.onSync.subscribe(null, () => a.setValue(o())), a.listeners().subscribe(null, () => s.setValue( "date_format", a.value())) }, "3u3j": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("Eyy1"), r = i("RDU5"); class n extends r.UndoCommand { constructor(e, t, i) { super(i), this._chartModel = e, this._sourceId = t.id(); const r = Object(s.ensureNotNull)(t.priceScale()); this._initialPriceScaleId = r.id(), this._initialPriceScaleState = Object(s .ensureNotNull)(t.priceScale()).state(); const n = Object(s.ensureNotNull)(e.paneForSource(t)); this._initialPriceScalePosition = n.priceScalePosition(r), this ._initialPriceScaleIndex = n.priceScaleIndex(r, this ._initialPriceScalePosition), this._initialPaneIndex = e.panes() .indexOf(n) } _newPriceScaleState(e) { const t = { ...this._initialPriceScaleState }; return delete t.m_isLockScale, delete t.id, delete t.m_topMargin, delete t .m_bottomMargin, t } _originalPriceScaleState() { return this._initialPriceScaleState } } }, "4GHa": function(e, t) { e.exports = '' }, "4TVt": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolPriceAxisView", (function() { return o })); var s = i("Eyy1"), r = i("KcY8"), n = i("Ulff"); class o extends r.a { constructor(e, t) { super(), this._active = !1, this._source = e, this._data = t } setActive(e) { this._active = e } _updateRendererData(e, t, i) { e.visible = !1; const s = this._source.model(); if (!s.timeScale() || s.timeScale().isEmpty()) return; const r = this._source.priceScale(); if (null === r || r.isEmpty()) return; if (!s.selection().isSelected(this._source) && !this._source .isForcedDrawPriceAxisLabel()) return; if (null === s.timeScale().visibleBarsStrictRange()) return; const o = this._source.priceAxisPoints(), a = this._data.pointIndex; if (o.length <= a) return; const l = o[a]; if (!isFinite(l.price)) return; const c = this._source.ownerSource(), h = null !== c ? c.firstValue() : null; if (null === h) return; let u = this._active ? n.a.active : n.a.common; this._data.backgroundProperty ? u = this._data.backgroundProperty.value() : this ._data.backgroundPropertyGetter && (u = this._data .backgroundPropertyGetter()), i.background = u, i.borderColor = "#2E84A6", i .textColor = this.generateTextColor(u), i.coordinate = r.priceToCoordinate(l .price, h), e.text = this._formatPrice(l.price, h), e.visible = !0 } _formatPrice(e, t) { return Object(s.ensureNotNull)(this._source.priceScale()).formatPrice(e, t) } } }, "4bfY": function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "FzRY", 7)).then(({ FibCirclesPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 2 } name() { return "Fib Circles" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } static createProperties(e) { var t = new r("linetoolfibcircles", e, !1, { range: [1, 11] }); return l._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "6U6r"))) .FibCirclesDefinitionsViewModel } _snapTo45DegreesAvailable() { return !0 } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline") .child("color") ], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child( "linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.LevelsCount = 11, t.LineToolFibCircles = l }, "4kQX": function(e, t, i) { "use strict"; i.r(t), i.d(t, "TimeFormatter", (function() { return n })); var s = i("iboI"), r = i("kcTO"); class n { constructor(e) { this._formatStr = e || "%h:%m:%s" } format(e) { return s.customFormatters.timeFormatter ? s.customFormatters.timeFormatter.format( e) : this._formatStr.replace("%h", Object(r.numberToStringWithLeadingZero)(e .getUTCHours(), 2)).replace("%m", Object(r.numberToStringWithLeadingZero)(e .getUTCMinutes(), 2)).replace("%s", Object(r.numberToStringWithLeadingZero)( e.getUTCSeconds(), 2)) } formatLocal(e) { return s.customFormatters.timeFormatter ? s.customFormatters.timeFormatter .formatLocal ? s.customFormatters.timeFormatter.formatLocal(e) : s .customFormatters.timeFormatter.format(e) : this._formatStr.replace("%h", Object(r.numberToStringWithLeadingZero)(e.getHours(), 2)).replace("%m", Object(r.numberToStringWithLeadingZero)(e.getMinutes(), 2)).replace("%s", Object(r.numberToStringWithLeadingZero)(e.getSeconds(), 2)) } } }, "4miz": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })), i.d(t, "b", (function() { return r })); class s { constructor(e, t) { this._visible = !0, this._title = e, this._value = t } title() { return this._title } setTitle(e) { this._title = e } text() { return this._value } value() { return this._value } setValue(e) { this._value = e } visible() { return this._visible } setVisible(e) { this._visible = e } color() { return this._color } setColor(e) { this._color = e } } class r { constructor() { this._items = [], this._header = "", this._title = "" } header() { return this._header } title() { return this._title } items() { return this._items } update() {} } }, "4o++": function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "MagnetMode", (function() { return s })), function(e) { e[e.WeakMagnet = 0] = "WeakMagnet", e[e.StrongMagnet = 1] = "StrongMagnet" }(s || (s = {})) }, "4u8j": function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "ZJWf", 7)).then(({ GannFanPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 2 } name() { return "Gann Fan" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "ASG6"))) .GannFanDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolgannfan", e, !1, { range: [1, 9] }); return l._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); for (var t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r) .child("linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.LevelsCount = 9, t.LineToolGannFan = l }, "4vW/": function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "ColorType", (function() { return s })), function(e) { e.Solid = "solid", e.Gradient = "gradient" }(s || (s = {})) }, "53h+": function(e, t, i) { "use strict"; i.r(t), i.d(t, "findSuitableResolutionToBuildFrom", (function() { return a })); var s = i("LxhU"); function r(e) { throw console.error(e), e } function n(e, t) { const i = t.multiplier(); for (let s = e.length - 1; s >= 0; s--) { const r = Number(e[s]); if (i % r == 0) return `${r}${t.letter()}` } return null } function o(e, t) { const i = n(e, t); if (null !== i) return i; r(`Misconfiguration error: it is trying to request ${t.value()} but we cannot build it from lower resolution`) } function a(e, t) { const i = s.Interval.parse(e); if ((i.isWeeks() || i.isMonths()) && t.has_weekly_and_monthly) { let e = ["1"]; i.isWeeks() && void 0 !== t.weekly_multipliers && (e = t.weekly_multipliers), i .isMonths() && void 0 !== t.monthly_multipliers && (e = t.monthly_multipliers); const s = n(e, i); if (null !== s) return s } if (i.isDWM() && (void 0 === t.has_daily || t.has_daily)) return i.isDays() && void 0 !== t .daily_multipliers ? o(t.daily_multipliers, i) : (void 0 === t.daily_multipliers || t.daily_multipliers.includes("1") || r( "Misconfiguration error: it is trying to request a resolution but symbol does not support it" ), "1D"); if (i.isDWM() && r( `Misconfiguration error: it is trying to request ${i.value()} but we cannot build it from lower resolution` ), i.isMinutes() && !t.has_intraday && r( "Misconfiguration error: it is trying to request intraday resolution but symbol does not support it" ), i.isSeconds() && !t.has_seconds && r( "Misconfiguration error: it is trying to request seconds resolution but symbol does not support it" ), i.isTicks()) return (!t.has_ticks || i.multiplier() > 1) && r( `Misconfiguration error: it is trying to request ${i.multiplier()} ticks resolution but symbol does not support it` ), "1T"; const a = i.isSeconds() ? t.seconds_multipliers : t.intraday_multipliers; return void 0 !== a ? o(a, i) : i.value() } }, "54XG": function(e, t, i) { "use strict"; i.r(t), i.d(t, "FavoriteStudyTemplateService", (function() { return r })); var s = i("ulZB"); class r extends s.b { constructor(e, t) { super(e, t, "FAVORITE_STUDY_TEMPLATES_CHANGED", "StudyTemplates.quicks", []) } remove(e) { this.set(this.get().filter(t => t !== e)) } } }, "585y": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor(e) { this._value = null, this._series = e, this._series.dataEvents().dataUpdated() .subscribe(this, this._onSeriesUpdated) } destroy() { this._series.dataEvents().dataUpdated().unsubscribeAll(this) } volume(e, t) { if (null !== this._value && this._value.from === e && this._value.to === t) return this._value.value; let i = 0; const s = this._series.data().bars(), r = s.firstIndex(), n = s.lastIndex(); if (null !== r && e < r && t < r || null !== n && e > n && t > n) i = NaN; else { const s = this._series.data().bars().rangeIterator(Math.min(e, t), Math.max(e, t)); for (; s.hasNext();) { const e = s.next().value[5]; if (void 0 === e) { i = NaN; break } i += e } } return this._value = { from: e, to: t, value: i }, i } _onSeriesUpdated(e, t) { if (null === this._value) return; if (t) return void(this._value = null); const i = this._series.data().bars().lastIndex(); (null === i || i <= this._value.to) && (this._value = null) } } }, "5B3K": function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyError", (function() { return s })); class s extends Error { constructor(e) { super(e), this.studyError = !0 } } }, "5C6T": function(e, t, i) { "use strict"; i.r(t), i.d(t, "PipFormatter", (function() { return r })); var s = i("kcTO"); class r extends s.PriceFormatter { constructor(e, t, i, s) { t || (t = 1), "forex" !== i && "cfd" !== i || !s ? (super(1), this._isForex = !1) : (super(s), this._isForex = !0), this ._pipPriceScale = e, this._pipMinMove = t, this._pipMinMove2 = s } format(e, t, i) { let s = this._isForex ? this._pipMinMove2 : this._pipMinMove; return void 0 === s && (s = NaN), super.format(e * this._pipPriceScale / s, t, i) } } }, "5JMW": function(e, t, i) { "use strict"; i.r(t), i.d(t, "isLineToolRiskReward", (function() { return a })), i.d(t, "LineDataSourceApi", (function() { return c })); var s = i("Eyy1"), r = i("ogJP"); const n = new Map([ ["LineToolRiskRewardLong", 2], ["LineToolRiskRewardShort", 2], ["LineToolBezierQuadro", 3], ["LineToolBezierCubic", 4] ]); function o(e) { const t = n.get(e.toolname); if (void 0 !== t) return t; const i = e.pointsCount(); return -1 === i ? e.points().length : i } function a(e) { return "LineToolRiskRewardLong" === e || "LineToolRiskRewardShort" === e } const l = ["alwaysShowStats", "entryPrice", "inputs.first bar time", "inputs.last bar time", "interval", "linesWidths", "points", "snapTo45Degrees", "stopPrice", "symbol", "symbolStateVersion", "currencyId", "unitId", "targetPrice", "zOrderVersion" ]; class c { constructor(e, t, i) { this._source = e, this._model = t, this._pointsConverter = i } isSelectionEnabled() { return this._source.isSelectionEnabled() } setSelectionEnabled(e) { this._source.setSelectionEnabled(e) } isSavingEnabled() { return this._source.isSavedInChart() } setSavingEnabled(e) { this._source.setSavingInChartEnabled(e) } isShowInObjectsTreeEnabled() { return this._source.showInObjectTree() } setShowInObjectsTreeEnabled(e) { this._source.setShowInObjectsTreeEnabled(e) } isUserEditEnabled() { return this._source.userEditEnabled() } setUserEditEnabled(e) { this._source.setUserEditEnabled(e) } bringToFront() { this._model.bringToFront([this._source]) } sendToBack() { this._model.sendToBack([this._source]) } getProperties() { return this._source.properties().state(l, !0) } setProperties(e) { this._setProps(this._source.properties(), e, "") } getPoints() { let e = this._source.points(); const t = o(this._source); return e.length > t && (Object(s.assert)(a(this._source.toolname)), e = e.slice(0, t)), this._pointsConverter.dataSourcePointsToPriced(e) } setPoints(e) { if (this._source.isFixed()) return; const t = o(this._source); if (t !== e.length) throw new Error( `Wrong points count. Required: ${t}, provided: ${e.length}`); const i = this._pointsConverter.apiPointsToDataSource(e); this._model.startChangingLinetool(this._source), this._model.changeLinePoints(this ._source, i), this._model.endChangingLinetool(!0), this._source .createServerPoints() } ownerSourceId() { return Object(s.ensureNotNull)(this._source.ownerSource()).id() } changePoint(e, t) { if (this._source.isFixed()) return; const i = this._pointsConverter.apiPointsToDataSource([e])[0]; this._model.startChangingLinetool(this._source, { ...i }, t), this._model.changeLinePoint({ ...i }), this._model.endChangingLinetool(!1), this._source.createServerPoints() } isHidden() { return this._source.isSourceHidden() } getRawPoints() { return this._source.points() } setRawPoint(e, t) { this._model.startChangingLinetool(this._source, { ...t }, e), this._model.changeLinePoint({ ...t }), this._model.endChangingLinetool(!1) } move(e, t) { this._model.startMovingSources([this._source], { logical: e }, null, new Map), this._model.moveSources({ logical: t }, new Map), this._model.endMovingSources(!1) } dataAndViewsReady() { return this._source.dataAndViewsReady() } zorder() { return this._source.zorder() } symbol() { return this._source.properties().symbol.value() } currency() { return this._source.properties().currencyId.value() } unit() { return this._source.properties().unitId.value() } _setProps(e, t, i) { for (const s in t) { if (!t.hasOwnProperty(s)) continue; const n = 0 === i.length ? s : `${i}.${s}`; if (e.hasOwnProperty(s)) { const i = t[s]; Object(r.isHashObject)(i) ? this._setProps(e[s], i, n) : e[s].setValue(i) } else console.warn(`Unknown property "${n}"`) } } } }, "5VQP": function(e, t, i) { "use strict"; i.r(t), i.d(t, "ContextMenuManager", (function() { return s })); var s, r = i("tWVy"); ! function(e) { const t = []; function s() { Object(r.b)() } e.createMenu = async function(e, r = {}, n) { const o = new((await Promise.all([i.e("react"), i.e(6), i.e(11), i.e(21), i.e( 22), i.e(24), i.e(28), i.e(48), i.e(52), i.e(60), i.e( 0), i.e(5), i.e(54), i.e("context-menu-renderer")]).then(i.bind( null, "cbq4"))).ContextMenuRenderer)(e, r, () => { const e = t.indexOf(o); - 1 !== e && t.splice(e, 1), void 0 !== n && n() }, s); return t.push(o), o }, e.hideAll = s, e.getShown = function() { for (let e = 0; e < t.length; e++) if (t[e].isShown()) return t[e]; return null } }(s || (s = {})) }, "5ZUI": function(e, t, i) { "use strict"; var s = i("WPQD").LineToolTrendLine, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Ray" } static createProperties(e) { var t = new r("linetoolray", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolRay = n }, "5fI3": function(e, t, i) { "use strict"; function s(e) { return function(e) { return "=" + JSON.stringify(e) }(e) } function r(e) { return "=" === e[0] } function n(e) { if (!r(e)) return { symbol: e }; try { return JSON.parse(e.slice(1)) } catch (t) { return { symbol: e } } } i.r(t), i.d(t, "encodeExtendedSymbolOrGetSimpleSymbolString", (function() { return s })), i.d(t, "isEncodedExtendedSymbol", (function() { return r })), i.d(t, "decodeExtendedSymbol", (function() { return n })) }, "5mo2": function(e, t, i) { "use strict"; i.r(t); var s = i("jCNj"), r = i("Y7w9"), n = i("txPx"), o = i("OBgQ"); const a = Object(n.getLogger)("Chart.Model.SessionSpec"); function l(e) { return e >= 48 && e <= 57 } class c { constructor() { this.entries = [], this.firstDayOfWeek = s.MONDAY, this.weekEndsCount = -1, this .maxTradingDayLength = 0 } parseSessions(e, t) { var i; if (this._clear(), this.timezone = e, "24x7" === (t = this._parseFirstDayOfWeek(t)) .toLowerCase()) for (const e of u) this.entries.push(c._createSessionEntry(e, 0, 0, 0, 0)); else { let e = !1; const i = new Map; for (const s of t.split("|")) { const t = s.split(":"); if (1 !== t.length && 2 !== t.length) { a.logError("Bad session section: " + s); continue } const r = 1 === t.length; if (r) { if (e) { a.logError("Duplicated default section: " + s); continue } e = !0 } const n = r ? h : c._parseWorkingDays(t[1]); for (const e of n) r && i.has(e) || i.set(e, t[0]) } for (const e of u) { const t = i.get(e); if (void 0 !== t) for (const i of t.split(",")) this.entries.push(c._parseSessionEntry(e, i)) } } this.entries.sort(p); const s = new Map; for (const e of this.entries) { const t = e.dayOfWeek(); s.set(t, e.length() + (null !== (i = s.get(t)) && void 0 !== i ? i : 0)) } this.maxTradingDayLength = 0, s.forEach(e => { this.maxTradingDayLength = Math.max(this.maxTradingDayLength, e) }), this.weekEndsCount = 7 - s.size } static parseHolidaysAndCorrections(e, t, i) { const r = new Map, n = new Map, o = e => { const t = this._parseDay(e), i = t.toString(), s = n.get(i); return void 0 !== s ? s : (n.set(i, t), t) }; if ("" !== t) { const e = []; for (const i of t.split(",")) { if (8 !== i.length) throw new Error("bad holiday date: " + i); const t = o(i); r.set(t, e) } } if ("" === i) return r; const a = s.get_timezone("Etc/UTC"); for (const e of i.split(";")) { const t = e.split(":"); if (2 !== t.length) throw new Error("bad correction section: " + e); const i = []; if ("dayoff" !== t[0]) for (const e of t[0].split(",")) i.push(this._parseSessionEntry(1, e)); for (const e of t[1].split(",")) { if (8 !== e.length) throw new Error("bad correction date: " + e); const t = o(e), n = s.get_day_of_week(s.get_cal(a, t.year, t.month - 1, t.day)), l = []; for (const e of i) l.push(new _(n, e.startOffset(), e.length())); r.set(t, l) } } return r } _clear() { this.entries = [], this.timezone = "", this.firstDayOfWeek = s.MONDAY, this .weekEndsCount = -1 } _parseFirstDayOfWeek(e) { const t = e.split(";"); if (t.length > 2) return a.logError( "Only one `first day` specification expected @ session " + e), e; if (1 === t.length) return e; let i = 1; let r = t[0].indexOf("-") >= 0 ? NaN : parseInt(t[0]); return isNaN(r) && (i = 0, r = parseInt(t[1])), r < s.SUNDAY || r > s.SATURDAY ? (a .logError(`Unexpected day index @ session: ${e}; day index ${r}`), e) : ( this.firstDayOfWeek = r, t[i]) } static _parseDay(e) { const t = parseInt(e.substring(0, 4)), i = parseInt(e.substring(4, 6)), s = parseInt(e.substring(6, 8)); return new o.a(t, i, s) } static _parseSessionEntry(e, t) { let i = t.split("-"); 2 !== i.length && (a.logError("Bad sessions entry: " + t), i = ["0000", "0000"]); let s = 0, r = i[0]; if (r.includes("F")) { const e = r.split("F"); r = e[0], s = "" !== e[1] ? parseInt(e[1]) : 1 } let n = 0, o = i[1]; if (o.includes("F")) { const e = o.split("F"); o = e[0], n = "" !== e[1] ? parseInt(e[1]) : 1 } if (!this._isCorrectSession(r) || !this._isCorrectSession(o)) throw new Error( "Incorrect entry syntax: " + t); const l = r, h = o; return this._createSessionEntry(e, c._minutesFromHHMM(l), c._minutesFromHHMM(h), s, n) } static _isCorrectSession(e) { return 4 === e.length && l(e.charCodeAt(0)) && l(e.charCodeAt(1)) && l(e.charCodeAt( 2)) && l(e.charCodeAt(3)) } static _parseWorkingDays(e) { const t = []; for (let i = 0; i < e.length; i++) { const s = +e[i]; - 1 === t.indexOf(s) && t.push(s) } return t } static _minutesFromHHMM(e) { return s.get_minutes_from_hhmm(e) } static _createSessionEntry(e, t, i, r, n) { 0 === i && (i = s.minutesPerDay), r === n && i <= t && (r += 1), r > 0 && (t -= r * s.minutesPerDay), n > 0 && (i -= n * s.minutesPerDay); return new _(e, t, i - t) } } i.d(t, "workingDays", (function() { return h })), i.d(t, "workingDaysAndWeekEnds", (function() { return u })), i.d(t, "compareSessionEntries", (function() { return p })), i.d(t, "SessionEntry", (function() { return _ })), i.d(t, "EntryIndex", (function() { return m })), i.d(t, "SessionSpec", (function() { return g })); const h = [s.MONDAY, s.TUESDAY, s.WEDNESDAY, s.THURSDAY, s.FRIDAY], u = [s.SUNDAY, s.MONDAY, s.TUESDAY, s.WEDNESDAY, s.THURSDAY, s.FRIDAY, s.SATURDAY]; function d(e, t) { return e.compareTo(t) < 0 } function p(e, t) { return e.compareTo(t) } class _ { constructor(e, t, i) { this._dayOfWeek = e, this._start = t, this._length = i } start() { return this._start + s.minutesPerDay * this.sessionStartDaysOffset() } startOffset() { return this._start } sessionStartDaysOffset() { return this._start >= 0 ? 0 : this._start % s.minutesPerDay == 0 ? -Math.ceil(this ._start / s.minutesPerDay) : -Math.floor(this._start / s.minutesPerDay) } sessionEndDaysOffset() { const e = this._start + this._length; return e >= 0 ? 0 : e % s.minutesPerDay == 0 ? -Math.ceil(e / s.minutesPerDay) : - Math.floor(e / s.minutesPerDay) } isOvernight() { return this._start < 0 } dayOfWeek() { return this._dayOfWeek } sessionStartDayOfWeek() { let e = this._dayOfWeek - this.sessionStartDaysOffset(); return e < s.SUNDAY && (e += 7), e } sessionEndDayOfWeek() { let e = this.sessionStartDayOfWeek() + this.sessionEndDaysOffset(); return e > s.SATURDAY && (e = 1), e } length() { return this._length } weight() { return this._dayOfWeek * s.minutesPerDay + this._start } compareTo(e) { const t = this.weight(), i = t + this._length, s = e.weight(), r = s + e._length; return t <= s && s < i || s <= t && t < r ? 0 : t > s ? 1 : -1 } contains(e) { const t = 60 * s.get_hours(e) + s.get_minutes(e); let i = s.get_day_of_week(e) - this._dayOfWeek; i > 0 && (i -= 7); const r = i * s.minutesPerDay + t; return r >= this._start && r < this._start + this._length } } class m { constructor(e, t, i) { this.weekIndex = e, this.entryIndex = t, this.entries = i } getEntry() { return this.entries[this.entryIndex] } } function f(e, t) { const i = Object(r.lowerbound)(e, t, (e, t) => -1 === e.day.compareTo(t)); return i === e.length ? null : e[i] } class g { constructor(e = "Etc/UTC", t = "0000-0000", i = "", r = "") { this._entries = [], this._firstDayOfWeek = s.MONDAY, this._entriesHash = new Map, this._holidayAndCorrectionMap = new Map, this._holidaySessions = []; const n = new c; n.parseSessions(e, t), this._entries = n.entries, this._timezone = n.timezone, this ._firstDayOfWeek = n.firstDayOfWeek, this._weekEndsCount = n.weekEndsCount, this ._maxTradingDayLength = n.maxTradingDayLength; const o = c.parseHolidaysAndCorrections(e, i, r), a = s.get_timezone(e); this._isThereCorrections = "" !== i || "" !== r, o.forEach((e, t) => { this._holidayAndCorrectionMap.set(t.toString(), e), this ._holidaySessions.push({ day: t, sessions: e }); const i = this.getWeekIndex(t.toCalendar(a)); this._entriesHash.set(i, null) }), this._holidaySessions.sort((e, t) => e.day.compareTo(t.day)) } entries() { return this._entries } timezone() { return this._timezone } firstDayOfWeek() { return this._firstDayOfWeek } addSessionEntry(e, t, i, r, n) { 0 === i && (i = s.minutesPerDay), r === n && i <= t && (r += 1), r > 0 && (t -= r * s.minutesPerDay), n > 0 && (i -= n * s.minutesPerDay); const o = i - t; this._entries.push(new _(e, t, o)) } longestSessionLength() { let e = 0, t = 0; for (const t of this._holidaySessions) t.sessions.forEach(t => { e = Math.max(e, t.length()) }); return this._entries.forEach(e => { t = Math.max(t, e.length()) }), Math.max(e, t) } isWeekEnd(e) { const t = Object(r.lowerbound)(this._entries, new _(e, 0, 0), (e, t) => e .dayOfWeek() < t.dayOfWeek()); return t > this._entries.length - 1 || this._entries[t].dayOfWeek() !== e } isCalWeekEnd(e) { const t = s.get_day_of_week(e); if (!this._isThereCorrections) return this.isWeekEnd(t); const i = o.a.fromCalendar(e), r = this._holidayAndCorrectionMap.get(i.toString()); return void 0 === r ? this.isWeekEnd(t) : 0 === r.length } hasWeekEnds() { return this.weekEndsCount() > 0 } weekEndsCount() { return this._weekEndsCount } maxTradingDayLength() { return this._maxTradingDayLength } holidaysFromYearStart(e) { if (!this._isThereCorrections) return 0; const t = s.get_timezone(this._timezone), i = new o.a(s.get_year(e), s.JANUARY, 1), r = o.a.fromCalendar(e); let n = 0; const a = this._selectHolidays(i, r); for (let e = 0; e < a.length; e++) { const i = a[e].day.toCalendar(t); this.isWeekEnd(s.get_day_of_week(i)) ? n += 0 === a[e].sessions.length ? 0 : - 1 : n += 0 === a[e].sessions.length ? 1 : 0 } return n } intradayCanBeBuiltFrom24x7(e) { return this._entries.every(t => t.start() % e == 0 && t.length() % e == 0) } indexOfSession(e, t, i) { const n = this._getEntriesForWeek(e); let o = Object(r.lowerbound)(n, new _(t, i, 0), d); if (o !== n.length) return new m(e, o, n); let a = e; const l = 7 - t + this._firstDayOfWeek - 1; for (i = -(s.minutesPerDay - i + l * s.minutesPerDay);;) { a++; const e = this._getEntriesForWeek(a); if (0 !== e.length) return o = Object(r.lowerbound)(e, new _(this ._firstDayOfWeek, i, 0), d), new m(a, o, e) } } findSession(e, t, i, s = 0) { const r = this.indexOfSession(e, t, i), n = r.entries; let o = r.entryIndex; if (0 !== s) { const e = n[o].dayOfWeek(), t = s > 0 ? 1 : -1; for (;;) { const i = o + t; if (i < 0 || i >= n.length || n[i].dayOfWeek() !== e) break; o = i } } return new m(r.weekIndex, o, n) } getWeekIndex(e) { if (!this._isThereCorrections) return 0; const t = s.get_day_of_week(e) - s.SUNDAY, i = s.get_timezone("Etc/UTC"), r = s.get_cal(i, s.get_year(e), s.get_month(e), s.get_day_of_month(e) - t); return Math.floor((r.getTime() + 621672192e5) / 1e3 / 86400 / 7) } correctTradingDay(e) { const t = s.get_day_of_week(e), i = 60 * s.get_hours(e) + s.get_minutes(e), r = this.getWeekIndex(e), n = this.findSession(r, t, i, 0), o = n.getEntry().dayOfWeek() - t + 7 * (n.weekIndex - r); return 0 !== o && s.add_date(e, o), e } alignToSessionStart(e, t = 0) { const i = s.get_day_of_week(e), r = 60 * s.get_hours(e) + s.get_minutes(e), n = this.getWeekIndex(e), o = this.findSession(n, i, r, t), a = o.getEntry(), l = a.dayOfWeek() - i + 7 * (o.weekIndex - n); 0 !== l && s.add_date(e, l); const c = a.startOffset(); return s.set_hms(e, c / 60, c % 60, 0, 0, s.get_timezone(this._timezone)), a .length() } businessDaysToCalendarDays(e, t) { let i = this.getWeekIndex(e), r = s.get_day_of_week(e), n = 0, o = 0; for (; o < t;) { const e = this._getEntriesForWeek(i); let a = 0; for (let i = r; i <= s.SATURDAY; i++) { n++; let s = !0; for (; a < e.length && !(e[a].dayOfWeek() > i);) e[a].dayOfWeek() < i || s && (s = !1, o++), a++; if (o >= t) return n } i++, r = s.SUNDAY } return n } calendarDaysToBusinessDays(e, t) { let i = this.getWeekIndex(e), r = s.get_day_of_week(e), n = 0, o = 0; for (; n < t;) { const e = this._getEntriesForWeek(i); let a = 0; for (let i = r; i <= s.SATURDAY; i++) { n++; let s = !0; for (; a < e.length && !(e[a].dayOfWeek() > i);) e[a].dayOfWeek() < i || s && (s = !1, o++), a++; if (n >= t) return o } i++, r = s.SUNDAY } return o } alignToNearestSessionStart(e, t) { return this._alignToNearestSessionValue(e, t, this._entrySessionStart.bind(this)) } alignToNearestSessionEnd(e, t) { return this._alignToNearestSessionValue(e, t, this._entrySessionEnd.bind(this)) } leftBorderOfDailyBar(e) { const t = this._getEntriesForDay(e); return 0 === t.length ? null : (t.sort(p), this._getLeftEntryBorder(e, t[0])) } bordersOfDailyBar(e) { const t = this._getEntriesForDay(e); if (0 === t.length) return null; t.sort(p); const i = this._getLeftEntryBorder(e, t[0]), r = t[t.length - 1], n = s.clone(e); let o = 60 * (r.startOffset() + r.length()) - 1; const a = Math.floor(o / 3600); return o -= 3600 * a, s.set_hms(n, a, o / 60, o % 60, 0, s.get_timezone(this ._timezone)), { from: i, to: n } } getEntriesForWeekByCalendar(e) { const t = this.getWeekIndex(e); return this._getEntriesForWeek(t) } _getEntriesForWeek(e) { let t = this._entriesHash.get(e); if (void 0 === t) return this._entries; if (null !== t) return t; const i = s.get_timezone(this._timezone); t = this._entries.slice(); const r = this._weekIndexToCalendar(e), n = this._weekIndexToCalendar(e + 1), a = o.a.fromCalendar(r), l = o.a.fromCalendar(n), c = this._selectHolidays(a, l); for (const e of c) { const r = e.day.toCalendar(i), n = s.get_day_of_week(r); t = t.filter(e => e.dayOfWeek() !== n), t = t.concat(e.sessions) } return t.sort(p), this._entriesHash.set(e, t), t } _selectHolidays(e, t) { const i = []; let s = e; for (;;) { const e = f(this._holidaySessions, s); if (null === e) return i; if (!e.day.before(t)) return i; i.push(e), s = e.day.addDays(1) } } _weekIndexToCalendar(e) { const t = 1e3 * (86400 * e * 7 + 86400) - 621672192e5, i = s.get_cal_from_unix_timestamp_ms(s.get_timezone("Etc/UTC"), t), r = s.get_timezone("Etc/UTC"); return s.get_cal(r, s.get_year(i), s.get_month(i), s.get_day_of_month(i)) } _alignToNearestSessionValue(e, t, i) { const r = s.get_day_of_week(e), n = 60 * s.get_hours(e) + s.get_minutes(e), o = this.getWeekIndex(e); let a = this.findSession(o, r, n); if (a.getEntry().contains(e) && o === a.weekIndex || 1 === t) return i(a, s.clone( e), t); let l = a.entryIndex - 1; if (l < 0) { let e = a.weekIndex, t = a.entries; for (; l < 0;) e--, t = this._getEntriesForWeek(e), l += t.length; a = new m(e, l, t) } else a = new m(a.weekIndex, l, a.entries); return i(a, s.clone(e), t) } _entrySessionStart(e, t, i) { return this._entrySessionValue(e, t, i, e => 60 * e.start()) } _entrySessionEnd(e, t, i) { return this._entrySessionValue(e, t, i, e => 60 * (e.start() + e.length()) - 1) } _entrySessionValue(e, t, i, r) { let n = s.get_day_of_week(t); const o = e.getEntry(); let a = o.dayOfWeek() - o.sessionStartDaysOffset(); const l = this.getWeekIndex(t); let c = e.weekIndex - l, h = !1; if (a < s.SUNDAY && (c <= 0 ? h = !0 : c--, a += 7), (c > 0 && i >= 0 || c < 0 && i < 0) && s.add_date(t, 7 * c), !o.contains(t)) { let e = a - n; h && i < 0 && (e = -(7 - a + n)), s.add_date(t, e), n = s.get_day_of_week(t) } o.isOvernight() && n === o.dayOfWeek() && s.add_date(t, -o .sessionStartDaysOffset()); let u = r(o); const d = Math.floor(u / 3600); return u -= 3600 * d, s.set_hms(t, d, u / 60, u % 60, 0, s.get_timezone(this ._timezone)), t } _getEntriesForDay(e) { const t = s.get_day_of_week(e); return this._getEntriesForWeek(this.getWeekIndex(e)).filter(e => e.dayOfWeek() === t) } _getLeftEntryBorder(e, t) { const i = s.clone(e), r = t.startOffset(); return s.set_hms(i, r / 60, r % 60, 0, 0, s.get_timezone(this._timezone)), i } } }, "5rJj": function(e, t, i) { "use strict"; (function(t) { var s = i("ogJP").isSameType, r = i("Ocx9").DefaultProperty; function n(e, t, i, s) { this._map = Object.assign({}, this._map, s), t && (t = this.unpackLevels(t)), r .call(this, e, t, i) } inherit(n, r), n.prototype.state = function(e, i) { e = e || []; var s = t.prototype.state.call(this, e); return i ? s : this.packLevels(s) }, n.prototype.clone = function() { for (var e = this.state(), t = new n(this._defaultName, e), i = 0; i < this ._exclusions.length; ++i) t.addExclusion(this._exclusions[i]); return t }, n.prototype.merge = function(e, i) { return t.prototype.merge.call(this, this.unpackLevels(e), i) }, n.prototype._map = { prefixes: [""], range: [0, 0], names: ["coeff", "color", "visible", "linestyle", "linewidth"], typecheck: { pack: Object, unpack: Array } }, n.prototype._packLvlTpl = function() { return [] }, n.prototype._unpackLvlTpl = function() { return {} }, n.prototype._packLvlFill = function(e, t, i, s) { return s.push(i[t]), s }, n.prototype._unpackLvlFill = function(e, t, i, s) { return s[t] = i[e], s }, n.prototype._iterateLevels = function(e, t) { for (var i in this._map.prefixes) for (var r = (this._map.prefixes[i] || "") + "level", n = this._map.range[ 0]; n <= this._map.range[1]; n++) if (e[r + n] && s(e[r + n], t.typecheck())) { var o = t.tpl(); for (var a in this._map.names) o = t.fill(a, this._map.names[a], e[ r + n], o); e[r + n] = o } return e }, n.prototype.packLevels = function(e) { return this._iterateLevels(e, { tpl: this._packLvlTpl, fill: this._packLvlFill, typecheck: this._map.typecheck.pack }) }, n.prototype.unpackLevels = function(e) { return this._iterateLevels(e, { tpl: this._unpackLvlTpl, fill: this._unpackLvlFill, typecheck: this._map.typecheck.unpack }) }, n.prototype.saveDefaults = function() { TradingView.saveDefaults(this._defaultName, this.state(this._exclusions, !0)) }, e.exports = n }).call(this, i("tc+8")) }, "5vwb": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return n })), i.d(t, "a", (function() { return o })); var s = i("tqok"), r = i("hsV8"); function n(e, t) { for (const i of e.points) { if (i.index >= t.length) return null; if (t[i.index] === s.INVALID_TIME_POINT_INDEX) return null } return { points: e.points.map(e => ({ index: t[e.index], offset: e.offset, level: e.level })) } } function o(e, t, i) { return { id: t, points: e.points.map(e => ({ ...e, index: Object(r.ensureTimePointIndexIndex)(i.indexOf(e.index)) })) } } }, "68at": function(e, t, i) { "use strict"; var s = i("5rJj"), r = i("7ADh").LineToolFibWedgeBase, n = i("j3hX").LineToolColorsProperty; class o extends r { constructor(e, t) { super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "jlk4", 7)).then(({ ProjectionLinePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return 1 } name() { return "Projection" } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "LzAw"))) .ProjectionDefinitionsViewModel } static createProperties(e) { var t = new s("linetoolprojection", e, !1, { range: [1, 1] }); return o._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e), e.addChild("linesColors", new n([e.trendline.color])) } } t.LineToolProjection = o }, "6I19": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return w })), i.d(t, "c", (function() { return P })), i.d(t, "a", (function() { return C })); var s = i("Eyy1"), r = i("ivNn"), n = i("eJTA"), o = i("YFKU"), a = i("qFKp"), l = i("Tmoa"), c = i("Ialn"), h = i("k9/m"), u = i("CW80"), d = i("mMWL"), p = i("GH0z"), _ = i("38az"), m = i("7qT/"), f = i("xCUR"); const g = a.CheckMobile.any(), b = g && !0, v = new p.PercentageFormatter, S = window.t("n/a"), y = `${S} (${S}%)`; function w(e, t) { const i = Object(n.parseRgb)(t), s = Object(n.parseRgb)(e); return Object(n.distanceRgb)(i, s) < 70 ? Object(n.rgbToHexString)(Object(n.invertRgb)(i)) : t } function P(e) { if (null === e) return null; const t = e.properties().child("background"); return void 0 === t ? null : t.value() } class C { constructor(e, t) { this._series = e, this._model = t, this._emptyValues = [{ title: Object(o.t)("Open"), visible: !1, value: "", index: 0, id: "" }, { title: Object(o.t)("High"), visible: !1, value: "", index: 1, id: "" }, { title: Object(o.t)("Low"), visible: !1, value: "", index: 2, id: "" }, { title: Object(o.t)("Close"), visible: !1, value: "", index: 3, id: "" }, { title: "", visible: !1, value: "", index: 4, id: "" }, { title: "", visible: !1, value: "", index: 5, id: "" }, { title: Object(o.t)("Change"), visible: !1, value: "", index: 6, id: "" }] } getItems() { return this._emptyValues } getValues(e) { const t = this._showLastPriceAndChangeOnly(), i = this._emptyValues.map(e => ({ ...e, visible: !t })); i[0].value = S, i[1].value = S, i[2].value = S, i[3].value = S, i[6].value = y, i[5] .visible = !1; const n = i[4]; if (n.value = S, n.visible = !1, this._model.timeScale().isEmpty() || 0 === this ._series.bars().size() || this._series.priceScale().isEmpty()) return i; Object(r.isNumber)(e) || (e = Object(s.ensureNotNull)(this._series.data().last()) .index); const o = this._series.nearestIndex(e, h.PlotRowSearchMode.NearestLeft); if (void 0 === o) return i; const a = this._series.data().valueAt(o), u = P(this._series.model().paneForSource(this._series)); if (null === a || null === u) return i; const d = a[1], p = a[2], m = a[3], g = a[4]; if (null == d || null == p || null == m || null == g) return i; const { values: C } = this._changesData(g, o, t), x = Object(f.a)(this._series); if (Object(f.b)(this._series)) i[6].value = ""; else if (void 0 !== C) { const e = this._series.formatter(); i[6].value = Object(c.forceLTRStr)( `${e.format(C.change, !0)} (${v.format(C.percentChange, !0)})`) } t ? (i[5].value = x(g), i[5].visible = !0, i[6].visible = !0) : (i[0].value = x(d), i[1].value = x(p), i[2].value = x(m), i[3].value = x(g), i[4].value = x(this ._series.barFunction()(a))); let T = null; if (t && !b) T = void 0 === C || C.change >= 0 ? _.SeriesBarColorer.upColor(this ._series.properties()) : _.SeriesBarColorer.downColor(this._series .properties()); else { const e = this._series.barColorer().barStyle(o, !1); T = w(u, null != e.barBorderColor ? e.barBorderColor : e.barColor) } T = Object(l.resetTransparency)(w(u, T)); for (const e of i) e.color = T; return i } _showLastPriceAndChangeOnly() { return g && (null === this._model.crossHairSource().pane || Object(u.isLineToolName) (d.tool.value()) || null !== this._model.lineBeingEdited()) } _changesData(e, t, i) { var s; if (i && !b) { const e = this._series.quotes(); if (null !== e) return { values: { change: e.change, percentChange: e.change_percent } } } else { const i = this._series.data().search(t - 1, h.PlotRowSearchMode.NearestLeft), r = null !== (s = null == i ? void 0 : i.value[4]) && void 0 !== s ? s : null; if (null !== r) return { values: { change: e - r, percentChange: Object(m.a)(r, e) } } } return {} } } }, "6KAu": function(e, t, i) { "use strict"; function s() { return Promise.all([i.e("react"), i.e(1), i.e(3), i.e(16), i.e(93), i.e(0), i.e(2), i.e(15), i.e("change-interval-dialog") ]).then(i.bind(null, "iT0o")) } i.d(t, "a", (function() { return s })) }, "6ctS": function(e, t) { e.exports = '' }, "6sst": function(e, t, i) { "use strict"; i.r(t), i.d(t, "OverlayStudyPriceLineAxisView", (function() { return r })); var s = i("TmNs"); class r extends s.PriceLineAxisView { constructor(e) { super(), this._study = e } _value() { return this._study.lastValueData("", !0) } _priceLineColor(e) { return e } _lineWidth() { return 1 } _isVisible() { const e = this._study.model().properties().scalesProperties.showSeriesLastValue .value(); return this._study.properties().childs().showPriceLine.value() && e } } }, "6vtU": function(e, t, i) { "use strict"; i.r(t), i.d(t, "setAdditionalSymbolInfoFields", (function() { return r })), i.d(t, "getAdditionalSymbolInfoFields", (function() { return n })); let s = []; function r(e) { s = e } function n() { return s } }, "704P": function(e, t, i) { "use strict"; (function(e) { var s = i("Ss5c").LineDataSource, r = i("jkoZ"), n = i("Ocx9").DefaultProperty, o = i("k9/m").PlotRowSearchMode, a = i("s1Gx").sortSourcesPreOrdered.LineToolExecution; class l { constructor(e, t) { this._pane = e, this._timeScale = t } static recreateOrderedByBarsSourcesCache(e) { l.clearOrderedByBarsSourcesCache(); for (var t = l.prototype, i = e.sourcesByGroup().all(), s = 0; s < i .length; ++s) { var r = i[s]; if (r._adapter && void 0 !== r._adapter._index) { var n = t._cachedByBarIndexOrderedExecutions[r._adapter._index]; t._cachedByBarIndexOrderedExecutions[r._adapter._index] = n || [], t ._cachedByBarIndexOrderedExecutions[r._adapter._index].push(r) } } } static clearOrderedByBarsSourcesCache() { l.prototype._cachedByBarIndexOrderedExecutions = {} } getXYCoordinate(e, t, i) { var s = 0, r = e.getDirection(), n = "buy" === r, a = this._pane.model().mainSeries(); if (a.bars) { var l = n ? 10 : -10, c = a.bars().search(i, o.NearestLeft); if (null !== c) { i = c.index; var u = n ? c.value[TradingView.LOW_PLOT] : c.value[TradingView .HIGH_PLOT], d = a.priceScale(), p = a.firstValue(); s = d.priceToCoordinate(u, p) + l } } e._index = i; var _ = t.visibleBarsStrictRange(); if (!isFinite(i) || null === _ || i > _.lastBar() || i < _.firstBar()) return { x: -1, y: -1 }; for (var m = this._cachedByBarIndexOrderedExecutions[i] || this._pane .sourcesByGroup().all(), f = m.length - 1; f >= 0; --f) { var g = m[f]; if (g instanceof h && g._adapter._index === i && g._adapter .getDirection() === r) { if (g === e._line) break; var b = g._adapter._height(); s = n ? s + b : s - b } } return { x: t.indexToCoordinate(i), y: s } } } l.prototype._cachedByBarIndexOrderedExecutions = {}; class c { constructor(e) { this._line = e } _height() { var e = this.getArrowHeight(), t = this.getArrowSpacing(); this.getText() && r.fontHeight(this.getFont()); return e + t + 0 + 10 } getIndex() { return this._line._model.timeScale().baseIndex() - this._line.points()[0] .index } setIndex(e) { var t = this._line._model.timeScale().baseIndex() - Math.abs(e); this._line.startMoving({ logical: this._line.points()[0] }); var i = TradingView.merge({}, this._line.points()[0]); return i.index = t, this._line.move({ logical: i }), this._line.endMoving(), this } getTime() { return this._unixtime } setTime(e) { return this._unixtime = e, this._line.restorePoints([{ offset: 0, price: this.getPrice(), time_t: this._unixtime }], []), this._line.createServerPoints(), this } getPrice() { return this._line.points().length > 0 ? this._line.points()[0].price : this ._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0 } setPrice(e) { return this._line.points().length > 0 && (this._line.points()[0].price = e), this._line._timePoint.length > 0 && (this._line._timePoint[0].price = e), this } getText() { return this._line.properties().text.value() } setText(e) { return this._line.properties().text.setValue(e || ""), this._line .updateAllViewsAndRedraw(), this } getArrowHeight() { return this._line.properties().arrowHeight.value() } setArrowHeight(e) { return this._line.properties().arrowHeight.setValue(e || 5), this } getArrowSpacing() { return this._line.properties().arrowSpacing.value() } setArrowSpacing(e) { return this._line.properties().arrowSpacing.setValue(e || 1), this } getDirection() { return this._line.properties().direction.value() } setDirection(e) { return this._line.properties().direction.setValue(e || "buy"), this } getArrowColor() { var e = this._line.properties(); return "buy" === this.getDirection() ? e.arrowBuyColor.value() : e .arrowSellColor.value() } setArrowColor(e) { return "buy" === this.getDirection() ? this.setArrowBuyColor(e) : this .setArrowSellColor(e), this } setArrowBuyColor(e) { return this._line.properties().arrowBuyColor.setValue(e), this } setArrowSellColor(e) { return this._line.properties().arrowSellColor.setValue(e), this } getTextColor() { return r.getColorFromProperties(this._line.properties().textColor, this ._line.properties().textTransparency) } setTextColor(e) { return r.setColorToProperties(e, this._line.properties().textColor, this ._line.properties().textTransparency), this } getFont() { return r.getFontFromProperties(this._line.properties().fontFamily, this ._line.properties().fontSize, this._line.properties().fontBold, this ._line.properties().fontItalic) } setFont(e) { return r.setFontToProperties(e, this._line.properties().fontFamily, this ._line.properties().fontSize, this._line.properties().fontBold, this ._line.properties().fontItalic), this } setTooltip(e) { return null == e ? e = "" : e += "", this._line.properties().tooltip .setValue(e), this } getTooltip() { return this._line.properties().tooltip.value() } remove() { this._line._model.removeSource(this._line), delete this._line } getPoints() { return this._line.points() } } class h extends s { constructor(e, t) { super(e, t || h.createProperties()), this._adapter = new c(this), this .customization.forcePriceAxisLabel = !1, this.customization .disableErasing = !0, this.customization.showInObjectTree = !1, this .setSelectionEnabled(!1), i.e("lt-pane-views").then(i.t.bind(null, "tjxb", 7)).then(({ ExecutionPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } zorder() { return a } isSpeciallyZOrderedSource() { return !0 } pointsCount() { return h.POINTS_COUNT } name() { return "Execution" } hasContextMenu() { return !1 } state() { return null } updateAllViews() { return this._isVisible() ? s.prototype.updateAllViews.call(this) : null } priceAxisViews(e, t) { return this._isVisible() ? s.prototype.priceAxisViews.call(this, e, t) : null } _isVisible() { return this._model.properties().tradingProperties.showExecutions.value() } paneViews() { return TradingView.printing && !e.enabled("snapshot_trading_drawings") ? null : this._model.properties().tradingProperties.showExecutions .value() ? s.prototype.paneViews.call(this) : null } userEditEnabled() { return !1 } showInObjectTree() { return !1 } cloneable() { return !1 } copiable() { return !1 } isSynchronizable() { return !1 } static createProperties(e) { var t = new n("linetoolexecution", e, !1, !1); return h._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } h.POINTS_COUNT = 1, t.ExecutionsPositionController = l, t.LineToolExecution = h }).call(this, i("Kxc7")) }, "7ADh": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolFibWedgeBase", (function() { return o })); var s = i("Eyy1"), r = i("aO4+"), n = i("Ss5c"); class o extends n.LineDataSource { pointsCount() { return 3 } hasEditableCoordinates() { return !1 } setPoint(e, t) { if (super.setPoint(e, t), !this._recursiveGuard) try { if (this._recursiveGuard = !0, 2 === e) { const e = this.pointToScreenPoint(this._points[0])[0]; let t = this.pointToScreenPoint(this._points[1])[0]; const i = this.pointToScreenPoint(this._points[2])[0].subtract(e) .length(); let s = t.subtract(e); s.length() <= 0 && (s = new r.Point(1, 0)), t = e.add(s.normalized() .scaled(i)); const n = this.screenPointToPoint(t), o = this._pointsProperty.childs().points[1]; o.childs().price.setValue(n.price), o.childs().bar.setValue(n.index) } else { const e = this.pointToScreenPoint(this._points[0])[0], t = this.pointToScreenPoint(this._points[1])[0]; let i = this.pointToScreenPoint(this._points[2])[0]; const s = t.subtract(e).length(); let n = i.subtract(e); n.length() <= 0 && (n = new r.Point(1, 0)), i = e.add(n.normalized() .scaled(s)); const o = this.screenPointToPoint(i), a = this._pointsProperty.childs().points[2]; a.childs().price.setValue(o.price), a.childs().bar.setValue(o.index) } } finally { this._recursiveGuard = !1 } } addPoint(e) { if (2 === this._points.length) { const t = this.pointToScreenPoint(this._points[0])[0], i = this.pointToScreenPoint(this._points[1])[0]; let r = this.pointToScreenPoint(e)[0]; const n = i.subtract(t).length(), o = r.subtract(t).normalized(); r = t.add(o.scaled(n)); const a = Object(s.ensureNotNull)(this.ownerSource()), l = Object(s.ensureNotNull)(a.firstValue()), c = Object(s.ensureNotNull)(this.priceScale()).coordinateToPrice(r.y, l); e = { index: Math.round(this._model.timeScale().coordinateToIndex(r.x)), price: c } } return n.LineDataSource.prototype.addPoint.call(this, e) } } }, "7ETO": function(e, t, i) { "use strict"; i.r(t); var s = i("ocLq"); class r { main(e) { const t = e.new_var(s.Std.open(e)), i = e.new_var(s.Std.close(e)), r = t.get(1), n = i.get(1), o = s.Std.ohlc4(e), a = s.Std.na(t.get(1)) ? (s.Std.open(e) + s.Std.close(e)) / 2 : (r + n) / 2; t.set(a), i.set(o); const l = s.Std.max(s.Std.high(e), s.Std.max(a, o)), c = s.Std.min(s.Std.low(e), s.Std.min(a, o)), h = s.Std.volume(e), u = e.symbol; return [u.time, a, l, c, o, h, u.updatetime, u.isBarClosed] } } function n(e) { if (0 === e.type.indexOf("BarSetHeikenAshi@tv-basicstudies-")) return new r; const t = "unknown builder type: " + e.type; throw console.error(t), new Error(t) } i.d(t, "getChartStyleStudy", (function() { return n })) }, "7Fue": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return n })); const s = ["horizlines", "vertlines", "lines", "hlines", "textmarks", "shapemarks", "backgrounds", "polygons", "trendchannels", "hhists", "dwglabels", "dwglines", "dwgboxes", "dwgtables", "dwgtablecells" ]; function r(e) { return !s.some(t => e[t]().size > 0) } function n(e) { const t = new Map; return e.forEach((e, i) => { e.forEach(e => { const s = { ...e, styleId: i }, r = e.firstBarTime; let n = t.get(r); void 0 === n && (n = new Set, t.set(r, n)), n.add(s) }) }), t } }, "7KDR": function(e, t, i) { "use strict"; i.r(t), i.d(t, "Action", (function() { return l })), i.d(t, "ActionAsync", (function() { return c })), i.d(t, "Separator", (function() { return h })), i.d(t, "Loader", (function() { return u })); var s = i("zRdu"), r = i("aIyQ"), n = i.n(r), o = i("/3z9"), a = i("e3/o"); class l { constructor(e, t = a.guid()) { this.type = s.a.Action, this._destroyed = !1, this._binding = null, this.id = t, this._onUpdate = new n.a, this._options = e, this.update(e) } execute() { this._options.checkable && this.update({ checked: !this._options.checked }), this._options.onExecute && this._options.onExecute(this) } getLabel() { return this._options.label || "" } getSubItems() { return this._options.subItems || [] } isDisabled() { return !0 === this._options.disabled } isActive() { return !0 === this._options.active } isCheckable() { return !0 === this._options.checkable } isChecked() { return !0 === this._options.checked } getPayload() { return this._options.payload } update(e) { this._destroyed || (this._unbindShortcut(), e.hotkeyHash && (this._options .shortcutHint = Object(o.humanReadableHash)(e.hotkeyHash)), this ._options = Object.assign(this._options, e), this._bindShortcut(), this ._onUpdate.fire(this)) } onUpdate() { return this._onUpdate } getState() { return { label: this.getLabel(), disabled: this.isDisabled(), active: this.isActive(), subItems: this.getSubItems(), checkable: this.isCheckable(), checked: this.isChecked(), doNotCloseOnClick: this._options.doNotCloseOnClick || !1, shortcutHint: this._options.shortcutHint, hint: this._options.hint, icon: this._options.icon, iconChecked: this._options.iconChecked, toolbox: this._options.toolbox, showToolboxOnHover: this._options.showToolboxOnHover || !1, statName: this._options.statName, name: this._options.name, fullWidthLabel: this._options.fullWidthLabel, invisibleHotkey: this._options.invisibleHotkey } } getBinding() { return this._binding } setBinding(e) { this._binding = e } destroy() { this._destroyed = !0, this._onUpdate.destroy(), null !== this._binding && this ._binding.destroy(), this._unbindShortcut() } options() { return this._options } _bindShortcut() { if (!this._options.hotkeyGroup || !this._options.hotkeyHash) return; const e = "string" == typeof this._options.label ? this._options.label : this ._options.name; this._hotkeyAction = this._options.hotkeyGroup.add({ hotkey: this._options.hotkeyHash, desc: e, handler: () => this.execute(), isDisabled: () => this.isDisabled() }) } _unbindShortcut() { this._hotkeyAction && (this._hotkeyAction.destroy(), delete this._hotkeyAction) } } class c extends l { constructor(e, t) { super({}, t), this.type = s.a.ActionAsync, this._loader = e, this._loaded = !1 } loadOptions() { return this._loadingPromise || (this._loadingPromise = this._loader().then(e => { this.update(e), this._loaded = !0 })), this._loadingPromise } isLoaded() { return this._loaded } } class h { constructor(e, t = a.guid()) { this.type = s.a.Separator, this.id = t, this._hint = e } getHint() { return this._hint } } class u { constructor(e = a.guid()) { this.type = s.a.Loader, this.id = e } } }, "7MWe": function(e, t, i) { "use strict"; i.r(t), i.d(t, "PriceScaleChangeUndoCommand", (function() { return a })); var s = i("Eyy1"), r = i("txPx"), n = i("RDU5"); const o = Object(r.getLogger)("Chart.ChartUndoModel"); class a extends n.UndoCommand { constructor(e, t, i, s, r) { super("Scale price", !1), this._newPriceScaleState = null, this._model = e, this ._paneIndex = e.panes().indexOf(t), this._priceScaleId = i.id(), this ._state = s, this._timestamp = r ? performance.now() : null } undo() { if (null !== this._newPriceScaleState) return void o.logDebug( "PriceScaleChangeUndoCommand.undo: Command is already undone"); const [e, t] = this._paneAndScale(); this._newPriceScaleState = t.state(), this._model.restorePriceScaleState(e, t, this._state) } redo() { if (null === this._newPriceScaleState) return void o.logDebug( "PriceScaleChangeUndoCommand.redo: Command is not undone"); const [e, t] = this._paneAndScale(); this._model.restorePriceScaleState(e, t, this._newPriceScaleState), this ._newPriceScaleState = null } canMerge(e) { return e instanceof a && null !== this._timestamp && null !== e._timestamp && null === this._newPriceScaleState && e._model === this._model && e ._paneIndex === this._paneIndex && e._priceScaleId === this._priceScaleId && Math.abs(e._timestamp - this._timestamp) < 1e3 } merge(e) { this._timestamp = e._timestamp } _paneAndScale() { const e = this._model.panes()[this._paneIndex], t = Object(s.ensureNotNull)(e.getPriceScaleById(this._priceScaleId)); return [e, t] } } }, "7RN7": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return s })), i.d(t, "a", (function() { return r })); const s = 52, r = 5 }, "7dm8": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return n })), i.d(t, "c", (function() { return o })), i.d(t, "d", (function() { return a })), i.d(t, "e", (function() { return l })); var s = i("ocLq"); class r { init(e, t) { e.new_sym(t(1), s.Std.period(e)), this._source = t(0), this._scaleFactor1 = 1, this ._scaleFactor2 = 1 } main(e, t) { const i = e.symbol.time, r = s.Std[this._source](e); e.select_sym(1); const n = s.Std[this._source](e), o = e.new_unlimited_var(n), a = e.new_unlimited_var(e.symbol.time); if (e.select_sym(0), isNaN(i)) return null; let l = a.indexOf(i); - 1 !== l && a.get(l) !== i && (l = -1); const c = l < 0 ? NaN : o.get(l); return [this._doCalculation(this._scaleFactor1, r, this._scaleFactor2, c)] } } const n = { styles: { plot1: { linestyle: 0, linewidth: 2, plottype: 0, trackPrice: !1, transparency: 35, visible: !0, color: "#800080" } }, precision: 2, inputs: { source: "close", symbol2: "" } }, o = [{ defval: "close", id: "source", name: "Source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"], type: "text" }, { id: "symbol2", name: "Symbol", type: "symbol", confirm: !0 }], a = [{ id: "plot1", type: "line" }], l = { plot1: { title: "Plot", histogramBase: 0 } } }, "7ktv": function(e, t, i) { "use strict"; i.r(t), i.d(t, "PriceDataSource", (function() { return a })); var s = i("fgLi"), r = i("aIyQ"), n = i.n(r), o = i("/tGj"); class a extends s.DataSource { constructor(e) { super(), this._formatterChanged = new n.a, this._priceStepChanged = new n.a, this._currencyChanged = new n.a, this._unitChanged = new n.a, this ._priceRangeReadyChanged = new n.a, this._metaInfo = null, this._priceStep = null, this._priceRangeReady = !0, this._model = e } barColorer() { return null } base() { return 0 } model() { return this._model } currencyChanged() { return this._currencyChanged } isCurrencySource() { return !0 } unitChanged() { return this._unitChanged } isUnitSource() { return !0 } priceRange(e, t) { return null } isDraggable() { return !this._metaInfo || !this._metaInfo.linkedToSeries } priceLineColor(e) { return e } formatterChanged() { return this._formatterChanged } priceStep(e) { return this._priceStep } priceStepChanged() { return this._priceStepChanged } hasStateForAlert() { return !1 } isIncludedInAutoScale() { return !0 } correctScaleMargins(e) { return e } priceRangeReady() { return this._priceRangeReady } priceRangeReadyChanged() { return this._priceRangeReadyChanged } disablePriceRangeReady() { const e = this.priceScale(); null === e || e.isAutoScale() || e.mainSource() !== this || (this ._priceRangeReady = !1, e.recalculatePriceRangeOnce()), this ._priceRangeReadyChanged.fire(!1) } _enablePriceRangeReady() { this._priceRangeReady = !0, this._priceRangeReadyChanged.fire(!0) } _onSourceCurrencyChanged() { Object(o.isSymbolSource)(this) || this._currencyChanged.fire() } _onSourceUnitChanged() { Object(o.isSymbolSource)(this) || this._unitChanged.fire() } _onSourcePriceRangeReadyChanged(e) { Object(o.isSymbolSource)(this) || e || this.disablePriceRangeReady() } } }, "7nsU": function(e, t, i) { "use strict"; i.r(t), i.d(t, "showConfirmInputsDialog", (function() { return r })); var s = i("YFKU"); async function r(e, t, r, n, o = "default") { let a = !1, l = !1; try { const s = await Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i .e(6), i.e(8), i.e(9), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e( 19), i.e(21), i.e(23), i.e(26), i.e(33), i.e(34), i.e(35), i.e(36), i.e(39), i.e(50), i.e(59), i.e(95), i.e(0), i.e(2), i.e(5), i.e(7), i.e( 10), i.e(15), i.e(18), i.e(20), i.e(25), i.e(30), i.e(31), i.e(32), i.e(37), i.e(46), i.e(55), i.e("new-confirm-inputs-dialog") ]).then(i.bind(null, "T4SC")); a = await s.selectInputValuesOnChart(e, t, o) } catch (e) { l = !0 } l ? n() : a ? r(t.defaults.inputs || {}) : Promise.all([i.e("redux"), i.e("react"), i.e( 1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i.e(13), i.e(14), i .e(16), i.e(17), i.e(19), i.e(21), i.e(23), i.e(26), i.e(33), i.e(34), i.e( 35), i.e(36), i.e(39), i.e(50), i.e(59), i.e(95), i.e(0), i.e(2), i.e( 5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(25), i.e(30), i.e( 31), i .e(32), i.e(37), i.e(46), i.e(55), i.e("new-confirm-inputs-dialog") ]).then(i.bind(null, "iqv3")).then(i => { const a = new i.ConfirmInputsDialogRenderer(function(e) { if ("symbol" === e) return Object(s.t)("Add Symbol"); return Object(s.t)("Confirm Inputs") }(o), t, e.model(), o, r, n); return a.show(), a }) } }, "7qI1": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolRectangle", (function() { return c })); var s = i("aO4+"), r = i("Ocx9"), n = i("tc+8"), o = i.n(n), a = i("Ss5c"), l = i("j3hX"); class c extends a.LineDataSource { constructor(e, t) { const s = t || c.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "GW0y")).then(({ RectanglePaneView: t }) => { const i = [new t(this, e)]; this._setPaneViews(i) }) } pointsCount() { return 2 } textColorsProperty() { return this.properties().childs().showLabel.value() ? super .textColorsProperty() : null } properties() { return super.properties() } name() { return "Rectangle" } setPoint(e, t, i) { if (e < 2 && super.setPoint(e, t, i), i && i.shift()) { const i = this._getAnchorPointForIndex(e); if (e >= 4) return this._correctMiddlePoints(e, t, i), void this .normalizePoints(); this._snapPoint45Degree(t, i) } switch (e) { case 2: this._points[1].price = t.price, this._points[0].index = t.index; break; case 3: this._points[0].price = t.price, this._points[1].index = t.index; break; case 4: this._points[0].index = t.index; break; case 5: this._points[1].index = t.index; break; case 6: this._points[0].price = t.price; break; case 7: this._points[1].price = t.price } this.normalizePoints() } getPoint(e) { return e < 2 ? super.getPoint(e) : this._getAnchorPointForIndex(e) } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e } static createProperties(e) { const t = new r.DefaultProperty("linetoolrectangle", e); return c._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "K4wI")).then( e => e.RectangleDefinitionsViewModel) } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } _snapPoint45Degree(e, t, i) { const s = this.m_priceScale, r = this.ownerSource(); if (null === s || null === r) return; const n = r.firstValue(); if (null === n) return; const o = this._model.timeScale(), a = this.pointToScreenPoint(e)[0], l = this.pointToScreenPoint(t)[0], c = a.x - l.x, h = a.y - l.y, u = c < 0 ? -1 : 1, d = h < 0 ? -1 : 1, p = Math.max(Math.abs(c), Math.abs(h)), _ = Math.round(o.coordinateToIndex(l.x + p * u)), m = Math.abs(o.indexToCoordinate(_) - l.x), f = s.coordinateToPrice(l.y + m * d, n); e.index = _, e.price = f } _correctMiddlePoints(e, t, i) { e < 6 ? this._correctRightLeftMiddlePoint(e, t, i) : this ._correctTopBottomMiddlePoint(e, t, i) } _correctRightLeftMiddlePoint(e, t, i) { const r = this.pointToScreenPoint(t)[0], n = this.pointToScreenPoint(i)[0], o = this.pointToScreenPoint(this._points[0])[0], a = this.pointToScreenPoint(this._points[1])[0]; let l = r.x - n.x; if (0 === l) return; const c = o.x < a.x ? 1 : -1, h = o.y < a.y ? 1 : -1; switch (l *= c, e) { case 4: { const e = a.y - h * l / 2, t = this.screenPointToPoint(new s.Point(a.x, e)); this._points[1].price = t.price; const i = this.screenPointToPoint(new s.Point(o.x + c * l, o.y + h * l / 2)); this._points[0].price = i.price, this._points[0].index = i.index; break } case 5: { const e = o.y - h * l / 2, t = this.screenPointToPoint(new s.Point(o.x, e)); this._points[0].price = t.price; const i = this.screenPointToPoint(new s.Point(a.x + c * l, a.y + h * l / 2)); this._points[1].price = i.price, this._points[1].index = i.index; break } } } _correctTopBottomMiddlePoint(e, t, i) { const r = this.m_priceScale, n = this.ownerSource(); if (null === r || null === n) return; const o = this._model.timeScale(), a = n.firstValue(); if (null === a) return; const l = this.pointToScreenPoint(t)[0], c = this.pointToScreenPoint(i)[0], h = this.pointToScreenPoint(this._points[0])[0], u = this.pointToScreenPoint(this._points[1])[0], d = l.y - c.y, p = d < 0 ? -1 : 1, _ = h.x < u.x ? 1 : -1, m = h.y < u.y ? 1 : -1; switch (e) { case 6: { const e = Math.floor(u.x - _ * d / 2), t = this.screenPointToPoint(new s.Point(e, u.y)), i = Math.abs(this._points[1].index - t.index), n = _ * m * p * Math.ceil(i / 2); if (0 === n) return; this._points[1].index = this._points[1].index - n; const l = p * Math.abs(o.indexToCoordinate(this._points[1].index) - u .x); this._points[0].price = r.coordinateToPrice(h.y + l, a), this._points[0] .index = this._points[0].index + n; break } case 7: { const e = Math.floor(h.x - _ * d / 2), t = this.screenPointToPoint(new s.Point(e, h.y)), i = Math.abs(this._points[0].index - t.index), n = _ * m * p * Math.ceil(i / 2); if (0 === n) return; this._points[0].index = this._points[0].index - n; const l = p * Math.abs(o.indexToCoordinate(this._points[0].index) - h .x); this._points[1].price = r.coordinateToPrice(u.y + l, a), this._points[1] .index = this._points[1].index + n; break } } } _snapTo45DegreesAvailable() { return !0 } static _configureProperties(e) { a.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new o.a("")), e.addExclusion("text"), e.addChild("linesColors", new l.LineToolColorsProperty([e.childs().color])), e.addChild( "textsColors", new l.LineToolColorsProperty([e.childs().textColor], e .childs().showLabel)) } _getAnchorPointForIndex(e) { const t = this.points(), i = t[0], s = t[1]; let r = 0, n = 0; switch (e) { case 0: r = i.price, n = i.index; break; case 1: r = s.price, n = s.index; break; case 2: r = s.price, n = i.index; break; case 3: r = i.price, n = s.index; break; case 4: r = (s.price + i.price) / 2, n = i.index; break; case 5: r = (s.price + i.price) / 2, n = s.index; break; case 6: r = i.price, n = (s.index + i.index) / 2; break; case 7: r = s.price, n = (s.index + i.index) / 2 } return { index: n, price: r } } } }, "7qT/": function(e, t, i) { "use strict"; function s(e, t) { return 100 * (t - e) / Math.abs(e) } i.d(t, "a", (function() { return s })) }, "8LSp": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor() { this._stable = [], this._variable = null, this._owner = null } addStable(e) { e.setOwner(this), this._stable.push(e) } setVariable(e) { this._variable = e, null !== this._variable && this._variable.setOwner(this) } primitivesData(e) { const t = []; return this._forEach(i => t.push(...i.primitivesData(e))), t } deleteErasedItems() { this._forEach(e => e.deleteErasedItems()) } markPostedItems() { this._forEach(e => e.markPostedItems()) } isNaN() { return this._all(e => e.isNaN()) } dirty() { null !== this._owner && this._owner.dirty() } setOwner(e) { this._owner = e } _forEach(e) { for (const t of this._stable) e(t); null !== this._variable && e(this._variable) } _all(e) { for (const t of this._stable) if (!e(t)) return !1; return null === this._variable || e(this._variable) } } }, "8OdW": function(e, t, i) { "use strict"; i.r(t), i.d(t, "MINUTE_SPAN", (function() { return s })), i.d(t, "HOUR_SPAN", (function() { return r })), i.d(t, "DAY_SPAN", (function() { return n })), i.d(t, "WEEK_SPAN", (function() { return o })), i.d(t, "MONTH_SPAN", (function() { return a })), i.d(t, "YEAR_SPAN", (function() { return l })), i.d(t, "DEFAULT_BAR_SPACING", (function() { return c })); const s = 20, r = 30, n = 40, o = 50, a = 60, l = 70, c = 6 }, "8Uy/": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LINESTYLE_SOLID", (function() { return s })), i.d(t, "LINESTYLE_DOTTED", (function() { return r })), i.d(t, "LINESTYLE_DASHED", (function() { return n })), i.d(t, "LINESTYLE_LARGE_DASHED", (function() { return o })), i.d(t, "LINESTYLE_SPARSE_DOTTED", (function() { return a })), i.d(t, "LINESTYLE_SMALL_DASHED", (function() { return l })); const s = 0, r = 1, n = 2, o = 3, a = 4, l = 5 }, "8gnj": function(e, t, i) { "use strict"; var s = i("LxhU").Interval, r = i("OLhd").isAlignmentEnabled, n = i("7ETO").getChartStyleStudy, o = i("5fI3").decodeExtendedSymbol, a = i("53h+").findSuitableResolutionToBuildFrom, l = function() { var e = i("ocLq"), t = e.StudyEngine, l = e.BarBuilder, c = e.BarSet; function h(e) { this.host = e, this.cache = {} } function u(e) { throw console.error(e), e } h.prototype.getCache = function(e) { return this.cache[e] }, h.prototype.putCache = function(e, t) { this.cache[e] = t }, h.prototype.subscribe = function(e, t, i, s, r, n, o, a, l, c) { var h = l(o), u = function(e, t, i, s, r, n, o, a) { var l = r.has_empty_bars ? "_" : ""; return n + e + s + (t || "") + (i || "") + l + "_" + o.countBack + "_" + o.to + "_" + Boolean(a) }(e, t, i, s, o, a, h, c), d = this.getCache(u); return d || (d = this.createItem(e, t, i, s, o, h, a, c), this.putCache(u, d)), d.listeners.addListener(r, n), { key: u, listener: r } }, h.prototype.unsubscribe = function(e) { var t = this.getCache(e.key); t && t.listeners.removeListener(e.listener) }, h.prototype.removeUnused = function() { var e = []; for (var t in this.cache) { if (this.cache[t]) 0 === this.cache[t].listeners.listenersCount() && e.push( t) } if (0 !== e.length) { for (var i = 0; i < e.length; i++) { var s = e[i], r = this.cache[s]; this.cache[s] = null, r.stop() } this.removeUnused() } }, h.prototype.rebuildFrom = function(e, t) { return a(e, t) }; var d = s.parse("1M").inMilliseconds(0); h.prototype.createItem = function(e, t, i, a, c, h, f, g) { var b = new m, v = o(e), S = "string" != typeof v.symbol ? v.symbol : v; t = S["currency-id"] || t, i = S["unit-id"] || i; var y = S.symbol, w = S.session && "extended" !== S.session; if ("type" in v) { var P = Object.assign({}, c); return c.has_empty_bars && (P.has_empty_bars = !1), new _(b, y, t, i, a, n( v), P, h, f) } g && !r() && u("Internal error: rebuilding is requested but it is disabled."), ! g && c.has_empty_bars && u( 'Misconfiguration error: attempt to request data for symbol with "has_empty_bars" flag, but "disable_resolution_rebuild" featureset is enabled' ); var C, x, T = this.rebuildFrom(a, c); if (!s.isTicks(a) && (!s.isEqual(a, T) || g)) { r() || u( 'Misconfiguration error: remove "disable_resolution_rebuild" featureset or provide ' + a + " data by yourself"); var I = c.has_empty_bars; P = Object.assign({}, c); c.has_empty_bars && (P.has_empty_bars = !1); var M = Math.ceil((C = s.parse(a), x = s.parse(T), C.kind() === x.kind() ? C .multiplier() / x.multiplier() : (C.isMonths() ? C .multiplier() * d : C.inMilliseconds()) / (x.isMonths() ? x .multiplier() * d : x.inMilliseconds()))); return h = Object.assign({}, h, { countBack: h.countBack * M }), new _(b, y, t, i, T, new l(a, I), P, h, f) } return new p(b, y, { currency: t, unit: i }, a, w, this.host, c, h) }; var p = function(e, t, i, s, r, n, o, a) { this.listeners = e, this.host = n; var l = this; this.host.resolve(t, i, (function(e) { r && e.regular_session && (e.session = e.regular_session), l .subs = l.host.subscribe(e, s, a, (function(e) { l.listeners.fire(e) }), (function(e) { l.listeners.onError(e) })) }), (function(e) { l.listeners.onError(e) })) }; p.prototype.stop = function() { this.subs && this.host.unsubscribe(this.subs) }; var _ = function(e, i, s, r, n, o, a, l, c) { this.listeners = e, this.isRecalculated = !1, this.symbolInfo = a; var h = this; this.engine = new t({ tickerid: i, currencyCode: s, unitId: r, period: n, body: o, sessionId: c, symbolInfo: a, dataRange: l, forceAlignBars: !1, recalc: function(e, t) { h._recalc(t) }, out: function(e, t) { h._out(e, t) }, nonseriesOut: function(e, t) { h._nonseriesOut(e, t) }, setNoMoreData: function() { h.barset && (h.barset.endOfData = !0) }, onErrorCallback: function(e) { h.listeners.onError(e) } }) }; _.prototype.stop = function() { this.engine ? this.engine.stop() : console.error("Internal library error 0x1") }, _.prototype._recalc = function(e) { this.isRecalculated && console.error("recalc called twice!"), this.barset || ( this.barset = new c(this.symbolInfo)), e && (this.barset .firstLoadedTimeMs = e.firstLoadedTimeMs, this.barset.endOfData = e .endOfData), this.listeners.fire(this.barset), this.isRecalculated = !0 }, _.prototype._nonseriesOut = function(e, t) { var i = Object.assign({}, t); i.nonseries = !0, i.data = t.bars, delete i.bars, i.barsetSize = this.barset ? this.barset.count() : 0, i.lastBar = this.barset ? this.barset.bar(this .barset.count() - 1) : null, this.listeners.fire(i, !0) }, _.prototype._out = function(e, t) { var i = t[0]; if (!isNaN(i)) { var s = { time: i, open: t[1], high: t[2], low: t[3], close: t[4], volume: t[5], updatetime: t[6] }, r = t[7]; this.barset || (this.barset = new c(e.info)); var n = t[8]; if (n instanceof Array) for (var o = 0; o < n.length; o++) { var a = t[9], l = n[o], h = { time: l, open: a, high: a, low: a, close: a, volume: 0, updatetime: l }; this.barset.add(h, !0), this.isRecalculated && this.listeners.fire( this.barset) } this.barset.add(s, r), this.barset.isBarClosed = r, this.isRecalculated && this.listeners.fire(this.barset) } }; var m = function() { this.listeners = [] }; return m.prototype.listenersCount = function() { return this.listeners.reduce((function(e, t) { return e + (t ? 1 : 0) }), 0) }, m.prototype.addListener = function(e, t) { this.listeners.push({ dataListener: e, onErrorCallback: t }), this.barset && e(this.barset), this.errorMsg && t(this.errorMsg) }, m.prototype.removeListener = function(e) { var t = this.listeners.filter((function(t) { return t.dataListener === e })); if (0 !== t.length) { var i = this.listeners.indexOf(t[0]); delete this.listeners[i] } }, m.prototype.onError = function(e) { this.errorMsg = e || "unspecified error"; for (var t = this.listeners, i = t.length, s = 0; s < i; s++) { var r = t[s]; r && r.onErrorCallback && r.onErrorCallback(e) } }, m.prototype.fire = function(e, t) { t || (this.barset = e); for (var i = this.listeners, s = i.length, r = 0; r < s; r++) { var n = i[r]; n && n.dataListener(e) } }, { setupFeed: function(t) { h.instance = new h(t), e.setupFeed(h.instance) }, unsubscribeUnused: function() { h.instance.removeUnused() } } }(); e.exports = l }, "8pII": function(e) { e.exports = JSON.parse( '{"content":{"chartProperties":{"scalesProperties":{"textColor":"#B2B5BE","lineColor":"rgba(240, 243, 250, 0.12)","backgroundColor":"#ffffff"},"paneProperties":{"vertGridProperties":{"color":"rgba(240, 243, 250, 0.06)"},"horzGridProperties":{"color":"rgba(240, 243, 250, 0.06)"},"crossHairProperties":{"color":"#9598A1"},"background":"#131722","backgroundGradientStartColor":"#181C27","backgroundGradientEndColor":"#131722","backgroundType":"gradient"}},"sessions":{"graphics":{"backgrounds":{"outOfSession":{"color":"#2962FF","transparency":92},"preMarket":{"color":"#FF9800","transparency":92},"postMarket":{"color":"#2962FF","transparency":92}},"vertlines":{"sessBreaks":{"color":"#4985e7","style":2,"width":1}}}},"mainSourceProperties":{"baseLineColor":"#5d606b","candleStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#B5B5B8","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"haStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#B5B5B8","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"barStyle":{"downColor":"#ef5350","upColor":"#26a69a"},"pnfStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#336854","downColorProjection":"#7f323f"},"baselineStyle":{"baselineColor":"rgba( 117, 134, 150, 1)","topFillColor1":"rgba( 38, 166, 154, 0.28)","topFillColor2":"rgba( 38, 166, 154, 0.05)","bottomFillColor1":"rgba( 239, 83, 80, 0.05)","bottomFillColor2":"rgba( 239, 83, 80, 0.28)","topLineColor":"rgba( 38, 166, 154, 1)","bottomLineColor":"rgba( 239, 83, 80, 1)"},"areaStyle":{"transparency":100,"color1":"rgba(41, 98, 255, 0.28)","color2":"#2962FF","linecolor":"#2962FF","linewidth":2,"linestyle":0},"renkoStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f","borderUpColorProjection":"#336854","borderDownColorProjection":"#7f323f","wickUpColor":"#26a69a","wickDownColor":"#ef5350"},"lineStyle":{"color":"#2962FF","linewidth":2,"linestyle":0},"kagiStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#336854","downColorProjection":"#7f323f"},"pbStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f","borderUpColorProjection":"#336854","borderDownColorProjection":"#7f323f"},"rangeStyle":{"upColor":"#26a69a","downColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f"}}}}' ) }, "8sOK": function(e, t, i) { "use strict"; i.r(t); var s = i("2kV1"), r = i("7ktv"), n = i("kcTO"), o = i("aIyQ"), a = i.n(o), l = i("tc+8"), c = i.n(l), h = i("ww0J"); class u extends h.a { text() { return this._source.isActualInterval() ? `${this._source.title()} ${this.sourceStatusText()}` : this._source.title() } } var d = i("bmVy"); i.d(t, "StudyStub", (function() { return m })); class p { getItems() { return [] } getValues(e) { return [] } } const _ = new a.a; class m extends r.PriceDataSource { constructor(e, t, i) { super(e), this._priceStep = .01, this._status = { type: d.StudyStatusType.Undefined }, this._statusChanged = new a.a, this._formatter = new n.PriceFormatter( 100), this._origState = t, this._title = i; this._properties = new c.a({ visible: !0 }), this._statusView = new s.StudyStatusView(this) } properties() { return this._properties } statusView() { return this._statusView } legendView() { return null } state(e) { return this._origState } setStatus(e) { this._status = e, this._statusChanged.fire() } formatter() { return this._formatter } title() { return this._title } titleInParts() { return [this._title] } isFailed() { return this._status.type === d.StudyStatusType.Error } isLoading() { return this._status.type === d.StudyStatusType.Loading } setFailed(e) { this.setStatus({ type: d.StudyStatusType.Error, errorDescription: { error: e } }), this._model.updateSource(this) } isSymbolInvalid() { return !1 } isActualInterval() { return !0 } onIsActualIntervalChange() { return _ } start() {} status() { return this._status } onStatusChanged() { return this._statusChanged } firstValue() { return null } currency() { return null } sessionId() { return this._model.mainSeries().sessionId() } sessionIdChanged() { return this._model.mainSeries().sessionIdChanged() } unit() { return null } symbolSource() { return this._model.mainSeries() } valuesProvider() { return new p } statusProvider(e) { return new u(this, this._model.properties().scalesProperties.textColor) } } }, "8woN": function(e, t, i) { "use strict"; var s = i("Kxc7"), r = [{ d: "E-Mini S&P 500", t: "ES" }, { d: "E-Mini Nasdaq 100", t: "NQ" }, { d: "Gold", t: "GC" }, { d: "Silver", t: "SI" }, { d: "Crude Oil WTI", t: "CL" }, { d: "Natural Gas", t: "NG" }, { d: "Australian Dollar", t: "6A" }, { d: "Australian Dollar (Floor)", t: "AD" }, { d: "Euro FX", t: "6E" }, { d: "Euro FX (Floor)", t: "EC" }, { d: "Corn", t: "ZC" }, { d: "Corn (Floor)", t: "C" }, { d: "Eurodollar", t: "GE" }, { d: "Eurodollar (Floor)", t: "ED" }], n = function() { var e = [{ pattern: "(", ctor: o }, { pattern: ")", ctor: a }, { pattern: "+", ctor: c }, { pattern: "-", ctor: h }, { pattern: "*", ctor: u }, { pattern: "/", ctor: d }, { pattern: "^", ctor: p }, { pattern: /\d+(?:\.\d*|(?![a-zA-Z0-9_!:.&]))|\.\d+/, ctor: g }, { pattern: /\./, ctor: S }, { pattern: s.enabled("charting_library_base") ? /[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF^][a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!:.&]*|'.+?'/ : /[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF][a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!|:.&]*|'.+?'/, ctor: f }, { pattern: /'[^']*/, ctor: v }, { pattern: /[\0-\x20\s]+/, ctor: n }]; function t(e, t) { var i = function() {}; return i.prototype = t.prototype, e.prototype = new i, e } function i() {} function n(e) { this.value = e } function o() {} function a() {} function l() {} function c() {} function h() {} function u() {} function d() {} function p() {} i.prototype.toString = function() { return this.value }, t(n, i), t(o, i), o.prototype.value = "(", t(a, i), a.prototype.value = ")", t(l, i), t(c, l), c.prototype.value = "+", c.prototype.precedence = 0, c.prototype .commutative = !0, t(h, l), h.prototype.value = "-", h.prototype.precedence = 0, h .prototype.commutative = !1, t(u, l), u.prototype.value = "*", u.prototype .precedence = 1, u.prototype.commutative = !0, t(d, l), d.prototype.value = "/", d .prototype.precedence = 1, d.prototype.commutative = !1, t(p, l), p.prototype.value = "^", p.prototype.precedence = 2, p.prototype.commutative = !1; var _ = /^'?(?:([A-Z0-9_]+):)?(.*?)'?$/i, m = /[+\-/*]/; function f(e) { this.value = e } function g(e) { this.value = e } function b(e) { this.value = e } function v() { f.apply(this, arguments) } function S() { g.apply(this, arguments) } t(f, i), f.prototype.toString = function() { if (this.hasOwnProperty("_ticker")) { var e = m.test(this._ticker) ? "'" : ""; return e + (this._exchange ? this._exchange + ":" : "") + this._ticker + e } return this.value }, f.prototype.parse = function() { var e = _.exec(this.value); e[1] && (this._exchange = e[1]), this._ticker = e[2] }, f.prototype.parseAsFutures = function() { this.hasOwnProperty("_ticker") || this.parse(); for (var e = function(e) { return r.some((function(t) { return t.t === e })) }, t = 2; t >= 1; --t) { var i = this._ticker.slice(0, t); if (e(i)) { this._root = i, this._contract = this._ticker.slice(t); break } } }, f.prototype.exchange = function(e) { if (this.hasOwnProperty("_ticker") || this.parse(), !(arguments.length > 0)) return this._exchange; null == e ? delete this._exchange : this._exchange = e + "" }, f.prototype.ticker = function(e) { if (this.hasOwnProperty("_ticker") || this.parse(), !(arguments.length > 0)) return this._ticker; null == e ? delete this._ticker : this._ticker = e + "", delete this._root, delete this._contract }, f.prototype.root = function(e) { if (this.hasOwnProperty("_root") || this.parseAsFutures(), !(arguments.length > 0)) return this._root; null == e ? delete this._root : (this._root = e + "", this._root && (this ._ticker = this._root + (this._contract || ""))) }, f.prototype.contract = function(e) { if (this.hasOwnProperty("_contract") || this.parseAsFutures(), !(arguments .length > 0)) return this._root; null == e ? delete this._contract : (this._contract = e + "", this._root && ( this._ticker = this._root + this._contract)) }, t(g, i), g.prototype.toString = function() { return this.hasOwnProperty("_normalizedValue") ? this._normalizedValue : this .value }, g.prototype.parse = function() { this._normalizedValue = this.value.replace(/^0+|\.0*$/g, "").replace( /(\.\d*?)0+$/, "$1").replace(/^(\.|$)/, "0$1") }, b.prototype.toString = function() { return this.value }, t(v, f), v.prototype.isIncomplete = !0, v.prototype.incompleteSuggest = function() { if ("'" !== this.value) return String("'") }, t(S, g), S.prototype.isIncomplete = !0; var y = new RegExp(e.map((function(e) { return "(" + ("string" == typeof e.pattern ? e.pattern.replace( /[\^$()[\]{}*+?|\\]/g, "\\$&") : e.pattern.source) + ")" })).concat(".").join("|"), "g"); function w(t, i) { var s, r = []; e: for (; s = y.exec(t);) { for (var o = e.length; o--;) if (s[o + 1]) { if (e[o].ctor) { var a = new e[o].ctor(s[o + 1]); a._offset = s.index, r.push(a) } continue e } var l = new b(s[0]); l._offset = s.index, r.push(l) } if (i && i.recover) { var c; for (o = r.length; o--;) { var h = r[o]; if (h instanceof g || h instanceof f) { if (void 0 !== c) { var u = new f(""), d = r.splice(o, c - o + 1, u); u.value = d.map((function(e) { return e.value })).join("") } c = o } else h instanceof n || (c = void 0) } } return r } function P(e) { for (var t = [], i = 0; i < e.length; i++) e[i] instanceof n || t.push(e[i]); return t } function C(e) { e = P(e); for (var t, i = [], s = [], r = 0; r < e.length; r++) { var n = e[r]; if (n instanceof l) s.length && s[s.length - 1].minPrecedence > n.precedence && (s[s.length - 1].minPrecedence = n.precedence); else if (n instanceof o) s.push(t = { minPrecedence: 1 / 0, openBraceIndex: r }); else if (n instanceof a) { var c = e[(t = s.pop()).openBraceIndex - 1], h = e[r + 1]; h instanceof l && !(h.precedence <= t.minPrecedence) || !(!( c instanceof l) || c.precedence < t.minPrecedence || c .precedence === t.minPrecedence && c.commutative) || (i.unshift(t .openBraceIndex), i.push(r), s.length && s[s.length - 1] .minPrecedence > t.minPrecedence && (s[s.length - 1].minPrecedence = t.minPrecedence)) } } for (r = i.length; r--;) e.splice(i[r], 1); return e } function x(e) { if ("string" != typeof e) throw new TypeError("expression must be a string"); return (e = w(e)).filter((function(e) { return e instanceof f })).map((function(e) { return e.exchange() })).filter((function(e) { return e })) } function T(e) { return 1 !== (e = x(e)).length ? null : e[0] } function I(e, t) { return (e = x(e)).some((function(e) { return t.includes((e || "").toUpperCase()) })) } function M(e) { return e.join("") } return { tokenize: w, validate: function(e) { if (s.enabled("charting_library_base")) return { currentState: "var" }; for (var t = "init", i = { warnings: [], errors: [], isEmpty: !0 }, r = [], c = 0; c < e.length; c++) { if (!((u = e[c]) instanceof n)) { if (delete i.isEmpty, u.isIncomplete) { var h = { status: "incomplete", reason: "incomplete_token", offset: u._offset, token: u }; if (u.incompleteSuggest && (h.recover = { append: u.incompleteSuggest() }), i.warnings.push(h), c !== e.length - 1) { h.status = "error"; continue } } if (u instanceof f || u instanceof g) { if ("var" === t) { i.errors.push({ status: "error", reason: "unexpected_token", offset: u._offset, token: u }); continue } t = "var" } else if (u instanceof l) { if ("var" !== t) { i.errors.push({ status: "error", reason: "unexpected_token", offset: u._offset, token: u }); continue } t = "operator" } else if (u instanceof o) { if ("var" === t) { i.errors.push({ status: "error", reason: "unexpected_token", offset: u._offset, token: u }); continue } r.push(u), t = "init" } else if (u instanceof a) { if ("var" !== t) { i.errors.push({ status: "error", reason: "unexpected_token", offset: u._offset, token: u }); continue } r.pop() || i.errors.push({ status: "error", reason: "unbalanced_brace", offset: u._offset, token: u, recover: { prepend: new o } }), t = "var" } else u instanceof b && i.errors.push({ status: "error", reason: "unparsed_entity", offset: u._offset, token: u }) } } for (i.braceBalance = r.length, "var" !== t && i.warnings.push({ status: "incomplete" }); r.length;) { var u; h = { status: "incomplete", reason: "unbalanced_brace", offset: (u = r.pop())._offset, token: u }; "var" === t && (h.recover = { append: new a }), i.warnings.push(h) } return i.currentState = t, 0 === i.warnings.length && delete i.warnings, 0 === i.errors.length && delete i.errors, i }, factorOutBraces: C, normalizeTokens: function(e) { for (var t = 0; t < e.length; t++) e[t].parse && e[t].parse(); return e }, flip: function(e) { var t = function(e) { for (var t, i = 0, s = 0, r = 0; r < e.length; r++) { var c = e[r]; if (!(c instanceof n)) switch (i) { case 0: if (!(c instanceof g && 1 == +c.value)) return !1; i = 1; break; case 1: if (!(1 === i && c instanceof d)) return !1; i = 2, t = r + 1; break; case 2: if (c instanceof o) i = 3, s = 1; else if (c instanceof l) return !1; break; case 3: c instanceof o ? s++ : c instanceof a && --s <= 0 && (i = 2) } } return e.slice(t) }(e); return C(t || [new g("1"), new d, new o].concat(e).concat(new a)) }, hasBatsSymbols: function(e) { return I(e, ["BATS"]) }, hasEodSymbols: function(e) { return (e = T(e)) && -1 !== e.toUpperCase().indexOf("_EOD") }, hasChxjpySymbols: function(e) { return I(e, ["CHXJPY"]) }, hasFreeDelaySymbols: function(e) { return I(e, pro.getProductsByType(pro.PRODUCT_TYPES.exchange).map((function( e) { return e.exchange.toUpperCase() + "_DLY" }))) }, getExchange: T, getExchanges: x, isExchange: function(e, t) { return !!(e = T(e)) && e.substr(0, t.length) === t }, SymbolToken: f, IncompleteSymbolToken: v, NumberToken: g, BinaryOperatorToken: l, OpenBraceToken: o, CloseBraceToken: a, ticker: function(e) { return new f(e).ticker() }, shortName: function(e) { if ("string" != typeof e) throw new TypeError( "expression must be a string"); var t = C(P(w(e))); return t.forEach((function(e) { e instanceof f && e.exchange(null) })), M(t) }, normalize: function(e) { if ("string" != typeof e) throw new TypeError( "expression must be a string"); return M(C(P(w(e)))) } } }(); e.exports = n }, "96Yh": function(e, t, i) { "use strict"; i.r(t), i.d(t, "lineToolEntityInfo", (function() { return o })), i.d(t, "studyEntityInfo", (function() { return a })), i.d(t, "seriesEntityInfo", (function() { return l })), i.d(t, "entityForDataSource", (function() { return c })); var s = i("3ClC"), r = i("2jXJ"), n = i("CW80"); function o(e) { return { id: e.id(), name: (t = e.toolname, Object.keys(r.supportedLineTools).find(e => r.supportedLineTools[ e].name === t) || null) }; var t } function a(e) { return { id: e.id(), name: e.metaInfo().description } } function l(e) { return { id: e.id(), name: "Main Series" } } function c(e, t) { return t === e.mainSeries() ? l(e.mainSeries()) : Object(s.isStudy)(t) ? a(t) : Object(n .isLineTool)(t) ? o(t) : null } }, "972a": function(e, t, i) { "use strict"; var s, r, n, o; i.d(t, "c", (function() { return s })), i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return o })), function(e) { e.AboveBar = "AboveBar", e.BelowBar = "BelowBar", e.Top = "Top", e.Bottom = "Bottom", e .Right = "Right", e.Left = "Left", e.Absolute = "Absolute", e.AbsoluteUp = "AbsoluteUp", e.AbsoluteDown = "AbsoluteDown" }(s || (s = {})), function(e) { e.Left = "left", e.Center = "center", e.Right = "right" }(r || (r = {})), function(e) { e.Top = "top", e.Middle = "middle", e.Bottom = "bottom" }(n || (n = {})), function(e) { e[e.Solid = 0] = "Solid", e[e.Dotted = 1] = "Dotted", e[e.Dashed = 2] = "Dashed" }(o || (o = {})) }, "99ZO": function(e, t, i) { "use strict"; var s, r; i.r(t), i.d(t, "WeekDays", (function() { return s })), i.d(t, "Months", (function() { return r })), function(e) { e[e.SUNDAY = 1] = "SUNDAY", e[e.MONDAY = 2] = "MONDAY", e[e.TUESDAY = 3] = "TUESDAY", e[ e.WEDNESDAY = 4] = "WEDNESDAY", e[e.THURSDAY = 5] = "THURSDAY", e[e.FRIDAY = 6] = "FRIDAY", e[e.SATURDAY = 7] = "SATURDAY" }(s || (s = {})), function(e) { e[e.JANUARY = 0] = "JANUARY", e[e.FEBRUARY = 1] = "FEBRUARY", e[e.MARCH = 2] = "MARCH", e[e.APRIL = 3] = "APRIL", e[e.MAY = 4] = "MAY", e[e.JUNE = 5] = "JUNE", e[e.JULY = 6] = "JULY", e[e.AUGUST = 7] = "AUGUST", e[e.SEPTEMBER = 8] = "SEPTEMBER", e[e .OCTOBER = 9] = "OCTOBER", e[e.NOVEMBER = 10] = "NOVEMBER", e[e.DECEMBER = 11] = "DECEMBER" }(r || (r = {})) }, "9Jkk": function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("XlJ7"), n = i("x0JF"), o = i("Y7w9"), a = i("Zp/P"), l = i("VdBB"), c = i("cPgM"); class h extends c.ScaledPaneRenderer { constructor() { super(...arguments), this._data = null, this._barWidth = null } setData(e) { this._data = e, this._barWidth = Math.max(1, Math.round(Object(a .optimalHiLoWidth)(e.barSpacing))) } hitTest(e) { if (null === this._data || null === this._barWidth) return null; const t = this._data.bars, i = .5 * this._data.barSpacing; if (0 === t.length) return null; if (e.x < t[0].time - i) return null; if (e.x > t[t.length - 1].time + i) return null; const s = t[Object(o.lowerbound)(t, e.x - i, (e, t) => e.time < t)]; if (e.x < s.time - i || e.x > s.time + i) return null; const r = Object(a.interactionTolerance)().series + this._barWidth / 2, n = Math.min(s.high, s.low), c = Math.max(s.high, s.low), h = this._data.fontSize; return n - r - h <= e.y && e.y <= n + r || c - r <= e.y && e.y <= c + r + h ? new l.HitTestResult(l.HitTestResult.REGULAR) : null } _drawImpl(e) { if (null === this._data || null === this._barWidth) return; e.save(), e.translate(.5, .5), e.textAlign = "center", e.fillStyle = this._data .labelColor, e.font = Object(r.makeFont)(this._data.fontSize, this._data .font); const t = this._data.bars, i = this._data.inverted; for (let s = 0; s < t.length; ++s) { const r = t[s], n = Math.min(r.high, r.low), o = Math.max(r.high, r.low); e.fillText(i ? r.lowLabel : r.highLabel, r.time, n - this._data .labelsPadding), e.fillText(i ? r.highLabel : r.lowLabel, r.time, o + this._data.labelsPadding + this._data.fontSize) } e.restore() } } var u = i("/hKg"), d = i("Zy3/"), p = i("vq8G"), _ = i("u+0B"), m = i("zDbI"); function f(e) { return null != e } i.d(t, "SeriesHiLoPaneView", (function() { return g })); class g extends n.SeriesBarCandlesPaneView { constructor(e, t) { super(e, t), this._widthsCache = new _.TextWidthCache, this._labelsRenderer = new h, this._candlesRenderer = new u.PaneRendererCandles, this._canvas = document.createElement("canvas"), this._context = Object(s.ensureNotNull)( this._canvas.getContext("2d")); const i = e.properties(); this._context.font = Object(r.makeFont)(i.hiloStyle.fontSize.value(), m .CHART_FONT_FAMILY) } renderer(e, t, i) { if (this._invalidated) { const e = this._series().formatter(), t = this._needLabels(); this._updateImpl(this._barUpdater.bind(this, e, t)), this._invalidated = !1 } const s = this._series().properties().hiloStyle, r = this._model().timeScale().barSpacing(), n = this._needLabels() && this._bars().every(e => e.highLabelWidth <= r && e .lowLabelWidth <= r), o = { bars: this._bars(), wickVisible: !1, bodyVisible: s.drawBody.value(), barSpacing: r, borderVisible: s.showBorders.value(), barWidth: Object(a.optimalHiLoWidth)(r), font: m.CHART_FONT_FAMILY, fontSize: s.fontSize.value(), labelColor: s.labelColor.value(), inverted: this._series().priceScale().isInverted(), labelsPadding: 3 }, l = new d.CompositeRenderer; return this._candlesRenderer.setData(o), l.append(this._candlesRenderer), n && ( this._labelsRenderer.setData(o), l.append(this._labelsRenderer)), this ._model().selection().isSelected(this._series()) && this ._isMarkersEnabled && l.append(new p.SelectionRenderer(this ._selectionData)), l } topPixelMargin() { return this._margin() } bottomPixelMargin() { return this._margin() } _margin() { const e = this._series().properties().hiloStyle; return e.showLabels.value() ? e.fontSize.value() + 6 : 0 } _barUpdater(e, t, i, s) { const r = i[2], n = i[3]; return !(!f(r) || !f(n)) && (s.high = s.open = r, s.low = s.close = n, t && (s .highLabel = e.format(r), s.highLabelWidth = this._getLabelWidth(s.highLabel), s.lowLabel = e .format(n), s.lowLabelWidth = this._getLabelWidth(s.lowLabel)), !0) } _needLabels() { const e = this._model().timeScale().barSpacing(); return this._series().properties().hiloStyle.showLabels.value() && e > 5 } _getLabelWidth(e) { return this._widthsCache.measureText(this._context, e) } } }, "9QkW": function(e, t, i) { "use strict"; var s = i("7ADh").LineToolFibWedgeBase, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "1SUO", 7)).then(({ FibWedgePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } isSynchronizable() { return !1 } levelsCount() { return l.LevelsCount } name() { return "Fib Wedge" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } static createProperties(e) { var t = new r("linetoolfibwedge", e, !1, { range: [1, 11] }); return l._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "6mGk"))) .FibWedgeDefinitionsViewModel } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline") .child("color") ], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child( "linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.LevelsCount = 11, t.LineToolFibWedge = l }, "9dnG": function(e, t) { e.exports = '' }, "9iCb": function(e, t, i) { "use strict"; i.r(t), i.d(t, "applyOverridesToStudy", (function() { return h })), i.d(t, "applyOverridesToStudyDefaults", (function() { return u })); var s = i("Eyy1"), r = i("23IT"), n = i("txPx"); const o = Object(n.getLogger)("Chart.Model.StudyPropertiesOverrider"); var a, l; function c(e, t, i, s) { const r = i.split("."); if (0 === r.length || 0 === r[0].length) return; const n = function(e) { const t = e.split(":"); return { name: t[0], type: 2 === t.length ? t[1] : null } }(r[0]), c = n.name, h = n.type, u = null !== h, d = !u || "band" === h, p = !u || "area" === h, _ = !u || "input" === h, m = !u || "plot" === h ? l.getPlotIdByTitle(e, c) : null, f = d ? l.getBandIndexByName(e, c) : null, g = p ? l.getFilledAreaIdByTitle(e, c) : null, b = _ ? l.getInputByName(e, c) : null, v = t.hasOwnProperty(c); if ((null !== m ? 1 : 0) + (null !== f ? 1 : 0) + (null !== g ? 1 : 0) + (null !== b ? 1 : 0) + (v ? 1 : 0) > 1) return void o.logWarn( `Study '${e.description}' has ambiguous identifier '${c}'`); const S = r[1]; if (null !== m) { if (1 === r.length) return void o.logWarn( `Path of sub-property of '${c}' plot for study '${e.description}' must be not empty` ); const i = r.slice(1); a.applyPlotProperty(e, t, m, i, s) } else if (null !== b) a.applyInputValue(t, b, s); else if (null !== f) { if (void 0 === S) return void o.logWarn( `Property name of '${c}' band for study '${e.description}' must be set`); a.applyBandProperty(t, f, S, s) } else if (null !== g) { if (void 0 === S) return void o.logWarn( `Property name of '${c}' area for study '${e.description}' must be set`); a.applyFilledAreaProperty(t, g, S, s) } else v ? a.setRootProperty(t, r, s) : o.logWarn( `Study '${e.description}' has no plot or input '${c}'`) } function h(e, t) { const i = e.properties(), s = i.state(); for (const i in t) t.hasOwnProperty(i) && c(e.metaInfo(), s, i, t[i]); i.mergeAndFire(s) } function u(e, t, i) { for (const s in e) { if (!e.hasOwnProperty(s)) continue; const r = s.indexOf("."); if (-1 === r) continue; const n = s.substr(0, r), a = l.getMetaInfoByDescription(t, n); if (null === a) { o.logWarn("There is no such study " + n); continue } const h = i(a); null !== h ? c(a, h, s.substr(r + 1), e[s]) : o.logWarn( "Cannot apply overrides for study " + n) } }! function(e) { const t = { line: r.LineStudyPlotStyle.Line, histogram: r.LineStudyPlotStyle.Histogram, cross: r.LineStudyPlotStyle.Cross, area: r.LineStudyPlotStyle.Area, columns: r.LineStudyPlotStyle.Columns, circles: r.LineStudyPlotStyle.Circles, line_with_breaks: r.LineStudyPlotStyle.LineWithBreaks, area_with_breaks: r.LineStudyPlotStyle.AreaWithBreaks }; e.applyPlotProperty = function(e, i, n, a, l) { if (void 0 === i.styles) return void o.logWarn("Study does not have styles"); const c = a[0]; if ("color" === c) { return void function(e, t, i, r, n) { if (void 0 !== e.styles) if (null === t && !isNaN(r) && r > 0) o.logWarn( "Study plot does not have color #" + r); else { if (0 === r || isNaN(r)) { Object(s.ensureDefined)(e.styles[i]).color = String(n), r = 0 } null !== t && (Object(s.ensureDefined)(t.colors[r]).color = String( n)) } else o.logWarn("Study does not have styles") }(i, function(e, t, i) { if (void 0 === e.plots) return null; for (const s of e.plots) { if (!Object(r.isColorerPlot)(s) || void 0 === t.palettes) continue; const e = t.palettes[s.palette]; if (s.target === i && void 0 !== e) return e } return null }(e, i, n), n, a.length > 1 ? parseInt(a[1]) : NaN, l) } const h = i.styles[n]; if (void 0 !== h && h.hasOwnProperty(c)) { if ("plottype" === c) { const e = t[String(l)]; if (void 0 === e) return void o.logWarn("Unsupported plot type for plot: " + l); l = e } h[c] = l } else o.logWarn(`Study plot does not have property '${c}'`) }, e.applyBandProperty = function(e, i, s, r) { if (void 0 === e.bands) return void o.logWarn("Study does not have bands"); const n = e.bands[i]; if (void 0 !== n && n.hasOwnProperty(s)) { if ("plottype" === s) { const e = t[String(r)]; if (void 0 === e) return void o.logWarn("Unsupported plot type for band: " + r); r = e } n[s] = r } else o.logWarn(`Study band does not have property '${s}'`) }, e.applyFilledAreaProperty = function(e, t, i, s) { if (void 0 === e.filledAreasStyle) return void o.logWarn( "Study does not have areas"); const r = e.filledAreasStyle[t]; void 0 !== r && r.hasOwnProperty(i) ? r[i] = s : o.logWarn( `Study area does not have property '${i}'`) }, e.applyInputValue = function(e, t, i) { void 0 !== e.inputs && e.inputs.hasOwnProperty(t) ? e.inputs[t] = i : o.logWarn( `Study does not have input '${t}'`) }, e.setRootProperty = function(e, t, i) { if (0 === t.length) return; let s = e; for (const e of t.slice(0, -1)) { if (null == s || !s.hasOwnProperty(e)) break; s = s[e] } const r = t[t.length - 1]; null != s && s.hasOwnProperty(r) ? s[r] = i : o.logWarn( "Study does not have property " + t.join(".")) } }(a || (a = {})), function(e) { e.getInputByName = function(e, t) { if (void 0 === e.inputs) return null; t = t.toLowerCase(); for (const i of e.inputs) if (i.name.toLowerCase() === t) return i.id; return null }, e.getPlotIdByTitle = function(e, t) { if (void 0 === e.styles) return null; t = t.toLowerCase(); for (const i in e.styles) { const s = e.styles[i]; if ((void 0 !== s && void 0 !== s.title ? s.title : i).toLowerCase() === t) return i } return null }, e.getFilledAreaIdByTitle = function(e, t) { if (void 0 === e.filledAreas) return null; t = t.toLowerCase(); for (const i of e.filledAreas) if (i.title.toLowerCase() === t) return i.id; return null }, e.getBandIndexByName = function(e, t) { if (void 0 === e.bands) return null; t = t.toLowerCase(); for (let i = 0; i < e.bands.length; ++i) if (e.bands[i].name.toLowerCase() === t) return i; return null }, e.getMetaInfoByDescription = function(e, t) { t = t.toLowerCase(); for (const i of e) if (i.description.toLowerCase() === t || i.shortDescription.toLowerCase() === t) return i; return null } }(l || (l = {})) }, "9nLJ": function(e, t, i) { "use strict"; (function(t, s) { var r = i("PT1i").linking, n = (i("jofe").createDeferredPromise, i("Q19o")), o = i("VNzU").layouts, a = i("FQhm"), l = i("5VQP").ContextMenuManager, c = i("mMWL"), h = i("pPtI"), u = i("zUrt").backend, d = i("txPx"), p = i("fZEr").showWarning, _ = i("fZEr").showConfirm, m = i("2jXJ"), f = i("sJA2").ThemesApi, g = i("ZjKI").CLOSE_POPUPS_AND_DIALOGS_COMMAND, b = i("LxhU").Interval, v = i("Ocx9").saveDefaultProperties, S = i("htUT").ChartChangesWatcher, y = i("xt3Q").TradingViewApiBase, w = i("0YCj"), P = i("pZDF").getStudyInputsInfo; e.exports = class extends y { constructor(e) { const { chartWidgetCollection: i, chartApiInstance: s = null, saveChartService: r, loadChartService: n, alertsDispatcher: o, supportTicketData: a, favoriteServices: l, studyMarket: c = null, financialsDialog: h = null } = e; super({ chartApiInstance: s, chartWidgetCollection: i, studyMarket: c, financialsDialog: h, saveChartService: r, loadChartService: n }), this._chartApiInstance = s, this._loadChartService = n, this ._alertsDispatcher = o, this._supportTicketData = a, this ._favoriteServices = l, this._proxyWatchListChangedDelegate = null, this._lockDrawingsWatchedValue = null, this ._hideDrawingsWatchedValue = null, this ._hideIndicatorsWatchedValue = null, this ._magnetEnabledWatchedValue = null, this._magnetModeWatchedValue = null, this._replayApi = null, this._chartChangesWatcher = null, this ._hasChartChangesWatchedValue = null, this._getDataSourceHub = function() { return i.activeChartWidget.value().model().model() }, this._chartWidgetCollection.getResizerDetacher = function() { return i.activeChartWidget.value().getResizerDetacher() }, this._alertService = this._alertsDispatcher ? new(void 0)(this ._alertsDispatcher, this._getDataSourceHub) : null, this ._activeChangedChangedDelegate = new t, this._chartWidgetCollection .activeChartWidget.subscribe(function() { this._activeChangedChangedDelegate.fire() }.bind(this)), this._chartWidgets = new WeakMap, this ._activateChart = function(e) { i.activeChartWidget.setValue(e) } } subscribe(e, t) { a.subscribe(e, t) } unsubscribe(e, t) { a.unsubscribe(e, t) } onContextMenu(e) { a.subscribe("onContextMenu", (function(t) { t.callback(e(t.unixtime, t.price)) })) } onGrayedObjectClicked(e) { a.subscribe("onGrayedObjectClicked", e) } activeChart() { return this._getChartWidgetApi(this._chartWidgetCollection .activeChartWidget.value()) } _getChartWidgetApi(e) { var t = this._chartWidgets.get(e); return void 0 === t && (t = new n(e, this._activateChart.bind(null, e)), this._chartWidgets.set(e, t)), t } onActiveChartChanged() { return this._activeChangedChangedDelegate } changeSymbol(e, t, i) { r.interval.setValue(b.normalize(t)), r.symbol.setValue(e), i && this .activeChart().onDataLoaded().subscribe(null, i, !0) } setLayout(e) { this._chartWidgetCollection.setLayout(e) } layout() { return this._chartWidgetCollection.layout.value() } layoutName() { return this._chartWidgetCollection.metaInfo.name.value() } layoutNameWatchedValue() { return this._chartWidgetCollection.metaInfo.name.readonly() } layoutSettingsDrawer() { throw new Error("not implemented") } chartsCount() { return o[this.layout()].count } viewMode() { throw new Error("not implemented") } viewModeWatchedValue() { throw new Error("not implemented") } setForceFullscreenMode() { throw new Error("not implemented") } setMultichartMode() { throw new Error("not implemented") } setActiveChart(e) { throw new Error("not implemented") } chart(e) { if (void 0 === e && (e = 0), e < 0 || e >= this.chartsCount()) throw Error("Incorrect index: " + e); return this._getChartWidgetApi(this._chartWidgetCollection.getAll()[e]) } getSymbolInterval(e) { var t = { symbol: r.symbol.value(), interval: r.interval.value() }; return e && e(t), t } saveChart(e) { if (this._saveChartService) { var t = this; this._saveChartService.whenReadyToSave((function() { var i = t._saveChartService.saveToJSON(); return e && e(JSON.parse(i.content)) })) } } loadChart(e) { this._chartApiInstance.disconnect(), this._chartWidgetCollection .loadContent(e.json), this._chartWidgetCollection .purgeUnusedWidgets(), e.extendedData && (this ._chartWidgetCollection.metaInfo.id.setValue(e.extendedData .uid), this._chartWidgetCollection.metaInfo.uid.setValue(e .extendedData.uid), this._chartWidgetCollection.metaInfo .name.setValue(e.extendedData.name)), this._chartApiInstance .connect(), r.symbol.setValue(this.activeChart().symbol()), a.emit( "chart_loaded") } getStudiesList() { return this._chartApiInstance.allStudiesMetadata().filter((function(e) { return !e.is_hidden_study })).map((function(e) { return e.description })) } getStudyInputs(e) { { const t = w.findStudyMetaInfoByDescription(this._chartApiInstance .allStudiesMetadata(), e); return P(t) } } getSavedCharts(e) { u.getCharts().then(e) } loadChartFromServer(e) { u.loadChart(e) } saveChartToServer(e, t, i) { this._saveChartService && this._saveChartService.saveChartSilently(e, t, i) } setAutosave(e) { this._saveChartService && this._saveChartService.autoSaveEnabled() .setValue(e) } removeChartFromServer(e, t) { u.removeChart(e).then(t) } getIntervals() { var e = [], t = h.getCustomResolutions(); return null !== this._chartApiInstance && (e = this._chartApiInstance .defaultResolutions()), h.mergeResolutions(e, t) } closePopupsAndDialogs() { for (var e = document.querySelectorAll("._tv-dialog-title-close"), t = 0; t < e.length; t++) e[t].click(); l.hideAll(), a.emit(g) } selectLineTool(e) { m.supportedLineTools[e] && (e = m.supportedLineTools[e].name, c.tool .value() !== e && c.tool.setValue(e)) } selectedLineTool() { for (var e = Object.keys(m.supportedLineTools), t = c.tool.value(), i = 0; i < e.length; ++i) if (m.supportedLineTools[e[i]].name === t) return e[i]; return "" } lockAllDrawingTools() { return null === this._lockDrawingsWatchedValue && (this ._lockDrawingsWatchedValue = new s(c.lockDrawings().value()), this._lockDrawingsWatchedValue.subscribe((function(e) { c.lockDrawings().setValue(e) })), c.lockDrawings().subscribe(this, (function() { this._lockDrawingsWatchedValue.setValue(c .lockDrawings().value()) }))), this._lockDrawingsWatchedValue } hideAllDrawingTools() { return null === this._hideDrawingsWatchedValue && (this ._hideDrawingsWatchedValue = new s(c.hideAllDrawings().value()), this._hideDrawingsWatchedValue.subscribe((function(e) { c.hideAllDrawings().setValue(e) })), c.hideAllDrawings().subscribe(this, (function() { this._hideDrawingsWatchedValue.setValue(c .hideAllDrawings().value()) }))), this._hideDrawingsWatchedValue } hideAllIndicators() { return null === this._hideIndicatorsWatchedValue && (this ._hideIndicatorsWatchedValue = new s(c.hideAllIndicators() .value()), this._hideIndicatorsWatchedValue.subscribe(( function(e) { c.hideAllIndicators().setValue(e) })), c.hideAllIndicators().subscribe(this, (function() { this._hideIndicatorsWatchedValue.setValue(c .hideAllIndicators().value()) }))), this._hideIndicatorsWatchedValue } magnetEnabled() { return null === this._magnetEnabledWatchedValue && (this ._magnetEnabledWatchedValue = new s(c.properties().magnet .value()), this._magnetEnabledWatchedValue.subscribe(( function( e) { v(!0), c.properties().magnet.setValue(e), v(!1) })), c.properties().magnet.subscribe(this, (function() { this._magnetEnabledWatchedValue.setValue(c .properties().magnet.value()) }))), this._magnetEnabledWatchedValue } magnetMode() { return null === this._magnetModeWatchedValue && (this ._magnetModeWatchedValue = new s(c.properties().magnetMode .value()), this._magnetModeWatchedValue.subscribe((function( e) { v(!0), c.properties().magnetMode.setValue(e), v(!1) })), c.properties().magnetMode.subscribe(this, (function() { this._magnetModeWatchedValue.setValue(c.properties() .magnetMode.value()) }))), this._magnetModeWatchedValue } mainSeriesPriceFormatter() { return this._chartWidgetCollection.activeChartWidget.value().model() .mainSeries().priceScale().formatter() } showNoticeDialog(e) { p({ title: (e = e || {}).title, text: e.body || "", onClose: e.callback }) } showConfirmDialog(e) { if (!(e = e || {}).callback) throw Error("callback must be exist"); var t = e.callback; function i(e) { t && (t(e), t = null) } _({ title: e.title, text: e.body || "", onClose: function() { i(!1) }, onConfirm: function(e) { i(!0), e.dialogClose() } }) } logs() { return { getLogHistory: d.getLogHistory, enable: d.loggingOn, disable: d.loggingOff } } watchlist() { throw new Error("not implemented") } setWatchlistApiPromise(e) { throw new Error("not implemented") } news() { throw new Error("not implemented") } setNewsApiPromise(e) { throw new Error("not implemented") } showLoadChartDialog() { var e = this._loadChartService; e && e.showLoadDialog() } showSaveAsChartDialog() { var e = this._saveChartService; e && window.runOrSignIn((function() { e.saveChartAs() }), { source: "Save as chart dialogue" }) } drawOnAllCharts(e) { return c.drawOnAllCharts().setValue(e) } themes() { return new f({ chartWidgetCollection: this._chartWidgetCollection }) } undoRedoState() { return this._chartWidgetCollection.undoHistory.state() } clearUndoHistory() { return this._chartWidgetCollection.undoHistory.clearStack() } undo() { return this._chartWidgetCollection.undoHistory.undo() } redo() { return this._chartWidgetCollection.undoHistory.redo() } trading() { throw new Error("Not implemented") } waitTrading() { throw new Error("Not implemented") } symbolSearch() { throw new Error("Not implemented") } saveChartOrShowTitleDialog(e, t, i) { throw new Error("Not implemented") } showRenameChartDialog() { throw new Error("Not implemented") } setUserInfo(e) { throw new Error("Not implemented") } connect() { throw new Error("Not implemented") } disconnect() { throw new Error("Not implemented") } loginRequired() { throw new Error("Not implemented") } onConnectionStatusChanged(e) { throw new Error("Not implemented") } isConnected() { throw new Error("Not implemented") } showCreateAlertDialog() { throw new Error("Not implemented") } alertService() { throw new Error("Not implemented") } publishChart(e) { throw new Error("Not implemented") } setPublishChartOptions(e) { throw new Error("Not implemented") } showSupportDialog() { throw new Error("Not implemented") } openMobileChartPicker() { throw new Error("Not implemented") } closeMobileChartPicker() { throw new Error("Not implemented") } replayApi() { throw new Error("Not implemented") } takeScreenshot() { return this._chartWidgetCollection.takeScreenshot() } setSymbolSearchUI(e) { throw new Error("Not implemented") } setIntervalLinkingEnabled(e) { this._chartWidgetCollection.lock.interval.setValue(e) } setTimeFrame(e) { this._chartWidgetCollection.setTimeFrame(e) } symbolSync() { return this._chartWidgetCollection.lock.symbol } intervalSync() { return this._chartWidgetCollection.lock.interval } crosshairSync() { return this._chartWidgetCollection.lock.crosshair } timeSync() { return this._chartWidgetCollection.lock.trackTime } startFullscreen() { return this._chartWidgetCollection.startFullscreen() } exitFullscreen() { return this._chartWidgetCollection.exitFullscreen() } takeClientScreenshot(e) { return this._chartWidgetCollection.clientSnapshot(e) } getFavoriteIntervalsService() { throw new Error("not implemented") } getFavoriteChartStylesService() { throw new Error("not implemented") } getLinetoolsFavoritesStore() { throw new Error("not implemented") } supportTicketData() { return this._supportTicketData } hasChartChanges() { return null === this._chartChangesWatcher && null === this ._hasChartChangesWatchedValue && (this._chartChangesWatcher = new S( this._chartWidgetCollection.undoHistory, window.saver, a), this._hasChartChangesWatchedValue = new s(this ._chartChangesWatcher.hasChanges()), this ._chartChangesWatcher.getOnChange().subscribe(this, ( function() { this._hasChartChangesWatchedValue.setValue(this ._chartChangesWatcher.hasChanges()) }))), this._hasChartChangesWatchedValue } } }).call(this, i("aIyQ"), i("hY0g")) }, "9uLv": function(e, t, i) { "use strict"; var s = i("K9GE"); i.d(t, "a", (function() { return s.a })), i.d(t, "b", (function() { return s.b })), i.d(t, "c", (function() { return s.c })) }, "9zVu": function(e, t, i) { "use strict"; i.r(t), i.d(t, "DrawingToolbarBootloader", (function() { return a })); var s = i("OiSa"), r = i("7RN7"), n = i("cZRT"), o = i("YuHv"); class a extends n.a { constructor(e) { super(), this._opts = e, s.isDrawingToolbarVisible.value() && (this._opts .resizerBridge.negotiateWidth(r.b), this._opts.resizerBridge.container .value().appendChild(Object(o.a)())) } _startLoading() { return Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e( 24), i.e(29), i.e(67), i.e(70), i.e(77), i.e(0), i.e(5), i.e(7), i.e(10), i.e("line-tools-icons"), i.e(53), i.e(57), i.e( "drawing-toolbar") ]).then(i.bind(null, "5f7t")).then(e => new e.DrawingToolbarRenderer(this ._opts.resizerBridge.container.value(), { ...this._opts })) } } }, AE9l: function(e, t, i) {}, "AWC/": function(e, t, i) { e.exports = { container: "container-e6Js9pSl", inner: "inner-e6Js9pSl", "border-left": "border-left-e6Js9pSl", "border-right": "border-right-e6Js9pSl", "border-top": "border-top-e6Js9pSl", "border-bottom": "border-bottom-e6Js9pSl", "top-right-radius": "top-right-radius-e6Js9pSl", "top-left-radius": "top-left-radius-e6Js9pSl", "bottom-right-radius": "bottom-right-radius-e6Js9pSl", "bottom-left-radius": "bottom-left-radius-e6Js9pSl" } }, "Aba+": function(e, t, i) {}, ApcL: function(e, t, i) { "use strict"; i.r(t); var s = i("ogJP"), r = i("vTIA"); var n = i("txPx"), o = i("oXaB"), a = i("wZIs"), l = i("sDZI"), c = i("FIi8"), h = i("4vW/"); i.d(t, "gridPreferencesDefault", (function() { return d })), i.d(t, "crossHairPreferencesDefault", (function() { return p })), i.d(t, "legendPreferencesDefault", (function() { return _ })), i.d(t, "priceScalePreferencesDefault", (function() { return m })), i.d(t, "panePreferencesDefault", (function() { return f })), i.d(t, "scalesPreferencesBaseDefault", (function() { return g })), i.d(t, "scalesPreferencesToApplyDefault", (function() { return b })), i.d(t, "chartEventsSourceBreaksPreferencesDefault", (function() { return v })), i.d(t, "chartEventsSourcePreferencesDefault", (function() { return S })), i.d(t, "timeScalePreferencesDefault", (function() { return y })), i.d(t, "statusViewPreferencesDefault", (function() { return w })), i.d(t, "highLowAvgPreferencesDefault", (function() { return P })), i.d(t, "mainSeriesPreferencesDefault", (function() { return C })), i.d(t, "chartPreferencesBaseDefault", (function() { return x })), i.d(t, "chartPreferencesToApplyDefault", (function() { return T })), i.d(t, "chartPreferencesToRestoreDefault", (function() { return I })), i.d(t, "createPreferencesObject", (function() { return M })), i.d(t, "preferencesByWhiteList", (function() { return O })), i.d(t, "defaultsPreferencesByWhiteList", (function() { return L })); const u = Object(n.getLogger)("Chart.ApplyPreferencesToAllCharts"), d = { color: "", style: 0 }, p = { color: "", style: 0, transparency: 0, width: 0 }, _ = { showStudyArguments: !1, showStudyTitles: !1, showStudyValues: !1, showSeriesTitle: !1, showSeriesOHLC: !1, showLegend: !1, showBarChange: !0, showBackground: !0, backgroundTransparency: 0, wrapText: !1 }, m = { autoScale: !1, autoScaleDisabled: !1, lockScale: !1, percentage: !1, percentageDisabled: !1, log: !1, logDisabled: !1, alignLabels: !1, isInverted: !1, indexedTo100: !1 }, f = { backgroundType: h.ColorType.Solid, background: "", backgroundGradientStartColor: "", backgroundGradientEndColor: "", topMargin: 0, bottomMargin: 0, rightOffset: 0, horzGridProperties: Object(c.deepExtend)({}, d), vertGridProperties: Object(c.deepExtend)({}, d), crossHairProperties: Object(c.deepExtend)({}, p), legendProperties: Object(c.deepExtend)({}, _), axisProperties: Object(c.deepExtend)({}, m) }, g = { lineColor: "", textColor: "", fontSize: 0, scaleSeriesOnly: !1, showSeriesLastValue: !1, seriesLastValueMode: o.PriceAxisLastValueMode.LastValueAccordingToScale, showSeriesPrevCloseValue: !1, showStudyLastValue: !1, showSymbolLabels: !1, showStudyPlotLabels: !1, showBidAskLabels: !1, showPrePostMarketPriceLabel: !0, showFundamentalLastValue: !1, showFundamentalNameLabel: !1, showCurrency: !0, showUnit: !0 }, b = { ...g }, v = { color: "", visible: !1, style: 0, width: 0 }, S = { visible: !1, futureOnly: !1, breaks: Object(c.deepExtend)({}, v) }, y = { defaultRightOffset: 0 }, w = { fontSize: 16, showExchange: !0, showInterval: !0, symbolTextSource: "description" }, P = { highLowPriceLinesVisible: !1, highLowPriceLabelsVisible: !1, averageClosePriceLineVisible: !1, averageClosePriceLabelVisible: !1 }, C = { style: 0, minTick: 0, showPriceLine: !1, priceLineWidth: 0, priceLineColor: "", showPrevClosePriceLine: !1, showCountdown: !0, prevClosePriceLineWidth: 0, sessionId: "regular", prevClosePriceLineColor: "", esdShowDividends: !1, esdShowSplits: !1, esdShowEarnings: !1, esdShowBreaks: !1, dividendsAdjustment: !1, statusViewStyle: Object(c.deepExtend)({}, w), priceAxisProperties: Object(c.deepExtend)({}, m), highLowAvgPrice: Object(c.deepExtend)({}, P), candleStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", drawWick: !1, drawBorder: !1, drawBody: !0, borderColor: "", borderUpColor: "", borderDownColor: "", wickColor: "", wickUpColor: "", wickDownColor: "", barColorsOnPrevClose: !1 }), hollowCandleStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", drawWick: !1, drawBorder: !1, drawBody: !0, borderColor: "", borderUpColor: "", borderDownColor: "", wickColor: "", wickUpColor: "", wickDownColor: "" }), barStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", barColorsOnPrevClose: !1, dontDrawOpen: !1, thinBars: !0 }), lineStyle: Object(c.deepExtend)({}, { color: "", linestyle: 0, linewidth: 0, styleType: 0 }), areaStyle: Object(c.deepExtend)({}, { color1: "", color2: "", linecolor: "", linestyle: 0, linewidth: 0, transparency: 0 }), baselineStyle: Object(c.deepExtend)({}, { topFillColor1: "", topFillColor2: "", bottomFillColor1: "", bottomFillColor2: "", topLineColor: "", bottomLineColor: "", topLineWidth: 0, bottomLineWidth: 0, transparency: 0, baseLevelPercentage: 0 }), hiloStyle: Object(c.deepExtend)({}, { color: "", showBorders: !1, borderColor: "", showLabels: !1, labelColor: "", fontSize: 0, drawBody: !0 }), haStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", drawWick: !1, drawBorder: !1, drawBody: !0, borderColor: "", borderUpColor: "", borderDownColor: "", wickColor: "", wickUpColor: "", wickDownColor: "", showRealLastPrice: !1, barColorsOnPrevClose: !1, inputs: {} }), renkoStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", borderUpColor: "", borderDownColor: "", upColorProjection: "", downColorProjection: "", borderUpColorProjection: "", borderDownColorProjection: "", wickUpColor: "", wickDownColor: "", inputs: { boxSize: 0, style: "", atrLength: 0, wicks: !1, sources: "", source: "" } }), pbStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", borderUpColor: "", borderDownColor: "", upColorProjection: "", downColorProjection: "", borderUpColorProjection: "", borderDownColorProjection: "", inputs: { source: "", lb: 0 } }), kagiStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", upColorProjection: "", downColorProjection: "", inputs: { style: "", atrLength: 0, reversalAmount: 0 } }), pnfStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", upColorProjection: "", downColorProjection: "", inputs: { reversalAmount: 0, boxSize: 0, style: "", atrLength: 0 } }), rangeStyle: Object(c.deepExtend)({}, { upColor: "", downColor: "", upColorProjection: "", downColorProjection: "", thinBars: !1, inputs: { range: 0, phantomBars: !1 } }) }, x = { priceScaleSelectionStrategyName: "auto", timeScale: Object(c.deepExtend)({}, y), mainSeries: Object(c.deepExtend)({}, C), sessions: Object(c.deepExtend)({}, l.sessionsPreferencesDefault), paneProperties: Object(c.deepExtend)({}, f), chartEventsSourceProperties: Object(c.deepExtend)({}, S), tradingProperties: Object(c.deepExtend)({}, r.tradingPreferencesDefault) }, T = { timezone: "", scalesProperties: Object(c.deepExtend)({}, b), ...x }, I = { scalesProperties: Object(c.deepExtend)({}, g), ...x }; function M(e, t, i, r, n = !0) { if (void 0 === t[e]) return u.logDebug( `We haven't had this property ${r}.${e} yet, please, remove it from whiteList`), null; if (Object(s.isObject)(i[e])) { const s = Object.keys(i[e]); let o = ""; return s.map(s => ({ [s]: M(s, t[e], i[e], `${r}.${e}`, n) })).reduce((e, t) => (o = Object.keys(t)[0], e[o] = t[o], e), {}) } return n ? t[e].value() : t[e] } function O(e, t, i = T) { const s = { timezone: "", priceScaleSelectionStrategyName: "auto", timeScale: { defaultRightOffset: e.timeScale().defaultRightOffsetProperty().value() }, mainSeries: {}, sessions: {}, paneProperties: {}, scalesProperties: {}, chartEventsSourceProperties: {}, tradingProperties: {} }, r = ["timeScale", "mainSeries", "sessions"], n = i.mainSeries, o = Object.keys(i), a = Object.keys(n), l = t.properties(), c = e.properties(), h = i.sessions, u = Object.keys(h), d = e.sessions().properties(); return a.forEach(e => { s.mainSeries[e] = M(e, l, n, "mainSeries") }), u.forEach(e => { s.sessions[e] = M(e, d, h, "sessions") }), o.forEach(e => { r.includes(e) || (s[e] = M(e, c, i, "preferences")) }), s } function L(e, t, i = I) { const s = { timeScale: { defaultRightOffset: e.timeScale().rightOffsetDefaultValue() }, mainSeries: {}, sessions: Object(c.deepExtend)({}, l.sessionsPreferencesDefault), paneProperties: {}, scalesProperties: {}, chartEventsSourceProperties: {}, tradingProperties: {}, priceScaleSelectionStrategyName: "auto" }, r = ["timeScale", "mainSeries", "sessions"], n = i.mainSeries, o = Object.keys(i), h = Object.keys(n), u = Object(a.factoryDefaults)("chartproperties.mainSeriesProperties"), d = Object(a.factoryDefaults)("chartproperties"); return h.forEach(e => { s.mainSeries[e] = M(e, u, n, "mainSeries", !1) }), o.forEach(e => { r.includes(e) || (s[e] = M(e, d, i, "preferences", !1)) }), s } }, Az04: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("GEp6").distanceToLine, n = i("Ss5c").LineDataSource, o = i("Ocx9").DefaultProperty, a = i("j3hX").LineToolColorsProperty; class l extends n { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "lZ9F", 7)).then(({ RotatedRectanglePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } startChanging(e, t) { if (super.startChanging(e, t), 0 === e || 1 === e) { var i = this._getPaneViews()[0], s = i._points[0], n = i._points[1], o = i._points[2]; this._distance = r(s, n, o).distance } } setPoint(e, t, i) { if (super.setPoint(e, t, i), 0 === e || 1 === e) { var r = this._getPaneViews()[0]; r.update(); var n = r._points[0], o = r._points[1].subtract(n), a = new s(o.y, -o.x).normalized().scaled(this._distance), l = n.add(a), c = this.screenPointToPoint(l); this._points[2] = c } } endChanging(e, t) { delete this._distance, super.endChanging(e, t) } pointsCount() { return 3 } name() { return "Rotated Rectangle" } hasEditableCoordinates() { return !1 } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D"))) .GeneralFiguresDefinitionsViewModel } _snapTo45DegreesAvailable() { return !0 } static createProperties(e) { var t = new o("linetoolrotatedrectangle", e); return l._configureProperties(t), t } static _configureProperties(e) { n._configureProperties(e), e.addChild("linesColors", new a([e.color])) } } t.LineToolRotatedRectangle = l }, "B4/o": function(e, t, i) { "use strict"; (function(e) { var s = i("QIuV").LineToolTrading, r = i("4TVt").LineToolPriceAxisView, n = i("jkoZ"), o = i("Ss5c").LineDataSource, a = i("Ocx9").DefaultProperty, l = i("s1Gx").sortSourcesPreOrdered.LineToolOrder; function c(e) { return null == e ? e = "" : e += "", e } class h { constructor(e) { this._line = e, this._data = { bodyText: "order", quantityText: "0" }, this._editable = !0, this._cancellable = !0, this._mode = "", this ._direction = "buy", this._active = !0 } setMode(e) { return this._mode = e, this._line.updateAllViewsAndRedraw(), this } setDirection(e) { return this._direction = e, this._line.updateAllViewsAndRedraw(), this } setActive(e) { return this._active = e, this._line.updateAllViewsAndRedraw(), this } setEditable(e) { return this._editable = e, this._line.updateAllViewsAndRedraw(), this } getEditable() { return this._editable } setCancellable(e) { return this._cancellable = e, this._line.updateAllViewsAndRedraw(), this } getCancellable() { return this._cancellable } hasMoveCallback() { return this.isFunction(this._onMoveCallback) } hasModifyCallback() { return this.isFunction(this._onModifyCallback) } getPrice() { return this._line.points().length > 0 ? this._line.points()[0].price : this ._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0 } setPrice(e) { if (this._line.points().length > 0) { var t = this._line.points()[0]; t.price = e, this._line._points[0] = t, this._line.normalizePoints(), this._line.updateAllViewsAndRedraw() } return this._line._timePoint.length > 0 && (this._line._timePoint[0].price = e), this } getText() { return this._data.bodyText } setText(e) { return this._data.bodyText = e || "", this._line.updateAllViewsAndRedraw(), this } setTooltip(e) { return this._line.properties().tooltip.setValue(c(e)), this } getTooltip() { return this._line.properties().tooltip.value() } setModifyTooltip(e) { return this._line.properties().modifyTooltip.setValue(c(e)), this } getModifyTooltip() { return this._line.properties().modifyTooltip.value() } setCancelTooltip(e) { return this._line.properties().cancelTooltip.setValue(c(e)), this } getCancelTooltip() { return this._line.properties().cancelTooltip.value() } getQuantity() { return this._data.quantityText } setQuantity(e) { return this._data.quantityText = e || "", this._line .updateAllViewsAndRedraw(), this } getExtendLeft() { var e = this._line.properties().extendLeft.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .extendLeft.value() : e } setExtendLeft(e) { return this._line.properties().extendLeft.setValue(e), this } getLineLength() { var e = this._line.properties().lineLength.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .lineLength.value() : e } setLineLength(e) { return this._line.properties().lineLength.setValue(Math.max(0, Math.min(e, 100))), this } getLineColor() { var e = this._line.properties(); return "buy" === this._direction ? this._active ? e.lineActiveBuyColor .value() : e.lineInactiveBuyColor.value() : this._active ? e .lineActiveSellColor.value() : e.lineInactiveSellColor.value() } setLineColor(e) { return "buy" === this._direction ? this._active ? this .setLineActiveBuyColor(e) : this.setLineInactiveBuyColor(e) : this ._active ? this.setLineActiveSellColor(e) : this .setLineInactiveSellColor(e), this } setLineActiveBuyColor(e) { return this._line.properties().lineActiveBuyColor.setValue(e), this } setLineInactiveBuyColor(e) { return this._line.properties().lineInactiveBuyColor.setValue(e), this } setLineActiveSellColor(e) { return this._line.properties().lineActiveSellColor.setValue(e), this } setLineInactiveSellColor(e) { return this._line.properties().lineInactiveSellColor.setValue(e), this } getLineStyle() { var e = this._line.properties().lineStyle.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .lineStyle.value() : e } setLineStyle(e) { return this._line.properties().lineStyle.setValue(e), this } getLineWidth() { var e = this._line.properties().lineWidth.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .lineWidth.value() : e } setLineWidth(e) { return this._line.properties().lineWidth.setValue(e), this } getBodyBorderColor() { var e = this._line.properties(); return "buy" === this._direction ? this._active ? e.bodyBorderActiveBuyColor .value() : e.bodyBorderInactiveBuyColor.value() : this._active ? e .bodyBorderActiveSellColor.value() : e.bodyBorderInactiveSellColor .value() } setBodyBorderColor(e) { return "buy" === this._direction ? this._active ? this .setBodyBorderActiveBuyColor(e) : this.setBodyBorderInactiveBuyColor( e) : this._active ? this.setBodyBorderActiveSellColor(e) : this .setBodyBorderInactiveSellColor(e), this } setBodyBorderActiveBuyColor(e) { return this._line.properties().bodyBorderActiveBuyColor.setValue(e), this } setBodyBorderInactiveBuyColor(e) { return this._line.properties().bodyBorderInactiveBuyColor.setValue(e), this } setBodyBorderActiveSellColor(e) { return this._line.properties().bodyBorderActiveSellColor.setValue(e), this } setBodyBorderInactiveSellColor(e) { return this._line.properties().bodyBorderInactiveSellColor.setValue(e), this } getBodyBackgroundColor() { return n.getColorFromProperties(this._line.properties().bodyBackgroundColor, this._line.properties().bodyBackgroundTransparency) } setBodyBackgroundColor(e) { return n.setColorToProperties(e, this._line.properties() .bodyBackgroundColor, this._line.properties() .bodyBackgroundTransparency), this } getBodyTextColor() { var e = this._line.properties(); return "limit" === this._mode ? this._active ? e.bodyTextActiveLimitColor .value() : e.bodyTextInactiveLimitColor.value() : "stop" === this ._mode ? this._active ? e.bodyTextActiveStopColor.value() : e .bodyTextInactiveStopColor.value() : "buy" === this._direction ? this ._active ? e.bodyTextActiveBuyColor.value() : e.bodyTextInactiveBuyColor .value() : this._active ? e.bodyTextActiveSellColor.value() : e .bodyTextInactiveSellColor.value() } setBodyTextColor(e) { return "limit" === this._mode ? this._active ? this .setBodyTextActiveLimitColor(e) : this.setBodyTextInactiveLimitColor( e) : "stop" === this._mode ? this._active ? this .setBodyTextActiveStopColor(e) : this.setBodyTextInactiveStopColor(e) : "buy" === this._direction ? this._active ? this .setBodyTextActiveBuyColor(e) : this.setBodyTextInactiveBuyColor(e) : this._active ? this.setBodyTextActiveSellColor(e) : this .setBodyTextInactiveSellColor(e), this } setBodyTextInactiveLimitColor(e) { return this._line.properties().bodyTextInactiveLimitColor.setValue(e), this } setBodyTextActiveLimitColor(e) { return this._line.properties().bodyTextActiveLimitColor.setValue(e), this } setBodyTextInactiveStopColor(e) { return this._line.properties().bodyTextInactiveStopColor.setValue(e), this } setBodyTextActiveStopColor(e) { return this._line.properties().bodyTextActiveStopColor.setValue(e), this } setBodyTextInactiveBuyColor(e) { return this._line.properties().bodyTextInactiveBuyColor.setValue(e), this } setBodyTextActiveBuyColor(e) { return this._line.properties().bodyTextActiveBuyColor.setValue(e), this } setBodyTextInactiveSellColor(e) { return this._line.properties().bodyTextInactiveSellColor.setValue(e), this } setBodyTextActiveSellColor(e) { return this._line.properties().bodyTextActiveSellColor.setValue(e), this } getBodyFont() { return n.getFontFromProperties(this._line.properties().bodyFontFamily, this ._line.properties().bodyFontSize, this._line.properties() .bodyFontBold, this._line.properties().bodyFontItalic) } setBodyFont(e) { return n.setFontToProperties(e, this._line.properties().bodyFontFamily, this ._line.properties().bodyFontSize, this._line.properties() .bodyFontBold, this._line.properties().bodyFontItalic), this } getQuantityBorderColor() { var e = this._line.properties(); return "buy" === this._direction ? this._active ? e .quantityBorderActiveBuyColor.value() : e.quantityBorderInactiveBuyColor .value() : this._active ? e.quantityBorderActiveSellColor.value() : e .quantityBorderInactiveSellColor.value() } setQuantityBorderColor(e) { return "buy" === this._direction ? this._active ? this .setQuantityBorderActiveBuyColor(e) : this .setQuantityBorderInactiveBuyColor(e) : this._active ? this .setQuantityBorderActiveSellColor(e) : this .setQuantityBorderInactiveSellColor(e), this } setQuantityBorderActiveBuyColor(e) { return this._line.properties().quantityBorderActiveBuyColor.setValue(e), this } setQuantityBorderInactiveBuyColor(e) { return this._line.properties().quantityBorderInactiveBuyColor.setValue(e), this } setQuantityBorderActiveSellColor(e) { return this._line.properties().quantityBorderActiveSellColor.setValue(e), this } setQuantityBorderInactiveSellColor(e) { return this._line.properties().quantityBorderInactiveSellColor.setValue(e), this } getQuantityBackgroundColor() { var e = this._line.properties(); return "buy" === this._direction ? this._active ? e .quantityBackgroundActiveBuyColor.value() : e .quantityBackgroundInactiveBuyColor.value() : this._active ? e .quantityBackgroundActiveSellColor.value() : e .quantityBackgroundInactiveSellColor.value() } setQuantityBackgroundColor(e) { return "buy" === this._direction ? this._active ? this .setQuantityBackgroundActiveBuyColor(e) : this .setQuantityBackgroundInactiveBuyColor(e) : this._active ? this .setQuantityBackgroundActiveSellColor(e) : this .setQuantityBackgroundInactiveSellColor(e), this } setQuantityBackgroundActiveBuyColor(e) { return this._line.properties().quantityBackgroundActiveBuyColor.setValue(e), this } setQuantityBackgroundInactiveBuyColor(e) { return this._line.properties().quantityBackgroundInactiveBuyColor.setValue( e), this } setQuantityBackgroundActiveSellColor(e) { return this._line.properties().quantityBackgroundActiveSellColor.setValue( e), this } setQuantityBackgroundInactiveSellColor(e) { return this._line.properties().quantityBackgroundInactiveSellColor.setValue( e), this } getQuantityTextColor() { return n.getColorFromProperties(this._line.properties().quantityTextColor, this._line.properties().quantityTextTransparency) } setQuantityTextColor(e) { return n.setColorToProperties(e, this._line.properties().quantityTextColor, this._line.properties().quantityTextTransparency), this } getQuantityFont() { return n.getFontFromProperties(this._line.properties().quantityFontFamily, this._line.properties().quantityFontSize, this._line.properties() .quantityFontBold, this._line.properties().quantityFontItalic) } setQuantityFont(e) { return n.setFontToProperties(e, this._line.properties().quantityFontFamily, this._line.properties().quantityFontSize, this._line.properties() .quantityFontBold, this._line.properties().quantityFontItalic), this } getCancelButtonBorderColor() { var e = this._line.properties(); return "buy" === this._direction ? this._active ? e .cancelButtonBorderActiveBuyColor.value() : e .cancelButtonBorderInactiveBuyColor.value() : this._active ? e .cancelButtonBorderActiveSellColor.value() : e .cancelButtonBorderInactiveSellColor.value() } setCancelButtonBorderColor(e) { return "buy" === this._direction ? this._active ? this .setCancelButtonBorderActiveBuyColor(e) : this .setCancelButtonBorderInactiveBuyColor(e) : this._active ? this .setCancelButtonBorderActiveSellColor(e) : this .setCancelButtonBorderInactiveSellColor(e), this } setCancelButtonBorderActiveBuyColor(e) { return this._line.properties().cancelButtonBorderActiveBuyColor.setValue(e), this } setCancelButtonBorderInactiveBuyColor(e) { return this._line.properties().cancelButtonBorderInactiveBuyColor.setValue( e), this } setCancelButtonBorderActiveSellColor(e) { return this._line.properties().cancelButtonBorderActiveSellColor.setValue( e), this } setCancelButtonBorderInactiveSellColor(e) { return this._line.properties().cancelButtonBorderInactiveSellColor.setValue( e), this } getCancelButtonBackgroundColor() { return n.getColorFromProperties(this._line.properties() .cancelButtonBackgroundColor, this._line.properties() .cancelButtonBackgroundTransparency) } setCancelButtonBackgroundColor(e) { return n.setColorToProperties(e, this._line.properties() .cancelButtonBackgroundColor, this._line.properties() .cancelButtonBackgroundTransparency), this } getCancelButtonIconColor() { var e = this._line.properties(); return "buy" === this._direction ? this._active ? e .cancelButtonIconActiveBuyColor.value() : e .cancelButtonIconInactiveBuyColor.value() : this._active ? e .cancelButtonIconActiveSellColor.value() : e .cancelButtonIconInactiveSellColor.value() } setCancelButtonIconColor(e) { return "buy" === this._direction ? this._active ? this .setCancelButtonIconActiveBuyColor(e) : this .setCancelButtonIconInactiveBuyColor(e) : this._active ? this .setCancelButtonIconActiveSellColor(e) : this .setCancelButtonIconInactiveSellColor(e), this } setCancelButtonIconActiveBuyColor(e) { return this._line.properties().cancelButtonIconActiveBuyColor.setValue(e), this } setCancelButtonIconInactiveBuyColor(e) { return this._line.properties().cancelButtonIconInactiveBuyColor.setValue(e), this } setCancelButtonIconActiveSellColor(e) { return this._line.properties().cancelButtonIconActiveSellColor.setValue(e), this } setCancelButtonIconInactiveSellColor(e) { return this._line.properties().cancelButtonIconInactiveSellColor.setValue( e), this } block() { this._blocked = !0, this._line.updateAllViewsAndRedraw() } unblock() { this._blocked = !1, this._line.updateAllViewsAndRedraw() } getBlocked() { return this._blocked } isFunction(e) { return "function" == typeof e } onCancel(e, t) { return t ? this.isFunction(t) && (this._onCancelData = e, this ._onCancelCallback = t) : this.isFunction(e) && (this ._onCancelCallback = e), this } callOnCancel() { this.isFunction(this._onCancelCallback) && this._onCancelCallback.call(this, this._onCancelData) } isOnCancelCallbackPresent() { return this.isFunction(this._onCancelCallback) } onModify(e, t) { return t ? this.isFunction(t) && (this._onModifyData = e, this ._onModifyCallback = t) : this.isFunction(e) && (this ._onModifyCallback = e), this } callOnModify() { this.isFunction(this._onModifyCallback) && this._onModifyCallback.call(this, this._onModifyData) } onMove(e, t) { return t ? this.isFunction(t) && (this._onMoveData = e, this ._onMoveCallback = t) : this.isFunction(e) && (this ._onMoveCallback = e), this } callOnMove() { this.isFunction(this._onMoveCallback) && this._onMoveCallback.call(this, this._onMoveData) } onContextMenu(e, t) { return t ? this.isFunction(t) && (this._onContextMenuData = e, this ._onContextMenuCallback = t) : this.isFunction(e) && (this ._onContextMenuCallback = e), this } shouldShowContextMenu() { return this.isFunction(this._onContextMenuCallback) } callOnContextMenu() { if (this.isFunction(this._onContextMenuCallback)) return this ._onContextMenuCallback.call(this, this._onContextMenuData) } remove() { this._line._model.removeSource(this._line), delete this._line } } class u extends s { constructor(e, t) { super(e, t || u.createProperties()), this._adapter = new h(this), this .setSelectionEnabled(!0), i.e("lt-pane-views").then(i.bind(null, "LMGK")).then(({ OrderPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } zorder() { return l } isSpeciallyZOrderedSource() { return !0 } setPoint(e, t, i) { this._points[e] = t, this.normalizePoints() } addPoint(e, t) { return this._points.push(e), this._lastPoint = null, this.normalizePoints(), this.createServerPoints(), !0 } name() { return "Order" } endMoving(e) { var t = this._startMovingPoint && this._currentMovingPoint && this ._startMovingPoint.logical.price !== this._currentMovingPoint.logical .price; super.endMoving(), !e && t && this._adapter.callOnMove() } createPriceAxisView(e) { var t = { pointIndex: e, backgroundPropertyGetter: () => this._adapter.getLineColor() }; return this._priceAxisView = new r(this, t), this._priceAxisView } paneViews() { return TradingView.printing && !e.enabled("snapshot_trading_drawings") ? null : this._model.properties().tradingProperties.showOrders.value() ? o .prototype.paneViews.call(this) : null } priceAxisViews(t, i) { return TradingView.printing && !e.enabled("snapshot_trading_drawings") ? null : this._model.properties().tradingProperties.showOrders.value() ? o .prototype.priceAxisViews.call(this, t, i) : null } adapter() { return this._adapter } hasContextMenu() { return this._adapter.shouldShowContextMenu() } contextMenuItems() { return this._adapter.callOnContextMenu() } movable() { return Boolean(this._adapter._onMoveCallback) } static createProperties(e) { var t = new a("linetoolorder", e, !1, !1); return u._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolOrder = u }).call(this, i("Kxc7")) }, BBCR: function(e, t) { e.exports = '' }, BOPY: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("f6yo").pointInCircle, n = i("VdBB").HitTestResult, o = i("zDbI").CHART_FONT_FAMILY, a = i("cPgM").ScaledPaneRenderer; class l extends a { constructor(e, t) { super(), this._barWidth = e.barWidth, this._plates = e.plates, this._tooltip = e .tooltip, this._model = t } _drawImpl(e) { e.save(); for (var t = 0; t < this._plates.length; t++) if (this._plates[t].highlightByAuthor) { this._highlightByAuthor = !0; break } this._plates.forEach(this._drawItem.bind(this, e)), this._tooltip.draw(this ._plates.map(function(e) { return this._plateTransform(e) }.bind(this)), e), this._tooltip.endDraw(), e.restore() } _drawItem(e, t) { e.save(), this._highlightByAuthor && !t.highlightByAuthor && (e.globalAlpha = .4); var i = this._dotTransform(t); i.mine ? this._drawTriangle(e, i) : this._drawDot(e, i), e.restore() } _commonTransform(e) { var t = Math.max(1.4 * e.minSize, this._barWidth + 4), i = { up: -1, down: 1 } [e.direction] * (e.yInverted ? -1 : 1) * (t * (e.order + .6) + .25 * t), s = e.y + i, r = TradingView.clone(e.overridedTheme || this.themes[e.theme]); return r.dotBorderWidth = e.hovered || e.highlightByAuthor ? 4 : 2, { id: e.id, theme: r, themeName: e.theme, x: Math.round(e.x + 1), y: Math.round(s), yInverted: e.yInverted, pinned: e.pinned, hovered: e.hovered } } _dotTransform(e) { var t = this._commonTransform(e); return t.radius = Math.max(e.minSize / 2, .4 * this._barWidth), t.label = e.label, t .labelFontColor = e.labelFontColor, t.labelFontSize = Math.ceil(Math.max(10, Math.min(t.radius, 20))), this._model.updateDotData(e, t) } _plateTransform(e) { var t = this._commonTransform(e); return this._model.updatePlateData(e, t) } _drawTriangle(e, t) { e.strokeStyle = t.theme.border, e.fillStyle = t.theme.background, e.lineWidth = t .theme.dotBorderWidth; var i = t, s = t.radius, r = Math.cos(Math.PI / 6) * s, n = Math.sin(Math.PI / 6) * s; e.translate(i.x, i.y), "up" === t.direction !== t.yInverted && e.rotate(Math.PI), t .public || (e.lineWidth /= 2), e.beginPath(), e.moveTo(0, -s), e.lineTo(r, n), e .lineTo(-r, n), e.lineTo(0, -s), e.closePath(), e.stroke(), t.public && e.fill() } _drawDot(e, t) { e.strokeStyle = t.theme.border, e.fillStyle = t.theme.background, e.lineWidth = t .theme.dotBorderWidth, e.beginPath(), e.arc(t.x, t.y, t.radius, 0, 2 * Math.PI, !0), e.closePath(), e.stroke(), e.fill(), t.label && t.radius >= 7 && (e .textAlign = "center", e.textBaseline = "middle", e.font = "bold " + t .labelFontSize + "px " + o, e.fillStyle = t.labelFontColor, e.fillText(t .label, t.x, t.y)) } hitTest(e) { for (var t, i = this._plates.length - 1; i >= 0; --i) if (t = this._hitTestDot(this._plates[i], e)) return t; return null } _hitTestDot(e, t) { var i = this._dotTransform(e), o = new s(i.x, i.y); return r(t, o, Math.max(i.radius, 8)) ? new n(n.REGULAR, e) : null } } l.prototype.themes = { green: { border: "#78C143", background: "#8DDD54" }, red: { border: "#CC4545", background: "#ED5A5A" }, neutral: { border: "#EAC300", background: "#FFD400" }, yellow: { border: "#EAC300", background: "#FFD400" }, blue: { border: "#047ACE", background: "#0496FF" } }, t.BarsMarksContainerPaneView = class { constructor(e, t) { this.source = e, this._rendererFactory = t } update() {} renderer(e, t) { return this._rendererFactory(this.source) } }, t.BarsMarksContainerRenderer = l }, BZtw: function(e, t, i) { "use strict"; var s = i("Eyy1"), r = i("ogJP"), n = i("5fI3"), o = i("LxhU"), a = i("XPit"), l = i("hsV8"), c = i("YWnQ"), h = i("aIyQ"), u = i.n(h); class d { constructor() { this._loading = new u.a, this._completed = new u.a, this._error = new u.a, this ._symbolError = new u.a, this._symbolResolved = new u.a, this._seriesError = new u.a, this._symbolNotPermitted = new u.a, this._symbolGroupNotPermitted = new u.a, this._chartTypeNotPermitted = new u.a, this ._intradaySpreadNotPermitted = new u.a, this._intradayExchangeNotPermitted = new u.a, this._customIntervalNotPermitted = new u.a, this ._secondsIntervalNotPermitted = new u.a, this._tickMarksRangeChanged = new u.a, this._barReceived = new u.a, this._seriesTimeFrame = new u.a, this ._dataUpdated = new u.a } destroy() { this._loading.destroy(), this._completed.destroy(), this._error.destroy(), this ._symbolError.destroy(), this._symbolResolved.destroy(), this._seriesError .destroy(), this._symbolNotPermitted.destroy(), this._symbolGroupNotPermitted .destroy(), this._chartTypeNotPermitted.destroy(), this ._intradaySpreadNotPermitted.destroy(), this._intradayExchangeNotPermitted .destroy(), this._customIntervalNotPermitted.destroy(), this ._secondsIntervalNotPermitted.destroy(), this._tickMarksRangeChanged.destroy(), this._barReceived.destroy(), this._seriesTimeFrame.destroy(), this._dataUpdated .destroy() } loading() { return this._loading } completed() { return this._completed } error() { return this._error } symbolError() { return this._symbolError } symbolResolved() { return this._symbolResolved } seriesError() { return this._seriesError } symbolNotPermitted() { return this._symbolNotPermitted } symbolGroupNotPermitted() { return this._symbolGroupNotPermitted } chartTypeNotPermitted() { return this._chartTypeNotPermitted } intradaySpreadNotPermitted() { return this._intradaySpreadNotPermitted } intradayExchangeNotPermitted() { return this._intradayExchangeNotPermitted } customIntervalNotPermitted() { return this._customIntervalNotPermitted } secondsIntervalNotPermitted() { return this._secondsIntervalNotPermitted } tickMarksRangeChanged() { return this._tickMarksRangeChanged } barReceived() { return this._barReceived } seriesTimeFrame() { return this._seriesTimeFrame } dataUpdated() { return this._dataUpdated } fireCompleted(e, t) { this._completed.fire(e, t) } fireLoading(e) { this._loading.fire(e) } fireError() { this._error.fire() } fireSymbolError(e) { this._symbolError.fire(e), this.fireError() } fireSymbolResolved(e) { this._symbolResolved.fire(e) } fireSeriesError(e) { this._seriesError.fire(e), this.fireError() } fireSymbolNotPermitted(e) { this._symbolNotPermitted.fire(e), this.fireError() } fireSymbolGroupNotPermitted(e) { this._symbolGroupNotPermitted.fire(e), this.fireError() } fireChartTypeNotPermitted(e) { this._chartTypeNotPermitted.fire(e), this.fireError() } fireIntradaySpreadNotPermitted() { this._intradaySpreadNotPermitted.fire(), this.fireError() } fireIntradayExchangeNotPermitted() { this._intradayExchangeNotPermitted.fire(), this.fireError() } fireCustomIntervalNotPermitted() { this._customIntervalNotPermitted.fire(), this.fireError() } fireSecondsIntervalNotPermitted() { this._secondsIntervalNotPermitted.fire(), this.fireError() } fireTickMarksRangeChanged(e) { this._tickMarksRangeChanged.fire(e) } fireBarReceived(e) { this._barReceived.fire(e) } fireSeriesTimeFrame(e, t, i, s, r) { this._seriesTimeFrame.fire(e, t, i, s, r) } fireDataUpdated(e, t) { this._dataUpdated.fire(e, t) } } var p = i("txPx"); i.d(t, "a", (function() { return b })); const _ = Object(p.getLogger)("Chart.SeriesDataSource"); var m; ! function(e) { e[e.Idle = 0] = "Idle", e[e.AwaitingConnection = 1] = "AwaitingConnection", e[e .AwaitingFirstDataUpdate = 2] = "AwaitingFirstDataUpdate", e[e.Active = 3] = "Active" }(m || (m = {})); let f = 1; let g = 1; class b { constructor(e, t, i) { var r; this._instanceId = null, this._symbolInstanceId = null, this._symbol = null, this ._resolution = null, this._timeFrame = null, this._data = new a.SeriesData, this ._dataEvents = new d, this._status = m.Idle, this._turnaroundCounter = 1, this ._boundOnGatewayIsConnectedChanged = this._onGatewayIsConnectedChanged.bind( this), this._ongoingDataUpdate = Promise.resolve(), this._gateway = e, this ._turnaroundPrefix = t, this._createSeriesParams = (r = null != i ? i : { count: 300 }).startDate ? r.endDate || r.count ? r.endDate ? ["from_to", r.startDate, r .endDate ] : ["bar_count", r.startDate, Object(s.ensure)(r.count)] : ["from_to", r .startDate ] : r.count || 300, this._gateway.isConnected().subscribe(this ._boundOnGatewayIsConnectedChanged) } destroy() { this.stop(), this._gateway.isConnected().unsubscribe(this ._boundOnGatewayIsConnectedChanged) } modifySeries(e, t, i = null, n = !1) { n && (_.logNormal( "Due to force flag clearing symbol & resolution to force re-requesting data." ), this._symbol = null, this._resolution = null); const a = this._symbol, l = this._resolution; if (this._symbol = e, this._resolution = t, null === this._instanceId) return void( this._timeFrame = i); const c = !Object(r.deepEquals)(a, e)[0], h = null === l || !o.Interval.isEqual(l, t); (c || h || null !== i) && (this._timeFrame = null, (c || h) && this ._turnaroundCounter++, c && this._resolveSymbol(), this._gateway.modifySeries( this._instanceId, this.turnaround(), Object(s.ensureNotNull)(this ._symbolInstanceId), this._resolution, i, this._onMessage.bind(this))) } requestMoreData(e) { null !== this._instanceId && this._gateway.requestMoreData(this._instanceId, e, this ._onMessage.bind(this)) } requestMoreTickmarks(e) { null !== this._instanceId && this._gateway.requestMoreTickmarks(this._instanceId, e, this._onMessage.bind(this)) } isStarted() { return this._status !== m.Idle } isActive() { return this._status === m.Active } start() { this.isStarted() ? _.logNormal( "start: data source is already started, nothing to do") : (Object(s.assert)( null !== this._symbol, "symbol must be set before start"), Object(s .assert)(null !== this._resolution, "resolution must be set before start"), this._gateway.isConnected() .value() ? this._createSeries() : this._changeStatusTo(m.AwaitingConnection) ) } stop() { this.isStarted() ? (null !== this._instanceId && (this._gateway.removeSeries(this ._instanceId), this._instanceId = null), this._changeStatusTo(m.Idle)) : _ .logNormal("stop: data source is already stopped, nothing to do") } instanceId() { return this._instanceId } data() { return this._data } clearData() { this.isStarted() ? this._enqueueUpdate(() => this._clearDataImpl()) : this ._clearDataImpl() } dataEvents() { return this._dataEvents } turnaround() { return `${this._turnaroundPrefix}${this._turnaroundCounter}` } symbolInstanceId() { return this._symbolInstanceId } moveData(e) { this._enqueueUpdate(() => this._data.moveData(e)) } _clearDataImpl() { this._data.clear() } _resolveSymbol() { null !== this._symbol && (this._symbolInstanceId = "sds_sym_" + f++, this._gateway .resolveSymbol(this._symbolInstanceId, Object(n .encodeExtendedSymbolOrGetSimpleSymbolString)(this._symbol), this ._onMessage.bind(this))) } _changeStatusTo(e) { Object(s.assert)(this._status !== e, "Source and destination status should be distinct"), _.logNormal( `Status changed from ${m[this._status]} to ${m[e]}`), this._status = e } _createSeries() { Object(s.assert)(this._status !== m.Active, 'Status should not be "Active" when creating a study'), this._instanceId = "sds_" + g++, this._resolveSymbol(), this._gateway.createSeries(this ._instanceId, this.turnaround(), Object(s.ensureNotNull)(this ._symbolInstanceId), Object(s.ensureNotNull)(this._resolution), this ._createSeriesParams, this._timeFrame, this._onMessage.bind(this)), this ._timeFrame = null, this._changeStatusTo(m.AwaitingFirstDataUpdate) } _onGatewayIsConnectedChanged(e) { e ? this._onGatewayConnected() : this._onGatewayDisconnected() } _onGatewayConnected() { this._status === m.AwaitingConnection && this._createSeries() } _onGatewayDisconnected() { this._status !== m.Idle && this._status !== m.AwaitingConnection && (this ._instanceId = null, this._changeStatusTo(m.AwaitingConnection)), this ._turnaroundCounter = 1 } _onMessage(e) { this._enqueueUpdate(() => this._onMessageImpl(e)) } async _onMessageImpl(e) { switch (e.method) { case "symbol_resolved": { const [t, i] = e.params; if (t !== this._symbolInstanceId) { _.logNormal( `Resolve for old symbol, expected: ${this._symbolInstanceId}, actual ${e.params[0]}` ); break } this._onSymbolResolved(i); break } case "symbol_error": if (e.params[0] !== this._symbolInstanceId) { _.logNormal( `Symbol error for old symbol, expected: ${this._symbolInstanceId}, actual ${e.params[0]}` ); break } this._onSymbolError(e); break; case "series_timeframe": { const [t, i, s, r, n, o, a] = e.params; if (!this._checkTurnaround(t, i)) { _.logNormal( `Time frame for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${i})` ); break } this._onSeriesTimeFrame(s, r, n, o, a); break } case "series_error": { const [t, i] = e.params; if (!this._checkTurnaround(t, i)) { _.logNormal( `Series error for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${i})` ); break } this._onSeriesError(e.params[2]); break } case "series_loading": { const [t, i] = e.params; if (!this._checkTurnaround(t, i)) break; this._onSeriesLoading(e.time); break } case "series_completed": { const [t, i, s] = e.params; if (!this._checkTurnaround(t, s)) { _.logNormal( `Series completed for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${s})` ); break } this._onSeriesCompleted(i, e.time); break } case "data_update": if (!this._checkTurnaround(e.params.customId, e.params.turnaround)) { _.logNormal( `Data update for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${e.params.customId} (${e.params.turnaround})` ); break } await this._onDataUpdate(e.params.plots, e.params.nonseries, e.params .lastBar); break; case "clear_data": if (e.params.turnaround !== this.turnaround()) { _.logNormal( `Clear data for old data, expected: ${this.turnaround()}, actual ${e.params.turnaround}` ); break } this._clearDataImpl(), this._dataEvents.fireDataUpdated(void 0, !1) } } _onSeriesError(e) { let t, i; if ("string" == typeof e) i = { error: e }, t = e; else if (i = e, e.ctx) { const i = {}; Object.entries(e.ctx).forEach(([e, t]) => { i[e] = t.toString() }), t = e.error.format(i) } else t = e.error; if (t.startsWith("study_not_auth:")) { const e = t.split(":", 2)[1].split("@", 2)[0]; ["BarSetRenko", "BarSetPriceBreak", "BarSetKagi", "BarSetPnF"].includes(e) ? this._dataEvents.fireChartTypeNotPermitted(e) : "BarSetSpread" === e ? this ._dataEvents.fireIntradaySpreadNotPermitted() : "BarSetRange" === e && this ._dataEvents.fireCustomIntervalNotPermitted() } else "resolution_not_entitled" === t ? this._dataEvents .fireIntradayExchangeNotPermitted() : "custom_resolution" === t ? this ._dataEvents.fireCustomIntervalNotPermitted() : "seconds_not_entitled" === t && this._dataEvents.fireSecondsIntervalNotPermitted(); this._dataEvents.fireSeriesError(i) } _onSeriesTimeFrame(e, t, i, s, r) { this._dataEvents.fireSeriesTimeFrame(e, t, i, null == s || s, r) } _onSymbolError(e) { if (e.params[1] === c.permissionDenied) switch (e.params[2]) { case c.SymbolErrorPermissionDeniedReason.Symbol: this._dataEvents.fireSymbolNotPermitted(e.params[3]); break; case c.SymbolErrorPermissionDeniedReason.GroupPermission: this._dataEvents.fireSymbolGroupNotPermitted(e.params[3]); break; default: this._dataEvents.fireSymbolNotPermitted(e.params[2]) } this._dataEvents.fireSymbolError(e.params[1]) } _onSymbolResolved(e) { this._dataEvents.fireSymbolResolved(e) } async _onDataUpdate(e, t, i) { this._onDataUnpacked(e, i, await async function(e) { if (void 0 === e) return { projectionPlots: [], boxSize: null }; if ("" === e.d || "nochange" === e.indexes) return null; const t = await Object(l.unpackNonSeriesData)(e.d); if (null === t || t.indexes_replace) return null; const i = e.indexes, { bars: s, price: r, boxSize: n, reversalAmount: o } = t.data, a = (s || []).map(e => { let t; return "factor" in e ? t = e.factor : "additionalPrice" in e && (t = e.additionalPrice), { index: i[e.time], value: [0, e.open, e.high, e.low, e.close, e .volume, t ] } }); return { lastPrice: r, projectionPlots: a, reversalAmount: o, boxSize: n } }(t)) } _enqueueUpdate(e) { return this._ongoingDataUpdate = this._ongoingDataUpdate.then(e, e), this ._ongoingDataUpdate } _onDataUnpacked(e, t, i) { if (this._status === m.Idle) return; this._status === m.AwaitingFirstDataUpdate && (this._changeStatusTo(m.Active), this ._clearDataImpl()); const s = this._data.bars().size(), r = this._data.bars().firstIndex(), n = this._data.bars().merge(e); null !== i && (this._data.nsBars().clear(), this._data.nsBars().merge(i .projectionPlots), this._data.lastProjectionPrice = i.lastPrice, null !== i.boxSize && (this._data.boxSize = i.boxSize), this._data .reversalAmount = i.reversalAmount); const o = null === r || null !== n && n.index < r; this._dataEvents.fireDataUpdated(t, o), s !== this._data.bars().size() && null !== n && this._dataEvents.fireBarReceived(n) } _onSeriesLoading(e) { this._dataEvents.fireLoading(e) } _onSeriesCompleted(e, t) { this._dataEvents.fireCompleted(e, t) } _checkTurnaround(e, t) { return this._instanceId === e && (void 0 === t || t === this.turnaround()) } } }, Bt3k: function(e, t, i) { "use strict"; function s(e, t) { this.tooltips = {}, this.tooltipFactory = e, this.source = t } function r(e, t) { this.renderer = e, this._tooltip = t, this.visible = !1 } s.prototype.findOrCreateTooltip = function(e) { var t = this.tooltips[e.id]; return null == t && (e.hovered || e.pinned) && (t = this._createTooltip(), this .tooltips[e.id] = t), t }, s.prototype.showPlate = function(e, t) { var i = this.findOrCreateTooltip(e); null != i && (i._drawPlate(e, t), i.plateData = e) }, s.prototype.draw = function(e, t) { this.hoveredId = null; for (var i = 0; i < e.length; i++) e[i].hovered && (this.hoveredId = e[i].id); e.forEach(function(e) { this.showPlate(e, t) }.bind(this)) }, s.prototype.endDraw = function() { for (var e in this.tooltips) if (this.tooltips.hasOwnProperty(e)) { var t = this.tooltips[e]; t.toggleVisibility(), this.hoveredId && t.plateData.id !== this.hoveredId && !t .plateData.pinned && (t.remove(), delete this.tooltips[e]) } }, s.prototype.removeAll = function() { for (var e in this.tooltips) { if (this.tooltips.hasOwnProperty(e)) this.tooltips[e].remove() } this.tooltips = {} }, s.prototype.removeTooltip = function(e) { delete this.tooltips[e] }, s.prototype._createTooltip = function() { return new r(this, this.tooltipFactory()) }, r.prototype._drawPlate = function(e, t) { var i = this; this.visible = !0, this._tooltip.setSource(this.renderer.source), this._tooltip .showPlate(e, t), e.hovered || e.pinned || this._tooltip.hide((function() { i.renderer.removeTooltip(e.id) })) }, r.prototype.remove = function() { this._tooltip._removeLayout() }, r.prototype.toggleVisibility = function() { this._tooltip._toggleLayout(this.visible), this.visible = !1 }, t.TooltipRenderer = s }, CCPt: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"); function r(e, t, i) { return new Promise(s => { i && e.classList.remove(i), e.classList.add(t); const r = i => { i.target === e && i.animationName === t && (e.removeEventListener(i .type, r), s(i)) }; e.addEventListener("animationend", r, !1), e.addEventListener( "webkitAnimationEnd", r, !1), e.addEventListener("MSAnimationEnd", r, ! 1) }) } function n(e) { return r(e, "tv-transition--fade-in", "tv-transition--fade-out") } i.d(t, "UserDefinedBarsMarksTooltip", (function() { return o })); class o extends class { constructor() { this._source = null, this._tooltipHovered = !1, this._layout = null, this ._container = null, this._context = null, this._plateArrowSize = 14 } showPlate(e, t) { if (this._currentId !== e.id || !this._layout || null === this._layout.parentNode) { this._currentId = e.id, this._createLayout(); const i = Object(s.ensureNotNull)(this._layout); this._getContainer(t).appendChild(i), i.addEventListener("mouseenter", () => { this._tooltipHovered = !0, n(Object(s.ensureNotNull)(this._layout)) }), i.addEventListener("mouseleave", () => { this._tooltipHovered = !1 }) } const i = Object(s.ensureNotNull)(this._layout); let r = Math.round(e.barWidth / 2); r > 15 && (r = 15), r < 10 && (r = 10), this._updatePlate(e); const o = t.canvas.getBoundingClientRect(), a = e.x - i.offsetWidth < this._plateArrowSize; let l = o.width - e.x + Math.round(e.barWidth / 2 + r); a && (l -= i.offsetWidth + 2 * this._plateArrowSize); const c = o.height, h = Math.min(Math.max(e.y, 20), c - i.offsetHeight - 10) + "px"; i.classList.toggle("right", a), i.style.display = "block", i.style.top = h, i.style .right = l + "px", i.style.fontSize = r + "px" } hide(e) { const t = Object(s.ensureNotNull)(this._layout); var i; this._tooltipHovered ? n(t) : (i = t, r(i, "tv-transition--fade-out", "tv-transition--fade-in")).then(() => { t.remove(), e() }) } setSource(e) { this._source = e } _getContainer(e) { return this._container && this._context === e || (this._context = e, this ._container = e.canvas.parentElement), Object(s.ensureNotNull)(this ._container) } _removeLayout() { var e; this._tooltipHovered || null === (e = this._layout) || void 0 === e || e.remove() } _toggleLayout(e) { Object(s.ensureNotNull)(this._layout).style.visibility = e ? "visible" : "hidden" } } { constructor() { super(...arguments), this._layoutText = null } _createLayout() { this._layout = document.createElement("div"), this._layout.classList.add( "bar-mark-tooltip"), this._layoutText = document.createElement("div"), this ._layoutText.classList.add("text"), this._layout.appendChild(this._layoutText) } _updatePlate(e) { this._currentId = e.id; const t = Object(s.ensureNotNull)(this._layout); t.style.borderColor = e.theme.border, t.style.marginTop = e.tooltipMargin + "px"; const i = Object(s.ensureNotNull)(this._layoutText); i.innerHTML = e.text, t.appendChild(i) } } }, CHw2: function(e, t, i) { "use strict"; var s = i("WPQD").LineToolTrendLine, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Extended Line" } static createProperties(e) { var t = new r("linetoolextended", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolExtended = n }, CJIV: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("p1SQ").LineToolHorzLinePriceAxisView, n = i("tc+8"), o = i("Ocx9").DefaultProperty; class a extends s { constructor(e, t) { super(e, t || a.createProperties()), this._priceAxisView = new r(this), i.e( "lt-pane-views").then(i.t.bind(null, "1oDZ", 7)).then(({ HorzRayPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 1 } name() { return "Horizontal Ray" } priceAxisViews(e, t) { return this.isSourceHidden() ? null : t === this.priceScale() && this.properties() .showPrice.value() && this._model.paneForSource(this) === e ? [this ._priceAxisView ] : null } updateAllViews() { super.updateAllViews(), this._priceAxisView.update() } canHasAlert() { return !0 } _getAlertPlots() { var e = this._points[0], t = { index: e.index + 1, price: e.price }; return [this._linePointsToAlertPlot([e, t], null, !1, !0)] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "e0H+"))) .HorizontalRayDefinitionsViewModel } template() { var e = s.prototype.template.call(this); return e.text = this.properties().childs().text.value(), e } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } static createProperties(e) { var t = new o("linetoolhorzray", e); return a._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e), e.hasChild("text") || e.addChild("text", new n("")), e .addExclusion("text") } } t.LineToolHorzRay = a }, CLNU: function(e, t, i) { (function(e) { TradingView.cleanButAmpersand = function(e, t) { var i = t ? ["&"] : ["&"]; return TradingView.clean(e, t, i) }, TradingView.strip_tags = function(e) { return e && e.replace ? e.replace(/(<([^>]+)>)/gi, "") : e }, TradingView.encodeSpread = function(e) { return encodeURIComponent(e) }, TradingView.clean = function(e, t, i) { var s = [ ["&", "&"], ["<", "<"], [">", ">"], ['"', """], ["'", "'"], ["'", "'"] ], r = e; if (!e || !e.replace) return r; for (var n = 0; n < s.length; n++) { var o = s[n][0], a = s[n][1]; i && i.indexOf && -1 !== i.indexOf(t ? a : o) || (r = t ? r.replace( new RegExp(a, "g"), o) : r.replace(new RegExp(o, "g"), a)) } return r }, e && e.exports && (e.exports = { clean: TradingView.clean, cleanButAmpersand: TradingView.cleanButAmpersand, stripTags: TradingView.strip_tags }) }).call(this, i("YuTi")(e)) }, CPmC: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return n })); const s = new WeakMap; function r(e, t) { const i = s.get(e); return i instanceof Function ? i(t) : i && i[t] } function n(e, t, i) { if (i instanceof Function) return void s.set(e, i); const r = s.get(e), n = void 0 === r || r instanceof Function ? {} : r; n[t] = i, s.set(e, n) } }, CW80: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("aO4+"), n = i("MSvv"), o = i("Ss5c"), a = i("OH2X"), l = i("gf4d"), c = i("USzt"), h = i("cBZt"); const u = Object(h.studyIdString)("VbPFixed", "tv-basicstudies"); class d extends c.a { constructor(e, t, i, s) { const r = i || e.studyMetaInfoRepository().findByIdSync({ type: "java", studyId: u }); super(e, t, r, s) } calcIsActualSymbol() { n.StudyLineDataSource.prototype.calcIsActualSymbol.apply(this) } boundToSymbol() { return !0 } isSynchronizable() { return this.priceScale() === this._model.mainSeries().priceScale() } static studyId() { return u } static createProperties(e) { const t = super._createPropertiesFromStudyIdAndState(u, e); return c.a._configureProperties(t), t } } var p = i("e92V"), _ = i("QIuV"); i.d(t, "setNewToolProperties", (function() { return g })), i.d(t, "unsetNewToolProperties", (function() { return b })), i.d(t, "getNewToolProperties", (function() { return v })), i.d(t, "createLineTool", (function() { return S })), i.d(t, "prepareLineToolPropertiesByOwnerSource", (function() { return y })), i.d(t, "createLineToolProperties", (function() { return w })), i.d(t, "createStudyLineToolProperties", (function() { return P })), i.d(t, "supportsPhantomMode", (function() { return C })), i.d(t, "isLineTool", (function() { return x })), i.d(t, "isStudyLineTool", (function() { return T })), i.d(t, "isTrading", (function() { return I })), i.d(t, "tryFindStudyLineToolNameByStudyId", (function() { return M })), i.d(t, "cloneLineTool", (function() { return O })), i.d(t, "lineToolByLinkKey", (function() { return L })), i.d(t, "isLineToolName", (function() { return p.isLineToolName })), i.d(t, "isStudyLineToolName", (function() { return p.isStudyLineToolName })), i.d(t, "isLineDrawnWithPressedButton", (function() { return p.isLineDrawnWithPressedButton })); function m(e) { for (const t of Object.keys(e)) TradingView[t] = e[t] } m(a), m({ LineToolRegressionTrend: l.LineToolRegressionTrend, LineToolVbPFixed: c.a, LineToolFixedRangeVolumeProfile: d }); let f = null; function g(e, t) { return null !== f && f.tool === e && f.toolData === t || (f = { properties: w(e), tool: e, toolData: t }), f.properties } function b() { f = null } function v(e) { return null !== f && f.tool === e ? f.properties : null } function S(e, t, i, r, n) { let o; if (Object(s.assert)(Object(p.isLineToolName)(e), "Unknown line tool: " + e), n || i || (i = v(e) || void 0), "LineToolVbPFixed" === e) o = new c.a(t, i, Object(s.ensureDefined) (r), t.mainSeries()); else if ("LineToolFixedRangeVolumeProfile" === e) o = new d(t, i, Object(s.ensureDefined)( r), t.mainSeries()); else if ("LineToolRegressionTrend" === e) o = new l.LineToolRegressionTrend(t, i, Object(s .ensureDefined)(r)); else { o = new(Object(s.ensureDefined)(a[e]))(t, i, n) } return o.toolname = e, b(), o } function y(e, t) { const i = Object(s.ensureNotNull)(t.symbolSource()); e.childs().symbol.setValue(i.symbol()), e.childs().currencyId.setValue(i.currency()), e .childs().unitId.setValue(i.unit()), e.childs().symbolStateVersion.setValue(2), e .childs().zOrderVersion.setValue(2) } function w(e, t) { if (Object(s.assert)(Object(p.isLineToolName)(e), e + " should be name of the line tool"), "LineToolVbPFixed" === e) return c.a.createProperties(t); if ("LineToolFixedRangeVolumeProfile" === e) return d.createProperties(t); if ("LineToolRegressionTrend" === e) return l.LineToolRegressionTrend.createProperties(t); return Object(s.ensureDefined)(a[e]).createProperties(t) } function P(e, t, i, r, n) { if (Object(s.assert)(Object(p.isStudyLineToolName)(e), e + " should be name of the study line tool"), "LineToolVbPFixed" === e) return c.a .createPropertiesFromStudyMetaInfoAndState(t, i, r, n); if ("LineToolFixedRangeVolumeProfile" === e) return d .createPropertiesFromStudyMetaInfoAndState(t, i, r, n); if ("LineToolRegressionTrend" === e) return l.LineToolRegressionTrend .createPropertiesFromStudyMetaInfoAndState(t, i, r, n); throw new Error("Property creation is not implemented for study line tool " + e) } function C(e) { Object(s.assert)(Object(p.isLineToolName)(e), e + " should be name of the line tool"); const t = a[e]; return void 0 !== t && Boolean(t.supportPhantomMode) } function x(e) { return e instanceof o.LineDataSource } function T(e) { return e instanceof n.StudyLineDataSource } function I(e) { return e instanceof _.LineToolTrading } function M(e) { let t = null; return e === l.LineToolRegressionTrend.studyId() ? t = "LineToolRegressionTrend" : e === c.a .studyId() ? t = "LineToolVbPFixed" : e === d.studyId() && (t = "LineToolFixedRangeVolumeProfile"), t } function O(e, t, i, n) { const o = t.toolname, a = w(t.toolname, t.properties().state()); a.childs().visible.setValue(!0); const l = Object(s.ensureNotNull)(t.ownerSource()), c = S(o, e, a); void 0 !== n && c.setId(n), c.setOwnerSource(l), c.toolname = o; const h = c.clonePositionOffset(), u = t.fixedPoints(); (i ? u.map(e => e.add(new r.Point(h.xCoordOffset, h.yCoordOffset))) : u).forEach(e => c .addFixedPoint(e)); const d = t.normalizedPoints(), p = i ? function(e, t, i) { const r = Object(s.ensureNotNull)(t.priceScale()), n = Object(s.ensureNotNull)(t.firstValue()); return e.map(e => { const t = e.price, s = r.priceToCoordinate(t, n) + i.yCoordOffset, o = r.coordinateToPrice(s, n); return { time_t: e.time_t, price: o, offset: e.offset + i.barOffset } }) }(d, l, h) : d, _ = t.points(); return c.restorePoints(p, _), c.cloneData && c.cloneData(t), c.checkAlert && c.checkAlert(), c } function L(e, t) { return e.dataSources().find(e => x(e) && e.linkKey().value() === t) || null } }, Cf1E: function(e, t, i) { "use strict"; function s(e) { if (void 0 === e) return ""; if (e instanceof Error) { let t = e.message; return e.stack && (t += " " + e.stack), t } return "string" == typeof e ? e.toString() : JSON.stringify(e) } i.d(t, "a", (function() { return s })) }, CsKN: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SetScaleRatioPropertiesCommand", (function() { return n })); var s = i("RDU5"), r = i("Ocx9"); class n extends s.UndoCommand { constructor(e, t, i, s) { super(i), this._property = e, this._newValue = t, this._model = s, this ._priceScale = this._model.mainSeries().priceScale(), this._oldValue = this ._property.value(), this._oldMode = this._priceScale.mode() } redo() { this._oldValue = this._property.value(), this._oldMode = this._priceScale .mode(), Object(r.saveDefaultProperties)(!0), this._priceScale.setMode({ autoScale: !1, percentage: !1, log: !1 }), this._property.setValue(this._newValue), Object(r.saveDefaultProperties) (!1), this._model.recalculateAllPanes(), this._model.lightUpdate() } undo() { Object(r.saveDefaultProperties)(!0), this._property.setValue(this._oldValue), this._priceScale.setMode(this._oldMode), Object(r.saveDefaultProperties)(! 1), this._model.recalculateAllPanes(), this._model.lightUpdate() } } }, CwKc: function(e, t) { e.exports = '' }, CxTi: function(e, t, i) { e.exports = { css_value_currency_label_top: "6", css_value_currency_label_radius: "4", css_value_currency_label_text_horizontal_padding: "4", css_value_border_color_light: "#D1D4DC", css_value_border_color_dark: "#363A45", "price-axis-currency-label-wrapper": "price-axis-currency-label-wrapper-25tFaE37", "price-axis-currency-label": "price-axis-currency-label-25tFaE37", readonly: "readonly-25tFaE37", multiline: "multiline-25tFaE37", "price-axis-currency-label-dropdown": "price-axis-currency-label-dropdown-25tFaE37", "price-axis-currency-label-text": "price-axis-currency-label-text-25tFaE37", "price-axis-currency-label-arrow-down": "price-axis-currency-label-arrow-down-25tFaE37" } }, DVnF: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("Ss5c"); class r extends s.LineDataSource { constructor() { super(...arguments), this._finished = !1 } pointsCount() { return -1 } finished() { return this._finished } finish() { this._finished = !0, this._lastPoint = null, this.normalizePoints(), this .createServerPoints() } hasEditableCoordinates() { return !1 } addPoint(e, t, i) { if (this._finished) return !0; if (this._lastPoint = null, this._points.length > 0) { const t = this._points[this._points.length - 1], i = this.pointToScreenPoint(t)[1]; if (this.pointToScreenPoint(e)[1].subtract(i).length() < 2) return this ._finished } return super.addPoint(e), this._finished } restorePoints(e, t, i) { super.restorePoints(e, t, i), this._finished = !0 } } }, Daqx: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); const s = ["Z", "Y", "X", "W", "V", "U", "T", "S"], r = ["A", "B", "C", "D", "E", "F", "G", "H"]; class n { constructor(e) { this.label = e } equals(e) { return null !== e && this.label === e.label } } function o(e, t) { const i = "left" === e ? s : r; return new n(t < i.length ? i[t] : "") } }, Dq3s: function(e) { e.exports = JSON.parse( '{"4":["v",["h",0,2],["h",1,3]],"6":["v",["h",0,2,4],["h",1,3,5]],"8":["v",["h",0,2,4,6],["h",1,3,5,7]],"2h":["h",0,1],"2v":["v",0,1],"2-1":["v",["h",0,2],1],"3s":["h",0,["v",1,2]],"3h":["h",0,1,2],"3v":["v",0,1,2],"1-2":["v",0,["h",1,2]],"3r":["h",["v",0,1],2],"4h":["h",0,1,2,3],"4v":["v",0,1,2,3],"4s":["h",0,["v",1,2,3]],"1-3":["v",0,["h",1,2,3]],"2-2":["v",["h",0,1],["v",2,3]],"1-4":["v",0,["h",1,2,3,4]],"5s":["h",0,["v",1,2,3,4]],"6c":["v",["h",0,1],["h",2,3],["h",4,5]],"8c":["v",["h",0,1],["h",2,3],["h",4,5],["h",6,7]],"s":0}' ) }, E3Wt: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("YFKU"), n = i("RDU5"); class o extends n.UndoCommand { constructor(e, t) { super(""), this._chartModel = e, this._targetIndex = t } redo() { const e = this._chartModel.createPane(this._targetIndex, void 0, this._paneId); this._paneId = e.id() } undo() { const e = Object(s.ensureDefined)(this._paneId), t = this._chartModel.panes().find(t => t.id() === e); void 0 !== t && this._chartModel.removePane(t) } createdPaneId() { return this._paneId } } var a = i("txPx"), l = i("25b6"), c = i("qHEz"); const h = Object(a.getLogger)("Clipboard"); class u { constructor(e) { this._e = e } write(e) { return Object(c.a)(this._toRaw(e), this._e) } _toRaw(e) { const t = { files: [] }; t.text = e.text, void 0 !== e.app ? t.html = this._serializeAppData(e.app, e.text) : e.html && (t.html = e.html); for (const i of e.files || []) t.files.push(i); return t } _serializeAppData(e, t) { return `${t ? Object(l.b)(t.slice(0, 256)) : "📈"}` } } class d { constructor(e) { this._e = e } async read() { this._e && 0 === this._e.eventPhase && (h.logWarn( "Cannot use an already dispatched ClipboardEvent for reading"), this ._e = null); const e = this._e ? this._readUsingEvent(this._e) : await this._readUsingApi(); return this._fromRaw(e) } _readUsingEvent(e) { const t = Object(s.ensure)(e.clipboardData); e.preventDefault(); const i = { files: [] }; for (let e = 0; e < t.files.length; e++) i.files.push(t.files[e]); for (let e = 0; e < t.items.length; e++) { const s = t.items[e]; "string" === s.kind && ("text/plain" === s.type ? i.text = t.getData(s.type) : "text/html" === s.type ? i.html = t.getData(s.type) : i.files.push( new Blob([t.getData(s.type)], { type: s.type }))) } return i } async _readUsingApi() { if (!navigator.clipboard || !navigator.clipboard.read) throw new DOMException( "ClipboardApi is not supported", "NotSupportedError"); let e, t; const i = [], s = await navigator.clipboard.read(); for (const r of s) for (const s of r.types) "text/html" === s ? e = r.getType(s).then(this ._readBlobAsText) : "text/plain" === s ? t = r.getType(s).then(this ._readBlobAsText) : i.push(r.getType(s)); return { text: await t, html: await e, files: await Promise.all(i) } } _fromRaw(e) { const t = {}; if (void 0 !== e.text && (t.text = e.text), void 0 !== e.html) { const i = this._parseAppData(e.html); i ? t.app = i : t.html = e.html } return e.files.length > 0 && (t.files = e.files), t } _parseAppData(e) { if (-1 === e.slice(0, 1024).indexOf("data-tradingview-clip")) return; const t = (new DOMParser).parseFromString(e, "text/html").querySelector( "[data-tradingview-clip]"); return t ? t.getAttribute("data-tradingview-clip") || "" : void 0 } _readBlobAsText(e) { return new Promise((t, i) => { const s = new FileReader; s.onloadend = () => { t(s.result) }, s.onerror = () => { i(s.error) }, s.readAsText(e) }) } } var p = i("d700"); function _(e) { const t = e.target; return null !== t && 1 === t.nodeType && Object(p.b)(t) } function m(e) { const t = e.target; if (null === t) return !1; const i = (t.ownerDocument || t).getSelection(); return null !== i && !i.isCollapsed } class f extends class { constructor(e) { this._callbacks = Object.assign({}, e), this._boundOnCopy = this._onCopyEv.bind( this), this._boundOnCut = this._onCutEv.bind(this), this._boundOnPaste = this._onPasteEv.bind(this) } listen() { document.addEventListener("copy", this._boundOnCopy), document.addEventListener( "cut", this._boundOnCut), document.addEventListener("paste", this ._boundOnPaste) } async peek() { if ("granted" !== (await navigator.permissions.query({ name: "clipboard-read" })).state) throw new Error("clipboard-read is not granted"); return new d(null).read() } uiRequestCopy(e) { this._callbacks.copyRequested && this._callbacks.copyRequested(new u(null), e) } uiRequestCut(e) { this._callbacks.cutRequested && this._callbacks.cutRequested(new u(null), e) } uiRequestPaste(e) { this._callbacks.pasteRequested && this._callbacks.pasteRequested(new d(null), e) } destroy() { document.removeEventListener("copy", this._boundOnCopy), document .removeEventListener("cut", this._boundOnCut), document.removeEventListener( "paste", this._boundOnPaste) } _onCopyEv(e) { e.defaultPrevented || this._callbacks.copyRequested && this._callbacks .copyRequested(new u(e)) } _onCutEv(e) { e.defaultPrevented || this._callbacks.cutRequested && this._callbacks.cutRequested( new u(e)) } _onPasteEv(e) { e.defaultPrevented || this._callbacks.pasteRequested && this._callbacks .pasteRequested(new d(e)) } } { _onCopyEv(e) { if (!_(e) && !m(e)) return super._onCopyEv(e) } _onCutEv(e) { if (!_(e) && !m(e)) return super._onCutEv(e) } _onPasteEv(e) { if (!_(e)) return super._onPasteEv(e) } } i.d(t, "applyIndicatorsToAllChartsImpl", (function() { return g })), i.d(t, "applyIndicatorToAllChartsImpl", (function() { return b })), i.d(t, "lineToolsAndGroupsDTOsImpl", (function() { return S })), i.d(t, "getStateForChartImpl", (function() { return y })), i.d(t, "getAsyncStateForChartImpl", (function() { return w })), i.d(t, "resetLineToolsInvalidatedImpl", (function() { return P })), i.d(t, "applyLineToolUpdateNotificationImpl", (function() { return C })), i.d(t, "createClipboardHandler", (function() { return x })), i.d(t, "setBrokerImpl", (function() { return T })), i.d(t, "chartsSymbolsImpl", (function() { return I })); Object(r.t)( "Please give us a clipboard writing permission in your browser or press {keystroke}"); function g(e, t) { const i = t.model().model().studyTemplate(); e.undoHistory.beginUndoMacro("Apply Indicators to Entire Layout"); for (let s = 0; s < e.chartWidgetsDefs.length; s++) { const r = e.chartWidgetsDefs[s].chartWidget; r !== t && (r.hasModel() && r.model().applyStudyTemplate(i, "")) } e.undoHistory.endUndoMacro() } function b(e, t, i, r, n) { e.undoHistory.beginUndoMacro(n); for (let a = 0; a < e.chartWidgetsDefs.length; a++) { const l = e.chartWidgetsDefs[a].chartWidget; if (l !== t && l.hasModel()) { const t = l.model(); let a; if (r.isOnMainPane) a = Object(s.ensureNotNull)(t.model().paneForSource(l.model() .model().mainSeries())); else { const i = new o(t.model(), r.paneIndex); e.undoHistory.pushUndoCommand(i); const n = Object(s.ensureDefined)(i.createdPaneId()); a = Object(s.ensureDefined)(t.model().panes().find(e => e.id() === n)) } const c = t.pasteSourceFromClip(a, i, !0); if (c && 1 === c.length) { const e = c[0]; if (r.asCompare) { const i = Object(s.ensureNotNull)(t.mainSeries().priceScale()); t.moveToScale(e, Object(s.ensureDefined)(a), i, n), t.setPriceScaleMode({ percentage: !0 }, i, "") } } t.model().lightUpdate() } } e.undoHistory.endUndoMacro() } function v(e) { let t = 1; for (; e.has("" + t);) t++; return "" + t } function S(e) { const t = new Map, i = e.chartsCountToSave(), s = new Set; for (let r = 0; r < i; r++) if (r < e.chartWidgetsDefs.length) { const i = e.chartWidgetsDefs[r].chartWidget, n = i.id(), o = i.lineToolsAndGroupsDTO(); t.set(n, o), s.add(n) } else { const i = e.savedChartWidgetOptions[r - e.chartWidgetsDefs.length].content; i.chartId || (i.chartId = v(s)), t.set(i.chartId, extractLineToolsDTOFromChartState(i)), s.add(i.chartId) } return t } function y(e, t, i, s, r, n) { if (t < e.chartWidgetsDefs.length) { const o = e.chartWidgetsDefs[t].chartWidget; return t < e.actualLayoutCount() || o.shouldBeSavedEvenIfHidden() ? o.state(i, s, r, n) : null } const o = e.savedChartWidgetOptions[t - e.chartWidgetsDefs.length].content; return o } function w(e, t) { return t < e.chartWidgetsDefs.length ? e.chartWidgetsDefs[t].chartWidget.asyncState() : Promise.resolve({}) } function P(e, t, i) { const s = e.chartsCountToSave(); for (let r = 0; r < s; r++) if (r < e.chartWidgetsDefs.length) { const s = e.chartWidgetsDefs[r].chartWidget, n = s.id(), o = i.get(n); s.resetLineToolsInvalidated(t, o) } else 0 } function C(e, t, i) { var s; null === (s = e.map(e => e.chartWidget).find(e => e.id() === t)) || void 0 === s || s .applyLineToolUpdateNotification(i) } function x(e) { return new f({ copyRequested: (t, i) => { e.activeChartWidget.value().model().clipboardCopy(t, i) }, cutRequested: (t, i) => { e.activeChartWidget.value().model().clipboardCut(t, i) }, pasteRequested: (t, i) => { (i ? i.model().undoModel() : e.activeChartWidget.value().model()) .clipboardPaste(t, i) } }) } function T(e, t) { 0 } function I(e) { const t = {}; return e.chartWidgetsDefs.map(e => e.chartWidget).forEach(e => t[e.id()] = function(e) { var t, i; const s = {}, r = e.model().mainSeries(), n = r.properties(), o = r.symbolInfo(); s.resolution = r.properties().interval.value(), s.symbol_type = null !== o && o .type || "", s.exchange = null !== o && o.exchange || "", s .listed_exchange = null !== o && o.listed_exchange || ""; const a = null !== (t = null == o ? void 0 : o.legs) && void 0 !== t ? t : []; if (null !== o && r.isSpread()) { const e = a[0]; let t = o.base_name[0]; t = t.split(":")[1], s.symbol = e, s.short_name = t, s.expression = o .full_name } else s.symbol = null !== o && o.ticker || n.symbol.value(), s.short_name = n .shortName.value(); const l = null !== (i = null == o ? void 0 : o.base_name) && void 0 !== i ? i : []; return s.legs = a.map((e, t) => ({ symbol: e, pro_symbol: l[t] })), s }(e)), t } }, E6p6: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "SessionStage", (function() { return s })), function(e) { e[e.PRE_SESSION = -1] = "PRE_SESSION", e[e.POST_SESSION = -2] = "POST_SESSION", e[e .LASTBAR_SESSION = -3] = "LASTBAR_SESSION" }(s || (s = {})) }, EJcV: function(e, t, i) { "use strict"; var s = i("rQHv"), r = i("ocLq"), n = i("8gnj"), o = i("XRI5").SymbolExtrapolator, a = i("ViuT").SessionTimeScale, l = i("gzUS").PointsetsManager, c = i("IiTo"), h = i("OLhd").createDwmAligner, u = i("LxhU").Interval, d = i("FQhm"), p = i("TlGQ").visitObject, _ = i("ogJP").isObject; i("2cgs"), i("MrEN"); var m = i("WIS0").DatafeedRequestsCachedProcessor, f = i("+6ja").timezoneIsAvailable, g = i("OLhd").isAlignmentEnabled, b = i("5fI3"), v = b.isEncodedExtendedSymbol, S = b.decodeExtendedSymbol, y = i("n5al").extractSymbolNameFromSymbolInfo, w = i("dUJ+").replaceGraphicsTimesWithTimePointIndexIndex, P = i("Kxc7"); function C(e) { var t = e.findIndex((function(e) { return -5e6 !== e.index })); return -1 === t ? [] : 0 === t ? e : e.slice(t) } function x(e, t) { return e + "_" + t } var T = function(e) { var t = this; this._studiesCache = {}, this._objectsDataCache = {}, this._studiesNonSeriesTimes = {}, this._metainfoCache = [], this._barsCoefficientsCache = {}, this._externalDatafeed = e, e.getVolumeProfileResolutionForPeriod && r .overwriteVolumeProfileResolutionForPeriodGetter((function(t, i, s, r) { return e.getVolumeProfileResolutionForPeriod(t, i, s, r) })), this._datafeedConfiguration = null, this._marketStatusWatchers = {}, this ._resolveRequests = {}, this._resolvePromisesBySymbolId = new Map, this ._symbolIdToSymbolRequestString = new Map, this._callbacks = {}, this ._serverTimeOffset = 0, t._logMessage("Datafeed settings received: {0}".format(JSON .stringify(window.configurationData))), t._datafeedConfiguration = t ._adoptConfigurationData(window.configurationData), t._fireEvent( "configuration_received"), t._externalDatafeed.getServerTime && t ._externalDatafeed.getServerTime((function(e) { t._serverTimeOffset = e - (new Date).valueOf() / 1e3 })), this._invalidatedPointsetSessions = new Set, this._refreshPointsetsTimerId = null, this._pointsetsManagers = {}, this._quotesInfo = [], this._depthInfo = [], this._endOfData = {}, this._computeStudyCounter = 0, this._symbolExtrapolators = {}, this._timeScales = {}, this._cachedDatafeed = new m(e, this.serverTimeOffset.bind( this), this._datafeedConfiguration.reset_cache_timeout), n.setupFeed({ resolve: function(e, i, s, r) { t._resolveSymbolByName(e, i, s, r) }, subscribe: function(e, i, s, r, n) { return t._cachedDatafeed.subscribe(e, i, s, function(e, i, s) { var r = new c.SessionInfo(e.timezone, e.session, e .session_holidays, e.corrections), n = c.newBarBuilder(i, r, r); return function(e) { if (e && e.count()) { var i = 1e3 * t.getCurrentUTCTime(); n.moveTo(i), n.indexOfBar(i) >= 0 && e .setLastBarClosed(!1) } s(e) } }(e, i, r), n) }, unsubscribe: function(e) { return t._cachedDatafeed.unsubscribe(e) } }) }; function I(e, t) { return e + "_" + t } function M(e, t, i) { return e + (t ? "_#_" + t : "") + (i ? "_#_" + i : "") } T.prototype._getSymbolExtrapolator = function(e, t, i) { var s = u.normalize(i), r = function(e, t, i) { return e + "," + t.full_name + "," + i }(e, t, s), n = this._symbolExtrapolators[r]; return void 0 === n && (n = new o(t, s), this._symbolExtrapolators[r] = n), n }, T.prototype._barsCoefficients = function(e, t) { if (void 0 === S(e).type) return {}; var i = e + t; return this._barsCoefficientsCache[i] || (this._barsCoefficientsCache[i] = {}), this ._barsCoefficientsCache[i] }, T.prototype.destroy = function() { this._cachedDatafeed.destroy(), this._externalDatafeed = null, Object.keys(this ._pointsetsManagers).forEach((function(e) { this._pointsetsManagers[e].destroy() }), this), this._pointsetsManagers = {} }, T.prototype.purgeCache = function() { this._endOfData = {}, this._resolveRequests = {}, this._objectsDataCache = {}, this ._studiesNonSeriesTimes = {}, this._studiesCache = {}, this ._resolvePromisesBySymbolId.clear(), this._symbolIdToSymbolRequestString.clear(), Object.keys(this._pointsetsManagers).forEach((function(e) { this._pointsetsManagers[e].destroy() }), this), this._pointsetsManagers = {}, Object.keys(this._timeScales).forEach(( function(e) { this._timeScales[e].destroy() }), this), this._timeScales = {}, Object.keys(this._symbolExtrapolators) .forEach((function(e) { this._symbolExtrapolators[e].destroy() }), this), this._symbolExtrapolators = {} }, T.prototype.purgeDataCache = function() { this._cachedDatafeed.purgeCache() }, T.prototype._logMessage = function(e) { P.enabled("charting_library_debug_mode") && console.log(e) }, T.prototype.on = function(e, t) { return this._callbacks.hasOwnProperty(e) || (this._callbacks[e] = []), this._callbacks[ e].push(t), this }, T.prototype._fireEvent = function(e, t, i) { if (this._callbacks.hasOwnProperty(e)) { for (var s = this._callbacks[e], r = 0; r < s.length; ++r) s[r](t); i || (this._callbacks[e] = []) } }, T.prototype._adoptConfigurationData = function(e) { var t = TradingView.merge({}, e), i = t.supported_resolutions; if (!i || 0 === i.length) return t.supported_resolutions = void 0, t; for (var s = [], r = 0; r < i.length; r++) { var n = i[r]; if (-1 !== s.indexOf(n)) throw new Error("Duplicating resolution `" + n + "`"); s.push(n) } return t.supported_resolutions = s, t }, T.prototype.supportedResolutions = function() { return this._datafeedConfiguration.supported_resolutions }, T.prototype.supportedCurrencies = function() { return this._datafeedConfiguration.currency_codes || [] }, T.prototype.supportedUnits = function() { return this._datafeedConfiguration.units || [] }, T.prototype.supportedSymbolsTypes = function() { return this._datafeedConfiguration.symbols_types || [] }, T.prototype.supportedExchangesList = function() { return this._datafeedConfiguration.exchanges || [] }, T.prototype.symbolsGrouping = function() { return this._datafeedConfiguration.symbols_grouping || { futures: /$a/ } }, T.prototype._findStudyObject = function(e) { e.endsWith("!") && (e = e.slice(0, -1)); var t = e.split("@")[0], i = JSServer.studyLibrary.filter((function(i) { return i.metainfo.id === e || i.metainfo.shortDescription === t })); return 0 === i.length ? null : i[0] }, T.prototype.getMarks = function(e, t, i, s, r) { var n = { red: 6, green: 5, blue: 4, yellow: 3 }; if (this._externalDatafeed.getMarks && this._datafeedConfiguration.supports_marks) { this._logMessage( "Requesting bars marks: symbol {0}, resolution {1}, range [{2} ... {3}]" .format(e.full_name, r, new Date(1e3 * t).toUTCString(), new Date(1e3 * i) .toUTCString())); var o = this; this._externalDatafeed.getMarks(e, t, i, (function(t) { var i = t.map((function(e) { return e.time = parseInt(e.time), e })); o._logMessage( "Received bars marks: symbol {0}, resolution {1}, marks {2}" .format(e.full_name, r, JSON.stringify(i))); var a = h(r, e), l = P.enabled("two_character_bar_marks_labels"), c = i.map((function(e) { return e.tickmark = null !== a ? a .timeToSessionStart(1e3 * e.time) / 1e3 : e .time, e.direction = n[e.color], e.onClicked = function() { d.emit("onMarkClick", e.id) }, e.label = !!e.label && (l ? e.label.slice(0, 2) : e.label[0]), e })); s(c) }), r) } }, T.prototype.getTimescaleMarks = function(e, t, i, s, r) { if (this._externalDatafeed.getTimescaleMarks && this._datafeedConfiguration .supports_timescale_marks) { this._logMessage( "Requesting timescale marks: symbol {0}, resolution {1}, range [{2} ... {3}]" .format(e.full_name, r, new Date(1e3 * t).toUTCString(), new Date(1e3 * i) .toUTCString())); var n = this; this._externalDatafeed.getTimescaleMarks(e, t, i, (function(t) { n._logMessage( "Received timescale marks: symbol {0}, resolution {1}, marks {2}" .format(e.full_name, r, JSON.stringify(t))); var i = h(r, e), o = t.map((function(e) { return e.tickmark = null !== i ? i .timeToSessionStart(1e3 * e.time) / 1e3 : e .time, e })); s(o) }), r) } }, T.prototype.getSeriesLastBarTime = function(e, t) { var i = this._getSeriesData(e, t); return null === i || 0 === i.length ? null : i[i.length - 1].timeMs }, T.prototype.getSeriesInterval = function(e, t) { var i = this._studiesCache[e][t]; return i ? i.resolution : null }, T.prototype.getSeriesSymbolInfo = function(e, t) { var i = this._studiesCache[e][t]; return i ? i.symbolInfo : null }, T.prototype.getSeriesInterval = function(e, t) { var i = this._studiesCache[e][t]; return i ? i.resolution : null }, T.prototype.getSeriesSymbolInfo = function(e, t) { var i = this._studiesCache[e][t]; return i ? i.symbolInfo : null }, T.prototype._getSeriesData = function(e, t) { return this._objectsDataCache[I(e, t)] || null }, T.prototype._computeStudy = async function(e, t, i, s, n, o, a, l, c, d) { var p = !0, _ = []; null !== l && (this._objectsDataCache[l] = null); var m = this._computeStudyCounter++; function f(e, t) { if (e < c()) return -5e6; if (0 === t) return 0; var i = _[t - 1].index; return -5e6 === i ? 0 : i + 1 } var b = new Map; var v = !1, S = this, y = function() { return S._studiesCache[e] && S._studiesCache[e][n] && S._studiesCache[e][n] .activeResolve === m }; S._studiesCache[e][n].activeResolve = m; var w, C, T = this._resolvePromisesBySymbolId.get(x(e, i)); if (void 0 === T) throw new Error("This should never happen"); try { var I = await T; w = I.symbolInfo, C = I.requestedSymbol } catch (e) { return void(y() && d.onSymbolErrorCallback(e)) } y() && function(i, c) { if (!u.parse(s).isIntraday() || i.has_intraday) { if (u.isDWM(s) && void 0 !== a.to) { var m = h(s, i); null !== m && (a.to = m.timeToExchangeTradingDay(a.to)) } try { var y = new r.StudyEngine({ tickerid: c, symbolInfo: i, period: s, body: t, sessionId: e, onErrorCallback: d.onErrorCallback, dataRange: a, forceAlignBars: !P.enabled( "disable_sameinterval_aligning") && g(), input: function(e) { return o[e] }, out: function(e, t) { ! function(e, t, i) { for (var s = e.time, r = "number" == typeof t ? [t] : t, n = 0; n < r .length; ++n) { var o = r[n]; o && "object" == typeof o && (b.set(n, o .offset), o = o.value), "number" == typeof o && isNaN(o) && (o = void 0), r[n] = o } var a = _.length - 1, l = a < 0 || s > _[a].timeMs; l ? _.push({ index: f(s, _.length), value: [s / 1e3].concat(r), timeMs: s }) : (_[a].index = f(s, a), _[a] .value = [s / 1e3].concat(r), _[a] .timeMs = s), p || d .onRealtimeCallback([_[_.length - 1]], l, _.length, b, i) }(e, t, i) }, nonseriesOut: function(e, t) { d.onNonSeriesDataUpdate(t, i) }, setNoMoreData: function() { v = !0 }, recalc: function(e, s) { p = !1, _.endOfData = v, t.error && null !== t .error() || (null !== l && (S ._objectsDataCache[l] = _), d .onDataReadyCallback(_, b, i, s)) } }); if (!S._studiesCache[e] || !S._studiesCache[e][n]) throw Error( "This should never happen"); S._studiesCache[e][n].engine = y } catch (e) { if (!e.studyError) throw e; d.onErrorCallback(e.message) } } else d.onErrorCallback( "Unsupported resolution. Did you forget to set has_intraday to true?" ) }(w, C) }, T.prototype._createStudy = function(e, t, i, s, r, n, o, a) { var l = this; function c(e, t, i) { e = C(e), l._timeScales[s].fillIndexesInRows(e), TradingView .ChartapiMessagerInstances[s].onDataUpdate(r, n, e, t), TradingView .ChartapiMessagerInstances[s].onStudyCompleted(r, n) } function h(e) { var t = {}; if (0 !== e.size) { var i = {}, n = l._studiesCache[s][r].metainfo; e.forEach((function(e, t) { i[n.plots[t].id] = e })), t.data = { offsets: i } } return t } a = function(e) { if (Array.isArray(e)) return e; for (var t = [], i = l._studiesCache[s][r].metainfo.inputs, n = 0; n < i .length; n++) t[n] = e[i[n].id]; return t }(a), TradingView.ChartapiMessagerInstances[s].onStudyLoading(r, n); var u = null, d = !1; l._computeStudy(s, i, e, t, r, a, this._seriesDataRange(s, o), null, (function() { if (null === u) { var e = l._getSeriesData(s, o)[0]; if (void 0 === e) return 1 / 0; u = e.timeMs } return u }), { onDataReadyCallback: function(e, t, i) { d && 0 === e.length || c(e, h(t)) }, onRealtimeCallback: function(e, t, i, o, a) { e = C(e), l._timeScales[s].fillIndexesInRows(e), TradingView .ChartapiMessagerInstances[s].onDataUpdate(r, n, e, h(o)) }, onSymbolErrorCallback: function() { TradingView.ChartapiMessagerInstances[s].onStudyError(r, n, "error in series") }, onErrorCallback: function(e) { TradingView.ChartapiMessagerInstances[s].onStudyError(r, n, e) }, onNonSeriesDataUpdate: function(e, t) { switch (d = !0, e.type) { case "projection": break; case "study_graphics": var i = { data: e.data, indexes: [] }, n = w(i); l._studiesNonSeriesTimes[s][r] = n, i.indexes = l ._timeScales[s].convertTimesToIndexes(n), c([], i); break; case "non_series_data": n = function(e) { var t = {}; p(e, (function(e) { _(e) && Object.keys(e).forEach(( function(i) { i.endsWith( "__t" ) && (t[e[i]] = ! 0) })) }), { visitInstances: !0 }); var i = Object.keys(t).map(Number).sort(( function(e, t) { return e - t })); return i.forEach((function(e, i) { t[e] = i })), Object.assign(e, p(e, (function(e) { return _(e) && Object.keys( e).forEach(( function(i) { i.endsWith( "__t" ) && (e[i.slice(0, - 3 )] = t[e[ i ]] ) })), e }), { visitInstances: !0 })), i }(i = { data: e.data, indexes: [] }); l._studiesNonSeriesTimes[s][r] = n, i.indexes = l ._timeScales[s].convertTimesToIndexes(n), c([], i); break; default: console.warn( "unsupported non-series data type for study " + e.type) } } }) }, T.prototype.onSessionSeriesError = function(e) { this.stopSources(e); var t = this._mainSeriesRecord(e); null !== t && (t.error = !0), this._applyTimeScaleUpdate(e, this._timeScales[e] .clearTimeScale()) }, T.prototype.modifySeries = function(e, t, i, s, r) { var n = this._mainSeriesRecord(e); if (null === n || n.guid !== t) { if (null !== n && n.error) return this._studiesCache[e][t].symbolId = i, this ._studiesCache[e][t].resolution = s, void(this._studiesCache[e][t] .turnaround = r); for (var o in this._stopSourcesTree(e, t), this.createSeries(e, t, r, i, s, { countBack: 0 }, !0), this._studiesCache[e]) { var a = this._studiesCache[e][o]; if (a && "study" === a.type && a.parentId === t) { this._studiesNonSeriesTimes[e][o] = null; var l = this._studiesCache[e][a.parentId]; this._createStudy(l.symbolId, l.resolution, a.studyObject, e, o, a .turnaround, a.parentId, a.inputs) } } } else this._modifyMainSeries(e, i, s, r) }, T.prototype._modifyMainSeries = function(e, t, i, s) { this.stopSources(e); var r = this._mainSeriesRecord(e); for (var n in this._studiesCache[e]) { (o = this._studiesCache[e][n]) && "series" === o.type && (o.guid === r.guid ? this.createSeries(e, r.guid, s, t, i, { countBack: 0 }, !0) : this.createSeries(e, o.guid, o.turnaround, o.symbolId, i, { countBack: 0 }, !0)) } for (var n in this._studiesCache[e]) { var o; if ((o = this._studiesCache[e][n]) && "study" === o.type) { this._studiesNonSeriesTimes[e][n] = null; var a = this._studiesCache[e][o.parentId]; this._createStudy(a.symbolId, a.resolution, o.studyObject, e, n, o .turnaround, o.parentId, o.inputs) } } this._applyTimeScaleUpdate(e, this._timeScales[e].clearTimeScale()) }, T.prototype.stopSources = function(e) { for (var t in this._studiesCache[e]) { var i = this._studiesCache[e][t]; i && "series" === i.type && this._stopSourcesTree(e, t) } }, T.prototype._stopSourcesTree = function(e, t) { for (var i in this._studiesCache[e]) { var s = this._studiesCache[e][i]; s && (("series" === s.type && i === t || "study" === s.type && s.parentId === t) && (s.engine && s.engine.isStarted() && s.engine.stop(), s .activeResolve = -1)) } n.unsubscribeUnused() }, T.prototype._recreateSourcesForDataRange = function(e, t) { var i = []; for (var s in this._studiesCache[e]) { (r = this._studiesCache[e][s]) && "series" === r.type && !this._isEndOfData(e, s, r.turnaround) && (this._stopSourcesTree(e, s), i.push(s)) } for (var s in i.forEach((function(i) { this._startSourcesTree(e, i, Object.assign({}, t)) }), this), this._studiesCache[e]) { var r; "series" === (r = this._studiesCache[e][s]).type && this._isEndOfData(e, s, r .turnaround) && TradingView.ChartapiMessagerInstances[e] .onSeriesCompleted(s, r.turnaround, r.engine.runner.host.symbolInfo .data_status) } this._updateTimeScaleState(e) }, T.prototype._startSourcesTree = function(e, t, i) { var s = this._studiesCache[e][t]; for (var r in this.createSeries(e, t, s.turnaround, s.symbolId, s.resolution, i, ! 0), this._studiesCache[e]) { var n = this._studiesCache[e][r]; n && "study" === n.type && n.parentId === t && this._createStudy(s.symbolId, s .resolution, n.studyObject, e, r, n.turnaround, n.parentId, n.inputs) } }, T.prototype.removeStudy = function(e, t) { this._studiesCache[e] && this._studiesCache[e][t] && this._studiesCache[e][t] .engine && (this._studiesCache[e][t].engine.stop(), n.unsubscribeUnused()), delete this._studiesCache[e][t], delete this._studiesNonSeriesTimes[e][t] }, T.prototype.removeSeries = function(e, t) { this._stopSourcesTree(e, t), delete this._studiesCache[e][t], this ._updateMainTsBuilder(e), this._timeScales[e].isCompleted() && this._timeScales[ e].setCompleted(!1); var i = this._timeScales[e].setSeriesBarsTimes(t, []); this._applyTimeScaleUpdate(e, i), this._updateTimeScaleState(e) }, T.prototype.modifyStudy = function(e, t, i, s) { var r = this._studiesCache[e][t]; if (!r) throw Error("This should never happen"); var o = this._studiesCache[e][r.parentId]; r.inputs = s, r.turnaround = i, r.engine && (r.engine.stop(), n .unsubscribeUnused()), this._studiesNonSeriesTimes[e][t] = null, this ._createStudy(o .symbolId, o.resolution, r.studyObject, e, t, i, r.parentId, s) }, T.prototype.createStudy = function(e, t, i, s, r, n) { var o = this._studiesCache[e][i], a = this._findStudyObject(r); if (null === a) return console.warn("Study does not exist: " + r), void TradingView .ChartapiMessagerInstances[e].onStudyError(t, s, "unknown study name"); var l = new a.constructor; this._studiesCache[e] = this._studiesCache[e] || {}, this._studiesCache[e][t] = { studyObject: l, guid: t, type: "study", inputs: n, metainfo: a.metainfo, turnaround: s, parentId: i }, this._studiesNonSeriesTimes[e][t] = null, this._createStudy(o.symbolId, o .resolution, l, e, t, s, i, n) }, T.prototype.sessionTimeScale = function(e) { return this._timeScales[e] || null }, T.prototype.isTimeScaleExtendedTo = function(e, t) { var i = this._mainSeriesRecord(e); if (u.isDWM(i.resolution) && null != i.symbolInfo) { var s = h(i.resolution, i.symbolInfo); null !== s && (t = s.timeToSessionStart(t)) } var r = this._timeScales[e].indexOfTime(t); return null !== r && r.index >= 0 }, T.prototype.ensureExtendedTo = function(e, t, i) { if (!this._studiesCache[t][e]) throw Error("This should never happen"); var s = this; setTimeout((function() { s._recreateSourcesForDataRange(t, { to: i }) }), 0) }, T.prototype.extendSeriesRange = function(e, t) { var i = this._timeScales[e].firstSeriesBarTime(); if (null !== i) { var s = this._mainSeriesRecord(e); if (u.isDWM(s.resolution) && null != s.symbolInfo) { var r = h(s.resolution, s.symbolInfo); null !== r && (i = r.timeToExchangeTradingDay(i)) } var n = this._symbolIdToSymbolRequestString.get(x(e, s.symbolId)), o = this._barsCoefficients(n, s.resolution), a = o.barsCoefficient || 1; if (!o.barsCoefficient) { var l = this._getSeriesData(e, s.guid); null !== l && (o.expectedBarsCount = l.length + t) } var c = this; setTimeout((function() { c._recreateSourcesForDataRange(e, { to: i, countBack: (t + 2) * a }) }), 0) } else this._logMessage("Nothing to extend - there is no points on time scale") }, T.prototype.seriesTurnaround = function(e, t) { return this._studiesCache[e] && this._studiesCache[e][t] && this._studiesCache[e][t] .turnaround }, T.prototype._seriesDataRange = function(e, t) { var i = this._studiesCache[e][t]; return null !== i.firstLoadedTimeMs ? { to: i.firstLoadedTimeMs, countBack: 0 } : i.dataRange }, T.prototype._applyTimeScaleUpdate = function(e, t) { if (null !== t) { var i = []; for (var s in this._studiesCache[e]) { var r = this._studiesCache[e][s]; if (r && "study" === r.type) { var n = this._studiesNonSeriesTimes[e][s]; if (n) { var o = { indexes: this._timeScales[e].convertTimesToIndexes(n), data: { indexes_replace: !0 } }; i.push({ objId: s, turnaround: r.turnaround, data: [], nonSeriesData: o }) } } } TradingView.ChartapiMessagerInstances[e].onTimescaleUpdate(t, i), Promise .resolve().then(function() { var t = this._mainSeriesRecord(e); if (null !== t && null != t.symbolInfo) { var i = this._getSymbolExtrapolator(e, t.symbolInfo, t .resolution); this._pointsetsManagers[e].getUpdatesForSymbol(t.symbolInfo .full_name, t.resolution, i, this._timeScales[e]) .forEach((function(t, i) { TradingView.ChartapiMessagerInstances[e] .onPointsetDataUpdate(i, null, t) })) } }.bind(this)) } }, T.prototype._updateMainTsBuilder = function(e) { var t = this._mainSeriesRecord(e); if (null !== t && null != t.symbolInfo) { var i = this._getSymbolExtrapolator(e, t.symbolInfo, t.resolution); this._timeScales[e].setMainSymbolExtrapolator(i) } }, T.prototype._updateTimeScaleState = function(e) { var t = !0, i = !0; for (var s in this._studiesCache[e]) { var r = this._studiesCache[e][s]; "series" === r.type && (i = i && this._isEndOfData(e, s, r.turnaround), t = t && r.completed) } this._timeScales[e].isCompleted() !== t && (this._timeScales[e].setCompleted(t), t && TradingView.ChartapiMessagerInstances[e].onTimescaleCompleted(i)) }, T.prototype._mainSeriesRecord = function(e) { var t = null, i = null; for (var s in this._studiesCache[e]) { var r = this._studiesCache[e][s]; if ("series" === r.type && (null === t && (t = r), r.isMain)) { i = r; break } } return null === i && (i = t), null !== i && (i.isMain = !0), i }, T.prototype._seriesCount = function(e) { var t = 0; for (var i in this._studiesCache[e]) { "series" === this._studiesCache[e][i].type && (t += 1) } return t }, T.prototype._prepareSeriesNonSeriesData = function(e, t, i) { var s = i.data[i.data.length - 1], r = this._getSeriesData(e, t), n = null === r ? [] : i.data; return { data: { data: { reversalAmount: i.reversalAmount, boxSize: i.boxSize, price: s ? s[4] : i.price, bars: n.map((function(e, t) { return { time: t, open: e[1], high: e[2], low: e[3], close: e[4], volume: e[5], factor: e[6], additionalPrice: e[6] } })) } }, indexes: this._timeScales[e].convertTimesToIndexes(n.map((function(e) { var t = e[0] || 0; return t < 0 ? r[r.length + t].timeMs : i.projectionTime + t }))) } }, T.prototype.createSeries = function(e, t, i, s, n, o, a) { this._setEndOfData(e, t, i, !1); var l = new r.OHLCV; this._studiesCache[e] = this._studiesCache[e] || {}; var c = this._getSeriesData(e, t), h = this._studiesCache[e][t], d = this._seriesCount(e), p = this._mainSeriesRecord(e); if (!h || u.isEqual(h.resolution, n) && h.symbolId === s) void 0 !== o.countBack && null !== c && 0 !== c.length && (o.to = c[0].timeMs), h && null != h .firstLoadedTimeMs ? o.to = void 0 !== o.to ? Math.min(h.firstLoadedTimeMs, o .to) : h.firstLoadedTimeMs : h || 0 === d || null !== p && (null != p .firstLoadedTimeMs ? (o.to = p.firstLoadedTimeMs, o.countBack = 0) : o = Object.assign({}, p.dataRange)); else if (1 === d) void 0 !== o.countBack && null !== c && (o.countBack += c.length); else { var _ = this._timeScales[e].firstSeriesBarTime(); (void 0 === o.to || null !== _ && _ < o.to) && (o.to = _, o.countBack = 0) } if (void 0 === o.countBack && (o.countBack = 0), void 0 === o.to && 0 === o .countBack && (o.countBack = 100), this._studiesCache[e][t] = { symbolId: s, resolution: n, studyObject: l, guid: t, type: "series", turnaround: i, dataRange: o, firstLoadedTimeMs: null, symbolInfo: null, isMain: h && h.isMain || 0 === d, completed: !1 }, null === p || p.guid === t || !p.error) { this._updateMainTsBuilder(e), this._updateTimeScaleState(e), TradingView .ChartapiMessagerInstances[e].onSeriesLoading(t, i); var m = this; this._computeStudy(e, l, s, n, t, [], o, I(e, t), (function() { return -1 / 0 }), { onDataReadyCallback: function(r, o, l, c) { var h = m._studiesCache[e][t]; if (!h) throw Error("This should never happen"); if (h.symbolInfo = l, h.firstLoadedTimeMs = c .firstLoadedTimeMs, h.completed = !0, m ._updateMainTsBuilder(e), a && m._pointsetsManagers[e] .invalidatePointsetsForSymbol(l.full_name, n), 0 !== r .length) { var u = m._symbolIdToSymbolRequestString.get(x(e, s)), d = m._barsCoefficients(u, n); d.expectedBarsCount && d.barsCount && (d .barsCoefficient = Math.min(Math.max(d .barsCoefficient || 1, parseInt(d .expectedBarsCount / (r.length - d .barsCount) + .5)), 100)), d .barsCount = r.length, m._clearSeriesData(e, t) } else !c.endOfData && h.isMain && setTimeout((function() { m._studiesCache[e] && m ._recreateSourcesForDataRange(e, { countBack: 10 }) }), 0); f(l), c.endOfData && (m._logMessage( "Series has no more data on server: {0}".format( l.full_name)), m._setEndOfData(e, t, i)), 0 === r.length && m._clearSeriesData(e, t), TradingView .ChartapiMessagerInstances[e].onSeriesCompleted(t, i, l .data_status), m._updateTimeScaleState(e) }, onRealtimeCallback: function(s, r, n, o, a) { f(a, s), m._timeScales[e].fillIndexesInRows(s); var l = s[s.length - 1]; if (r) { if (!m._studiesCache[e][t]) throw Error( "This should never happen"); m._logMessage("New bar arrived: symbol {0}, bar {1}" .format(a.full_name, JSON.stringify(l))) } else m._logMessage("Last bar update: symbol {0}, bar {1}" .format(a.full_name, JSON.stringify(l))), TradingView.ChartapiMessagerInstances[e].onDataUpdate(t, i, s, null); m._fireEvent("realtime_tick", s[s.length - 1], !0) }, onSymbolErrorCallback: function(t) { m._logMessage("Series symbol resolve error"), TradingView .ChartapiMessagerInstances[e].onSymbolError(s, t || "resolve error"), g(t || "resolve error") }, onErrorCallback: function(e) { m._logMessage("Series error: " + e), g(e) }, onNonSeriesDataUpdate: function(s, r) { if ("projection" !== s.type) throw new Error( "unexpected non-series data type for series " + s.type); var n = m._getSeriesData(e, t); if (null !== n) f(r, 0 === n.length ? void 0 : [n[n.length - 1]], s); else { s = m._prepareSeriesNonSeriesData(e, t, s); TradingView.ChartapiMessagerInstances[e].onDataUpdate(t, i, [], s) } } }) } function f(s, r, o) { var a = []; if (void 0 !== o) { var l = (o.data || []).reduce((function(e, t) { return Math.max(e, t[0] || 0) }), -1); if (null != o.projectionTime) for (var c = 0; c <= l; ++c) a.push(o.projectionTime + c) } var h = null, u = null, d = s ? m._getSymbolExtrapolator(e, s, n) : null; if (void 0 !== r) { var p = r.map((function(e) { return e.timeMs })).concat(a); null !== d && d.replaceBarsTimesTail(p, r.length), u = m._timeScales[e] .replaceSeriesBarsTimesTail(t, p), h = r } else { var _ = m._getSeriesData(e, t) || [], f = _.map((function(e) { return e.timeMs })).concat(a); null !== d && d.setBarsTimes(f, _.length), u = m._timeScales[e] .setSeriesBarsTimes(t, f), h = _ } if (m._applyTimeScaleUpdate(e, u), 0 !== h.length || void 0 !== o) { m._timeScales[e].fillIndexesInRows(h); var g = void 0 !== o ? m._prepareSeriesNonSeriesData(e, t, o) : null; TradingView.ChartapiMessagerInstances[e].onDataUpdate(t, i, h, g) } } function g(s) { var r = m._studiesCache[e][t]; r.completed = !0, TradingView.ChartapiMessagerInstances[e].onSeriesError(t, i, s), P.enabled("clear_bars_on_series_error") && (r.isMain ? m .onSessionSeriesError(e) : m._clearSeriesData(e, t)) } }, T.prototype._clearSeriesData = function(e, t) { var i = {}; for (var s in i[t] = { turnaround: this._studiesCache[e][t].turnaround }, this._studiesCache[e]) { var r = this._studiesCache[e][s]; "study" === r.type && r.parentId === t && (i[s] = { turnaround: r.turnaround }) } TradingView.ChartapiMessagerInstances[e].onClearData(i) }, T.prototype.requestMoreTickmarks = function(e, t) { var i = this._timeScales[e]; i.setMinFutureBarsCount(i.minFutureBarsCount() + t); var s = i.firstFutureBarIndex(), r = i.tickMarks(s); TradingView.ChartapiMessagerInstances[e].onTickmarksUpdated(s, r) }, T.prototype.chartCreateSession = function(e) { this._pointsetsManagers[e] = new l, this._timeScales[e] = new a, this ._studiesNonSeriesTimes[e] = {} }, T.prototype.chartDeleteSession = function(e) { this._pointsetsManagers[e].destroy(), delete this._pointsetsManagers[e], this ._timeScales[e].destroy(), delete this._timeScales[e], delete this ._studiesNonSeriesTimes[e] }, T.prototype.removePointset = function(e, t) { this._pointsetsManagers[e].removePointset(t) }, T.prototype.createPointset = async function(e, t, i, s, r) { var n, o = this._resolvePromisesBySymbolId.get(x(e, i)); try { n = (await o).symbolInfo } catch (e) { return } var a = this._getSymbolExtrapolator(e, n, s); if (this._pointsetsManagers[e].createPointset(t, n.full_name, s, r, a), null === this._refreshPointsetsTimerId) { var l = this; this._refreshPointsetsTimerId = setTimeout((function() { l._refreshPointsetsTimerId = null, l._refreshPointsets(l ._invalidatedPointsetSessions), l ._invalidatedPointsetSessions.clear() }), 0) } this._invalidatedPointsetSessions.add(e) }, T.prototype._refreshPointsets = function(e) { var t = this; e.forEach((function(e) { var i = t._studiesCache[e]; if (null != i) { var s = null; for (var r in i) { var n = i[r]; if ("series" === n.type) { s = n; break } } if (null !== s && null != s.symbolInfo) { var o = t._getSymbolExtrapolator(e, s.symbolInfo, s .resolution); t._pointsetsManagers[e].getUpdatesForSymbol(s.symbolInfo .full_name, s.resolution, o, t._timeScales[e]) .forEach((function(t, i) { TradingView.ChartapiMessagerInstances[e] .onPointsetDataUpdate(i, null, t) })) } } })) }, T.prototype.studiesMetadata = function() { return 0 === this._metainfoCache.length && (this._metainfoCache = JSServer .studyLibrary.map((function(e) { return e.metainfo })), this._metainfoCache.push({ palettes: {}, inputs: [], plots: [{ id: "open", type: "line" }, { id: "high", type: "line" }, { id: "low", type: "line" }, { id: "close", type: "line" }, { id: "volume", type: "line" }], graphics: {}, _metainfoVersion: 48, description: "Unnamed Study", format: { type: "inherit" }, is_hidden_study: !0, is_price_study: !1, shortDescription: "Unnamed Study", description_localized: "Unnamed Study", id: "BarSetHeikenAshi@tv-prostudies", shortId: "BarSetHeikenAshi", packageId: "tv-basicstudies", version: "13", fullId: "BarSetHeikenAshi@tv-basicstudies-13", productId: "tv-basicstudies", name: "BarSetHeikenAshi@tv-basicstudies" })), this._metainfoCache }, T.prototype.searchSymbols = function(e, t, i, s) { this._logMessage( "Symbol search requested: search string `{0}`, exchange: `{1}`, type `{2}`" .format(e, t, i)); var r = this; this._externalDatafeed.searchSymbols(e, t, i, (function(e) { r._logMessage("Symbol search response: {0}".format(JSON .stringify(e))), s(e) })) }, T.prototype.resolveSymbol = function(e, t, i) { var s = this; this._symbolIdToSymbolRequestString.set(x(e, t), i), this ._resolvePromisesBySymbolId.set(x(e, t), new Promise((function(r, n) { s._resolveSymbolImpl(i, (function(s) { TradingView.ChartapiMessagerInstances[e] .onSymbolResolved(t, s), r({ symbolInfo: s, requestedSymbol: i }) }), (function(i) { TradingView.ChartapiMessagerInstances[e] .onSymbolError(t, i), n(i) })) }))) }, T.prototype._resolveSymbolImpl = function(e, t, i) { v(e) || console.error( "Expect to get symbol encoded string, but got the following instead: " + e); var s = S(e), r = "string" == typeof s.symbol ? s : s.symbol, n = r.symbol, o = r["currency-id"], a = r["unit-id"]; this._resolveSymbolByName(n, { currency: o, unit: a }, t, i) }, T.prototype._resolveSymbolByName = function(e, t, i, s) { var r, n = t && t.currency, o = t && t.unit, a = M(e, n, o); if (this._resolveRequests[a]) r = this._resolveRequests[a]; else { r = this._resolveSymbolInternal(e, n || void 0, o || void 0), this ._resolveRequests[a] = r; var l = this; r.then((function(t) { l._resolveRequests[M(e, t.currency_id, t.unit_id)] = r, l ._resolveRequests[M(y(t, null), t.currency_id, t .unit_id)] = r, l._resolveRequests[M(y(t, null), n, o)] = r })).catch((function() {})) } r.then(i).catch(s) }, T.prototype._resolveSymbolInternal = function(e, t, i) { var s = this; return new Promise(function(r, n) { this._logMessage("Symbol resolve requested: `{0}` ".format(e)); var o = !0; this._externalDatafeed.resolveSymbol(e, (function(t) { o && console.warn( "`resolveSymbol` should return result asynchronously. Use `setTimeout` with 0 interval to execute the callback function." ), s._logMessage( "Symbol resolved: `{0}`, SymbolInfo in server response {1}" .format(e, JSON.stringify(t))), function(e) { if (e.base_name || (e.base_name = [e.name]), e.legs || (e.legs = [e.name]), e .exchange || (e.exchange = e[ "exchange-listed"]), e.full_name || (e.full_name = e.symbol || (e.exchange ? e.exchange + ":" + e.name : e .name)), e.pro_name || (e.pro_name = e.full_name), e.data_status || (e .data_status = "streaming"), e .ticker || (e.ticker = e.symbol || e .name), !e.session && e[ "session-regular"] && (e.session = e["session-regular"]), !e.minmov && e.minmovement && (e.minmov = e .minmovement), e.currency_code && (e .currency_id = e.currency_code), e .original_currency_code && (e .original_currency_id = e .original_currency_code), e .holidays && (e.session_holidays = e .holidays), e.supported_resolutions) for (var t = 0; t < e .supported_resolutions.length; t++ ) { var i = u.parse(e .supported_resolutions[t]); i.isValid() && (e .supported_resolutions[t] = i.value()) } }(t), function(e) { function t(e) { console.warn("SymbolInfo validation: " + e) } if (e.has_empty_bars && !g() && t( 'both has_empty_bars field and featureset "disable_resolution_rebuild" are enabled and may cause data issues (see #3329)' ), (void 0 === e.minmov || e .minmov <= 0) && t( "minmov must be positive"), ( void 0 === e.pricescale || e .pricescale <= 0) && t( "pricescale must be positive"), void 0 !== e.name && 0 !== e.name .length || t( "name must be non-empty string"), void 0 !== e.session && 0 !== e.session .length || t( "session must be non-empty string"), void 0 !== e.holidays && t( "field holidays is deprecated, use session_holidays instead" ), void 0 === e.timezone || 0 === e .timezone.length ? t( "timezone must be non-empty string" ) : "exchange" !== e.timezone && f(e .timezone) || "UTC" !== e .timezone && t( 'unsupported timezone "{0}"'.format( e.timezone)), void 0 !== e .intraday_multipliers) { var i = e.intraday_multipliers; if (Array.isArray(i)) for (var s = 0; s < i.length; ++s) "string" != typeof i[s] && t( 'intraday_multipliers[{0}] = "{1}" must be string (now: {2})' .format(s + 1, i[s], typeof i[s])); else t( "intraday_multipliers must be array" ) }(e.supported_resolutions || []).filter(( function(e) { return !u.isValid(e) })).forEach((function(e) { t("supported_resolutions field contains invalid value: " + e) })) }(t), s._logMessage( "Symbol info after post-processing: `{0}`, SymbolInfo {1}" .format(e, JSON.stringify(t))), r(t) }), (function(t) { s._logMessage( "Symbol resolve failed: `{0}`, reason: `{1}`" .format(e, t)), n(t) }), { currencyCode: t, unitId: i }), o = !1 }.bind(this)) }, T.prototype._createMarketStatusWatchers = function(e, t) { void 0 === this._marketStatusWatchers[e] && (this._marketStatusWatchers[ e] = {}); var i = this; t.forEach((function(t) { void 0 === i._marketStatusWatchers[e][t] && (i ._marketStatusWatchers[e][t] = new s(i ._resolveSymbolByName.bind(i), e, t)) })) }, T.prototype._removeMarketStatusWatchers = function(e) { var t = this; Object.keys(this._marketStatusWatchers[e] || {}).forEach((function(i) { t._marketStatusWatchers[e][i].stop() })), this._marketStatusWatchers[e] = {} }, T.prototype._stopQuotesSubscription = function(e) { this._quotesInfo[e].listenerGUID && (this._externalDatafeed.unsubscribeQuotes( this._quotesInfo[e].listenerGUID), this._quotesInfo[e] .listenerGUID = void 0), this._removeMarketStatusWatchers(e) }, T.prototype._startQuotesSubscription = function(e) { var t = {}, i = this; function s(t, s) { var r = i._marketStatusWatchers[e][t.n]; t.symbolname = t.n, t.status = t.s, t.values = t.v, t.values.change = t.v .ch, t.values.last_price = t.v.lp, t.values.change_percent = t.v.chp, t .values.current_session = t.v.cs || r && r.marketStatus(), t.values .pricescale = s.pricescale, t.values.minmov = s.minmov, t.values .minmove2 = s.minmove2 || 0, t.values.fractional = s.fractional || !1, r && t.v.cs && r.stop(), TradingView.ChartapiMessagerInstances[e] .onQuotesData([e].concat([t])) } function r(e) { e.forEach((function(e) { void 0 !== t[e.n] ? null !== t[e.n] && s(e, t[e.n]) : i ._resolveSymbolByName(e.n, null, (function(i) { t[e.n] = i, s(e, i) }), (function() { t[e.n] = null })) })) } var n = this._quotesInfo[e].symbols; 0 !== n.length && (this._externalDatafeed.getQuotes && !P.enabled( "charting_library") ? this._externalDatafeed.getQuotes(n, (function( t) { i._quotesInfo[e] && (r(t), i._quotesInfo[e].listenerGUID = e, i._externalDatafeed.subscribeQuotes(n, i ._quotesInfo[e].fastSymbols, r, i._quotesInfo[e] .listenerGUID)) }), (function(e) {})) : !this._externalDatafeed.getQuotes && P.enabled( "trading_terminal") && setTimeout((function() { r(n.map((function(e) { return { n: e, s: "ok", v: {} } }))) })), this._createMarketStatusWatchers(e, n)) }, T.prototype._restartQuotesSubscription = function(e) { this._stopQuotesSubscription(e), this._startQuotesSubscription(e) }, T.prototype.quoteCreateSession = function(e) { this._quotesInfo[e] = { symbols: [], fastSymbols: [], listenerGUID: void 0 } }, T.prototype.quoteDeleteSession = function(e) { this._stopQuotesSubscription(e), this._quotesInfo[e] = null }, T.prototype.quoteSetFields = function(e, t) {}, T.prototype.quoteAddSymbols = function(e, t) { this._quotesInfo[e].symbols = this._filteredSymbols(this._quotesInfo[e].symbols .concat(t)), this._restartQuotesSubscription(e) }, T.prototype.quoteRemoveSymbols = function(e, t) { this._quotesInfo[e].symbols = this._quotesInfo[e].symbols.filter((function(e) { return t.indexOf(e) < 0 })), this._restartQuotesSubscription(e) }, T.prototype.quoteFastSymbols = function(e, t) { this._quotesInfo[e].fastSymbols = this._filteredSymbols(t), this ._restartQuotesSubscription(e) }, T.prototype.quoteHibernateAll = function(e) {}, T.prototype ._stopDepthSubscription = function(e) { this._depthInfo[e].listenerGUID && (this._externalDatafeed.unsubscribeDepth(this ._depthInfo[e].listenerGUID), this._depthInfo[e].listenerGUID = void 0) }, T.prototype._startDepthSubscription = function(e) { var t = this, i = this._depthInfo[e].symbol; function s(e) { return e.map((function(e) { return { p: e.price, v: e.volume } })) } function r(e) { var t = {}; return t.s = i, t.bids = s(e.bids), t.asks = s(e.asks), t } i && this._externalDatafeed.subscribeDepth && (t._depthInfo[e].listenerGUID = this._externalDatafeed.subscribeDepth(i, (function(i) { var s; t._depthInfo[e] && ((s = i).snapshot ? TradingView .ChartapiMessagerInstances[e].onDepthData([e] .concat([r(s)])) : TradingView .ChartapiMessagerInstances[e].onDepthUpdate([e] .concat([r(s)]))) }))) }, T.prototype._restartDepthSubscription = function(e) { this._stopDepthSubscription(e), this._startDepthSubscription(e) }, T.prototype.depthCreateSession = function(e) { this._depthInfo[e] = { symbol: null, listenerGUID: void 0 } }, T.prototype.depthDeleteSession = function(e) { this._depthInfo[e].symbol = null, this._stopDepthSubscription(e), delete this ._depthInfo[e] }, T.prototype.depthSetSymbol = function(e, t) { this._depthInfo[e].symbol = t, this._restartDepthSubscription(e) }, T.prototype._filteredSymbols = function(e) { var t = []; return e.forEach((function(e) { e instanceof Object || t.indexOf(e) < 0 && t.push(e) })), t }, T.prototype._isEndOfData = function(e, t, i) { var s = e + "!" + t + "@" + i; return !!this._endOfData[s] }, T.prototype._setEndOfData = function(e, t, i, s) { var r = e + "!" + t + "@" + i; this._endOfData[r] = !1 !== s }, T.prototype.serverTimeOffset = function() { return this._serverTimeOffset }, T.prototype.serverTime = function() { return 1e3 * this.getCurrentUTCTime() }, T.prototype.getCurrentUTCTime = function() { return (new Date).valueOf() / 1e3 + this._serverTimeOffset }, T.prototype.switchTimezone = function(e, t) { this._timeScales[e].setTimezone(t); var i = this._timeScales[e].tickMarks(); null !== i && TradingView.ChartapiMessagerInstances[e].onTickmarksUpdated(0, i) }, e.exports = T }, EX27: function(e, t, i) { "use strict"; var s = i("Eyy1").ensureNotNull, r = i("IiTo"), n = i("LxhU").Interval, o = i("EJcV"), a = i("MrEN"), l = i("XzZr"), c = l.ChartApiInterface, h = l.HandlerInfo, u = i("ogJP").requireFullInterfaceImplementation, d = i("txPx").getLogger("Chart.ChartApiLocal"), p = i("uDHo").TIMEFRAMETYPE, _ = i("OLhd").createDwmAligner; TradingView.STUDY_COUNT_LIMIT = 210, JSServer.ChartApi = function(e) { this._notificationHandlers = {}, this._sessions = {}, this.studyCounter = 0, this ._connected = !1, this._enabled = !1, this._studyEngine = new o(e), this ._callbacks = {}, this._serverTimeOffset = 0; var t = this; this._studyEngine.on("configuration_received", (function() { t._fireEvent("configuration_received") })), this._studyEngine.on("realtime_tick", (function(e) { var i = { time: e.value[0] / 1e3, open: e.value[1], high: e.value[2], low: e.value[3], close: e.value[4], volume: e.value[5] }; t._fireEvent("realtime_tick", i, !0) })), this._setVisibleRangeTimeout = {} }, JSServer.ChartApi.prototype.destroy = function() { this._studyEngine.destroy(), this._studyEngine = null }, JSServer.ChartApi.prototype.purgeCache = function(e) { this._studyEngine.purgeCache(), this._studyEngine.purgeDataCache() }, JSServer.ChartApi.prototype.defaultWatchlistSymbols = function() { return this._watchlistSettings.default_symbols }, JSServer.ChartApi.prototype.defaultResolutions = function() { return this._studyEngine.supportedResolutions() || ["1", "3", "5", "15", "30", "45", "60", "120", "180", "240", "1D", "1W", "1M" ] }, JSServer.ChartApi.prototype.availableCurrencies = function() { var e = this._studyEngine.supportedCurrencies().map((function(e) { return { id: e, code: e, convertible: !0 } })); return Promise.resolve(e) }, JSServer.ChartApi.prototype.availableUnits = function() { return Promise.resolve(this._studyEngine.supportedUnits()) }, JSServer.ChartApi.prototype.supportedSymbolsTypes = function() { return this._studyEngine.supportedSymbolsTypes() }, JSServer.ChartApi.prototype.supportedExchangesList = function() { return this._studyEngine.supportedExchangesList() }, JSServer.ChartApi.prototype.symbolsGrouping = function() { return this._studyEngine.symbolsGrouping() }, JSServer.ChartApi.prototype.start = function() { this._enabled = !0, this._fireEvent("start_enabled") }, JSServer.ChartApi.prototype.unsubscribe = function(e, t) { var i = this._callbacks[e]; i && i.splice(i.indexOf(t), 1) }, JSServer.ChartApi.prototype.on = function(e, t) { return this._callbacks.hasOwnProperty(e) || (this._callbacks[e] = []), this._callbacks[ e].push(t), this }, JSServer.ChartApi.prototype._fireEvent = function(e, t, i) { if (this._callbacks.hasOwnProperty(e)) { var s = this._callbacks[e].slice(0); i || (this._callbacks[e] = []); for (var r = 0; r < s.length; ++r) s[r](t) } }, JSServer.ChartApi.prototype.chartCreateSession = function(e, t) { this._studyEngine.chartCreateSession(e) }, JSServer.ChartApi.prototype.chartDeleteSession = function(e) { this._studyEngine.chartDeleteSession(e) }, JSServer.ChartApi.prototype.createSession = function(e, t) { TradingView.ChartapiMessagerInstances[e] = new a(this, e), this._sessions[e] = t, this ._notificationHandlers[e] = {}, this.connected() && t.onMessage({ method: "connected", params: [] }) }, JSServer.ChartApi.prototype.removeSession = function(e) { delete this._sessions[e], delete this._notificationHandlers[e], this._studyEngine .stopSources(e) }, JSServer.ChartApi.prototype.connected = function() { return this._connected }, JSServer.ChartApi.prototype.connect = function() { if (this._enabled) this.connected() || (this._connected = !0, this.sessionid = "dummy session id", this._notifySessions({ method: "connected", params: [] })); else { var e = this; this.on("start_enabled", (function() { e.connect() })) } }, JSServer.ChartApi.prototype.disconnect = function() { this._connected = !1, this._notifySessions({ method: "disconnected", params: [] }), this.purgeCache(), this.studyCounter = 0 }, JSServer.ChartApi.prototype.switchTimezone = function(e, t) { this._studyEngine.switchTimezone(e, t) }, JSServer.ChartApi.prototype.receiveLocalResponse = function(e) { this._dispathNotification(e), this._fireEvent("message_" + e.method, void 0, !0) }, JSServer.ChartApi.prototype.getMarks = function(e, t, i, s, r) { this._studyEngine.getMarks(e, t, i, s, r) }, JSServer.ChartApi.prototype.getTimescaleMarks = function(e, t, i, s, r) { this._studyEngine.getTimescaleMarks(e, t, i, s, r) }, JSServer.ChartApi.prototype.resolveSymbol = function(e, t, i, s, r) { this._notificationHandlers[e][t] = new h(s, t), this._studyEngine.resolveSymbol(e, t, i) }, JSServer.ChartApi.prototype._doWhenSeriesDataReceived = function(e, t) { TradingView.ChartapiMessagerInstances[e].seriesCompleted.subscribe(null, t, !0) }, JSServer.ChartApi.prototype.createSeries = function(e, t, i, s, r, n, o, a) { var l = this; this._notificationHandlers[e][t] = new h((function(r) { "series_completed" === r.method && null !== o && (l._applyTimeFrame(e, s, t, i, o), o = null), a(r) }), t), this._studyEngine.createSeries(e, t, i, s, r, { countBack: n || 300 }) }, JSServer.ChartApi.prototype.removeSeries = function(e, t) { delete this._notificationHandlers[e][t], this._studyEngine.removeSeries(e, t) }, JSServer.ChartApi.prototype.setVisibleTimeRange = function(e, t, i, r, n, o, a, l) { var c = r, h = !0 !== (a = a || {}).applyDefaultRightMargin && void 0 === a .percentRightMargin && void 0 !== n ? n : null, u = _(this._studyEngine.getSeriesInterval(e, t), this._studyEngine .getSeriesSymbolInfo(e, t)); null !== u && (c = u.timeToSessionStart(1e3 * c) / 1e3, null !== h && (h = u .timeToSessionStart(1e3 * h) / 1e3)); var d = this; function p() { var r = d._studyEngine.sessionTimeScale(e); if (null !== r) { var n, u = r.indexOfTime(1e3 * c); if (null === h) n = r.lastSessionBarIndex(); else { var p = r.indexOfTime(1e3 * h); n = p && p.index } if (null !== u && null !== n) { var _ = u.index; if (u.timeMs < 1e3 * c && (_ += 1), !1 === o) { const e = s(r.firstSessionBarIndex()); _ < e && (_ = e) } _ > n || (TradingView.ChartapiMessagerInstances[e].onSeriesTimeframeUpdate( t, i, _, n, a), l && setTimeout(l, 0)) } } } if (this._studyEngine.isTimeScaleExtendedTo(e, 1e3 * r)) p(); else { var m = TradingView.ChartapiMessagerInstances[e].seriesCompleted, f = TradingView.ChartapiMessagerInstances[e].seriesError; void 0 !== this._setVisibleRangeTimeout[e] && clearTimeout(this ._setVisibleRangeTimeout[e]), this._setVisibleRangeTimeout[e] = setTimeout( function() { delete this._setVisibleRangeTimeout[e], m.subscribe(null, g, !0), f .subscribe(null, b, !0), this._studyEngine.ensureExtendedTo(t, e, 1e3 * r) }.bind(this), 0) } function g(e, s) { e === t && s === i && (m.unsubscribe(null, g), f.unsubscribe(null, b), p()) } function b(e, s) { e === t && s === i && m.unsubscribe(null, g) } }, JSServer.ChartApi.prototype._applyTimeFrame = function(e, t, i, s, o) { var a, l, c = {}, h = !0; if (o.type === p.PeriodBack) { var u = this._studyEngine.getSeriesLastBarTime(e, i); if (null === u) return; l = u / 1e3; var d = n.parse(o.value), m = this._studyEngine.getSeriesSymbolInfo(e, i); a = r.alignPeriodsBackForVisibleRange(m.session, m.session_holidays, m.corrections, d.letter(), d.multiplier(), 1, u) / 1e3; var f = _(this._studyEngine.getSeriesInterval(e, i), m); null !== f && (l = f.timeToExchangeTradingDay(1e3 * l) / 1e3, a = f .timeToExchangeTradingDay(1e3 * a) / 1e3), c = { applyDefaultRightMargin: !0 }, h = !1 } else a = o.from, l = o.to; this.setVisibleTimeRange(e, i, s, a, l, h, c) }, JSServer.ChartApi.prototype.modifySeries = function(e, t, i, s, r, n, o) { var a = this; this._notificationHandlers[e][t] = new h((function(r) { "series_completed" === r.method && null !== n && (a._applyTimeFrame(e, s, t, i, n), n = null), o(r) }), t), this._studyEngine.modifySeries(e, t, s, r, i) }, JSServer.ChartApi.prototype.requestMoreData = function(e, t) { this._studyEngine.extendSeriesRange(e, t) }, JSServer.ChartApi.prototype.setStudiesAccessController = function(e) { this.studiesAccessController = e }, JSServer.ChartApi.prototype.setWatchlistSettings = function(e) { this._watchlistSettings = e }, JSServer.ChartApi.prototype.allStudiesMetadata = function() { return this._studyEngine.studiesMetadata() }, JSServer.ChartApi.prototype.requestMetadata = function(e, t, i) { this._notificationHandlers[e][t] = new h(i, t); var s = this.studiesAccessController.getEnabledTools(); TradingView.ChartapiMessagerInstances[e].onRequestMetadata(t, s) }, JSServer.ChartApi.prototype.isCanCreateStudy = function() { return this.studyCounter < TradingView.STUDY_COUNT_LIMIT }, JSServer.ChartApi.prototype.createStudy = function(e, t, i, s, r, n, o) { if (!this.isCanCreateStudy()) throw new Error("Exceeded the limit of studies"); this._notificationHandlers[e][t] = new h(o, t), this._studyEngine.createStudy(e, t, s, i, r, n), this.studyCounter++ }, JSServer.ChartApi.prototype.rebindStudy = function(e, t, i, s, r, n, o, a) { throw new Error("Not implemented") }, JSServer.ChartApi.prototype.removeStudy = function(e, t, i) { delete this._notificationHandlers[e][t], this._studyEngine.removeStudy(e, t), this .studyCounter-- }, JSServer.ChartApi.prototype.modifyStudy = function(e, t, i, s, r) { this._notificationHandlers[e][t] = new h(r, t), this._studyEngine.modifyStudy(e, t, i, s) }, JSServer.ChartApi.prototype.createPointset = function(e, t, i, s, r, n, o) { this._notificationHandlers[e][t] = new h(o, t), this._studyEngine.createPointset(e, t, s, r, n) }, JSServer.ChartApi.prototype.modifyPointset = function(e, t, i, s, r) { throw Error("This call is not implemented") }, JSServer.ChartApi.prototype.removePointset = function(e, t, i) { this._notificationHandlers[e][t] = null, this._studyEngine.removePointset(e, t) }, JSServer.ChartApi.prototype.requestMoreTickmarks = function(e, t) { this._studyEngine.requestMoreTickmarks(e, t) }, JSServer.ChartApi.prototype.requestFirstBarTime = function(e, t, i, s) { this._notificationHandlers[e][t] = new h(s, t) }, JSServer.ChartApi.prototype._invokeHandler = function(e, t) { e && e(t) }, JSServer.ChartApi.prototype._sendRequest = function(e, t) { throw Error("This method is not implemented") }, JSServer.ChartApi.prototype._onMessage = function(e) { throw Error("This method is not implemented") }, JSServer.ChartApi.prototype._dispathNotification = function(e) { var t = e.params.shift(); if (this._notificationHandlers[t]) switch (e.method) { case "timescale_update": var i = e.params[0], s = e.params[1]; for (var r in s.clear = 0 === s.changes.length && 0 === s.marks.length, this ._sessions[t].onMessage({ method: "timescale_update", params: s }), i) { var n = { method: "data_update", params: { customId: r, plots: i[r].series, nonseries: i[r].nonseries, turnaround: i[r].turnaround } }; this._invokeNotificationHandler(t, r, n) } break; case "tickmark_update": this._sessions[t].onMessage({ method: "timescale_update", params: e.params[0] }); break; case "data_update": for (var r in e.params[0]) { var o = e.params[0][r]; n = { method: "data_update", params: { customId: r, plots: o.series ? o.series : o.plots, nonseries: o.nonseries, turnaround: o.turnaround } }; this._invokeNotificationHandler(t, r, n) } break; case "index_update": for (var r in e.params[0]) { n = { method: "index_update", params: e.params[0][r] }; this._invokeNotificationHandler(t, r, n) } break; case "critical_error": d.logNormal(new Date + " critical_error session:" + this.sessionid + " reason:" + e.params[0]), this._sessions[t].onMessage({ method: "critical_error", params: e.params }); break; case "timescale_completed": case "quote_symbol_data": case "quote_list_fields": case "depth_symbol_error": case "depth_symbol_success": case "dd": case "dpu": case "depth_bar_last_value": this._sessions[t].onMessage({ method: e.method, params: e.params }); break; case "clear_data": for (var a in e.params[0]) this._invokeNotificationHandler(t, a, { method: "clear_data", params: e.params[0][a] }); break; default: var l = e.params[0]; this._invokeNotificationHandler(t, l, e) } }, JSServer.ChartApi.prototype._invokeNotificationHandler = function(e, t, i) { if (void 0 !== t) { var s = this._notificationHandlers[e][t]; void 0 !== s && s && this._invokeHandler(s.handler, i) } }, JSServer.ChartApi.prototype.searchSymbols = function(e, t, i, s, r, n, o, a, l, c) { this._studyEngine.searchSymbols(e, t, i, c) }, JSServer.ChartApi.prototype._notifySessions = function(e) { for (var t in this._sessions) { if (!this._sessions.hasOwnProperty(t)) return; var i = this._sessions[t]; "function" == typeof i.onMessage && i.onMessage(e) } }, JSServer.ChartApi.prototype.unpack = function(e) { throw Error("This method is not implemented") }, JSServer.ChartApi.prototype.quoteCreateSession = function(e) { return this._studyEngine.quoteCreateSession(e) }, JSServer.ChartApi.prototype.quoteDeleteSession = function(e) { return this._studyEngine.quoteDeleteSession(e) }, JSServer.ChartApi.prototype.quoteSetFields = function(e, t) { return this._studyEngine.quoteSetFields(e, t) }, JSServer.ChartApi.prototype.quoteAddSymbols = function(e, t) { return -1 !== t.indexOf(void 0) && (console.warn("Got undefined in quoteAddSymbols"), t = t.filter((function(e) { return !!e }))), this._studyEngine.quoteAddSymbols(e, t) }, JSServer.ChartApi.prototype.quoteRemoveSymbols = function(e, t) { return this._studyEngine.quoteRemoveSymbols(e, t) }, JSServer.ChartApi.prototype.quoteFastSymbols = function(e, t) { return this._studyEngine.quoteFastSymbols(e, t) }, JSServer.ChartApi.prototype.quoteHibernateAll = function(e) { return this._studyEngine.quoteHibernateAll(e) }, JSServer.ChartApi.prototype.depthCreateSession = function(e) { return this._studyEngine.depthCreateSession(e) }, JSServer.ChartApi.prototype.depthDeleteSession = function(e) { return this._studyEngine.depthDeleteSession(e) }, JSServer.ChartApi.prototype.depthSetSymbol = function(e, t) { return this._studyEngine.depthSetSymbol(e, t) }, JSServer.ChartApi.prototype.depthClearSymbol = function(e) {}, JSServer.ChartApi .prototype.depthSetScale = function(e, t) {}, JSServer.ChartApi.prototype .createStudiesAccessController = function(e, t, i) { return new this.StudiesAccessController(this._studyEngine, e && JSON.parse(e) || { type: "black", tools: [] }) }, JSServer.ChartApi.prototype.StudiesAccessController = function(e, t) { this._studyEngine = e, this._studiesAccess = t }, JSServer.ChartApi.prototype.StudiesAccessController.prototype._findTool = function(e) { for (var t = null, i = 0; i < this._studiesAccess.tools.length; ++i) { var s = this._studiesAccess.tools[i]; if (s.name === e || s === e) { t = s; break } } return t }, JSServer.ChartApi.prototype.StudiesAccessController.prototype.getEnabledTools = function() { return this._studyEngine.studiesMetadata().filter((function(e) { return this.isToolEnabled(e.description) || e.is_hidden_study }), this) }, JSServer.ChartApi.prototype.StudiesAccessController.prototype.isToolEnabled = function( e) { var t = this._findTool(e); return "black" === this._studiesAccess.type ? !t || t.grayed : !!t }, JSServer.ChartApi.prototype.StudiesAccessController.prototype.isToolGrayed = function( e) { var t = this._findTool(e); return t && t.grayed }, JSServer.ChartApi.prototype.serverTimeOffset = function() { return this._studyEngine.serverTimeOffset() }, JSServer.ChartApi.prototype.serverTime = function() { return this._studyEngine.serverTime() }, JSServer.ChartApi.prototype.disconnectCount = function() { return 0 }, u(JSServer.ChartApi, "JSServer.ChartApi", c, "ChartApiInterface"), e.exports = JSServer .ChartApi }, EYFt: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return S })); var s = i("ivNn"), r = i("YFKU"), n = i("qFKp"), o = i("Tmoa"), a = i("Kxc7"), l = i("k9/m"), c = i("CW80"), h = i("mMWL"), u = i("23IT"), d = i("i6cO"), p = i("UAFa"), _ = i("xCUR"), m = i("Eyy1"), f = i("nEwK"); const g = n.CheckMobile.any(), b = Object(r.t)("n/a"), v = a.enabled("hide_last_na_study_output"); class S { constructor(e, t) { this._emptyValues = [], this._colorProviders = new Map, this._study = e, this ._model = t; const i = e.metaInfo().plots; i && i.forEach((t, i) => { if (Object(u.isPlotWithTechnicalValues)(t)) return; const s = t.id; this._emptyValues.push({ id: s, index: i, title: this._study.guiPlotName(s), value: "", visible: !1 }); const r = Object(u.isOhlcPlot)(t) ? t.target : t.id; this._colorProviders.set(r, Object(p.createStudyPlotColorProvider)(e .metaInfo(), e.properties(), r)) }) } getItems() { return this._emptyValues } getValues(e) { const t = this._emptyValues.map(e => ({ ...e })); let i = null; const r = this._study.data().lastIndex(); if (null !== r) for (const e of t) { if (!this._study.properties().styles[e.id].visible.value()) continue; const t = this._study.nearestIndex(r, l.PlotRowSearchMode.NearestLeft, e .index + 1); if (void 0 === t) continue; const s = t + this._study.offset(e.id); i = null !== i ? Math.max(s, i) : s }(null === e || null !== i && e > i) && (e = i); const n = this._hideValues(), a = this._study.isVisible() && !n ? b : ""; for (const e of t) e.value = a; if (n) return t; if (v && t.length && (t[t.length - 1].value = ""), this._study.metaInfo().graphics .hhists) return this._getValuesForHHist(t, e); const c = this._study.priceScale(); if (!this._study.isVisible() || null === e || null === c || c.isEmpty() || this ._model.timeScale().isEmpty()) return t; const h = this._study.metaInfo().plots, p = Object(_.a)(this._study), m = {}; for (const i of t) { let t = i.id; const n = this._study.properties().styles[t].visible.value(); if (i.visible = n, !n) continue; const a = i.index, c = e - this._study.offset(t), _ = null !== r && c > r ? l.PlotRowSearchMode.NearestLeft : l .PlotRowSearchMode.Exact, f = this._study.nearestIndex(c, _); if (void 0 === f) continue; let g = m[t]; if (void 0 === g && (g = this._study.getMinFirstBarIndexForPlot(t), Number .isFinite(g) && (m[t] = g)), g > f) continue; const b = this._study.data().last(), v = this._study.data().valueAt(f) || (null !== b ? b.value : null); if (null === v) continue; const S = v[a + 1]; if (!Object(s.isNumber)(S)) continue; const y = S > 0; i.value = p(S); const w = this._study.properties().styles[t]; let P = w.color.value(); const C = h[a]; Object(u.isOhlcPlot)(C) ? (t = C.target || t, P = this._study.properties() .ohlcPlots[t].color.value()) : Object(u.isArrowsPlot)(C) && (P = y ? w .colorup.value() : w.colordown.value()); let x = P; const T = this._colorProviders.get(t), I = T && T.getPlotPointStyle(v); I && (Object(u.isArrowsPlot)(C) ? (y && void 0 !== I.colors[d.ColorerType.Up] && (x = I.colors[d.ColorerType.Up]), y || void 0 === I.colors[d .ColorerType.Down] || (x = I.colors[d.ColorerType.Down])) : void 0 !== I.colors[d.ColorerType.Main] && (x = I.colors[d.ColorerType .Main])), "transparent" === x && (x = P), x = Object(o.resetTransparency)(x), i.color = x } return t } _hideValues() { return g && (null === this._model.crossHairSource().pane || Object(c.isLineToolName) (h.tool.value()) || null !== this._model.lineBeingEdited()) } _getValuesForHHist(e, t) { e.forEach(e => { e.visible = this._study.isVisible(), e.value = b }); const i = this._study.priceScale(), r = this._model.timeScale(); if (null === i || i.isEmpty() || r.isEmpty() || this._hideValues()) return e; if (null === t || !isFinite(t)) { const i = this._study.data().last(); if (null === i) return e; t = i.index } const n = this._model.crossHairSource(), o = n.price; if (!isFinite(n.y) && null === (t = function(e, t) { var i; const s = null === (i = e.visibleBarsStrictRange()) || void 0 === i ? void 0 : i.lastBar(); if (!s) return null; const r = t.data().search(s, l.PlotRowSearchMode.NearestLeft); return r ? r.index : null }(this._model.timeScale(), this._model.mainSeries()))) return e; const a = function(e, t, i, s) { if (0 === e.size) return null; if (!i) { const e = Object(m.ensureNotNull)(s.data().valueAt(t)); i = s.barFunction()(e) } const r = function(e, t) { let i = null; return e.forEach((e, s) => { s <= t && (null === i || s > i) && (i = s) }), i }(e, t); if (null === r) return null; const n = e.get(r); if (!n || 0 === n.size) return null; return function(e, t) { let i = null; return e.forEach(e => { e.priceLow <= t && t < e.priceHigh && (i = e) }), i }(n, i) }(this._study.graphics().hhistsByTimePointIndex(), t, o, this._model .mainSeries()); if (null === a) return e; const c = this._study.metaInfo().graphics.hhists; if (void 0 === c) return e; const h = c[a.styleId]; if (void 0 === h) return e; const u = this._study.properties().child("graphics").child("hhists").child(a .styleId), d = new f.VolumeFormatter; return e.forEach((e, t) => { if (t < u.colors.childCount()) if (t < a.rate.length) { const i = a.rate[t]; e.title = h.titles[t], e.value = Object(s.isNumber)(i) ? d .format(i) : "", e.color = u.colors[t].value() } else e.title = "", e.value = "", e.color = void 0; else { if (a.rate.length > 1 && t === u.colors.childCount()) { const t = a.rate.reduce((e, t) => e + t, 0); return e.value = d.format(t), void(e.color = u.valuesColor .value()) } e.value = "" } }), e } } }, Ecpn: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); const s = { VbPFixed: !0, PivotPointsStandard: !0, VbPVisible: !0 }; function r(e) { return e in s } }, EqoR: function(e, t, i) { "use strict"; var s = i("5rJj"), r = i("aDyP").LineToolPitchfork; class n extends r { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Inside Pitchfork" } static createProperties(e) { var t = new s("linetoolinsidepitchfork", e, !1, { range: [0, 8] }); return n._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e) } } t.LineToolInsidePitchfork = n }, Ery9: function(e, t, i) { "use strict"; i.r(t), i.d(t, "setCustomAdapter", (function() { return _ })), i.d(t, "initialize", (function() { return m })), i.d(t, "updateUser", (function() { return f })), i.d(t, "getChartsCount", (function() { return g })), i.d(t, "getCharts", (function() { return b })), i.d(t, "removeChart", (function() { return v })), i.d(t, "saveChart", (function() { return S })), i.d(t, "getChartContent", (function() { return y })), i.d(t, "loadChart", (function() { return w })), i.d(t, "removeStudyTemplate", (function() { return P })), i.d(t, "getStudyTemplateContent", (function() { return C })), i.d(t, "saveStudyTemplate", (function() { return x })), i.d(t, "getStudyTemplatesList", (function() { return T })), i.d(t, "invalidateStudyTemplatesList", (function() { return I })), i.d(t, "getStudyTemplateContentById", (function() { return M })), i.d(t, "getStandardStudyTemplateContentById", (function() { return O })), i.d(t, "removeStudyTemplateById", (function() { return L })), i.d(t, "renameStudyTemplate", (function() { return A })), i.d(t, "replaceStudyTemplate", (function() { return E })), i.d(t, "getDrawingTemplates", (function() { return k })), i.d(t, "loadDrawingTemplate", (function() { return D })), i.d(t, "removeDrawingTemplate", (function() { return V })), i.d(t, "saveDrawingTemplate", (function() { return B })); var s = i("FQhm"), r = i("txPx"), n = i("Cf1E"); const o = Object(r.getLogger)("Chart.SaveloadAdapter.Library"); let a, l, c, h, u = null, d = null; function p(e) { return `${c}/${encodeURIComponent(h)}/${e}?client=${encodeURIComponent(a)}&user=${encodeURIComponent(l)}` } function _(e) { u = e } function m(e, t, i, s) { a = e, l = t, c = i, h = s } function f(e) { l = e } function g(e, t) { throw new Error("Not implemented") } async function b() { const e = e => e.map(e => ({ id: e.id, name: e.name, image_url: String(e.id), modified_iso: e.timestamp, short_symbol: e.symbol, interval: e.resolution })); if (u) return u.getAllCharts().then(e); try { const t = await fetch("" + p("charts"), { credentials: "same-origin" }); if (!t.ok) throw new Error( `Getting chart content response was not OK. Status: ${t.status}.`); const i = await t.json(); if ("ok" !== i.status) throw new Error("Get chart content request failed: " + i .message); return e(i.data) } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } async function v(e) { if (u) u.removeChart(e); else try { const t = await fetch(`${p("charts")}&chart=${encodeURIComponent(e)}`, { method: "DELETE", credentials: "same-origin" }); if (!t.ok) throw new Error( `Remove chart response was not OK. Status: ${t.status}.`); const i = await t.json(); if ("ok" !== i.status) throw new Error( "Remove drawing template request failed: " + i.message) } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } async function S(e, t, i, s, r) { const a = r.id.value(), l = { name: e, content: JSON.stringify(s), symbol: t, resolution: i }; if (u) return u.saveChart({ ...l, id: a }); try { const e = new FormData; for (const t in l) e.append(t, l[t]); let t = p("charts"); null != a && (t += "&chart=" + encodeURIComponent(a)); const i = await fetch(t, { credentials: "same-origin", method: "POST", body: e }); if (!i.ok) throw new Error( `Saving chart content response was not OK. Status: ${i.status}.`); const s = await i.json(); if ("ok" !== s.status) throw new Error("Saving chart content request failed: " + s .message); return s.id } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } async function y(e) { const t = t => { const i = JSON.parse(t); return i.uid = e.id, i }; if (u) return u.getChartContent(e.id).then(e => t(e)); try { const i = await fetch(`${p("charts")}&chart=${encodeURIComponent(e.id)}`, { credentials: "same-origin" }); if (!i.ok) throw new Error( `Getting chart content response was not OK. Status: ${i.status}.`); const s = await i.json(); if ("ok" !== s.status) throw new Error("Get chart content request failed: " + s .message); return t(s.data.content) } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } function w(e) { y(e).then(e => { s.emit("chart_load_requested", e) }, () => { o.logWarn("Error loading chart") }) } async function P(e) { try { if (u) return u.removeStudyTemplate({ name: e }); const t = await fetch(`${p("study_templates")}&template=${encodeURIComponent(e)}`, { method: "DELETE", credentials: "same-origin" }); if (!t.ok) throw new Error( `Remove study template response was not OK. Status: ${t.status}.`); const i = await t.json(); if ("ok" !== i.status) throw new Error("Remove study template request failed: " + i .message) } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } async function C(e) { try { if (u) { return { content: await u.getStudyTemplateContent({ name: e }) } } const t = await fetch(`${p("study_templates")}&template=${encodeURIComponent(e)}`, { credentials: "same-origin" }); if (!t.ok) throw new Error( `Get study template response was not OK. Status: ${t.status}.`); const i = await t.json(); if ("ok" !== i.status) throw new Error("Get study template request failed: " + i .message); return i.data } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } async function x(e) { try { if (u) return u.saveStudyTemplate(e).then(() => ({ error: "" })).catch(e => ({ error: null != e ? Object(n.a)(e) : "error" })); const t = new FormData; t.append("name", e.name), t.append("content", e.content); const i = await fetch(p("study_templates"), { method: "POST", body: t, credentials: "same-origin" }); if (!i.ok) throw new Error( `Save study template response was not OK. Status: ${i.status}.`); const s = await i.json(); return { error: "ok" === s.status ? "" : s.status } } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } async function T() { try { if (d) return d; d = []; const e = e => (d = e.map(e => ({ is_default: !1, name: e.name })), d); if (u) return u.getAllStudyTemplates().then(e); const t = await fetch(p("study_templates"), { method: "GET", credentials: "same-origin" }); if (!t.ok) throw new Error( `Study templates list response was not OK. Status: ${t.status}.`); const i = await t.json(); if ("ok" !== i.status) throw new Error("Study templates list request failed: " + i .message); return e(i.data) } catch (e) { throw o.logWarn(Object(n.a)(e)), e } } function I() { d = null } function M(e, t) { throw new Error("Not implemented") } function O(e, t) { throw new Error("Not implemented") } function L(e, t) { throw new Error("Not implemented") } function A(e, t, i) { throw new Error("Not implemented") } function E(e, t, i) { throw new Error("Not implemented") } async function k(e) { throw new Error("Not implemented") } async function D(e, t) { throw new Error("Not implemented") } async function V(e, t) { throw new Error("Not implemented") } async function B(e, t, i) { throw new Error("Not implemented") } }, EsvI: function(e, t, i) { "use strict"; i.r(t); i("bSeV"); var s = i("eJTA"), r = i("wZIs"), n = i("Vdly"); function o() { return Object(n.getValue)("current_theme.name") || null } var a = i("wVAQ"), l = i("txPx"); const c = Object(l.getLogger)("Themes.Provider"); let h = null; function u(e) { return Object(a.fetch)("/theme/?themeName=" + encodeURIComponent(e), { credentials: "include", method: "GET" }).then(e => e.json()).then(e => { const t = {}; return e.content && (t.content = JSON.parse(e.content)), t }) } var d = i("zM7N"), p = i("oiZD"); var _ = i("YFKU"), m = i("IMMp"), f = i("HGP3"); const g = { [d.a.Light]: { name: d.a.Light, label: () => Object(_.t)("Light", { context: "colorThemeName" }), order: 2, getThemedColor: e => Object(f.getHexColorByName)(e) }, [d.a.Dark]: { name: d.a.Dark, label: () => Object(_.t)("Dark", { context: "colorThemeName" }), order: 1, getThemedColor: e => { const t = m[e] || e; return Object(f.getHexColorByName)(t) } } }; function b(e) { return !e.isPrivate } function v() { return g[p.watchedTheme.value()] || g.light } function S(e) { return v().getThemedColor(e) } async function y(e, t, i, s, n = !0, o = !1, a = !1) { const l = await (t ? Promise.resolve(O(e)) : x(e)); if (void 0 !== l.content) { const h = !t; a && (void 0 !== (c = l.content).chartProperties && Object(r.applyDefaultsOverrides) (c.chartProperties), void 0 !== c.mainSourceProperties && Object(r .applyDefaultsOverrides)(c.mainSourceProperties, void 0, !0, "mainSeriesProperties")), await s.applyTheme(l.content, h, i, e, t, n, o) } var c; return l } function w() { Object(p.setTheme)(o() || "light") } function P() { return o() } function C() { var e; e = v().name, Object(n.setValue)("current_theme.name", e, { forceFlush: !0 }) } function x(e) { return u(e) } function T() { return h || Object(a.fetch)("/themes/", { credentials: "include", method: "GET" }).then(e => (h = e.json(), h)) } function I() { return d.c() } function M(e) { return I().includes(e) } function O(e) { return d.b(e) || { content: void 0 } } function L(e, t) { const i = t || v().name, s = d.b(i), r = 0 !== e.length && e.split("."); return s && s.content && r ? r.reduce((e, t) => e[t], s.content) : null } function A(e, t, i) { const r = L(e, i); return null !== r && Object(s.areEqualRgba)(Object(s.parseRgba)(r), Object(s.parseRgba)( String(t))) } function E(e, t) { return function(e, t) { const i = new FormData; return i.append("content", JSON.stringify(t)), i.append("name", e), h = null, Object(a.fetch)("/save-theme/", { credentials: "include", method: "POST", body: i }).then(e => e.json(), e => c.logError(e)) }(e, t) } function k(e) { return function(e) { const t = new FormData; return t.append("name", e), h = null, Object(a.fetch)("/remove-theme/", { credentials: "include", method: "POST", body: t }).then(e => e.json(), e => c.logError(e)) }(e) } function D(e) { return function(e) { return u(e).then(e => Boolean(e.content)) }(e) } function V(e) { return d.e(e) } function B(e) { return d.d(e) } function R(e) { return { content: { chartProperties: { paneProperties: e.model().properties().paneProperties.state(), scalesProperties: e.model().properties().scalesProperties.state() }, sessions: e.model().sessions().properties().state(), mainSourceProperties: e.model().mainSeries().properties().state() } } } i.d(t, "isPublicTheme", (function() { return b })), i.d(t, "getCurrentTheme", (function() { return v })), i.d(t, "getThemedColor", (function() { return S })), i.d(t, "loadTheme", (function() { return y })), i.d(t, "restoreTheme", (function() { return w })), i.d(t, "savedThemeName", (function() { return P })), i.d(t, "syncTheme", (function() { return C })), i.d(t, "getTheme", (function() { return x })), i.d(t, "getThemeNames", (function() { return T })), i.d(t, "getStdThemeNames", (function() { return I })), i.d(t, "isStdThemeName", (function() { return M })), i.d(t, "getStdTheme", (function() { return O })), i.d(t, "getStdThemedValue", (function() { return L })), i.d(t, "isStdThemedDefaultValue", (function() { return A })), i.d(t, "saveTheme", (function() { return E })), i.d(t, "removeTheme", (function() { return k })), i.d(t, "isThemeExist", (function() { return D })), i.d(t, "translateStdThemeName", (function() { return V })), i.d(t, "isStdTheme", (function() { return B })), i.d(t, "extractThemeFromModel", (function() { return R })), i.d(t, "DEFAULT_THEME", (function() { return "light" })), i.d(t, "themes", (function() { return g })) }, ExCE: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("VdBB"); class r { constructor() { this._bars = [] } hitTest(e) { const t = this._bars, i = this._getBarSpacing(), s = i / 2; if (0 === t.length) return null; const r = this._getTolerance(), n = t[0], o = t[t.length - 1]; if (e.x < n.time - s - r) return null; if (e.x > o.time + s + r) return null; let a = 0, l = t.length - 1, c = -1; for (; a <= l;) { const i = Math.floor((a + l) / 2), h = t[i]; let u = s; if (h !== n && h !== o || (u += r), Math.abs(h.time - e.x) <= u) { c = i; break } e.x - h.time > s ? a = i + 1 : l = i - 1 } if (-1 !== c) { const n = Math.ceil(r / i); if (0 !== n) { const i = Math.max(0, c - n), o = Math.min(t.length - 1, c + n); for (let n = i; n <= o; n++) if (Math.abs(e.x - t[n].time) <= s + r && this._isPointAtBar(t[n], e.y, r)) return this._getHitTest() } else if (this._isPointAtBar(t[c], e.y, r)) return this._getHitTest() } return null } _getHitTest() { return new s.HitTestResult(s.HitTestResult.REGULAR) } _isPointAtBar(e, t, i) { const s = Math.min(e.high, e.low), r = Math.max(e.high, e.low); return s - i <= t && t <= r + i } } }, EyEd: function(e, t, i) { "use strict"; var s = i("lCO3").Version, r = i("txPx").getLogger("Chart.StudyMigration"); function n(e) { this._studyId = e, this._maxToVers = s.ZERO, this._maxFromVers = s.ZERO, this._migrs = [] } n.prototype.addMigration = function(e, t, i) { var r = s.parse(e), n = s.parse(t); r.isGreater(this._maxFromVers) && (this._maxFromVers = r), n.isGreater(this ._maxToVers) && (this._maxToVers = n), this._migrs.push({ fromVers: r, toVers: n, rules: i }) }, n.prototype.updateInputs = function(e, t, i) { if (!i) return i; for (var s = TradingView.clone(i), n = e; n.isLess(t);) { var o = this._findMigration(n); if (null == o) break; if (r.logNormal("Migrating study inputs from " + o.fromVers + " to " + o.toVers + " version, studyId: " + this._studyId + ", migration: " + JSON.stringify( o) + ", inputs: " + JSON.stringify(i)), s = this._applyMigration(s, o), !n .isLess(o.toVers)) throw new Error( "Problems in study migration process... Possible infinite cycle has been detected and stopped." ); n = o.toVers } return n > e && r.logNormal("Study inputs migration is done, studyId: " + this ._studyId + ", inputs: " + JSON.stringify(s)), s }, n.prototype._findMigration = function(e) { for (var t = -1, i = this._maxFromVers, s = 0; s < this._migrs.length; s++) { var r = this._migrs[s]; r.fromVers.isLess(e) || r.fromVers.isLessOrEqual(i) && (i = r.fromVers, t = s) } return t < 0 ? null : this._migrs[t] }, n.prototype._applyMigration = function(e, t) { for (var i = e, s = 0; s < t.rules.length; s++) { var r = t.rules[s]; i = this._getApplyRuleFun(r.type)(i, r) } return i }, n.prototype._getApplyRuleFun = function(e) { if ("inputRemoved" === e) return n._applyInputRemovedRule; if ("inputChangedType" === e) return n._applyInputChangedTypeRule; if ("inputChangedMinMax" === e) return n._applyInputChangedMinMaxRule; if ("inputChangedOptions" === e) return n._applyInputChangedOptionsRule; throw new Error("Unknown migration rule type: " + e) }, n._applyInputRemovedRule = function(e, t) { if (!(t.inputId in e)) return e; if ("removeVal" !== t.action) throw new Error("Unexpected rule.action=" + t.action + " in rule.type=" + t.type); var i = e[t.inputId]; return delete e[t.inputId], r.logNormal("Input " + t.inputId + "=" + i + " removed"), e }, n._applyInputChangedTypeRule = function(e, t) { var i = e[t.inputId]; if ("resetToDefVal" === t.action) return e[t.inputId] = t.defVal, r.logNormal("Input " + t.inputId + "=" + i + " reset to default value " + t.defVal), e; if ("convertVal" === t.action) { if (null == i) return e; if ("float" === t.inputTypeFrom && "integer" === t.inputType) return e[t.inputId] = Math.round(e[t.inputId]), r.logNormal("Input " + t.inputId + "=" + i + " converted to value " + e[t.inputId]), e; if ("integer" === t.inputTypeFrom && "float" === t.inputType) return e; if ("text" === t.inputTypeFrom && "source" === t.inputType) return n._isValidSource( i, t.options) || (e[t.inputId] = t.defVal), e; throw new Error("Cannot convertVal from " + t.inputTypeFrom + " to " + t.inputType) } throw new Error("Unknown action " + t.action + " for rule with type " + t.type) }, n._isValidSource = function(e, t) { return e.indexOf("$") >= 0 || t.indexOf(e) >= 0 }, n._applyInputChangedMinMaxRule = function(e, t) { if ("adjustValIfNeeded" !== t.action) throw new Error("Unknown action " + t.action + " for rule with type " + t.type); var i = e[t.inputId]; return i < t.minVal ? e[t.inputId] = t.minVal : i > t.maxVal && (e[t.inputId] = t .maxVal), r.logNormal("Input " + t.inputId + "=" + i + " adjusted to value " + e[t.inputId]), e }, n._applyInputChangedOptionsRule = function(e, t) { if (!(["text"].indexOf(t.inputType) >= 0 && "resetToDefValIfNeeded" === t.action)) throw new Error("Unexpected rule.inputType=" + t.inputType + " in rule.action=" + t .action); var i = e[t.inputId]; return t.options.indexOf(i) < 0 && (e[t.inputId] = t.defVal, r.logNormal("Input " + t .inputId + "=" + i + " reset to default value " + t.defVal)), e }, e.exports = n }, Eyy1: function(e, t, i) { "use strict"; function s(e) { if (void 0 === e) throw new Error("Value is undefined"); return e } function r(e) { if (null === e) throw new Error("Value is null"); return e } Object.defineProperty(t, "__esModule", { value: !0 }), t.ensureNever = t.ensure = t.ensureNotNull = t.ensureDefined = t.assert = void 0, t .assert = function(e, t) { if (!e) throw new Error("Assertion failed" + (t ? ": " + t : "")) }, t.ensureDefined = s, t.ensureNotNull = r, t.ensure = function(e) { return r(s(e)) }, t.ensureNever = function(e) {} }, F58L: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyTemplates", (function() { return _ })); var s = i("YFKU"), r = i("zUrt"), n = i("JWMC"), o = i("aIyQ"), a = i.n(o), l = i("hY0g"), c = i.n(l), h = i("fZEr"), u = i("txPx"); const d = Object(u.getLogger)("Platform.StudyTemplates"), p = Object(s.t)("Do you really want to delete Study Template '{name}' ?"); class _ { constructor(e) { this._chartWidgetCollection = e.chartWidgetCollection, this ._favoriteStudyTemplatesService = e.favoriteStudyTemplatesService, window .loginStateChange.subscribe(null, r.backend.invalidateStudyTemplatesList), this ._list = new c.a([]), this._onChange = new a.a, this._list.subscribe(() => this ._onChange.fire()) } findRecordByName(e) { return this._list.value().find(t => t.name === e) || null } showSaveAsDialog() { const e = this._chartWidgetCollection.activeChartWidget.value().model(); Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(13), i.e(16), i.e(17), i.e(21), i.e(23), i.e(28), i.e(36), i.e(85), i.e(0), i.e(2), i .e(15), i.e("study-template-dialog") ]).then(i.bind(null, "IDfV")).then(t => { new t.StudyTemplateSaver({ controller: e, onSave: e => { this._list.setValue(e) } }).show() }) } applyTemplate(e) { const t = this.findRecordByName(e); null !== t ? window.runOrSignIn(() => { const e = this._chartWidgetCollection.activeChartWidget.value(), i = i => { Object(n.trackEvent)("GUI", "Load Study Template"), e.model() .applyStudyTemplate(JSON.parse(i.content), t.name) }; void 0 !== t.id ? t.is_default ? r.backend .getStandardStudyTemplateContentById(t.id, i) : r.backend .getStudyTemplateContentById(t.id, i) : r.backend .getStudyTemplateContent(t.name).then(i) }, { source: "Study templates apply" }) : d.logNormal(`Template ${e} not found in cache`) } deleteStudyTemplate(e) { const t = this.findRecordByName(e); null !== t ? this._removeTemplate(t) : d.logNormal( `Template ${e} not found in cache`) } list() { return this._list.value() } getOnChange() { return this._onChange } refreshStudyTemplateList(e) { r.backend.getStudyTemplatesList().then(t => { this._list.setValue(t), void 0 !== e && e() }) } invalidate() { r.backend.invalidateStudyTemplatesList() } _removeTemplate(e) { window.runOrSignIn(() => { Object(h.showConfirm)({ text: p.format({ name: e.name }), onConfirm: ({ dialogClose: t }) => new Promise(i => { const s = () => { this.refreshStudyTemplateList(() => { const s = this.list(); this._list.setValue(s .filter(t => t !== e)), this ._favoriteStudyTemplatesService && this ._favoriteStudyTemplatesService .remove(e.name), i(), t() }) }; r.backend.invalidateStudyTemplatesList(), void 0 !== e.id ? r.backend .removeStudyTemplateById(e.id, s) : r .backend.removeStudyTemplate(e.name).then(s) }) }) }, { source: "Study templates delete" }) } } }, FA0h: function(e, t, i) { "use strict"; function s() { return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e( 13), i.e(14), i.e(19), i.e(26), i.e(0), i.e(2), i.e(7), i.e(10), i.e(18), i .e(20), i.e(25), i.e("symbol-search-dialog") ]).then(i.bind(null, "GcSm")) } i.d(t, "a", (function() { return s })) }, FBsw: function(e, t, i) { "use strict"; i.r(t), i.d(t, "OverlayPriceAxisView", (function() { return l })); var s = i("Kxc7"), r = i("KcY8"), n = i("n5al"), o = i("oXaB"); const a = s.enabled("force_exchange_as_title"); class l extends r.a { constructor(e) { super(), this._source = e } _updateRendererData(e, t, i) { e.visible = !1, t.visible = !1; const s = this._source.lastValueData("close", !1); if (s.noData) return; const r = this._source.model(), n = this._source.priceScale(); if (null === n) return; if (!r.isPriceScaleVisible(n)) return; i.background = s.color, i.textColor = this.generateTextColor(s.color), i .coordinate = s.coordinate, i.floatCoordinate = s.floatCoordinate; const a = this._source.model().properties().scalesProperties, l = n.isPercentage(); a.showSeriesLastValue.value() && (e.text = l ? s.formattedPricePercentage : s .formattedPriceAbsolute, a.seriesLastValueMode.value() !== o .PriceAxisLastValueMode.LastPriceAndPercentageValue ? e.secondLine = "" : e.secondLine = l ? s.formattedPriceAbsolute : s .formattedPricePercentage, e.visible = !0), t.text = "", a .showSymbolLabels.value() && (t.text = this._paneText(), t.visible = t.text.length > 0) } _paneText() { let e = ""; const t = this._source.symbolInfo(); return a ? e = Object(n.displayedSymbolExchange)(t) : this._source.model() .properties().scalesProperties.showSymbolLabels.value() && (e = Object(n .displayedSymbolName)(t)), e } } }, FBuY: function(e, t, i) { "use strict"; i.r(t), i.d(t, "TVXWindowEvents", (function() { return o })); i("HbRj"); var s = i("txPx"), r = i("VVxS"); const n = Object(s.getLogger)("XWindowEvents"); var o; ! function(e) { const t = "tvxwevents.", i = {}; let s; window.BroadcastChannel ? (s = new BroadcastChannel("tvxwevents"), s.addEventListener( "message", (function(e) { const { data: { event: t, value: s } } = e; i[t] && i[t].forEach(e => { e(s) }) })), function() { const e = [], i = performance.now(); for (let i = 0; i < r.TVLocalStorage.length; i++) { const s = r.TVLocalStorage.key(i); s.startsWith(t) && e.push(s) } const s = r.TVLocalStorage.length; for (const t of e) r.TVLocalStorage.removeItem(t); const o = performance.now() - i; n.logNormal("Total keys amount in local storage on operation start: " + s), n .logNormal("Keys amount in local storage to be deleted: " + e.length), n .logNormal("Keys to be deleted from local storage: " + JSON.stringify(e)), n .logNormal(`Removing keys from local storage took ${o} ms`) }()) : window.addEventListener("storage", (function(e) { const { newValue: s, key: n } = e; if (null === s || !n || !n.startsWith(t)) return; const o = n.substr(t.length); i[o] && i[o].forEach(t => { t(e.newValue) }); r.TVLocalStorage.removeItem(n) })), e.on = function(e, t) { i[e] || (i[e] = []), i[e].push(t) }, e.off = function(e, t) { if (!i[e]) return; const s = i[e].indexOf(t); - 1 !== s && (1 === i[e].length ? delete i[e] : i[e] .splice(s, 1)) }, e.emit = function(e, i = Date.now()) { try { s ? s.postMessage({ event: e, value: i }) : r.TVLocalStorage.setItem(t + e, i.toString()) } catch (e) { n.logError(e.message) } } }(o || (o = {})) }, FDyI: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("LxhU"), n = i("IiTo"), o = i("/bs+"); class a { constructor(e) { this._timeScale = e } coordinateToTime(e) { const t = this._timeScale.coordinateToIndex(e); return this._timeScale.indexToTimePoint(t) } barSpacingChanged() { return this._timeScale.barSpacingChanged() } rightOffsetChanged() { return this._timeScale.rightOffsetChanged() } barSpacing() { return this._timeScale.barSpacing() } rightOffset() { return this._timeScale.rightOffset() } width() { return this._timeScale.width() } } var l = i("aIyQ"), c = i.n(l), h = i("96Yh"), u = i("pOzK"), d = i("CsKN"); function p(e, t) { const i = () => { e.completed().unsubscribe(null, s), t(!1) }, s = () => { e.error().unsubscribe(null, i), t(!0) }; e.completed().subscribe(null, i, !0), e.error().subscribe(null, s, !0) } var _ = i("OLhd"); i.d(t, "ChartWidgetApiBase", (function() { return m })); class m { constructor(e, t) { this._visibleBarsChanged = new c.a, this._crosshairMoved = new c.a, this._ranges = null, this._alignerResolution = r.Interval.parse(""), this._alignerSymbolInfo = null, this._dwmAligner = null, this._chartWidget = e, this._activateChart = t, this._chartWidget.model().crossHairSource().moved().subscribe(this, this ._onCrosshairMoved) } getPriceToBarRatio() { return this._chartWidget.model().model().mainSeriesScaleRatioProperty().value() } setPriceToBarRatio(e, t) { const i = this._chartWidget.model(), s = i.model(), r = s.mainSeriesScaleRatioProperty(); (null == t ? void 0 : t.disableUndo) ? new d.SetScaleRatioPropertiesCommand(r, e, "", s).redo(): i.setScaleRatioProperty(r, e, "Change Price to Bar Ratio") } isPriceToBarRatioLocked() { return this._chartWidget.model().model().mainSeries().priceScale().isLockScale() } setPriceToBarRatioLocked(e, t) { const i = this._chartWidget.model(), s = i.model(), r = s.mainSeries().priceScale(); (null == t ? void 0 : t.disableUndo) ? new u.SetPriceScaleModeCommand({ lockScale: e }, r, "", s).redo(): i.setPriceScaleMode({ lockScale: e }, r, "Toggle Lock Scale") } onDataLoaded() { return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries() .dataEvents().completed()) } onSymbolChanged() { return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries() .dataEvents().symbolResolved()) } onIntervalChanged() { return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries() .onIntervalChanged()) } onVisibleRangeChanged() { return this._makeSubscriptionFromDelegate(this._visibleBarsChanged) } onChartTypeChanged() { return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries() .onStyleChanged()) } onSeriesTimeframe() { return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries() .dataEvents().seriesTimeFrame()) } whenChartReady(e) { this._chartWidget.withModel(this, e) } crossHairMoved() { return this._makeSubscriptionFromDelegate(this._crosshairMoved) } setSymbol(e, t) { if (e === this.symbol()) return void(null == t || t()); const i = e => { !e && t && t() }, s = this._chartWidget.model().mainSeries().dataEvents(); t && p(s, i), this._activateChart(), this._chartWidget.setSymbol(e) } setResolution(e, t) { const i = r.Interval.normalize(e); if (null === i || i === this.resolution()) return void(null == t || t()); const s = e => { !e && t && t() }, n = this._chartWidget.model().mainSeries().dataEvents(); t && p(n, s), this._activateChart(), this._chartWidget.setResolution(i) } setChartType(e, t) { const i = this._chartWidget.model().mainSeries().properties().style; if (i.value() === e) return void(null == t || t()); const s = e => { !e && t && t() }, r = this._chartWidget.model().mainSeries().dataEvents(); t && p(r, s), this._chartWidget.model().setChartStyleProperty(i, e, "Change Series Style") } getAllStudies() { return this._chartWidget.model().model().allStudies(!0).map(h.studyEntityInfo) } getAllPanesHeight() { const e = this._chartWidget.model().model().panes(); if (this._chartWidget.isMaximizedPane()) { let t = 0, i = 0; e.forEach(e => { t += e.height(), i += e.stretchFactor() }); const s = i / t; return e.map(e => Math.round(e.stretchFactor() / s * 100) / 100) } return e.map(e => e.height()) } setAllPanesHeight(e) { const t = this._chartWidget.model().model(), i = t.panes(); Object(s.assert)(i.length === e.length, "There`s a mismatch between the number of heights you provided and the number of panes." ); const r = i.reduce((e, t) => e + t.stretchFactor(), 0) / e.reduce((e, t) => e + t); e.forEach((e, t) => { const s = e * r; i[t].setStretchFactor(s) }), t.fullUpdate() } sessions() { return this._chartWidget.model().model().sessions() } getTimeScaleLogicalRange() { return this._chartWidget.model().timeScale().logicalRange() } exportData(e) { const t = { ...e }; return void 0 !== t.from && (t.from = this._convertTimeFromPublic(t.from)), void 0 !== t.to && (t.to = this._convertTimeFromPublic(t.to)), i.e( "export-data").then(i.bind(null, "SIoL")).then(e => e.exportData(this ._chartWidget.model().model(), t)) } barTimeToEndOfPeriod(e) { const t = this._prepareEndOfPeriodArgs(); return Object(o.a)(t.barBuilder, e, t.intervalObj) } endOfPeriodToBarTime(e) { const t = this._prepareEndOfPeriodArgs(); return Object(o.b)(t.barBuilder, e, t.intervalObj) } properties() { return this._chartWidget.properties() } setBarSpacing(e) { this._chartWidget.model().timeScale().setBarSpacing(e) } scrollChartByBar(e) { this._chartWidget.model().scrollChartByBar(e) } mergeAllScales(e) { this._chartWidget.model().mergeAllScales(e) } chartPainted() { return this._chartWidget.chartPainted() } axesSizeReady() { for (const e of this._chartWidget.paneWidgets()) { for (const t of e.leftPriceAxisesContainer().axes()) if (!t.sizeReady()) return !1; for (const t of e.rightPriceAxisesContainer().axes()) if (!t.sizeReady()) return !1 } return !0 } applyOverrides(e) { this._chartWidget.applyOverrides(e) } addOverlayStudy(e, t, i) { return this._chartWidget.addOverlayStudy(e, t, i) } ranges() { throw new Error("not implemented") } getTimeScale() { return new a(this._chartWidget.model().timeScale()) } _destroy() { this._chartWidget.hasModel() && this._chartWidget.model().crossHairSource().moved() .unsubscribeAll(this) } _createStudy(e) { return Promise.reject("Pine and java studies are not supported") } _convertTimeToPublic(e) { const t = this._getSeriesAligner(); return null !== t ? t.timeToExchangeTradingDay(1e3 * e) / 1e3 : e } _convertIndexToPublicTime(e) { const t = this._chartWidget.model(), i = t.timeScale(); if (i.isEmpty()) return null; const r = i.points(), n = Object(s.ensureNotNull)(r.firstIndex()), o = Object(s.ensureNotNull)(r.lastIndex()); let a = null; if (n <= e && e <= o) a = r.valueAt(e); else if (e > o) { const r = t.mainSeries().syncModel(); if (null !== r) { const t = Object(s.ensureNotNull)(i.indexToTimePoint(o)); a = r.projectTime(t, e - o) } } return null !== a && (a = this._convertTimeToPublic(a)), a } _convertTimeFromPublic(e) { const t = this._getSeriesAligner(); return null !== t ? t.timeToSessionStart(1e3 * e) / 1e3 : e } _getSeriesAligner() { const e = this._chartWidget.model().mainSeries(), t = e.interval(), i = r.Interval.parse(t), s = e.symbolInfo(); return this._alignerResolution.isEqualTo(i) && this._alignerSymbolInfo === s || ( this._dwmAligner = null === s ? null : Object(_.createDwmAligner)(t, s), this._alignerResolution = i, this._alignerSymbolInfo = s), this._dwmAligner } _onCrosshairMoved(e) { const t = this._convertIndexToPublicTime(e.index); null !== t && this._crosshairMoved.fire({ price: e.price, time: t }) } _makeSubscriptionFromDelegate(e) { return { subscribe: e.subscribe.bind(e), unsubscribe: e.unsubscribe.bind(e), unsubscribeAll: e.unsubscribeAll.bind(e) } } _prepareEndOfPeriodArgs() { const e = this._chartWidget.model().model(), t = e.timezone(), i = Object(s.ensureNotNull)(e.mainSeries().symbolInfo()), o = e.mainSeries().interval(), a = new n.SessionInfo(t, i.session, i.session_holidays, i.corrections); return { barBuilder: Object(n.newBarBuilder)(o, a, a), intervalObj: r.Interval.parse(o) } } } }, FIi8: function(e, t, i) { "use strict"; function s(e, ...t) { return e && "object" == typeof e ? (0 === t.length || t.forEach(t => { null != t && "object" == typeof t && Object.keys(t).forEach(i => { const n = e[i], o = t[i]; if (o === e) return; const a = Array.isArray(o); if (o && (r(o) || a)) { let t; t = a ? n && Array.isArray(n) ? n : [] : n && r(n) ? n : {}, e[i] = s(t, o) } else void 0 !== o && (e[i] = o) }) }), e) : e } function r(e) { if (!e || "[object Object]" !== Object.prototype.toString.call(e)) return !1; const t = Object.getPrototypeOf(e); if (!t) return !0; const i = Object.hasOwnProperty.toString, s = t.hasOwnProperty("constructor") && t.constructor; return "function" == typeof s && i.call(s) === i.call(Object) } i.r(t), i.d(t, "deepExtend", (function() { return s })) }, FKaq: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SetPriceScaleSelectionStrategyCommand", (function() { return a })); var s = i("Eyy1"), r = i("RDU5"), n = i("MWAT"); class o { constructor(e) { this._leftScales = e.leftPriceScales().map(e => e.id()), this._rightScales = e .rightPriceScales().map(e => e.id()) } restorePane(e) { this._leftScales.reverse().map(t => Object(s.ensureNotNull)(e.getPriceScaleById(t))) .forEach(t => e.movePriceScale(t, "left")), this._rightScales.reverse().map(t => Object(s.ensureNotNull)(e.getPriceScaleById(t))).forEach(t => e .movePriceScale(t, "right")) } } class a extends r.UndoCommand { constructor(e, t, i) { super(i), this._chartModel = e, this._targetStrategy = Object(n .createPriceScaleSelectionStrategy)(t), this._initialState = e.panes() .map(e => new o(e)) } redo() { this._chartModel.panes().forEach(e => e.setPriceScaleSelectionStrategy(this ._targetStrategy)), this._chartModel.fullUpdate() } undo() { const e = this._chartModel.panes(); for (let t = 0; t < e.length; t++) this._initialState[t].restorePane(e[t]); this._chartModel.fullUpdate() } } }, FQhm: function(e, t, i) { "use strict"; i.r(t), i.d(t, "unsubscribe", (function() { return l })), i.d(t, "on", (function() { return c })), i.d(t, "subscribe", (function() { return h })), i.d(t, "subscribeToAll", (function() { return u })), i.d(t, "emit", (function() { return d })), i.d(t, "emitOnce", (function() { return p })); var s = i("aIyQ"), r = i.n(s); const n = {}, o = [], a = {}; function l(e, t, i) { n[e].unsubscribe(i, t) } function c(e, t, i) { h(e, t, i) } function h(e, t, i, s) { n.hasOwnProperty(e) || (n[e] = new r.a), a[e] ? t.call(i) : n[e].subscribe(i, t, s) } function u(e) { o.push(e) } function d(e, ...t) { const i = [e].concat(t); o.forEach(e => { e.apply(null, i) }), n.hasOwnProperty(e) && n[e].fire.apply(n[e], t) } function p(e) { a[e] && console.warn( `Something went wrong: emitOnce called multiple times with same event (${e})`), a[ e] = !0, d.apply(null, arguments) } }, FZIs: function(e, t, i) { "use strict"; var s; i.d(t, "a", (function() { return s })), function(e) { e.Light = "light", e.Dark = "dark" }(s || (s = {})) }, FaJS: function(e, t, i) { "use strict"; i.r(t), i.d(t, "scaleRatio", (function() { return r })), i.d(t, "priceRangeByScaleRatio", (function() { return n })), i.d(t, "barSpacingByScaleRatio", (function() { return o })); var s = i("Qb4w"); function r(e, t) { if (t.isLog() || e.isEmpty() || t.isEmpty()) return null; const i = function(e) { if (e.isEmpty()) return null; const t = e.priceRange(); if (null === t) return null; const i = t.length(); return e.internalHeight() / i }(t); if (null === i) return null; return e.getValidBarSpacing() / Math.max(1e-10, i) } function n(e, t, i) { if (e.isLog() || null === i || e.isEmpty()) return null; const r = e.priceRange(); if (null === r || r.isEmpty()) return null; const n = e.internalHeight() / (t / i), o = r.length(); if (n === o) return r; const a = (n - o) / 2; return new s.PriceRange(r.minValue() - a, r.maxValue() + a) } function o(e, t) { if (e.isLog() || null === t || e.isEmpty()) return null; const i = e.priceRange(); if (null === i) return null; const s = i.length(); return e.internalHeight() / s * t } }, Fdrt: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PaneRendererStandardPivotLabel", (function() { return r })); var s = i("VdBB"); class r { constructor(e, t, i) { this._drawRects = [], this._cacheProvider = e, this._point = t, this._label = i } draw(e, t) { const i = this._cacheProvider(t); e.save(), e.setTransform(1, 0, 0, 1, 0, 0); const s = t.pixelRatio; this._drawRects = []; const r = t => { const r = i.labelRectByIndex(t), n = { left: Math.round(this._point.x - r.width + o), top: Math.round(this._point.y - r.height / 2), width: r.width, height: r.height }; return e.drawImage(i.canvas(), Math.round(r.left * s), Math.round(r.top * s), r.width * s, r.height * s, Math.round(n.left * s), Math .round(n .top * s), n.width * s, n.height * s), this._drawRects.push(n), r.width }, n = this._label.split("/"); let o = 0; for (let e = 0; e < n.length; e++) { const t = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5"] .indexOf(n[e]); e > 0 && (o += r(t + 11) / 2), o += r(t) / 2 } e.restore() } hitTest(e) { for (const t of this._drawRects) if (e.x >= t.left && e.x <= t.left + t.width && e.y >= t.top && e.y <= t.top + t .height) return new s.HitTestResult(s.HitTestResult.REGULAR); return null } } }, Fixu: function(e, t, i) { "use strict"; i.d(t, "c", (function() { return r })), i.d(t, "d", (function() { return n })), i.d(t, "b", (function() { return o })), i.d(t, "a", (function() { return a })); i("Eyy1"), i("dfhE"); function s(e, t) { 0 } function r(e) { s() } function n(e) { s() } function o(e) { s() } function a(e) { 0 } }, FsE7: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views") .then(i.t.bind(null, "wgWl", 7)).then(({ FibTimeZonePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } migrateVersion(e, t, i) { if (1 === e) { i.properties.level1.color.setValue(i.properties.baselinecolor.value()); for (var s = 2; s <= 11; s++) i.properties["level" + s].color.setValue(i .properties.linecolor.value()); for (s = 1; s <= 11; s++) i.properties["level" + s].linewidth.setValue(i .properties.linewidth.value()), i.properties["level" + s].linestyle .setValue(i.properties.linestyle.value()) } } pointsCount() { return 2 } name() { return "Fib Time Zone" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "SMr9"))) .FibTimezoneDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolfibtimezone", e, !1, { range: [1, 11] }); return l._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); for (var t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r) .child("linewidth")), i.push(e.child("level" + r).child("color")); for (t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r) .child("linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.version = 2, l.LevelsCount = 11, t.LineToolFibTimeZone = l }, "GD+X": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor(e, t) { this._chartUndoModel = e, this._chartModel = e.model(), this._priceScale = t } getMode() { const e = this._priceScale.properties().childs(); return e.percentage.value() ? 2 : e.indexedTo100.value() ? 3 : e.log.value() ? 1 : 0 } setMode(e) { this._priceScale.setMode({ percentage: 2 === e, log: 1 === e, indexedTo100: 3 === e }) } isInverted() { return this._priceScale.isInverted() } setInverted(e) { this._priceScale.properties().childs().isInverted.setValue(e) } getVisiblePriceRange() { return this._priceScale.priceRangeInPrice() } setVisiblePriceRange(e) { this._priceScale.setPriceRangeInPrice(e), this._chartModel.lightUpdate() } hasMainSeries() { return this._priceScale.hasMainSeries() } getStudies() { return this._priceScale.getStudies().map(e => e.id()) } currency() { const e = this._priceScale.currency(this._chartModel.availableCurrencies()); return null === e ? null : { selectedCurrency: e.selectedCurrency, readOnly: e.readOnly } } setCurrency(e) { this._chartUndoModel.setPriceScaleCurrency(this._priceScale, e) } unit() { const e = this._priceScale.unit(this._chartModel.availableUnits()); return null === e ? null : { selectedUnit: e.selectedUnit, readOnly: 0 === e.availableGroups.size, availableGroups: Array.from(e.availableGroups) } } setUnit(e) { this._chartUndoModel.setPriceScaleUnit(this._priceScale, e) } } }, GDWD: function(e, t, i) { "use strict"; i.r(t), i.d(t, "addPlusButtonProperty", (function() { return o })), i.d(t, "restoreAddPlusButtonSettingsValue", (function() { return a })); var s = i("Vdly"), r = i("m/cY"); function n() { return s.getBool("add_plus_button", !0) } const o = Object(r.a)(n()); function a() { o.setValue(!0), s.remove("add_plus_button") } s.onSync.subscribe(null, () => o.setValue(n())), o.listeners().subscribe(null, () => s.setValue( "add_plus_button", o.value())) }, GEp6: function(e, t, i) { "use strict"; function s(e, t, i) { var s = t.subtract(e), r = i.subtract(e).dotProduct(s) / s.dotProduct(s); return { coeff: r, distance: e.addScaled(s, r).subtract(i).length() } } Object.defineProperty(t, "__esModule", { value: !0 }), t.distanceToSegment = t.distanceToLine = void 0, t.distanceToLine = s, t .distanceToSegment = function(e, t, i) { var r = s(e, t, i); if (0 <= r.coeff && r.coeff <= 1) return r; var n = e.subtract(i).length(), o = t.subtract(i).length(); return n < o ? { coeff: 0, distance: n } : { coeff: 1, distance: o } } }, GH0z: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PercentageFormatter", (function() { return n })); var s = i("kcTO"), r = i("Ialn"); class n extends s.PriceFormatter { constructor(e = 100) { super(e), this.type = "percentage" } state() { const e = s.PriceFormatter.prototype.state.call(this); return e.percent = !0, e } parse(e) { return e = e.replace("%", ""), super.parse(e) } format(e, t, i, s, n = !0) { const o = super.format(e, t, i, s, !1) + "%"; return n ? Object(r.forceLTRStr)(o) : o } static serialize(e) { return e.state() } static deserialize(e) { return new n(e.priceScale) } } }, GUQs: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "c", (function() { return n })), i.d(t, "b", (function() { return o })); var s = i("qFKp"); function r(e) { e.cancelable && e.preventDefault() } function n(e) { return t => { r(t), e() } } function o(e) { s.isChrome && e.addEventListener("mousedown", e => { if (1 === e.button) return e.preventDefault(), !1 }) } }, GVHu: function(e, t, i) { "use strict"; (function(e, s) { var r = i("Eyy1"), n = r.assert, o = r.ensureNotNull, a = i("hsV8").unpackNonSeriesData, l = i("n5al").symbolTitle, c = i("38az").StudyBarColorer, h = i("hezA").StudyPriceAxisView, u = i("jenN"), d = u.emptyStudyGraphics, p = u.loadStudyGraphics, _ = u.saveStudyGraphics, m = u.LiveStudyGraphics, f = u.createGraphicsPriceAxisViews, g = i("XzZr").ChartApiInterface, b = i("Ocx9").DefaultProperty, v = i("kcTO").PriceFormatter, S = i("nEwK").VolumeFormatter, y = i("GH0z").PercentageFormatter, w = i("k9/m"), P = w.PlotList, C = w.PlotRowSearchMode, x = i("0YCj"), T = (i("cBZt").extractStudyId, i("FQhm")), I = i("23IT"), M = I.LineStudyPlotStyle, O = i("TmNs").StudyPriceLineAxisView, L = i("w4Ji").studyPlotFunctionMap, A = i("w4Ji").studyEmptyPlotValuePredicate, E = i("jy4L").makeNextStudyId, k = i("Kxc7"), D = i("IcDj").StudyBase, V = i("i6cO").ColorerType, B = i("H0vP").InvalidationMask, R = i("bmVy"), N = R.StudyStatusType, j = (R.convertStudyStatusToString, i("Tmoa").colorToInteger), F = i("UAFa").createStudyPlotColorProvider, W = i("0C7r").intervalsVisibilitiesDefaults, H = i("txPx").getLogger("Chart.Study"), U = k.enabled("datasource_copypaste"), z = k.enabled("study_symbol_ticker_description"), G = k.enabled("hide_unresolved_symbols_in_legend"); function q(e, t, i) { var s = new b(t, i, !0); s.addExclusion("visible"), s.addExclusion("precision"), s.addExclusion("minTick"), s .addExclusion("intervalsVisibilities"); for (var r = 0; r < e.inputs.length; ++r) { var n = e.inputs[r]; n.isHidden && (s.addExclusion("inputs." + r.toString()), s.addExclusion( "inputs." + n.id)) } return s } function Y(e, t) { if (t.plots) for (var i = 0; i < t.plots.length; i++) { var s = t.plots[i], r = s.id; if (!I.isColorerPlot(s)) { var n = { visible: !0, color: "#0496FF", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 2, plottype: M.Line, histogramBase: 0, transparency: 50, trackPrice: !1, joinPoints: !1 }; I.isBarColorerPlot(s) && (n.transparency = 0), n.plottype = s.type, n .title = r, e.styles && r in e.styles && TradingView.merge(n, e .styles[r]), e.styles[r] = n } } } function K(e, t) { return e && e[t] && e[t].hasOwnProperty("showLast") ? e[t].showLast.value() : null } class J extends D { constructor(e, t, i, r) { super(e, t, i, r), this._resolvedSymbols = {}, this ._priceAxisViewsBase = [], this._graphicsPriceAxisViews = [], this ._priceLinesAxisViews = [], this._hlinesPriceAsisViews = [], this ._horizlinesPriceAsisViews = [], this._chartApi = e._chartApi, this ._turnaroundCounter = 0, this._turnaround = "st" + this ._turnaroundCounter, this._plotFields = []; var n = this.metaInfo().plots; if (n) for (var o = 0, a = n.length; o < a; o++) { var l = n[o].id; this._plotFields.push(l) } this._invalidateLastNonEmptyPlotRowCache(), this.m_data = new P(L(this ._metaInfo), A), this._graphics = new m, this._plotOffsets = {}, this._plotOffsetsMetaInfoOverride = {}, this._studyModified = !1, this ._tagsChanged = new s, this._labelPaneViews = [], this._createViews(); var c = this; this._handler = function(e) { c.onData(e) }, this._handler.isTVScriptStrategy = this._metaInfo.isTVScriptStrategy, this._recreatePriceFormattingDependencies(), this._properties.precision .listeners().subscribe(this, this._precisionChanged), this ._showStudyArgumentsProperty.listeners().subscribe(this, this .invalidateTitleCache), this._properties.description.listeners() .subscribe(this, this.invalidateTitleCache), this._properties.inputs .listeners().subscribe(this, this.invalidateTitleCache), this ._properties.shortDescription && this._properties.shortDescription .listeners().subscribe(this, this.invalidateTitleCache), k.enabled( "update_study_formatter_on_symbol_resolve") && e.mainSeries() .dataEvents().symbolResolved().subscribe(this, this ._recreatePriceFormattingDependencies), e.mainSeries().dataEvents() .symbolResolved().subscribe(this, this.invalidateTitleCache); c = this; var h = {}; this._simplePlotsCount = r.plots.filter((function(e, t) { if (I.isLinePlot(e)) return !0; if (I.isOhlcPlot(e)) { var i = c.metaInfo().plots[t].target; return !h[i] && (h[i] = i, !0) } return !1 })).length, this._properties.showInDataWindow.listeners().subscribe(e, e .fullUpdate), this.hasBarColorer() && this._properties.visible .listeners().subscribe(e.mainSeries(), e.mainSeries() .invalidateBarStylesCache), this._childStudyByRebind = new s, this ._formatterChanged = new s, this._priceStepChanged = new s, this ._aboutToBeDestroyed = new s, this._ongoingDataUpdate = Promise .resolve(), this._isDestroyed = !1, this._definitionsViewModel = null } lastValueData(e, t, i) { var s = { noData: !0 }; if (this._model.timeScale().isEmpty() || null == this.priceScale() || this .priceScale().isEmpty() || this.data().isEmpty()) return s; var r = this._model.timeScale().visibleBarsStrictRange(); if (null === r) return s; if (!this.properties().visible.value()) return s; var n, o, a = this.properties().styles, l = this.properties().ohlcPlots; if (a && a[e] && (n = a[e]), l && l[e] && (n = l[e]), !n || !n.visible .value()) return s; var c = this.metaInfo().plots; for (o = 0; o < c.length && !(c[o].id === e || I.isOhlcClosePlot(o) && c[o] .target === e); o++); var h = o + 1, u = this.offset(e), d = this.nearestIndex(r.lastBar() - u, C.NearestLeft, h); if (null == d) return s; var p = this._lastNonEmptyPlotRow(h), _ = null !== p && r.contains(p.index), m = null !== p ? p.value : null, f = t || _ ? m : this.data().valueAt(d); if (!f || !isNumber(f[h])) return s; var g = { noData: !1 }, b = f[h]; i && (g.price = b); var v = this.firstValue(!0); if (!isNumber(v)) return s; g.text = this.priceScale().formatPrice(b, v), g.formattedPriceAbsolute = this.priceScale().formatPriceAbsolute(b), g.formattedPricePercentage = this.priceScale().formatPricePercentage(b, v); const S = F(this.metaInfo(), this.properties(), e).getPlotPointStyle(f) .colors[V.Main]; return g.color = S || n.color.value(), g.floatCoordinate = this.priceScale() .priceToCoordinate(b, v), g.coordinate = g.floatCoordinate, g.item = f, g } isFailed() { return this._status.type === N.Error } isLoading() { return this._status.type === N.Loading } series() { return this._series } model() { return this._model } clearData() { this._invalidateLastNonEmptyPlotRowCache(), this.data().clear(), this ._graphics.clear && this._graphics.clear(), this._plotOffsets = {} } onTagsChanged() { return this._tagsChanged } properties() { return this._properties } state(e, t) { var i = { type: TradingView.className(this.constructor), id: this.id(), state: this.properties().state(), zorder: this.zorder(), ownFirstValue: this.isVisible() ? null : this._ownFirstValue }; this.metaInfo() instanceof x ? i.metaInfo = TradingView.clone(this .metaInfo().state()) : (i.metaInfo = TradingView.clone(this .metaInfo()), i.metaInfo.id = x.parseIdString(i.metaInfo.id + (i.metaInfo .version ? "-" + i.metaInfo.version : "")).fullId), e && (i .data = this.data().state(), i.data.symbols = this._resolvedSymbols, i.data.graphics = _(this.graphics()), i.data.plotOffsets = this ._plotOffsets), this.ownerSource() && (i.ownerSource = this .ownerSource().id()); for (var s = 0; s < this._metaInfo.inputs.length; s++) if ("bar_time" === this._metaInfo.inputs[s].type) { var r = this._metaInfo.inputs[s].id, n = i.state.inputs[r]; if (n < 0) { var o = this._rightOffsetToUnixTime(-n); i.state.inputs[r] = o && o >= 0 ? o : 0 } } return this._isChildStudy && x.patchChildStudyMetaInfoState(i), i } _plotsForAlert() { var e = this, t = this._metaInfo, i = [I.isLinePlot, I.isShapesPlot, I.isCharsPlot, I.isArrowsPlot, I .isOhlcPlot, I.isAlertConditionPlot ]; return t.plots.map((function(e, t) { return e.pinePlotIndex = t, e })).filter((function(e) { return i.some((function(t) { return t(e) })) })).map((function(i) { var s = { id: i.id, type: i.type, pinePlotIndex: i.pinePlotIndex, offset: e.offset(i.id) }; return t.styles && void 0 !== t.styles[i.id] && (s.title = t .styles[i.id].title || "", s.text = t.styles[i.id] .text || ""), i.target && t.ohlcPlots && t .ohlcPlots[i.target] && (s.ohlcTitle = t.ohlcPlots[i .target].title), s })) } _collectDepsForAlert() { throw new Error("Not implemented") } idForAlert() { return D.prototype.idForAlert.call(this) } dependenciesForAlerts() { throw new Error("Not implemented") } _hasAvailableAlertPlots() { return !1 } _hasAlertablePlots() { return (this.metaInfo().plots || []).some((function(e) { return "line" === e.type })) } _hasAlertConditions() { if (this.metaInfo().plots.some(I.isAlertConditionPlot)) return !0; var e = this.stateForAlert(); return Boolean(e.alerts && e.alerts.conditions) } _hasAlertFunction() { const e = this.metaInfo(); return Boolean(e.hasAlertFunction) } _isAlertFeatureEnabled() { return !1 } hasStateForAlert() { return this._isAlertFeatureEnabled() && !this.isFailed() && (this.metaInfo() .isTVScript ? this._hasAlertConditions() || this ._hasAvailableAlertPlots() || this._hasAlertFunction() : this ._hasAlertablePlots()) } stateForAlert() { throw new Error("Not implemented") } isSavedInStudyTemplates() { for (var e = 0; e < this._metaInfo.inputs.length; e++) if ("bar_time" === this._metaInfo.inputs[e].type) return !1; return !0 } restoreData(e) { this._invalidateLastNonEmptyPlotRowCache(), this.data().restoreState(e), this._resolvedSymbols = e.symbols, this._graphics = e.graphics ? p(e .graphics) : d(), this._postProcessGraphics(), this._plotOffsets = e .plotOffsets, this._status = { type: N.Completed } } restart(e) { this._restarting = !0, this.clearData(), (e || k.enabled( "stop_study_on_restart")) && this.stop(), setTimeout(this.start .bind(this), 0) } stop(e) { if (!0 === e && this._children) for (var t = 0; t < this._children.length; ++t) this._children[t].stop(! 0); this._stopStudyOnServer(), this.clearData(), this._unsubscribeToSessionId(), this.recalculate() } _allInputsAreValid() { for (var e = 0; e < this._metaInfo.inputs.length; e++) if ("bar_time" === this._metaInfo.inputs[e].type) { var t = this._metaInfo.inputs[e].id, i = this._properties.inputs[t].value(); if (void 0 === i || null == i) return !1 } return !0 } sourceId() { return this._studyId } parentSource() { return this._source || this._series } symbolSource() { return this.parentSource().symbolSource() } source() { return this.parentSource() } ownerSource() { return this._isChildStudy ? this._source : D.prototype.ownerSource.call( this) } getAllOwnerSources() { for (var e = [], t = this.ownerSource(); null != t;) e.push(t), t = t .ownerSource(); return e } isChildStudy() { return !!this._isChildStudy } setChild(e) { e instanceof J && e.source() === this && (this._children || (this ._children = []), -1 === this._children.indexOf(e) && this ._children.push(e)) } unsetChild(e) { if (e instanceof J && e.source() === this && this._children) { var t = this._children.indexOf(e); ~t && this._children.splice(t, 1) } } hasChildren() { return !(!this._children || !this._children.length) } getAllChildren() { if (!Array.isArray(this._children)) return []; for (var e = this._children.slice(), t = 0; t < e.length; ++t) for (var i = e[t].getAllChildren(), s = 0; s < i.length; ++s) ~e .indexOf(i[s]) || e.push(i[s]); return e } _debugId() { var e = []; return this._studyId && e.push(this._studyId), e.push(this._metaInfo .fullId), e.push(this._metaInfo.description), JSON.stringify({ study: e }) } isStarted() { return !!this._studyId } _isStopped() { return !this.isStarted() } isRestarting() { return !!this._restarting } start(e, t) { var i = this._model.mainSeries(); if (!i.isStarted()) return void i.dataEvents().completed().subscribe(this, ( function() { this.start(e, t) }), !0); this._isChildStudy && this._source.isHibernated() && this._source.start(); const s = !(!this._isChildStudy && !this.hasChildren() && !this .isVisible()) || !0 === t; this._chartApi && this._chartApi.connected() && s && this ._allSymbolsAreResolved().then(function() { this._startAfterSymbolsResolved(e, t) }.bind(this)).catch(function(e) { H.logError("ERROR: " + this._debugId() + " start failed, " + e), delete this._restarting }.bind(this)) } _getStudyIdWithLatestVersion() { var e = x.cutDollarHash(this._metaInfo.id), t = e; return e.indexOf("@tv-scripting") >= 0 ? t += "-101!" : t += "-" + this ._metaInfo.version, t } _startAfterSymbolsResolved(e, t) { if (!this.isStarted() || this._restarting) { if (this._isChildStudy) { if (!this._source.isStarted() || this._source.isRestarting()) return void this._source.onStart.subscribe(this, this ._startAfterSymbolsResolved, !0); x.setChildStudyMetaInfoPropertiesSourceId(this._metaInfo, this ._source.sourceId(), this._properties) } if (delete this._restarting, this._allInputsAreValid() && (this ._inputs = this.inputs({ keepOptionalSymbolsEmpty: !0 }), this._createStudyOnServer(), this._subscribeToSessionId(), this.onStart.fire(), !0 === e && this._children)) for (var i = 0; i < this._children.length; ++i) this._children[i] .start(!0, t) } } _createStudyOnServer() { var e = this._getStudyIdWithLatestVersion(); this._studyId = E(), this._incrementTurnaround(), this._studyName = e, this._chartApi.createStudy(this._studyId, this._turnaround, this ._isChildStudy ? this._source.sourceId() : this._series .seriesSource().instanceId(), this._studyName, this._inputs, this ._handler, this._isChildStudy) } _modifyStudyOnServer(e) { this._chartApi.modifyStudy(this._studyId, this._turnaround, e, this ._handler) } _stopStudyOnServer() { this._chartApi && this._chartApi.connected() && this.isStarted() && this ._chartApi.removeStudy(this._studyId, this._isChildStudy), this ._studyId = null } _rightOffsetToUnixTime(e) { var t = null; if (this._series.bars().size() >= e) { var i = o(this._series.bars().lastIndex()) - e; t = o(this._series.bars().valueAt(i))[TradingView.TIME_PLOT] } return t } inputsForAlert() { var e = this.offset(), t = this.inputs(); return e && t.push(e), t } inputsForAlertState() { return this.inputs() } _prepareInputValue(e, t) { var i = e.id; if (t.valuesAsIsFromProperties) return this._properties.inputs[i].value(); if ("symbol" === e.type) { var s = t && t.symbolsForDisplay, r = this._properties.inputs[i].value(), n = s ? r : this._getSymbolForApi(r), o = this._resolvedSymbols && this._resolvedSymbols[this ._getSymbolForResolve(n)]; if ("" === n && e.optional) { if (t && t.keepOptionalSymbolsEmpty) return n; n = this._model.mainSeries().symbol(), o = this._model.mainSeries() .symbolInfo() } if (s) if (o) if (z) { switch (this._model.mainSeries().properties() .statusViewStyle.symbolTextSource.value()) { case "description": n = o.description; break; case "ticker-and-description": n = `${o.name}, ${o.description}`; break; case "ticker": n = o.name } } else n = l(o, t.noExchanges); else G && (n = ""); else o && (n = o.ticker || o.full_name), !this.isPine() && t && t .symbolsForChartApi && (n = this.getSymbolString(n)); return n } if ("bar_time" === e.type) { var a = this._properties.inputs[i].value(); if (a < 0) { var c = this._rightOffsetToUnixTime(-a); a = c && c >= 0 ? c : a } return a } if (this._metaInfo.isTVScript || this._metaInfo.pine) { if ("text" === i) return this._metaInfo.defaults.inputs.text; if ("pineId" === i) return this._metaInfo.scriptIdPart; if ("pineVersion" === i) return this._metaInfo.pine ? this._metaInfo .pine.version : "-1"; if ("color" === e.type && this._metaInfo.isRGB) { var h = this._properties.inputs[i].value(); return j(h) } return this._properties.inputs[i].value() } return this._properties.inputs[i].value() } _rebindToSource(e, t) { var i = this.parentSource(); if (this._isChildStudy) { var s; this._source.unsetChild(this); var r = null; if (e === this._model.mainSeries()) delete this._source, delete this ._isChildStudy, delete this._ownerSource, s = this._series .seriesSource().instanceId(), r = g .REBIND_STUDY_CHILD_TO_STANDALONE; else { if (!(e instanceof J)) return H.logError( "Unable to rebind study to source of this type"), !1; this._ownerSource = e, this._source = e, s = this._source .sourceId(), this._source.setChild(this), this._source .isHibernated() && this._source.start() } this._incrementTurnaround(), this.disablePriceRangeReady(), this ._chartApi.rebindStudy(this._studyId, this._turnaround, s, this ._studyName, t, this._handler, r) } else { if (!(e instanceof J)) return H.logError( "Unable to rebind study to source of this type"), !1; var n = e.isHibernated(); n && e.start(); var o = !1; if (this._canCreateStudyWithRebindType(g .REBIND_STUDY_STANDALONE_TO_CHILD) && (this ._incrementTurnaround(), this.disablePriceRangeReady(), o = this ._chartApi.rebindStudy(this._studyId, this._turnaround, e .sourceId(), this._studyName, t, this._handler, g .REBIND_STUDY_STANDALONE_TO_CHILD)), !o) return n && e .stop(), !1; this._isChildStudy = !0, this._ownerSource = e, this._source = e, this ._source.setChild(this), this._childStudyByRebind.fire() } var a = this.m_priceScale, l = e.priceScale(); if (a !== l) { var c = this._model.paneForSource(this), h = this._model.paneForSource(e); c === h && h.move(this, l, !0) } const u = this.parentSource(); return i.formatterChanged().unsubscribe(this, this ._onSourceFormatterChanged), u.formatterChanged().subscribe(this, this._onSourceFormatterChanged), i.priceStepChanged().unsubscribe( this, this._onSourcePriceStepChanged), u.priceStepChanged() .subscribe(this, this._onSourcePriceStepChanged), i.currencyChanged() .unsubscribeAll(this), u.currencyChanged().subscribe(this, this ._onSourceCurrencyChanged), i.unitChanged().unsubscribeAll(this), u .unitChanged().subscribe(this, this._onSourceUnitChanged), i .priceRangeReadyChanged().unsubscribeAll(this), u .priceRangeReadyChanged().subscribe(this, this ._onSourcePriceRangeReadyChanged), this ._recreatePriceFormattingDependencies(), !0 } childStudyByRebind() { return this._childStudyByRebind } _changeInputsImpl(e, t) { var i = this.source(), s = this._properties.inputs && this._properties.inputs.state(), r = x.getSourceIdByInputs(this._metaInfo.inputs, s), n = !0; if (r) if ("high" === r || "open" === r || "low" === r || "close" === r || "hl2" === r || "ohl3" === r || "ohlc4" === r) i = this._model .mainSeries(); else for (var o = this._model.dataSources().filter((function(e) { return e instanceof J && e.canHaveChildren() })), a = 0; a < o.length; ++a) if (o[a].sourceId() === r) { i = o[a]; break } if (i !== this.source()) { if (!this._rebindToSource(i, e) && s) for (var l in t) if (t.hasOwnProperty(l) && t[l] !== e[l] && 0 === e[l].indexOf( r)) { var c = this._properties.inputs[l], h = t[l]; c.setValue(h), n = !1; break } } else this._incrementTurnaround(), this.disablePriceRangeReady(), this ._modifyStudyOnServer(e); this.invalidateTitleCache(), n && (this._studyModified = n) } _incrementTurnaround() { this._turnaround = "st" + ++this._turnaroundCounter } _tryChangeInputs() { var e = TradingView.clone(this._inputs); this.isStarted() && this._chartApi.connected() ? this._allInputsAreValid() ? this._allSymbolsAreResolved().then(function() { var t = this.inputs({ keepOptionalSymbolsEmpty: !0 }); const i = JSON.stringify(t) !== JSON.stringify(this._inputs); this._isStopped() ? i && this.disablePriceRangeReady() : i && ( this._changeInputsImpl(t, e), this._inputs = t) }.bind(this)).catch(function(e) { H.logError("ERROR: " + this._debugId() + " _tryChangeInputs: cannot modify study, " + e) }.bind(this)) : this.stop() : (this.stop(!0), this.start(!0)), this ._tagsChanged.fire() } testInputValue(e, t) { if (!x.canBeChild(this._metaInfo) || !x.isSourceInput(e)) return !0; var i = this._properties.inputs && this._properties.inputs[e.id]; if (!i) return !0; var s = J.getInputRebindType(e, i.value(), t); return !!this._canCreateStudyWithRebindType(s) } _canCreateStudyWithRebindType(e) { return e !== g.REBIND_STUDY_STANDALONE_TO_CHILD || this._chartApi .isCanCreateStudy(!0) } changeStyles() { var e = void 0 !== this._metaInfo.inputs.find((function(e) { return "symbol" === e.type })); !this.isStarted() && !e || this._restarting || (this._inputs ? this ._tryChangeInputs() : this._chartApi && this._chartApi .connected() && this.restart()) } _recreatePaneViews() { this.hasBarColorer() && this._model.mainSeries().invalidateBarStylesCache(), this._createViews(), this.recalculate(!0), this.updateAllViews() } _onPropertiesChanged() { this.changeStyles(), this._recreatePaneViews(), T.emit( "study_properties_changed", this._id) } _isModifiedStudyInputs(e) { if (void 0 === this._oldStudyInputs) return this._oldStudyInputs = e, !0; var t = Object.keys(this._oldStudyInputs); return n(t.length === Object.keys(e).length, "keys quantity should be equal"), t.forEach((function(t) { n(e.hasOwnProperty(t), "key '" + t + "' should existing in studyInputs"), this ._oldStudyInputs[t] !== e[t] && (this._oldStudyInputs = e) }), this), this._oldStudyInputs === e } _pinePatchProps() { throw new Error("Not implemented") } priceLabelText(e) { var t, i = this._metaInfo.styles, s = this._metaInfo.ohlcPlots; i && i[e] && (t = i[e]), s && s[e] && (t = s[e]); var r = t.title; return 1 !== this._simplePlotsCount || I.isPlotTitleDefined(r) ? this ._metaInfo.is_price_study && r !== this._metaInfo.shortDescription ? "" === r ? this._metaInfo.shortDescription : this._metaInfo .shortDescription + ":" + r : r : this._metaInfo.shortDescription } createPriceAxisView(e) { return new h(this, { plotIndex: e }) } createPriceLineAxisView(e) { return new O(this, e) } _concatPriceAxisViews() { this._priceAxisViews = [].concat(this._priceAxisViewsBase, this ._graphicsPriceAxisViews, this._hlinesPriceAsisViews, this ._horizlinesPriceAsisViews) } recalculate(e) { var t = this._model.paneForSource(this); this._model.recalculatePane(t, e), this._model.updateSource(this) } data() { return this.m_data } metaInfo() { return this._metaInfo } graphicsInfo() { return this._metaInfo.graphics } graphics() { return this._graphics } turnaround(e) { var t = this.source(); return !0 === e ? (t === this._series ? t.seriesSource().turnaround() : t .turnaround(!0)) + "_" + this._turnaround : this._turnaround } _checkTurnaround(e) { return e === this._turnaround || e === this._model.mainSeries() .seriesSource().turnaround() || e === this.turnaround(!0) } _handleStudyError(e) { this.clearData(), this._setStatus(e), this._statusView.update(), this._model .updateSource(this) } _onStudyLoading() { this._setStatus({ type: N.Loading, startTime: Date.now() }), this._statusView.update(), this._model.updateSource(this) } _onStudyError(e) { var t = "string" == typeof e ? { error: e.split(":", 2)[0] } : e; this._handleStudyError({ type: N.Error, errorDescription: t }), this._enablePriceRangeReady() } _onStudyCompleted(e) { this._studyModified && (this.clearData(), this._studyModified = !1), this ._setStatus({ type: N.Completed }), this._statusView.update(); var t = this._model.paneForSource(this); this._model.recalculatePane(t), this._updateSources(); var i = B.full(); null !== this._model.appliedTimeFrame().value() && i .lockVisibleTimeRangeOnResize(), this._model.invalidate(i) } onData(e) { switch (e.method) { case "study_loading": this._onStudyLoading(); break; case "study_error": this._onStudyError(e.params[2]); break; case "study_completed": if (!this._checkTurnaround(e.params[1])) return; this._onStudyCompleted(e.params[e.params.length - 1]); break; case "data_update": if (e.params.customId !== this.sourceId() || !this._checkTurnaround( e.params.turnaround)) return; n(!!e.params.nonseries, "data.params.nonseries is missing"), this ._onDataUpdate(e.params.plots, e.params.nonseries); break; case "clear_data": this._checkTurnaround(e.params.turnaround) && this.clearData() } } _onDataUpdate(e, t) { this._studyModified && (this.clearData(), this._studyModified = !1); var i = a(t.d); return this._ongoingDataUpdate = this._ongoingDataUpdate.then((function() { return i }), (function() { return i })).then(this._onDataUnpacked.bind(this, e, t.indexes)), this ._ongoingDataUpdate } _onDataUnpacked(e, t, i) { this._isDestroyed || ("nochange" !== t && this._processPlotOffsets(i), this .transformData(e), this._mergeData(e), null !== i && (i .indexes_replace ? (n("nochange" !== t), this._graphics .replaceIndexesTo(t)) : ("nochange" !== t && this._graphics .replaceIndexesTo(t), void 0 !== i.graphicsCmds && this ._graphics.processCommands(i.graphicsCmds, this._metaInfo .graphics))), this._onDataUpdated(e, i, t), this .priceRangeReady() || this._enablePriceRangeReady()) } _onDataUpdated(e, t, i) { if (this.hasBarColorer() && e.length > 0) { var s = this.barColorer().firstColoredBar(e[0].index); this._model.mainSeries().invalidateBarStylesCache(s) } null !== t && this._postProcessGraphics(); var r = this._model.paneForSource(this); this._model.recalculatePane(r), this._updateSources() } transformData(e) {} moveData(e) { this._ongoingDataUpdate = this._ongoingDataUpdate.then(function() { this._invalidateLastNonEmptyPlotRowCache(), this.data().move(e) }.bind(this)) } replaceData(e, t, i) { this._invalidateLastNonEmptyPlotRowCache(), this.data().remove(e + 1), this .data().addTail(i, t) } _updateSources() { this._model.updateSource(this), this.hasBarColorer() && this._model .updateSource(this._model.mainSeries()) } static processPlotOffsets(e, t) { t && t.indexes_replace || (e._plotOffsets = t && t.offsets || {}) } _processPlotOffsets(e) { J.processPlotOffsets(this, e) } _mergeData(e) { this._invalidateLastNonEmptyPlotRowCache(), this.data().merge(e) } _postProcessGraphics() { this._graphicsPriceAxisViews = f(this), this._concatPriceAxisViews() } static offset(e, t) { var i = 0; return e._plotOffsets && void 0 !== e._plotOffsets[t] && (i += e ._plotOffsets[t]), void 0 !== e._plotOffsetsMetaInfoOverride[t] ? i += e._plotOffsetsMetaInfoOverride[t] : e.properties().offsets && void 0 !== e.properties().offsets[t] && (i += e.properties().offsets[t] .val.value()), e.properties().offset && (i += e.properties().offset .val.value()), i } offset(e) { return J.offset(this, e) } paneViews() { return this.isSourceHidden() ? null : this._paneViews } labelPaneViews() { return this.isSourceHidden() ? null : this._labelPaneViews } dataWindowView() { return this._dataWindowView } legendView() { return this._legendView } statusView() { return this._statusView } priceAxisViews(e, t) { return this.properties().oldShowLastValue && !this.properties() .oldShowLastValue.value() ? null : e.findTargetPriceAxisViews(this, t, this._priceAxisViews, this._priceLinesAxisViews) } _showLastValueOnPriceScale() { return this._model.properties().scalesProperties.showStudyLastValue.value() } hasBarColorer() { for (var e = 0; e < this._metaInfo.plots.length; ++e) if (I.isBarColorerPlot(this._metaInfo.plots[e])) return !0; return !1 } barColorer() { for (var e = null, t = 0; t < this._metaInfo.plots.length; ++t) if (I.isBarColorerPlot(this._metaInfo.plots[t])) { var i = new c(this, t); null == e ? e = i : e.pushBackBarColorer(i) } if (null == e) throw new Error( "Cannot create BarColorer: study doesn't have a bar_colorer plot!" ); return e } base() { return 0 } _priceScaleByProperties() { if ("default" === this.properties().precision.value()) return null; var e = parseInt(this.properties().precision.value()); return isFinite(e) ? Math.pow(10, e) : null } _formatterByProperties() { var e = this._priceScaleByProperties(); return null !== e ? new v(e) : null } _priceScaleByMetaInfo() { var e = this.metaInfo().format, t = isNumber(e.precision) ? Math.pow(10, e.precision) : void 0; if ("price" === e.type || "percent" === e.type) return t || 100; if ("volume" === e.type) { if (void 0 === e.precision) { var i = this.series().symbolInfo(); if (null !== i && isNumber(i.volume_precision)) return Math.pow(10, i.volume_precision) } return 1 } return "inherit" === e.type || H.logWarn("Unsupported format type: " + e .type), null } _formatterByMetaInfo() { var e = this.metaInfo().format, t = isNumber(e.precision) ? Math.pow(10, e.precision) : void 0; switch (e.type) { case "price": return new v(t); case "volume": var i = e.precision; if (void 0 === i) { var s = this.series().symbolInfo(); i = s && isNumber(s.volume_precision) ? s.volume_precision : 0 } return new S(i); case "percent": return new y(t); case "inherit": return null; default: return H.logWarn("Unsupported format type: " + e.type), null } } _onSourceFormatterChanged() { null === this._formatter && (null !== this.priceScale() && this.priceScale() .updateFormatter(), this._formatterChanged.fire()) } _onSourcePriceStepChanged() { null === this._priceStep && this._priceStepChanged.fire() } _precisionChanged() { this._recreatePriceFormattingDependencies() } _recreatePriceFormattingDependencies() { this._recreateFormatter(), this._recreatePriceStep() } _recreateFormatter() { this._formatter = this._tryCreateFormatter(), this._formatterChanged.fire(), null !== this.priceScale() && this.priceScale().updateFormatter(), this ._model.fullUpdate() } _recreatePriceStep() { var e = null, t = this._tryToGetPriceScale(); null !== t && (e = 1 / t), this._priceStep !== e && (this._priceStep = e, this._priceStepChanged.fire()) } _tryToGetPriceScale() { var e = this._priceScaleByProperties(); return null === e && (e = this._priceScaleByMetaInfo()), e } _tryCreateFormatter() { var e = this._formatterByProperties(); return null === e && (e = this._formatterByMetaInfo()), e } formatter() { return this._formatter || this.parentSource().formatter(!1) } priceStep() { return this._priceStep || this.parentSource().priceStep(!1) } setOwnerSource(e) { super.setOwnerSource(e), this._recreatePriceFormattingDependencies() } nearestIndex(e, t, i) { if (TradingView.isInteger(e)) { var s = this.data().search(e, t, i); return null !== s ? s.index : void 0 } H.logDebug("nearestIndex: incorrect logicalPoint") } updateAllViews() { for (var e = 0; e < this._paneViews.length; e++) this._paneViews[e] .update(); for (e = 0; e < this._labelPaneViews.length; e++) this._labelPaneViews[e] .update(); this._dataWindowView.update(), null !== this._legendView && this._legendView .update(), this._statusView.update(); for (e = 0; e < this._priceAxisViews.length; e++) this._priceAxisViews[e] .update(); this._priceLinesAxisViews.forEach((function(e) { e.update() })) } tags() { return !this._metaInfo || !this._metaInfo.description || this._metaInfo .isTVScriptStub || this._metaInfo.is_hidden_study || this._metaInfo .isTVScript && "tv-scripting" === this._metaInfo.productId ? [] : [this ._metaInfo.description ] } onExtendedHoursChanged() { this.restart(!0) } hasSymbolInputs() { for (var e = this._metaInfo.inputs.length; e--;) if ("symbol" === this._metaInfo.inputs[e].type) return !0; return !1 } canOverrideMinTick() { return !1 } _subscribeExtendedHours() { !this._isSubscribedToExtendedHours && this.hasSymbolInputs() && (this ._series.onExtendedHoursChanged().subscribe(this, this .onExtendedHoursChanged), this._isSubscribedToExtendedHours = !0 ) } removeByRemoveAllStudies() { return !0 } canHaveChildren() { return void 0 === this._canHaveChildren && (this._canHaveChildren = !!x .canHaveChildren(this._metaInfo)), this._canHaveChildren } static getInputRebindType(e, t, i) { var s = x.isSourceInput(e); return s && !~t.indexOf("$") && ~i.indexOf("$") ? g .REBIND_STUDY_STANDALONE_TO_CHILD : s && ~t.indexOf("$") && !~i.indexOf( "$") ? g.REBIND_STUDY_CHILD_TO_STANDALONE : 0 } getPlotFields() { return this._plotFields } getMinFirstBarIndexForPlot(e) { var t = K(this._properties.styles, e) || K(this._properties.ohlcPlots, e) || K(this._properties.filledAreasStyle, e); if (null === t) return -1 / 0; var i = this.data().lastIndex(); return null === i ? -1 / 0 : i - t + 1 } _getPropertyDefinitionsViewModelClass() { return Promise.resolve(null) } getPropertyDefinitionsViewModel() { if (null === this._definitionsViewModel) { var e = this; return e._getPropertyDefinitionsViewModelClass().then((function(t) { return null === t || e._isDestroyed ? null : (null === e ._definitionsViewModel && (e ._definitionsViewModel = new t(e._model .undoModel(), e)), e ._definitionsViewModel) })) } return Promise.resolve(this._definitionsViewModel) } isPine() { return void 0 !== this._metaInfo.pine } isStandardPine() { return this.isPine() && x.isStandardPine(this._metaInfo.id) } isLinkedToSeries() { return !0 === this._metaInfo.linkedToSeries } _getTelemetryObjectName() { return "study" } _getTelemetryAdditionalData() { var e = ""; return this._metaInfo.pine && this._metaInfo.pine.version && this._metaInfo .shortId.indexOf("USER") >= 0 && (e = "_v" + this._metaInfo.pine .version), { symbol: this.series().actualSymbol(), resolution: this.series().interval(), study: this._metaInfo.shortId + e } } _sendTelemetryReport(e, t, i) { void 0 === i && (i = this._getTelemetryAdditionalData()); var s = Object.assign(t, { additional: i }); (void 0).sendChartReport(e, s) } _sendTelemetryCounter(e, t) { this._sendTelemetryReport(e, { count: 1 }, t) } onAboutToBeDestroyed() { return this._aboutToBeDestroyed } destroy() { this._aboutToBeDestroyed.fire(), this._isDestroyed = !0, this._legendView && this._legendView.destroy(), null !== this._definitionsViewModel && (this ._definitionsViewModel.destroy(), this._definitionsViewModel = null ), this._properties.precision.listeners().unsubscribe(this, this ._precisionChanged), this._showStudyArgumentsProperty.listeners() .unsubscribe(this, this.invalidateTitleCache), this._properties .description.listeners().unsubscribe(this, this.invalidateTitleCache), this._properties.shortDescription && this._properties.shortDescription .listeners().unsubscribe(this, this.invalidateTitleCache), this._model .mainSeries().dataEvents().symbolResolved().unsubscribeAll(this), this ._properties.showInDataWindow.listeners().unsubscribe(this._model, this ._model.fullUpdate), this.hasBarColorer() && this._properties .visible.listeners().unsubscribe(this._model.mainSeries(), this._model .mainSeries().invalidateBarStylesCache), this._model.mainSeries() .dataEvents().symbolResolved().unsubscribe(this, this ._recreatePriceFormattingDependencies), super.destroy() } desiredPriceScalePosition() { return this.metaInfo().isTVScriptStub ? "overlay" : this.metaInfo() .linkedToSeries ? "as-series" : void 0 === this.metaInfo().priceScale ? null : ["right", "left", "overlay"][this.metaInfo().priceScale] } guiPlotName(e) { var t = this.properties().styles; return t && t[e] && t[e].title ? t[e].title.value() : this.title() } defaultPlotIdForAlert() { return this._metaInfo.plots.length ? this._metaInfo.plots[0].id : null } formatterChanged() { return this._formatterChanged } copiable() { return U && !this.isChildStudy() } setPriceScale(e) { super.setPriceScale(e), T.emit("study_event", this.id(), "price_scale_changed") } disconnect() { this._studyId = null } } TradingView.Study = J, t.Study = J, t.prepareStudyProperties = function(t, s, r, o, a) { return function(t, s, r, o, a, l) { var c = function(t, s, r, o) { var a = i("K4L1"); if (x.versionOf(t) < 1) throw new Error( "This function cannot work with metainfo of the old format version. Required format version >= 1" ); var l = TradingView.clone(defaults("study")); Y(l, t); var c = x.getStudyPropertyRootName(t), h = TradingView.clone(defaults(c, o)); h.intervalsVisibilities = TradingView.clone(W), ("Overlay" === t .shortId || "Compare" === t.shortId) && (h.currencyId = null, h.unitId = null); t.isTVScript && t.TVScriptSourceCode !== h.TVScriptSourceCode && (h = TradingView.clone(TradingView.factoryDefaults(c, o))); TradingView.merge(l, h), s && (n(!(s instanceof e), "propsState should not be an instance of Property"), TradingView.merge(l, s)); var u = TradingView.clone(t), d = {}; a.mergeInputsObjPart(d, u.defaults.inputs), a .mergeInputsObjPart(d, l.inputs), l.inputs = d, delete u .inputs, delete u.defaults.inputs; var p = {}; if (TradingView.merge(p, u.defaults), TradingView.merge(p, TradingView.factoryDefaults(c)), TradingView.merge(p, l), TradingView.merge(p, u), delete p.defaults, l = p, null !== r) { var _ = r.model().studiesColorRotatorFactory() .getColorRotator(t); null !== _ && ("Overlay@tv-basicstudies" === t.id ? l .lineStyle.color = _.getColor(l.lineStyle.color, t) : TradingView.merge(l, function(e, t) { for (var i in e.styles) { var s = e.styles[i].color; s && (e.styles[i].color = t.getColor(s)) } return e }(l, _))) } s && TradingView.merge(l.styles, s.styles); return l }(t, s, r, o), h = x.getSourceInputIds(t); if (h.length > 0) { var u = h[0]; l instanceof J ? c.inputs[u] = "{pid}$0" : void 0 !== c.inputs[u] && -1 !== c.inputs[u].indexOf("$") && (c.inputs[u] = "close") } return q(t, a, c) }(t, s, r, o, x.getStudyPropertyRootName(t), a) }, t.prepareStudyPropertiesForLoadChart = function(e, t, s, r, n, o) { return function(e, t, s, r, n, o, a) { var l = function(e, t, s, r, n) { var o = i("K4L1"); e.version && s.version && e.version !== s.version && H.logWarn( "Serialized metaInfo version " + e.version + " is not equal to the saved state version " + s.version); var a = TradingView.clone(defaults("study")); a.intervalsVisibilities = TradingView.clone(W), TradingView .merge(a, TradingView.factoryDefaults(x .getStudyPropertyRootName(e))), Y(a, e), TradingView .merge(a, s), a = n.updateStudyState(a, e, t); var l = TradingView.clone(t || e); if (l && x.versionOf(l) >= 1) { var c = {}; o.mergeInputsObjPart(c, (l.defaults || {}).inputs), o .mergeInputsObjPart(c, a.inputs), a.inputs = c, delete l .inputs, l.defaults && delete l.defaults.inputs; var h = {}; TradingView.merge(h, l.defaults), TradingView.merge(h, TradingView.factoryDefaults(x .getStudyPropertyRootName(l))), TradingView .merge(h, a), delete l.defaults, TradingView.merge(h, l), a = h } return a }(e, t, s, 0, n); return q(t || e, o, l) }(e, t, s, 0, n, x.getStudyPropertyRootName(e)) } }).call(this, i("tc+8"), i("aIyQ")) }, GVQo: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); var s = i("Eyy1"), r = i("3ClC"), n = i("CW80"); function o(e, t) { if (1 === t.length && Object(r.isStudy)(t[0])) { const e = t[0]; return { title: e.title(), sources: [{ source: Object(s.ensureNotNull)(e.state()), type: "study" }] } } const i = { sources: [], title: "" }; return i.sources = t.filter(e => e.copiable() && Object(n.isLineTool)(e)).map(t => { const i = { type: "drawing", geometry: t.geometry(), source: { ...t.state(!1), points: t.normalizedPoints() }, modelId: e }; return delete i.source.alertId, i }), i.sources.length > 0 ? (1 === i.sources.length ? i.title = t[0].title && t[0] .title() : i.title = "Drawings", i) : null } }, GhVi: function(e, t, i) { "use strict"; (function(t) { function i() { this._marksByIndex = new Map, this._marksBySpan = [], this.changed = new t, this .minIndex = void 0, this.maxIndex = void 0 } i.prototype.reset = function() { this._resetImpl(), this.changed.fire() }, i.prototype._resetImpl = function() { this._marksByIndex = new Map, this._marksBySpan = [], this.minIndex = void 0, this.maxIndex = void 0, this._cache = void 0 }, i.prototype.merge = function(e) { if (0 !== e.length) { var t = e[0].index, i = e[e.length - 1].index; t <= this.minIndex && i >= this.maxIndex && this._resetImpl(); for (var s = this._marksBySpan, r = new Set, n = 0; n < e.length; n++) { var o = (c = e[n]).index, a = c.span, l = this._marksByIndex.get(c.index); if (l) { if (l.index === c.index && l.span === c.span) { l.time = c.time; continue } this._removeTickmark(l) } } for (n = 0; n < e.length; n++) { var c; o = (c = e[n]).index, a = c.span; if (!this._marksByIndex.has(c.index)) { this._marksByIndex.set(o, c); var h = s[a]; void 0 === h && (h = [], s[a] = h); var u = 0 === h.length || h[h.length - 1].index < c.index; s[a].push(c), u || r.add(a) } } this.minIndex = void 0 === this.minIndex ? t : Math.min(this.minIndex, t), this.maxIndex = void 0 === this.maxIndex ? i : Math.max(this.maxIndex, i); for (a = s.length; a--;) s[a] && (s[a].length || delete s[a], r.has(a) && s[ a].sort(this._sortByIndexAsc)); this._cache = void 0, this.changed.fire() } }, i.prototype._removeTickmark = function(e) { var t = e.index; if (this._marksByIndex.get(t) === e) { this._marksByIndex.delete(t), t <= this.minIndex && this.minIndex++, t >= this.maxIndex && this .maxIndex--, this.maxIndex < this.minIndex && (this.minIndex = void 0, this.maxIndex = void 0); var i = this._marksBySpan[e.span], s = i.indexOf(e); - 1 !== s && i.splice(s, 1) } }, i.prototype._sortByIndexAsc = function(e, t) { return e.index - t.index }, i.prototype.removeTail = function(e) { var t = new Map; this.maxIndex = 0, this._marksByIndex.forEach(function(i, s) { i.time < e && (t.set(s, i), this.maxIndex = Math.max(this.maxIndex, s)) }.bind(this)), this._marksByIndex = t }, i.prototype.addTail = function(e) { for (var t = 0; t < e.length; t++) e[t].index = this.maxIndex + t + 1; this.merge(e) }, i.prototype.indexToTime = function(e) { var t = this._marksByIndex.get(e); return t ? new Date(1e3 * t.time) : null }, i.prototype.density = function() { var e = this.maxIndex - this.minIndex; if (0 !== e) return 1e3 * (this._marksByIndex.get(this.maxIndex).time - this ._marksByIndex.get(this.minIndex).time) / e }, i.prototype.estimateLeft = function(e) { var t = this.density(); if (t) return (1e3 * this._marksByIndex.get(this.minIndex).time - e) / t }, i.prototype.nearestIndex = function(e) { for (var t = this.minIndex, i = this.maxIndex; i - t > 2;) { if (1e3 * this._marksByIndex.get(t).time === e) return t; if (1e3 * this._marksByIndex.get(i).time === e) return i; var s = Math.round((t + i) / 2); 1e3 * this._marksByIndex.get(s).time > e ? i = s : t = s } return t }, i.prototype.build = function(e, t) { var i = Math.ceil(t / e); if (this._maxbar === i && this._cache) return this._cache; this._maxbar = i; for (var s = [], r = this._marksBySpan.length; r--;) if (this._marksBySpan[r]) { var n = s; s = []; for (var o = n.length, a = 0, l = this._marksBySpan[r], c = l.length, h = 1 / 0, u = -1 / 0, d = 0; d < c; d++) { for (var p = l[d], _ = p.index; a < o;) { var m = n[a], f = m.index; if (!(f < _)) { h = f; break } a++, s.push(m), u = f, h = 1 / 0 } h - _ >= i && _ - u >= i && (s.push(p), u = _) } for (; a < o; a++) s.push(n[a]) } return this._cache = s, this._cache }, i.prototype.state = function() { for (var e = [], t = this._marksBySpan.length; t--;) this._marksBySpan[t] && ( e = e.concat(this._marksBySpan[t])); return { marks: e = e.map((function(e) { return [e.span, e.time, e.index] })), version: 2 } }, i.prototype.restoreState = function(e) { if (this._marksByIndex = new Map, this._marksBySpan = [], this.maxIndex = void 0, this.minIndex = void 0, e && e.marks && e.marks.length) if (2 === e.version) { var t = e.marks.map((function(e) { return { span: e[0], time: e[1], index: e[2] } })); this.merge(t) } else this.merge(e.marks) }, e.exports.Tickmarks = i }).call(this, i("aIyQ")) }, GmZZ: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("fJhV"); class r extends s.LineDataSourceTimeAxisView { constructor(e) { super(e, 0) } _getBgColor() { return this._source.properties().linecolor.value() } _getAlwaysInViewPort() { return !1 } _getIndex() { const e = this._source.points(); return 0 === e.length ? null : e[0].index } } }, GxN8: function(e, t, i) { "use strict"; function s(e) { return Boolean(e.showInObjectTree) } i.d(t, "a", (function() { return s })) }, H007: function(e, t, i) { "use strict"; i.r(t), i.d(t, "RiskRewordEntryPriceProperty", (function() { return a })), i.d(t, "RiskRewordStopPriceProperty", (function() { return l })), i.d(t, "RiskRewardTargetPriceProperty", (function() { return c })); var s = i("Eyy1"), r = i("tc+8"), n = i.n(r); class o extends n.a { constructor(e, t) { super(), this._lineSource = e, this._pointIndex = t } value() { const e = this._lineSource.points()[this._pointIndex].price; return this._formatAndParsePrice(e) } state() { return this.value() } merge(e, t) { return this.setValue(e), t ? [] : null } _formatAndParsePrice(e) { const t = Object(s.ensureNotNull)(this._lineSource.ownerSource()).formatter(); if (t.parse) { const i = t.format(e), s = t.parse(i); return s.res ? s.value : e } return e } } class a extends o { constructor(e) { super(e, 0) } setValue(e) { const t = this._lineSource.points()[this._pointIndex]; this._lineSource.startChanging(this._pointIndex, t), t.price = parseFloat("" + e), this._lineSource.setPoint(this._pointIndex, t), this._lineSource.recalculate(), this._lineSource.model().updateSource(this._lineSource), this._listeners.fire( this), this._lineSource.endChanging(!1, !1), this._lineSource .syncPriceLevels() } } class l extends o { constructor(e) { super(e, 1) } value() { const e = this._lineSource.stopPrice(); return this._formatAndParsePrice(e) } setValue(e) { const t = Math.round(Math.abs(e - this._lineSource.entryPrice()) * this._lineSource .model().mainSeries().base()); this._lineSource.properties().childs().stopLevel.setValue(t), this._lineSource .syncPriceLevels() } } class c extends o { constructor(e) { super(e, 2) } value() { const e = this._lineSource.profitPrice(); return this._formatAndParsePrice(e) } setValue(e) { const t = Math.round(Math.abs(e - this._lineSource.entryPrice()) * this._lineSource .model().mainSeries().base()); this._lineSource.properties().childs().profitLevel.setValue(t), this._lineSource .syncPriceLevels() } } }, H0vP: function(e, t, i) { "use strict"; i.r(t); var s, r = i("Eyy1"); class n { constructor(e = o) { this._paneInvalidationLevel = o, this._leftPriceScalesInvalidationMap = new Map, this._rightPriceScalesInvalidationMap = new Map, this._invalidationLevel = e } fullInvalidation() { return this._invalidationLevel } invalidateAll(e) { this._invalidationLevel = Math.max(this._invalidationLevel, e) } invalidatePane(e) { this._paneInvalidationLevel = Math.max(this._invalidationLevel, e) } invalidatePriceScale(e, t, i) { const s = "left" === e ? this._leftPriceScalesInvalidationMap : this ._rightPriceScalesInvalidationMap, r = s.get(t) || o; s.set(t, Math.max(r, i)) } invalidationLevelForPane() { return Math.max(this._paneInvalidationLevel, this._invalidationLevel) } getterForPriceScaleInvalidationLevelBySide(e) { const t = "left" === e ? this._leftPriceScalesInvalidationMap : this ._rightPriceScalesInvalidationMap; return e => Math.max(t.get(e) || o, this._invalidationLevel) } priceScaleSideMaxLevel(e) { const t = "left" === e ? this._leftPriceScalesInvalidationMap : this ._rightPriceScalesInvalidationMap; let i = this._invalidationLevel; return t.size > 0 && t.forEach(e => { e > i && (i = e) }), i } merge(e) { this._invalidationLevel = Math.max(this._invalidationLevel, e._invalidationLevel), this._paneInvalidationLevel = Math.max(this._paneInvalidationLevel, e ._paneInvalidationLevel), e._leftPriceScalesInvalidationMap.forEach((e, t) => { const i = this._leftPriceScalesInvalidationMap.get(t) || o; this._leftPriceScalesInvalidationMap.set(t, Math.max(i, e)) }), e._rightPriceScalesInvalidationMap.forEach((e, t) => { const i = this._rightPriceScalesInvalidationMap.get(t) || o; this._rightPriceScalesInvalidationMap.set(t, Math.max(i, e)) }) } } i.d(t, "InvalidationLevel", (function() { return s })), i.d(t, "defaultInvalidationLevel", (function() { return o })), i.d(t, "InvalidationMask", (function() { return a })), function(e) { e[e.None = 0] = "None", e[e.Cursor = 1] = "Cursor", e[e.Light = 2] = "Light", e[e.Full = 3] = "Full" }(s || (s = {})); const o = s.None; class a { constructor(e = o) { this._panesOrderChanged = !1, this._keepVisibleTimeRangeOnResize = !1, this ._timeAxisInvalidationLevel = o, this._invalidatedPanes = new Map, this ._additionalActions = [], this._invalidationLevel = e } invalidateAll(e) { this._invalidationLevel !== e && (this._invalidationLevel = Math.max(this ._invalidationLevel, e), this._invalidatedPanes.forEach(e => { e.invalidateAll(this._invalidationLevel) })) } invalidateAllPane(e, t) { this._invalidatedPanes.has(e) || this._invalidatedPanes.set(e, new n(this ._invalidationLevel)), Object(r.ensureDefined)(this._invalidatedPanes.get( e)).invalidateAll(t) } invalidatePriceScale(e, t, i, s) { this._invalidatedPanes.has(e) || this._invalidatedPanes.set(e, new n(this ._invalidationLevel)), Object(r.ensureDefined)(this._invalidatedPanes.get( e)).invalidatePriceScale(t, i, s) } invalidateTimeScale(e) { this._timeAxisInvalidationLevel = Math.max(this._timeAxisInvalidationLevel, e) } invalidatePanesOrder() { this._panesOrderChanged = !0 } lockVisibleTimeRangeOnResize() { this._keepVisibleTimeRangeOnResize = !0 } fullInvalidation() { return this._invalidationLevel } maxPaneInvalidation() { const e = []; return this._invalidatedPanes.forEach(t => { e.push(t.fullInvalidation()) }), Math.max(...e, this._invalidationLevel) } invalidateForPane(e) { return this._invalidatedPanes.get(e) || new n(this._invalidationLevel) } invalidateForTimeScale() { return Math.max(this._timeAxisInvalidationLevel, this._invalidationLevel) } validationActions() { return this._additionalActions } addValidationAction(e) { this._additionalActions.push(e) } merge(e) { this._invalidationLevel = Math.max(this._invalidationLevel, e._invalidationLevel), this._panesOrderChanged = this._panesOrderChanged || e._panesOrderChanged, this ._keepVisibleTimeRangeOnResize = this._keepVisibleTimeRangeOnResize || e ._keepVisibleTimeRangeOnResize, this._invalidatedPanes.forEach(e => { e.invalidateAll(this._invalidationLevel) }), e._invalidatedPanes.forEach((e, t) => { this._invalidatedPanes.has(t) || this._invalidatedPanes.set(t, new n( this._invalidationLevel)), Object(r.ensureDefined)(this ._invalidatedPanes.get(t)).merge(e) }), this._timeAxisInvalidationLevel = Math.max(this._timeAxisInvalidationLevel, e._timeAxisInvalidationLevel); for (let t = 0; t < e._additionalActions.length; t++) this._additionalActions.push(e ._additionalActions[t]) } panesOrderInvalidated() { return this._panesOrderChanged } isVisibleTimeRangeLockedOnResize() { return this._keepVisibleTimeRangeOnResize } static cursor() { return new a(s.Cursor) } static light() { return new a(s.Light) } static full() { return new a(s.Full) } static panesOrder() { const e = a.full(); return e.invalidatePanesOrder(), e } static validateAction(e) { const t = new a; return t._additionalActions.push(e), t } } }, HGP3: function(e, t, i) { "use strict"; i.r(t); var s = i("iR50"), r = i("RBvv"), n = i("Eyy1"); const o = { ...s, ...r }, a = {}, l = Object.keys(o).length, c = /^#[0-9A-F]{6}$/i; Object.keys(o).forEach(e => { const t = function e(t, i = []) { const s = o[t]; if (!s) return null; if (c.test(s)) return s; const r = s; return i.push(t), -1 !== i.indexOf(r) ? (console.warn( "Colors definitions cycled"), s) : i.length > l ? (console.warn( "Too many variables-link in HEX-color search: " + i[0]), null) : e( r, i) }(e); a[e] = Object(n.ensureNotNull)(t) }); const h = a; function u(e) { const t = h[e]; if (!t) throw new Error("No such color " + e); return t } i.d(t, "colorsPalette", (function() { return h })), i.d(t, "getHexColorByName", (function() { return u })) }, HGup: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })), i.d(t, "c", (function() { return a })), i.d(t, "b", (function() { return l })); var s = i("Eyy1"), r = i("3u3j"); class n extends r.a { constructor(e, t, i) { super(e, t, i) } redo() { const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this ._sourceId)), t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)), i = this._chartModel.children(e, !0); t.bulkActionMacro(() => { i.forEach(e => this._chartModel.detachSource(e)), this._chartModel .detachSource(e) }); const r = this._chartModel.createPane(this.targetPaneIndex()), n = r.findSuitableScale(e); r.bulkActionMacro(() => { r.addDataSource(e, n, !1), i.forEach(e => r.addDataSource(e, n, !1)) }), Object(s.ensureNotNull)(e.priceScale()).restoreState(this ._newPriceScaleState(r.isOverlay(e))), this._chartModel.fullUpdate(), this._chartModel.setShouldBeSavedEvenIfHidden(!0) } undo() { const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this ._sourceId)), t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)), i = this._chartModel.children(e, !0); t.bulkActionMacro(() => { i.forEach(e => this._chartModel.detachSource(e)); const t = this._chartModel.detachSource(e); Object(s.assert)(t, "Undo of detaching must remove pane") }); const r = this._chartModel.panes()[this._initialPaneIndex]; let n = r.getPriceScaleById(this._initialPriceScaleId); null === n && (n = r.createPriceScaleAtPosition(this._initialPriceScalePosition, this._initialPriceScaleIndex)), r.bulkActionMacro(() => { r.addDataSource(e, n, !0), i.forEach(e => r.addDataSource(e, n, !1)) }), Object(s.ensureNotNull)(e.priceScale()).restoreState(this ._originalPriceScaleState()), this._chartModel.fullUpdate() } } class o extends n { constructor(e, t, i) { super(e, t, i) } targetPaneIndex() { return this._initialPaneIndex + 1 } } class a extends n { constructor(e, t, i) { super(e, t, i) } targetPaneIndex() { return this._initialPaneIndex } } class l extends n { constructor(e, t, i) { super(e, t, i) } targetPaneIndex() { return this._chartModel.panes().length } } }, HLXm: function(e, t, i) { "use strict"; function s(e) { "LineToolGannComplex" !== e.type || void 0 !== e.version && 1 !== e.version || (e.type = "LineToolGannFixed") } i.r(t), i.d(t, "migrateState", (function() { return s })) }, "HV/F": function(e, t, i) { "use strict"; function s(e) { const t = {}; return { promise: new Promise((i, s) => { e.subscribe(t, i, !0) }), destroy: () => { e.unsubscribeAll(t) } } } i.r(t), i.d(t, "delegateToPromise", (function() { return s })) }, HY7u: function(e, t, i) {}, HZKX: function(e, t, i) { "use strict"; i.r(t), i.d(t, "defaultContextMenuOptions", (function() { return Te })), i.d(t, "createActionAddAlert", (function() { return Me })), i.d(t, "createActionTrade", (function() { return Oe })), i.d(t, "createActionOrder", (function() { return Le })), i.d(t, "createMTPredictorActions", (function() { return Ae })), i.d(t, "createLinesAction", (function() { return Ee })), i.d(t, "ActionsProvider", (function() { return ke })); var s = i("Eyy1"), r = i("txPx"), n = (i("nc0P"), i("ogJP")), o = i("Kxc7"), a = i("7KDR"), l = i("YmeR"), c = i("Daqx"), h = i("3ClC"), u = i("QloM"), d = i("Qq0B"), p = i("z61+"), _ = i("/3z9"), m = i("L/Ed"), f = i("cKqi"), g = i("YzC7"), b = i("pvsv"), v = i("GVQo"), S = i("CW80"), y = i("/tGj"), w = i("2uTr"), P = i("YFKU"), C = i("//lZ"), x = i("9uLv"); const T = Object(r.getLogger)("Chart.ActionsProvider"), I = (Object(P.t)("Add Alert"), Object(P.t)("Add Alert on {series}"), Object(P.t)( "Add Alert on {drawing}"), Object(w.appendEllipsis)(Object(P.t)( "Edit {title} Alert"))), M = Object(P.t)("Extend Alert Lines"), O = Object(P.t)("Show alert label lines"), L = Object(P.t)("Hide alert label lines"), A = (Object(P.t)("Trade"), Object(w.appendEllipsis)(Object(P.t)("Create Limit Order")), Object(P.t)("Show")), E = Object(P.t)("Hide"), k = (Object(P.t)("MTPredictor"), Object(P.t)("Apply Manual Risk/Reward"), Object(P.t)( "Apply Manual Decision Point"), Object(P.t)("Analyze Trade Setup"), Object(P.t)( "Apply Elliott Wave"), Object(P.t)("Apply Elliott Wave Intermediate"), Object(P.t)( "Apply Elliott Wave Major"), Object(P.t)("Apply Elliott Wave Minor"), Object(P.t)( "Apply WPT Up Wave"), Object(P.t)("Up Wave 1 or A"), Object(P.t)("Up Wave 2 or B"), Object(P.t)("Up Wave C"), Object(P.t)("Up Wave 3"), Object(P.t)("Up Wave 4"), Object(P .t)("Up Wave 5"), Object(P.t)("Apply WPT Down Wave"), Object(P.t)( "Down Wave 1 or A"), Object(P.t)("Down Wave 2 or B"), Object(P.t)("Down Wave C"), Object(P.t)("Down Wave 3"), Object(P.t)("Down Wave 4"), Object(P.t)("Down Wave 5"), Object(P.t)("Pinned To Scale {label} (Hidden)")), D = Object(P.t)("Pinned To Right Scale (Hidden)"), V = Object(P.t)("Pin To Scale {label} (Hidden)"), B = Object(P.t)("Pin To Right Scale (Hidden)"), R = Object(P.t)("Pinned To Scale {label}"), N = Object(P.t)("Pinned To Right Scale"), j = Object(P.t)("Pin To Scale {label}"), F = Object(P.t)("Pin To Right Scale"), W = Object(P.t)("Pinned To Left Scale (Hidden)"), H = Object(P.t)("Pin To Left Scale (Hidden)"), U = Object(P.t)("Pinned To Left Scale"), z = Object(P.t)("Pin To Left Scale"), G = Object(P.t)("Pin To New Left Scale"), q = Object(P.t)("Pin To New Right Scale"), Y = Object(P.t)("Pin To Scale (Now {label})"), K = Object(P.t)("Pin To Scale (Now No Scale)"), J = Object(P.t)("Pin To Scale (Now Left)"), Z = Object(P.t)("Pin To Scale (Now Right)"), X = Object(P.t)("No Scale (Fullscreen)"), $ = Object(P.t)("Move To"), Q = Object(P.t)("Existing Pane Above"), ee = Object(P.t)("New Pane Above"), te = Object(P.t)("Existing Pane Below"), ie = Object(P.t)("New Pane Below"), se = Object(P.t)("Bring to Front"), re = Object(P.t)("Send to Back"), ne = Object(P.t)("Bring Forward"), oe = Object(P.t)("Send Backward"), ae = Object(P.t)("Visual Order"), le = Object(P.t)("Lines"), ce = Object(w.appendEllipsis)(Object(P.t)("Add Indicator/Strategy on {studyTitle}")), he = (Object(w.appendEllipsis)(Object(P.t)("Add Financial metric for {instrumentName}")), Object(w.appendEllipsis)(Object(P.t)("Settings"))), ue = Object(P.t)("Apply Default"), de = Object(w.appendEllipsis)(Object(P.t)("Save As")), pe = Object(P.t)("Copy"), _e = Object(P.t)("Clone"), me = Object(P.t)("Template"), fe = (Object(P.t)("Sync To All Charts"), Object(P.t)("Go to {lineToolName}")), ge = Object(P.t)("Unlock"), be = Object(P.t)("Lock"), ve = (Object(P.t)("Show Earnings"), Object(P.t)("Show Dividends"), Object(P.t)( "Show Splits"), Object(P.t)("Show All Ideas")), Se = Object(P.t)("Show Ideas of Followed Users"), ye = Object(P.t)("Show My Ideas Only"), we = Object(w.appendEllipsis)(Object(P.t)("Settings")), Pe = Object(P.t)("Hide Events on Chart"), Ce = Object(P.t)("Add this Symbol to Entire Layout"), xe = Object(P.t)("Add this Indicator to Entire Layout"), Te = (Object(P.t)("Add this Strategy to Entire Layout"), Object(P.t)( "Add this Financial Metric to Entire Layout"), { general: !0, mainSeries: !0, mainSeriesTrade: !0, esdStudies: !0, studies: !0, fundamentals: !0, lineTools: !0, publishedCharts: !0, ordersAndPositions: !0, alerts: !0, chartEvents: !0, objectTree: !0, gotoLineTool: !1 }); function Ie(e) { return Object(y.isSymbolSource)(e) ? e.symbolTitle(!0, !0) : e.title(!0) } function Me(e, t) { return null } function Oe(e, t, i) { return null } function Le(e) { throw new Error("not supported") } function Ae(e, t, i, s) { return null } function Ee(e) { const t = e.actions(), i = [t.showPriceLine]; return i.push(t.showHighLowPriceLines), i.push(t.showAverageClosePriceLine), new a.Action({ label: le, statName: "Lines", subItems: i }) } class ke { constructor(e, t) { this._chartWidget = e, this._options = Object(n.merge)(Object(n.clone)(Te), t || {}) } async contextMenuActionsForSources(e) { const t = e[0], i = this._options; if (t === this._chartWidget.model().mainSeries() && i.mainSeries) return this ._contextMenuActionsForSeries(t); if (Object(h.isStudy)(t) && i.studies) return this._contextMenuActionsForStudy(t); if (Object(S.isLineTool)(t) && i.lineTools) { const t = e.filter(S.isLineTool); return this._contextMenuActionsForLineTool(t) } return [] } _isReadOnly() { return this._chartWidget.readOnly() } _createActionHide(e) { return new a.Action({ label: E, icon: i("dmHa"), statName: "HideSelectedObject", onExecute: this._chartWidget.hideDataSources.bind(this._chartWidget, [ e ]) }) } _createActionShow(e) { const t = new a.Action({ checkable: !0, label: A, icon: i("6ctS"), statName: "ToggleShow" }), s = new l.ActionBinder(t, e.properties().visible, this._chartWidget.model(), A); return t.setBinding(s), s.setValue(e.properties().visible.value()), t } _createActionScale(e) { const t = Object(s.ensureNotNull)(e.priceScale()), r = this._chartWidget.model().model(), n = Object(s.ensureNotNull)(r.paneForSource(e)), o = n.priceScalePosition(t), l = ("left" === o ? n.leftPriceScales() : n.rightPriceScales()).indexOf(t), h = r.priceScaleSlotsCount().totallySlots < 2 ? "dontneedname" : "needname", u = "overlay" === o ? "" : Object(c.a)(o, l).label, d = Y.format({ label: u }), p = { "left-needname": d, "left-dontneedname": J, "right-needname": d, "right-dontneedname": Z, "overlay-needname": K, "overlay-dontneedname": K } [o + "-" + h]; return new a.Action({ label: p, icon: i("/kal"), subItems: this._createActionScaleItems(e) }) } _createActionScaleDetach(e, t, i, r) { const n = this._chartWidget.model().model(), o = Object(s.ensureNotNull)(n.paneForSource(e)); if (!o.canCreateNewPriceScale()) return null; const l = Object(s.ensureNotNull)(e.priceScale()), h = l.canDetachSource(e), u = o.priceScalePosition(l), d = h || u !== t; if (!d) return null; const p = n.priceScaleSlotsCount(), _ = { left: { labelled: j, sided: G }, right: { labelled: j, sided: q } }, m = "left" === t ? o.leftPriceScales().length : o.rightPriceScales().length, f = p[t] > m ? "labelled" : "sided", g = Object(c.a)(t, m).label, b = _[t][f].format({ label: g }); return new a.Action({ checkable: !1, disabled: !d, label: b, statName: r, payload: e, onExecute: i }) } _onDetachLeft(e) { const t = e.getPayload(), i = this._chartWidget.model().model(), r = Object(s.ensureNotNull)(i.paneForSource(t)); this._chartWidget.model().detachToLeft(t, r) } _onDetachRight(e) { const t = e.getPayload(), i = this._chartWidget.model().model(), r = Object(s.ensureNotNull)(i.paneForSource(t)); this._chartWidget.model().detachToRight(t, r) } _createActionScaleDetachLeft(e) { return this._createActionScaleDetach(e, "left", this._onDetachLeft.bind(this), "ToggleScaleLeft") } _createActionScaleDetachRight(e) { return this._createActionScaleDetach(e, "right", this._onDetachRight.bind(this), "ToggleScaleRight") } _onMoveToScale(e) { const t = e.getPayload(); if (t.datasource.priceScale() === t.priceScale) return; const i = this._chartWidget.model().model(), r = Object(s.ensureNotNull)(i.paneForSource(t.datasource)); this._chartWidget.model().moveToScale(t.datasource, r, t.priceScale, t.undoText) } _createMoveToScaleAction(e, t, i, s) { const r = e.priceScale() === t; return new a.Action({ checkable: !0, checked: r, label: i, statName: "ToggleScale", payload: { datasource: e, priceScale: t, undoText: s }, onExecute: this._onMoveToScale.bind(this) }) } _onNoScale(e) { const t = e.getPayload().datasource, i = this._chartWidget.model().model(), r = Object(s.ensureNotNull)(i.paneForSource(t)); r.isOverlay(t) || this._chartWidget.model().detachNoScale(t, r) } _createActionNoScale(e) { const t = this._chartWidget.model().model(), i = Object(s.ensureNotNull)(t.paneForSource(e)), r = i.actionNoScaleIsEnabled(e); return new a.Action({ checkable: !0, checked: i.isOverlay(e), label: X, disabled: !r, statName: "ToggleNoScale", payload: { datasource: e }, onExecute: this._onNoScale.bind(this) }) } _createActionScaleItems(e) { const t = [], i = this._chartWidget.model().model(), r = Object(s.ensureNotNull)(i.paneForSource(e)), n = i.priceScaleSlotsCount().totallySlots > 1, o = r.rightPriceScales(), l = r.leftPriceScales(), h = this._createActionScaleDetachRight(e), u = this._createActionScaleDetachLeft(e), d = o.length + l.length + (null === h ? 0 : 1) + (null === u ? 0 : 1) > 2, p = { right: { hidden: { checked: { labelled: k, sided: D }, unchecked: { labelled: V, sided: B } }, visible: { checked: { labelled: R, sided: N }, unchecked: { labelled: j, sided: F } } }, left: { hidden: { checked: { labelled: k, sided: W }, unchecked: { labelled: V, sided: H } }, visible: { checked: { labelled: R, sided: U }, unchecked: { labelled: j, sided: z } } } }, _ = { left: r.visibleLeftPriceScales(), right: r.visibleRightPriceScales() }, m = (t, i) => { const s = ("right" === i ? o : l)[t], r = _[i].includes(s) ? "visible" : "hidden", a = e.priceScale() === s ? "checked" : "unchecked", h = n ? "labelled" : "sided", u = p[i], d = { labelled: u.visible.unchecked.labelled, sided: u.visible.unchecked.sided }, m = Object(c.a)(i, t).label; return { actionText: u[r][a][h].format({ label: m }), undoText: d[h].format({ label: m }) } }; t.push(...o.map((t, i) => { const s = m(i, "right"); return this._createMoveToScaleAction(e, t, s.actionText, s.undoText) })), null !== h && t.push(h); d && (o.length > 0 || null !== h) && t.push(new a.Separator); t.push(...l.map((t, i) => { const s = m(i, "left"); return this._createMoveToScaleAction(e, t, s.actionText, s.undoText) })), null !== u && t.push(u); d && (l.length > 0 || null !== u) && t.push(new a.Separator); return t.push(this._createActionNoScale(e)), t } _createVisualOrderAction(e) { const t = this._chartWidget.model(), s = t.availableZOrderOperations(e), r = [new a.Action({ label: se, statName: "BringToFront", disabled: !s.bringToFrontEnabled, onExecute: () => t.bringToFront(e) }), new a.Action({ label: re, statName: "SendToBack", disabled: !s.sendToBackEnabled, onExecute: () => t.sendToBack(e) }), new a.Action({ label: ne, statName: "BringForward", disabled: !s.bringForwardEnabled, onExecute: () => t.bringForward(e) }), new a.Action({ label: oe, statName: "SendBackward", disabled: !s.sendBackwardEnabled, onExecute: () => t.sendBackward(e) })]; return new a.Action({ label: ae, icon: i("9dnG"), statName: "VisualOrder", subItems: r }) } _createActionMergeUp(e) { const t = this._chartWidget.model(); return t.model().isMergeUpAvailableForSource(e) ? new a.Action({ label: Q, statName: "MergeUp", onExecute: () => t.mergeSourceUp(e) }) : null } _createActionUnmergeUp(e) { const t = this._chartWidget.model(); return t.model().isUnmergeAvailableForSource(e) ? new a.Action({ label: ee, statName: "UnmergeUp", onExecute: () => t.unmergeSourceUp(e) }) : null } _createActionMergeDown(e) { const t = this._chartWidget.model(); return t.model().isMergeDownAvailableForSource(e) ? new a.Action({ label: te, statName: "MergeDown", onExecute: () => t.mergeSourceDown(e) }) : null } _createActionUnmergeDown(e) { const t = this._chartWidget.model(); return t.model().isUnmergeAvailableForSource(e) ? new a.Action({ label: ie, statName: "UnmergeDown", onExecute: () => t.unmergeSourceDown(e) }) : null } _mergeContentMenuItems(e) { return [this._createActionMergeUp(e), this._createActionUnmergeUp(e), this ._createActionMergeDown(e), this._createActionUnmergeDown(e) ].filter(n.notNull) } _createActionMove(e) { const t = this._mergeContentMenuItems(e); return t.length > 0 ? new a.Action({ label: $, icon: i("BBCR"), subItems: t }) : null } _contextMenuActionsForSeries(e) { const t = [], i = e.properties().visible.value(), r = this._chartWidget.model().model(), n = (Object(s.ensureNotNull)(r.paneForSource(e)), this._chartWidget.actions()); if (this._isReadOnly()) t.push(i ? this._createActionHide(e) : this ._createActionShow(e)), t.push(new a.Separator), t.push(this ._createActionScale(e)); else { 0, t.length > 0 && !(t[t.length - 1] instanceof a.Separator) && t.push(new a .Separator), o.enabled("symbol_info") && t.push(n.showSymbolInfoDialog);r.mainSeries() .symbolInfo();0, t.length > 0 && !(t[t.length - 1] instanceof a.Separator) && t.push(new a .Separator), t.push(this._createVisualOrderAction([e])); const s = this._createActionMove(e);null !== s && t.push(s), t.push(this._createActionScale(e)), t.push(i ? this._createActionHide(e) : this._createActionShow(e)), t.push(new a.Separator), t.push(Ee(this._chartWidget)), t.push(new a.Separator);window.widgetbar && (!window.widgetbar._customization || window.widgetbar._customization.watchlist) && n.addToWatchlist && t.push(n .addToWatchlist), o.enabled("text_notes") && t.push(n.addToTextNotes), t[t.length - 1] instanceof a.Separator || t.push(new a.Separator), t[t.length - 1] instanceof a.Separator && t.pop() } return t } _createActionAddChildStudy(e) { const t = this._chartWidget.model().model(); return new a.Action({ label: ce.format({ studyTitle: Ie(e) }), icon: i("CwKc"), statName: "ApplyIndicator", onExecute: () => { const i = this._chartWidget.showIndicators(Object(h.isStudy)( e) ? e : void 0); if (i && Object(h.isStudy)(e)) { const e = () => { trackEvent("SOS", "Apply SOS", "Apply by RC menu") }, s = t.studyInserted(); s.subscribe(this, e), i.visible().subscribe(t => { t || s.unsubscribe(this, e) }, { once: !0 }) } } }) } _createActionAddFundamentals(e) { return null } _createActionShowSymbolInfoDialog(e, t) { return new a.Action({ label: Object(w.appendEllipsis)(Object(P.t)("Symbol Info")), icon: i("1pHB"), checkable: !1, statName: "SymbolInfo", onExecute: () => { const i = e.symbol(), s = { symbolInfo: e.symbolInfo(), unitName: e => t.name(e) }; Object(b.showSymbolInfoDialog)(i, s) } }) } _createActionShowProperties(e) { return new a.Action({ label: he, icon: i("MXV9"), statName: "EditSelectedObject", onExecute: () => this._chartWidget.showSourceProperties(e) }) } _contextMenuActionsForStudy(e) { const t = this._chartWidget.actions(), i = e.properties().visible.value(), s = []; if (!e.userEditEnabled()) return s; if (this._chartWidget.readOnly()) s.push(i ? this._createActionHide(e) : this ._createActionShow(e)), s.push(new a.Separator), e.constructor instanceof d .NonSeriesStudy || s.push(this._createActionScale(e)); else { 0, o.enabled("study_on_study") && e.canHaveChildren() && s.push(this ._createActionAddChildStudy(e)); const r = this._createApplyToEntireLayoutCommand(e); if (null !== r && s.push(r), s.length > 0 && !(s[s.length - 1] instanceof a .Separator) && s.push(new a.Separator), o.enabled("symbol_info") && ( e instanceof g.a || e instanceof f.study_Overlay) && null !== e .symbolInfo() && (s.push(this._createActionShowSymbolInfoDialog(e, this ._chartWidget.model().model().availableUnits())), s.push(new a .Separator)), s.push(this._createVisualOrderAction([e])), !(e .constructor instanceof d.NonSeriesStudy)) { const t = this._createActionMove(e); null !== t && s.push(t), s.push(this._createActionScale(e)) } s.push(new a.Separator); const n = e.metaInfo(); if (e.copiable()) { const t = new a.Action({ label: pe, shortcutHint: Object(_.humanReadableHash)(_.Modifiers.Mod + 67), statName: "Copy", onExecute: () => { this._chartWidget.chartWidgetCollection().clipboard .uiRequestCopy([e]) } }); s.push(t) } s.push(i ? this._createActionHide(e) : this._createActionShow(e)), s.push(t.studyRemove), s.push(new a.Separator), o.enabled("property_pages") && new p.a(n).hasUserEditableOptions() && s.push( this._createActionShowProperties(e)), s[s.length - 1] instanceof a.Separator && s.pop() } return s } _createEditAlertDrawingAction(e) { return new a.Action({ label: I.format({ title: e.title() }), icon: TbbiEditAlertSvg, statName: "EditAlert", onExecute: () => { window.runOrSignIn(() => { e.editAlert("pane_context_menu_edit_alert") }, { source: "Alert edit from pane context menu" }) } }) } _createLineToolTemplateAction(e) { if (!window.lineToolPropertiesToolbar) return null; const t = window.lineToolPropertiesToolbar.templatesList(); return void 0 === t ? null : new a.ActionAsync(() => { const i = [], s = new a.Action({ label: de, statName: "SaveAs", onExecute: () => { t.showSaveDialog(i => { const s = JSON.stringify(e.template()); t.saveTemplate(i, s) }) } }); i.push(s); const r = new a.Action({ label: ue, statName: "ApplyDefault", onExecute: () => { this._chartWidget.model() .restorePropertiesForSource(e), window .lineToolPropertiesToolbar.onSourceChanged(e) } }); return i.push(r), new Promise(e => { t.templatesLoaded().then(() => { const e = t.getData(); e.length > 0 && i.push(new a.Separator), e .forEach((e, s) => { const r = new a.Action({ label: e, statName: "ApplyTemplate", onExecute: () => t .loadTemplate(e), toolbox: { type: m.ToolboxType .Delete, action: () => { t.deleteAction( e) } }, showToolboxOnHover: !0 }); i.push(r) }) }, e => { T.logWarn(e) }).then(() => { e({ label: me, statName: "Template", subItems: i }) }) }) }) } _createActionToggleLockObject(e) { const t = e.properties().frozen.value(); return new a.Action({ label: t ? ge : be, statName: "ToggleLockSelectedObject", checkable: !0, icon: i(t ? "fs3R" : "qckB"), onExecute: () => this._chartWidget.toggleLockSelectedObject() }) } async _contextMenuActionsForLineTool(e) { const t = [], r = this._chartWidget.actions(), l = this._chartWidget.model().model(), c = () => { t.push(this._createVisualOrderAction(e)) }, h = () => { const s = e.filter(e => e.cloneable()); if (s.length > 0) { const e = new a.Action({ label: _e, icon: i("K8V9"), shortcutHint: Object(_.humanReadableModifiers)(_.Modifiers .Mod) + "Drag", doNotBindShortcut: !0, statName: "Clone", onExecute: () => this._chartWidget.model().cloneLineTools(s, !1) }, "Clone"); t.push(e) } return !!s.length }, u = () => { const i = e.filter(e => e.copiable()); if (i.length > 0) { const e = new a.Action({ label: pe, shortcutHint: Object(_.humanReadableHash)(_.Modifiers.Mod + 67), statName: "Copy", onExecute: () => this._chartWidget.chartWidgetCollection() .clipboard.uiRequestCopy(i) }, "Copy"); t.push(e) } return !!i.length }, d = e => { const i = new a.Action({ label: fe.format({ lineToolName: e.title() }), statName: "GoToLineTool", checkable: !1, onExecute: async t => { const i = l.timeScale().logicalRange(); if (null === i) return; const r = this._chartWidget.model(), o = l.timeScale().barSpacing(); let a = i.left(); const c = e.points().map(e => e.index); let h = l.timeScale().points().firstIndex(); const u = l.timeScale().points().lastIndex(); if (null === h || null === u) return; const d = i.length() / 2; if (0 === c.length || c.some(e => i.contains(e))) return; const p = () => { const t = e.points().map(e => e.index), i = t.filter(e => e <= u).reduce((e, t) => null === e ? t : Math.max(e, t), null); return null !== i ? i : t.reduce((e, t) => Math .min(e, t)) }; let _, m = p(); if (h - d > m) { const t = e.points().map(e => e.time).filter(n .notUndefined).map(e => e.valueOf() / 1e3); if (0 === t.length) return; const i = t.reduce((e, t) => Math.min(e, t), t[0]); await l.gotoTime(i), m = p(); a = Object(s.ensureNotNull)(l.timeScale() .logicalRange()).left(), h = Object(s .ensureNotNull)(l.timeScale().points() .firstIndex()) } h - d > m ? (_ = (a - h + d) * o, l.mainSeries() .setGotoDateResult({ timestamp: Object(s.ensureNotNull)(l .timeScale().points().valueAt(h) ), eod: !0 })) : _ = (a - m + 1 + d) * o, r .startScrollTime(0), Object(C.doAnimate)({ onStep: (e, t) => r.scrollTimeTo(t), from: 0, to: Math.round(_), easing: x.c.easeInOutCubic, duration: x.b, onComplete: () => r.endScrollTime() }) } }); t.push(i) }; if (1 === e.length) { const i = e[0]; if (this._chartWidget.readOnly()) t.push(r.lineHide); else if (i.userEditEnabled()) { if (o.enabled("alerts") && !this._chartWidget.onWidget() && i.hasAlert && i .hasAlert.value() && (t.push(this._createEditAlertDrawingAction(i)), t .push(new a.Separator)), !o.enabled("charting_library_base")) { const e = this._createLineToolTemplateAction(i); null !== e && t.push(e) } c(), this._options.objectTree && r.paneObjectTree && t.push(r .paneObjectTree), t.push(new a.Separator); let e = h(); e = u() || e, e = e, e && t.push(new a.Separator), t.push(this ._createActionToggleLockObject(i)), t.push(r.lineHide), t.push(r .lineRemove), i.points().length > 0 && this._options.gotoLineTool && (t.push(new a.Separator), d(i)); const s = await this._chartWidget.propertiesDefinitionsForSource(i); if (o.enabled("property_pages") && null !== s && (t.push(new a.Separator), t .push(r.format)), i.additionalActions) { t.push(new a.Separator); const e = i.additionalActions(this._chartWidget.model()); t.push(...e) } } } else this._options.objectTree && r.paneObjectTree && t.push(r.paneObjectTree), c(), t.push(new a.Separator), h(), u(), t.push(new a.Separator), t.push(r .lineHide), t.push(r.lineRemove); return t } _createEarningsShow() { return null } _createDividendsShow() { return null } _createSplitsShow() { return null } _contextMenuActionsForESD() { return [] } _contextMenuActionsForPublishedTimeline(e) { const t = this._chartWidget.actions(), i = []; if (i.push(t.lineHide), window.is_authenticated) { const t = e.properties().filter, s = new a.Action({ checked: t.value() === PublishedChartsFilter.None, checkable: !0, label: ve, name: "ToggleAllIdeas", statName: "ToggleAllIdeas", onExecute: () => this._chartWidget.model().setProperty(t, PublishedChartsFilter.None, ve) }), r = new a.Action({ checked: t.value() === PublishedChartsFilter.Following, checkable: !0, label: Se, name: "ToggleIdeasOfPeopleAndUser", statName: "ToggleIdeasOfPeopleAndUser", onExecute: () => this._chartWidget.model().setProperty(t, PublishedChartsFilter.Following, Se) }), n = new a.Action({ checked: t.value() === PublishedChartsFilter.Private, checkable: !0, label: ye, name: "ToggleUserIdeas", statName: "ToggleUserIdeas", onExecute: () => this._chartWidget.model().setProperty(t, PublishedChartsFilter.Private, ye) }); i.push(new a.Separator, s, r, n) } return i } _contextMenuActionsForTradingDrawings(e) { return e.contextMenuItems() } _createAlertToggleHorzLineLabelAction(e) { const t = getGlobalAlertSettingsProperty().childs().line.childs().visible, i = t.value() ? L : O; return new a.Action({ checkable: !0, label: M, checked: t.value(), statName: "ToggleExtendAlertLine", onExecute: () => this._chartWidget.model().setProperty(t, !t.value(), i) }) } _contextMenuActionsForAlertLabel(e) { const t = e.alert(), i = []; return t.get("active") ? i.push(AlertActionCreator.stopAlert(t)) : i.push( AlertActionCreator.restartAlert(t, "alert_label_context_menu_restart")), i .push(AlertActionCreator.editAlert(t, "alert_label_context_menu_edit")), i.push( AlertActionCreator.deleteAlert(t)), i.push(new a.Separator), i.push(this._createAlertToggleHorzLineLabelAction(e)), i } _contextMenuActionsForChartEvents(e) { const t = []; if (o.enabled("property_pages")) { const e = new a.Action({ label: we, statName: "Format", onExecute: () => this._chartWidget.showGeneralChartProperties(u .TabNames.eventsAndAlerts) }); t.push(e) } const i = new a.Action({ label: Pe, name: "HideEvents", statName: "HideEvents", onExecute: () => this._chartWidget.model().setProperty(e.properties() .visible, !1, Pe) }); return t.push(i), t } _createApplyToEntireLayoutCommand(e) { if (!this._chartWidget.chartWidgetCollection() .applyIndicatorsToAllChartsAvailable()) return null; const t = this._chartWidget.model().model(); if (e.parentSource() !== t.mainSeries()) return null; const i = Object(s.ensureNotNull)(t.paneForSource(e)), r = t.paneForSource(t.mainSeries()) === i, n = e instanceof g.a && e.priceScale() === t.mainSeries().priceScale() && Object(s.ensureNotNull)(e.priceScale()).isPercentage(), o = r ? void 0 : t.panes().indexOf(i); let l = xe, c = "AddStudyToEntireLayout"; return Object(y.isSymbolSource)(e) && (l = Ce, c = "AddSymbolToEntireLayout"), new a .Action({ label: l, statName: c, onExecute: () => { const i = Object(s.ensureNotNull)(Object(v.a)(t.id(), [e])), a = this._chartWidget.chartWidgetCollection(), c = { isOnMainPane: r, asCompare: n, paneIndex: o }; a.applyIndicatorToAllCharts(this._chartWidget, i, c, l) } }, "applyStudyToEntireLayout") } } }, Hr11: function(e, t, i) { "use strict"; function s(e, t) { return e <= t } function r(e, t) { return e >= t } function n(e, t, i) { return Math.min(Math.max(e, t), i) } function o(e) { return e < 0 ? -1 : e > 0 ? 1 : 0 } function a(e) { if (e < 0) return !1; for (let t = e; t > 1; t /= 10) if (t % 10 != 0) return !1; return !0 } function l(e, t, i) { return t - e <= i } function c(e, t, i) { return Math.abs(e - t) < i } function h(e) { return e <= 0 ? NaN : Math.log(e) / Math.log(10) } function u(e, t) { return e < t ? -1 : e > t ? 1 : 0 } function d(e, t = u) { if (e.length < 1) throw Error("array is empty"); let i = e[0]; for (let s = 0; s < e.length; ++s) t(e[s], i) < 0 && (i = e[s]); return i } function p(e, t = u) { if (e.length < 1) throw Error("array is empty"); let i = e[0]; for (let s = 0; s < e.length; ++s) t(e[s], i) > 0 && (i = e[s]); return i } function _(e) { const t = Math.ceil(e); return t % 2 != 0 ? t - 1 : t } function m(e) { return e > 0 ? Math.floor(e) : Math.ceil(e) } i.r(t), i.d(t, "lessThan", (function() { return s })), i.d(t, "greaterThan", (function() { return r })), i.d(t, "clamp", (function() { return n })), i.d(t, "sign", (function() { return o })), i.d(t, "isBaseDecimal", (function() { return a })), i.d(t, "greaterOrEqual", (function() { return l })), i.d(t, "equal", (function() { return c })), i.d(t, "log10", (function() { return h })), i.d(t, "defComparator", (function() { return u })), i.d(t, "min", (function() { return d })), i.d(t, "max", (function() { return p })), i.d(t, "ceiledEven", (function() { return _ })), i.d(t, "toInt", (function() { return m })) }, HySD: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ResizerDetacherState", (function() { return o })); var s = i("Eyy1"), r = i("hY0g"), n = i.n(r); class o { constructor(e) { this._alive = new n.a, this._container = new n.a, this._width = new n.a, this ._height = new n.a, this._fullscreen = new n.a, this._detachable = new n.a, this ._fullscreenable = new n.a, this._visible = new n.a, this._availWidth = new n.a, this._availHeight = new n.a, this._owner = new n.a, this._ownersStack = [], this.owner = this._owner .readonly(), this._bridge = { alive: this._alive.readonly(), container: this._container.readonly(), width: this._width.readonly(), height: this._height.readonly(), fullscreen: this._fullscreen.readonly(), detachable: this._detachable.readonly(), fullscreenable: this._fullscreenable.readonly(), visible: this._visible.readonly(), availWidth: this._availWidth.readonly(), availHeight: this._availHeight.readonly(), remove: () => { const e = this._owner.value(); e && e.remove && e.remove() }, negotiateWidth: e => { const t = this._owner.value(); t && t.negotiateWidth && t.negotiateWidth(e) }, negotiateHeight: e => { const t = this._owner.value(); t && t.negotiateHeight && t.negotiateHeight(e) }, requestFullscreen: () => { const e = this._owner.value(); e && e.requestFullscreen && e.requestFullscreen() }, exitFullscreen: () => { const e = this._owner.value(); e && e.exitFullscreen && e.exitFullscreen() }, detach: e => { const t = this._owner.value(); t && t.detach && t.detach(e) }, attach: () => { const e = this._owner.value(); e && e.attach && e.attach() } }, e && this.pushOwner(e) } bridge() { return this._bridge } pushOwner(e) { if (!e.alive.value()) return; for (const e of this._ownersStack) this._unsubscribeOwner(e); const t = { owner: e }; this._ownersStack.push(t), this._subscribeOwner(t) } _subscribeOwner(e) { const t = e.owner; if (e.deathWatcher || (this._alive.setValue(!0), e.deathWatcher = t.alive.spawn(), e .deathWatcher.subscribe(t => { t || this._deadHandler(e) })), this._owner.setValue(t), !e.subscriptions) { const i = e.subscriptions = []; this._visible.setValue(!1); const s = (e, t) => { if (e) { const s = e.spawn(); i.push(s), s.subscribe(e => { t.setValue(e) }, { callWithLast: !0 }) } else t.deleteValue() }; s(t.container, this._container), s(t.width, this._width), s(t.height, this ._height), s(t.fullscreen, this._fullscreen), s(t.detachable, this ._detachable), s(t.fullscreenable, this._fullscreenable), s(t .availWidth, this._availWidth), s(t.availHeight, this._availHeight), s(t .visible, this._visible) } } _unsubscribeOwner(e, t) { if (e.subscriptions) { for (const t of e.subscriptions) t.unsubscribe(); e.subscriptions = null } t && e.deathWatcher && (e.deathWatcher.unsubscribe(), e.deathWatcher = null) } _deadHandler(e) { const t = this._ownersStack.indexOf(e); Object(s.assert)(-1 !== t, "sanitized owner should be in stack"); for (let e = this._ownersStack.length - 1; e >= t; e--) this._unsubscribeOwner(this ._ownersStack[e], !0); this._ownersStack.length = t, t > 0 ? this._subscribeOwner(this._ownersStack[t - 1]) : (this._alive.setValue(!1), this._owner.deleteValue()) } } }, I4UZ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "HeaderToolbarBootloader", (function() { return o })); var s = i("yMne"), r = i("YuHv"), n = i("cZRT"); class o extends n.a { constructor(e, t) { super(), this._toolsBootloader = e, this._headerProps = t, this._headerProps .resizerBridge.negotiateHeight(s.b), this._headerProps.resizerBridge .container.value().appendChild(Object(r.a)()) } _startLoading() { return Promise.all([this._toolsBootloader.load(), this._loadHeaderToolbar()]) .then(([e, t]) => new t(this._headerProps.resizerBridge.container.value(), { ...this._headerProps, tools: e })) } _loadHeaderToolbar() { return Promise.all([i.e("react"), i.e(14), i.e(42), i.e(79), i.e(7), i.e(10), i .e(40), i.e("header-toolbar") ]).then(i.bind(null, "KMbc")).then(e => e.HeaderToolbarRenderer) } } }, IDnv: function(e, t, i) { "use strict"; i.r(t), i.d(t, "extrapolateBarsFrontToTime", (function() { return r })), i.d(t, "extrapolateBarsFrontByCount", (function() { return n })), i.d(t, "extrapolateBarsFrontByCountAllPoints", (function() { return o })), i.d(t, "extrapolateBars", (function() { return a })); var s = i("E6p6"); function r(e, t, i, s, n = !1) { if (t > i) { const o = r(e, i, t, s, n); return o.count = -o.count, o } return a(e, t, 1, (e, t) => t > i || 0 !== s && e > s, n) } function n(e, t, i, s = !1) { const r = i < 0 ? -1 : 1; return a(e, t, r, (e, t) => e >= i * r, s) } function o(e, t, i) { const s = i < 0 ? -1 : 1; return a(e, t, s, (e, t) => e >= i * s, !0).times } function a(e, t, i, r, n) { let o = 0, a = t; e.moveTo(a); let l = 0, c = Number.MAX_VALUE, h = !1, u = t; const d = []; for (; !r(o, a);) { if (l > 15) throw new Error("Internal error 0x10 while extrapolating."); const r = e.indexOfBar(a); if (r === s.SessionStage.PRE_SESSION && 1 === i) a = e.startOfBar(0), e.moveTo(a); else if (r === s.SessionStage.PRE_SESSION && -1 === i) a = e.startOfBar(s.SessionStage .PRE_SESSION), e.moveTo(a); else if (r === s.SessionStage.POST_SESSION && 1 === i) a = e.startOfBar(s.SessionStage .POST_SESSION), e.moveTo(a); else { if (r === s.SessionStage.POST_SESSION && -1 === i) throw new Error( "Internal error 0x12 while extrapolating."); { const p = e.startOfBar(r); if (p > t && i > 0 || t > p && i < 0) { if (h && c === p) throw new Error( "Internal error 0x11 while extrapolating."); h = !0, c = p, l = 0, o++, u = p, n && d.push(u) } if (0 === r && -1 === i) a = p - 1; else { a = e.startOfBar(r + i); const t = e.startOfBar(s.SessionStage.POST_SESSION); a > t && (e.moveTo(t), a = e.startOfBar(0)) } } } l++ } return { time: u, times: d, count: o } } }, IMMp: function(e) { e.exports = JSON.parse( '{"color-bg-primary":"color-cold-gray-850","color-bg-primary-hover":"color-cold-gray-800","color-bg-secondary":"color-cold-gray-900","color-bg-highlight":"color-cold-gray-900","color-bg-scroll-buttons":"color-cold-gray-800","color-legacy-bg-scroll-buttons":"color-cold-gray-550","color-legacy-bg-widget":"color-cold-gray-900","color-text-primary":"color-cold-gray-200","color-text-secondary":"color-cold-gray-500","color-text-tertiary":"color-cold-gray-400","color-text-disabled":"color-cold-gray-650","color-accent-content":"color-white","color-divider":"color-cold-gray-700","color-divider-hover":"color-cold-gray-800","color-box-shadow":"color-cold-gray-900","color-active-hover-text":"color-cold-gray-300","color-alert-text":"color-cold-gray-200","color-border":"color-cold-gray-750","color-border-chat-fields":"color-cold-gray-750","color-border-hover":"color-cold-gray-650","color-border-table":"color-cold-gray-800","color-brand":"color-tv-blue-500","color-brand-hover":"color-tv-blue-600","color-brand-active":"color-tv-blue-700","color-button-hover-bg":"color-cold-gray-850","color-chart-page-bg":"color-cold-gray-800","color-common-tooltip-bg":"color-cold-gray-650","color-danger":"color-ripe-red-600","color-danger-hover":"color-ripe-red-500","color-danger-active":"color-ripe-red-400","color-depthrenderer-fill-style":"color-cold-gray-150","color-depthrenderer-stroke-style":"color-cold-gray-650","color-disabled-border-and-color":"color-cold-gray-800","color-disabled-input":"color-cold-gray-750","color-empty-container-message":"color-cold-gray-500","color-highlight-new":"color-tv-blue-a800","color-icons":"color-cold-gray-500","color-input-bg":"color-cold-gray-800","color-input-textarea-readonly":"color-cold-gray-650","color-input-placeholder-text":"color-cold-gray-700","color-input-publish-bg":"color-cold-gray-900","color-item-active-blue":"color-tv-blue-a800","color-item-hover-active-bg":"color-cold-gray-800","color-item-hover-bg":"color-cold-gray-800","color-item-hover-blue":"color-tv-blue-a800","color-item-selected-blue":"color-tv-blue-a800","color-item-active-text":"color-cold-gray-200","color-item-active-bg":"color-tv-blue-500","color-link":"color-tv-blue-500","color-link-hover":"color-tv-blue-600","color-link-active":"color-tv-blue-700","color-list-item":"color-cold-gray-500","color-list-nth-child-bg":"color-cold-gray-850","color-news-highlight":"color-cold-gray-800","color-pane-bg":"color-cold-gray-900","color-pane-secondary-bg":"color-cold-gray-850","color-placeholder":"color-cold-gray-650","color-popup-menu-item-hover-bg":"color-cold-gray-800","color-popup-menu-separator":"color-cold-gray-700","color-row-hover-active-bg":"color-cold-gray-800","color-sb-scrollbar-body-bg":"color-cold-gray-650","color-screener-description":"color-cold-gray-200","color-section-separator-border":"color-cold-gray-750","color-search-button-hover":"color-cold-gray-700","color-separator-table-chat":"color-cold-gray-750","color-success":"color-minty-green-700","color-success-hover":"color-minty-green-600","color-success-active":"color-minty-green-500","color-tag-active-bg":"color-cold-gray-750","color-tag-hover-bg":"color-cold-gray-800","color-text-regular":"color-cold-gray-200","color-toolbar-button-text":"color-cold-gray-500","color-toolbar-button-text-hover":"color-cold-gray-450","color-toolbar-button-text-active":"color-tv-blue-500","color-toolbar-button-text-active-hover":"color-tv-blue-600","color-toolbar-button-background-hover":"color-cold-gray-800","color-toolbar-button-background-secondary-hover":"color-cold-gray-750","color-toolbar-toggle-button-background-active":"color-tv-blue-500","color-toolbar-toggle-button-background-active-hover":"color-tv-blue-600","color-toolbar-interactive-element-text-normal":"color-cold-gray-300","color-toolbar-interactive-element-text-hover":"color-cold-gray-250","color-toolbar-opened-element-bg":"color-cold-gray-800","color-tooltip-bg":"color-cold-gray-750","color-tv-button-checked":"color-cold-gray-500","color-tv-dialog-caption":"color-cold-gray-50","color-tv-dropdown-item-hover-bg":"color-cold-gray-800","color-underlined-text":"color-cold-gray-300","color-widget-pages-bg":"color-cold-gray-900","color-warning":"color-tan-orange-700","color-forex-icon":"color-white","color-list-item-active-bg":"color-tv-blue-500","color-list-item-hover-bg":"color-cold-gray-800","color-list-item-text":"color-cold-gray-200","color-price-axis-label-back":"color-cold-gray-800","color-price-axis-label-text":"color-cold-gray-500","color-price-axis-gear":"color-cold-gray-500","color-price-axis-gear-hover":"color-cold-gray-400","color-price-axis-highlight":"color-cold-gray-800","color-bid":"color-tv-blue-500","color-scroll-bg":"color-cold-gray-750","color-scroll-border":"color-cold-gray-850","color-widget-border":"color-cold-gray-800","color-scroll-buttons-arrow":"color-white","color-control-intent-default":"color-cold-gray-650","color-control-intent-success":"color-minty-green-600","color-control-intent-primary":"color-tv-blue-500","color-control-intent-warning":"color-tan-orange-500","color-control-intent-danger":"color-ripe-red-700","color-growing":"color-minty-green-600","color-falling":"color-ripe-red-600","color-pre-market":"color-tan-orange-600","color-pre-market-bg":"color-tan-orange-400","color-post-market":"color-tv-blue-500","color-post-market-bg":"color-tv-blue-400","color-market-open":"color-minty-green-500","color-market-open-bg":"color-minty-green-400","color-market-closed":"color-cold-gray-400","color-market-holiday":"color-cold-gray-400","color-invalid-symbol":"color-ripe-red-400","color-invalid-symbol-hover":"color-ripe-red-500","color-replay-mode":"color-tv-blue-500","color-replay-mode-icon":"color-tv-blue-50","color-replay-mode-hover":"color-tv-blue-600","color-notaccurate-mode":"color-berry-pink-700","color-notaccurate-mode-bg":"color-berry-pink-400","color-delay-mode":"color-tan-orange-700","color-delay-mode-bg":"color-tan-orange-400","color-eod-mode":"color-grapes-purple-700","color-eod-mode-bg":"color-grapes-purple-400","color-data-problem":"color-ripe-red-600","color-data-problem-bg":"color-ripe-red-400","color-data-problem-hover":"color-ripe-red-500","color-list-item-bg-highlighted":"color-tv-blue-a900","color-list-item-bg-selected":"color-tv-blue-a800","color-list-item-bg-highlighted-hover":"color-tv-blue-a800","color-list-item-bg-selected-hover":"color-tv-blue-a700","color-screener-header-bg":"color-cold-gray-850","color-screener-header-bg-hover":"color-cold-gray-800","color-overlay":"color-cold-gray-950","color-card-border":"color-cold-gray-700","color-card-border-hover":"color-cold-gray-600"}' ) }, IWXC: function(e, t, i) { "use strict"; i.r(t), i.d(t, "getQuoteSessionInstance", (function() { return o })), i.d(t, "setQuoteSessionInstance", (function() { return a })), i.d(t, "getQuoteSessionNoEnsure", (function() { return l })), i.d(t, "destroyQuoteSessions", (function() { return c })); var s = i("hGf4"), r = i.n(s); const n = {}; function o(e = "full") { return n[e] || a(e, new r.a(e)), n[e] } function a(e = "full", t) { n[e] = t } function l(e = "full") { return n[e] } function c() { for (const e in n) if (n.hasOwnProperty(e)) { const t = n[e]; void 0 !== t && t.destroy(), delete n[e] } } }, Ialn: function(e, t, i) { "use strict"; i.r(t), i.d(t, "isRtl", (function() { return r })), i.d(t, "stripLTRMarks", (function() { return o })), i.d(t, "startWithLTR", (function() { return a })), i.d(t, "forceLTRStr", (function() { return l })), i.d(t, "forceLTRStrSsr", (function() { return c })), i.d(t, "forceRTLStr", (function() { return h })), i.d(t, "getLTRScrollLeft", (function() { return u })), i.d(t, "getLTRScrollLeftOffset", (function() { return d })), i.d(t, "detectAutoDirection", (function() { return m })); var s = i("oYVD"); const r = () => "rtl" === window.document.dir, n = new RegExp("‎|‪|‫|‬", "g"); function o(e) { return "" !== e && r() && null != e ? e.replace(n, "") : e } function a(e) { return "" !== e && r() && null != e ? "‎" + e : e } function l(e) { return "" !== e && r() && null != e ? "‪" + e + "‬" : e } function c(e) { return "‪" + e + "‬" } function h(e) { return "" !== e && r() && null != e ? "‫" + e + "‬" : e } function u(e) { return Object(s.getNormalizedScrollLeft)(e, "rtl") } function d(e, t) { const i = Object(s.detectScrollType)(); if ("indeterminate" === i) return 0; switch (i) { case "negative": t = e.clientWidth - e.scrollWidth + t; break; case "reverse": t = e.scrollWidth - e.clientWidth - t } return t } const p = /[^\u0000-\u0040\u005B-\u0060\u007B-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u200E\u2010-\u2029\u202C\u202F-\u2BFF]/, _ = /[\u0590-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC]/; function m(e) { const t = p.exec(e); return t ? _.test(t[0]) ? "rtl" : "ltr" : "" } }, IcDj: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("txPx"), n = i("aIyQ"), o = i.n(n), a = i("7ktv"), l = i("Qb4w"), c = i("k9/m"), h = i("0YCj"), u = i.n(h), d = i("jenN"), p = i("972a"), _ = i("it7y"), m = i("e1Hy"); class f extends _.StudyDataWindowView { constructor(e, t) { super(e, t), this._showStudyValues = t.properties().paneProperties .legendProperties.showStudyValues, this._showStudyValues.subscribe(this, this.update) } isValuesVisible() { return this._showStudyValues.value() } additional() { return null } destroy() { this._showStudyValues.unsubscribeAll(this) } _createValuesProvider(e, t) { return new m.a(e, t) } } var g = i("mMWL"), b = i("2kV1"), v = i("5fI3"), S = i("jy4L"), y = i("YWnQ"), w = i("W+6j"), P = i("ogJP"), C = i("zXvd"), x = i("23IT"), T = i("Kxc7"), I = i("aO4+"), M = i("Tmoa"), O = i("Zy3/"); class L { constructor(e) { this._data = e } draw(e, t) {} drawBackground(e, t) { e.save(); const i = this._data, s = t.pixelRatio; let r = null; const n = Math.round(this._data.w * s); for (let t = 0; t < i.items.length; ++t) { const o = i.items[t]; if (null == o.color) { r = null; continue } e.fillStyle = o.color; const a = Math.round(o.x * s); let l = a; if (t > 0) { i.items[t - 1].index === o.index - 1 && null !== r && (l = r + 1) } const c = a + n, h = c - l + 1; e.fillRect(l, Math.round(i.y * s), h, Math.round(i.h * s)), r = c } e.restore() } hitTest(e) { return null } } var A = i("i6cO"), E = i("UAFa"); class k { constructor(e, t, i, r) { this._items = [], this._invalidated = !0, this._isMarkersEnabled = T.enabled( "source_selection_markers"), this._study = e, this._series = t, this ._model = i, this._plotName = r; const n = this._study.metaInfo().plots; for (let e = 0; e < n.length; e++) { const t = n[e]; t.id === this._plotName && (this._plotIndex = e, Object(s.assert)(Object(x .isBgColorerPlot)(t), "Plot '" + this._plotName + "' is not a background colorer!")) } this._colorProvider = Object(E.createStudyPlotColorProvider)(e.metaInfo(), e .properties(), r) } items() { return this._items } update() { this._invalidated = !0 } renderer() { if (!this._study.properties().styles[this._plotName].visible) return null; if (!this._study.properties().styles[this._plotName].visible.value()) return null; if (!this._scalesReady()) return null; this._invalidated && (this._updateImpl(), this._invalidated = !1); const e = { items: this._items, y: 0, h: Object(s.ensureNotNull)(this._study.priceScale()).height(), w: this._model.timeScale().barSpacing() }, t = new O.CompositeRenderer; return t.append(new L(e)), t } _scalesReady() { const e = this._model.timeScale(), t = this._study.priceScale(); return e && !e.isEmpty() && null !== t && !t.isEmpty() } _getTranspValue() { const e = this._study.properties().styles[this._plotName]; let t = 0; return e.transparency && (t = e.transparency.value(), t = Object(P.isNumber)(t) ? t : 40), t } _updateImpl() { this._items = [], Object(s.assert)(this._scalesReady(), "Scales must be ready!"); const e = this._model.timeScale().visibleBarsStrictRange(); if (null === e) return; const t = this._getTranspValue(); let i = Object(s.ensureDefined)(this._series.nearestIndex(e.firstBar(), c .PlotRowSearchMode.NearestRight)), r = Object(s.ensureDefined)(this._series.nearestIndex(e.lastBar(), c .PlotRowSearchMode.NearestLeft)); const n = this._study.offset(this._plotName); n > 0 ? (i -= n, r += n) : (i += n, r -= n); const o = this._study.getMinFirstBarIndexForPlot(this._plotName); if (o > r) return; i = Math.max(o, i); const a = this._study.data().rangeIterator(i, r); for (; a.hasNext();) { const e = a.next(); let i = e.index; const r = e.value; i += n; const o = new I.Point(Math.floor(i) - .5, NaN); let l = Object(P.isNumber)(t) ? t : 50; l = Math.min(l, 100), l = Math.max(l, 0); const c = this._colorProvider.getPlotPointStyle(r); void 0 !== c.colors[A.ColorerType.Background] && (o.color = Object(M .generateColor)(Object(s.ensureDefined)(c.colors[A.ColorerType .Background]), l)), o.index = i, this._items.push(o) } this._model.timeScale().timedValuesToCoordinates(this._items) } } var D = i("CLNU"), V = i("vq8G"), B = i("Nu4p"), R = i("Hr11"), N = i("VdBB"), j = i("o2pV"), F = i("XPit"), W = i("f6yo"); function H(e, t, i) { const s = e.get(t); return void 0 !== s ? s : (e.set(t, i), i) } function U(e, t, i, s) { const r = H(e, t, new Map); return H(r, i, s) } class z { constructor() { this._map = new Map, this._size = 0 } size() { return this._size } clear() { this._map.clear(), this._size = 0 } } var G, q, Y = i("XlJ7"), K = i("c44N"), J = i("ikwP"); ! function(e) { e.Left = "left", e.Right = "right", e.Center = "center" }(G || (G = {})), function(e) { e.Top = "top", e.Bottom = "bottom", e.Middle = "middle" }(q || (q = {})); class Z { constructor(e, t, i, r, n, o = "center") { this._cacheRenderParams = null, this._canvasesMap = {}, this._lines = e.split( /[^\S\r\n]*(?:\r\n|\r|\n)/), this._font = function(e, t, i, s) { return Object(Y.makeFont)(s, i, `${e ? "bold " : ""}${t ? "italic " : ""}`) }(t, i, r, n), this._fontSize = n, this._verticalPadding = ~~(n / 6), this ._textAlign = o; const a = Object(J.createDisconnectedCanvas)(document, new J.Size(0, 0), 1), l = Object(s.ensureNotNull)(a.getContext("2d")); l.font = this._font; let c = 0; for (const e of this._lines) { const t = l.measureText(e).width; c = Math.max(c, t) } this.textImageWidth = c + 1, this.textImageHeight = this._lines.length * n + this ._verticalPadding } paintTo(e, t, i, s, r, n, o) { const a = this._getTextImage(i, t); if (0 === a.width || 0 === a.height) return; const l = function(e, t, i) { let s = e; switch (t) { case "left": break; case "right": s -= i; break; case "center": s -= i / 2 } return Math.round(s) }(s, n, this.textImageWidth), c = function(e, t, i) { let s = e; switch (t) { case "top": break; case "bottom": s -= i; break; case "middle": s -= i / 2 } return Math.round(s) }(r, o, this.textImageHeight); Object(J.drawScaled)(e, t.pixelRatio, () => { e.drawImage(a, l, c, this.textImageWidth, this.textImageHeight) }) } _getTextImage(e, t) { if (null !== this._cacheRenderParams && Object(K.areEqualPaneRenderParams)(this ._cacheRenderParams, t) || (this._canvasesMap = {}, this ._cacheRenderParams = t), this._canvasesMap[e]) return this._canvasesMap[ e]; { const t = Object(J.createDisconnectedCanvas)(document, new J.Size(this .textImageWidth, this.textImageHeight), this._cacheRenderParams .pixelRatio), i = Object(s.ensureNotNull)(t.getContext("2d")); let r; switch (i.textBaseline = "top", i.font = this._font, i.fillStyle = e, this ._textAlign) { case "left": r = 0, i.textAlign = "left"; break; case "right": r = this.textImageWidth - 1, i.textAlign = "right"; break; default: r = this.textImageWidth / 2, i.textAlign = "center" } let n = this._verticalPadding; return Object(J.drawScaled)(i, this._cacheRenderParams.pixelRatio, () => { for (const e of this._lines) i.fillText(e, r, n), n += this ._fontSize }), this._canvasesMap[e] = t, t } } } class X extends z { constructor(e) { super(), this._maxSize = e, this._keysQueue = [] } get(e) { if (!e.text || !e.fontSize || !e.align) return null; const t = e.fontSize, i = e.text, s = e.align, r = U(this._map, t, s, new Map); let n = r.get(i); return void 0 !== n || (this._size >= this._maxSize ? this._deleteFirstKey() : ++ this._size, this._keysQueue.push([t, i, s]), n = new Z(e.text, e.bold, e .italic, e.font, e.fontSize, e.align), r.set(i, n)), n } _deleteFirstKey() { const e = this._keysQueue.shift(), t = e[0], i = e[1], s = this._map.get(t); s.delete(i), 0 === s.size && this._map.delete(t) } } var $ = i("zDbI"); class Q { constructor(e, t = { skipRenderingOptimizations: !1 }) { this._height = void 0 !== e.height ? e.height : e.width, this._width = void 0 !== e .width ? e.width : e.height, this._items = [], this._barSpacing = 0, this ._textCache = t.textCache || new X(5e3), this._drawOperation = t .skipRenderingOptimizations ? this._drawWithoutOptimizations.bind(this) : this ._drawWithOptimizations.bind(this), this._color = e.color, this._borderColor = e .borderColor, this._vertOffset = e.vertOffset || 0, e.text && (this._text = e .text, this._fontSize = e.fontSize, this._textColor = e.textColor, this ._textAlign = e.textAlign || "center"), void 0 !== e.items && void 0 !== e .barSpacing && this.setData(e.items, e.barSpacing) } draw(e, t) { this._preDrawInit(), this._drawOperation(e, t) } hitTest(e) { const t = N.HitTestResult.REGULAR; let i = null; for (const s of this._items) { if (!s) continue; const r = this._calcBoundingBox(s); if (r && Object(W.pointInBox)(e, r)) { const e = { tooltip: this._getTooltip(s, r) }; i = new N.HitTestResult(t, e) } } return i } setData(e, t) { this._setBaseData(e, t) } _calcBoundingBox(e) { const t = e.vertOffset, i = this._getTextCache(e); if (!i) return; const s = i.textImageWidth, r = i.textImageHeight, n = s / 2, o = e.y + t + e.textVertOffset, a = t > 0 ? 0 : -r, l = t > 0 ? r : 0, c = new I.Point(e.x - n, o + a), h = new I.Point(e.x + n, o + l); return Object(I.box)(c, h) } _unionBox(e, t) { const i = Math.min(e.min.x, t.min.x), s = Math.max(e.max.x, t.max.x), r = Math.min(e.min.y, t.min.y), n = Math.max(e.max.y, t.max.y), o = new I.Point(i, r), a = new I.Point(s, n); return Object(I.box)(o, a) } _getTooltip(e, t) { if (e.tooltip) return { content: { type: "text", data: e.tooltip }, tooltipDelay: 200, extendMargin: !0, rect: { x: t.min.x, y: t.min.y, w: Math.abs(t.max.x - t.min.x), h: Math.abs(t.max.y - t.min.y) } } } _setBaseData(e, t) { this._items.length = 0, this._barSpacing = t; for (const t of e) { const e = void 0 === t.width ? Object(s.ensureDefined)(this._width) : t.width, i = void 0 === t.height ? Object(s.ensureDefined)(this._height) : t.height, r = void 0 === t.vertOffset ? this._vertOffset : t.vertOffset, n = r > 0 ? i : -i; this._items.push({ width: e, height: i, vertOffset: r, textVertOffset: n, shapeWidth: 0, shapeHeight: 0, stepX: 0, stepY: 0, ...t }) } } _drawItemText(e, t, i) { const s = this._getTextCache(i); if (null === s) return; const r = i.x, n = i.vertOffset, o = i.y + n + i.textVertOffset; let a; a = i.style && void 0 !== i.style.textColor ? i.style.textColor : this._textColor, s .paintTo(e, t, a, r, o, G.Center, n > 0 ? q.Top : q.Bottom) } _drawWithOptimizations(e, t) { let i, s, r = null, n = !1; for (const o of this._items) o.style && void 0 !== o.style.color ? (i = o.style .color || "rgba(0, 0, 0, 0)", s = o.style.borderColor || "rgba(0, 0, 0, 0)" ) : (i = this._color, s = this._borderColor), r !== i && (r = i, n && this ._endPath(e), this._startPath(e, t, i, s)), this._drawItemShape(e, t, o), n = !0; n && this._endPath(e); for (const i of this._items) this._drawItemText(e, t, i) } _drawWithoutOptimizations(e, t) { let i, r; for (const n of this._items) { const o = Object(s.ensureDefined)(n.style); i = o.color || "rgba(0, 0, 0, 0)", r = o.borderColor || "rgba(0, 0, 0, 0)", this ._startPath(e, t, i, r), this._drawItemShape(e, t, n), this._endPath(e), this._drawItemText(e, t, n) } } _drawItemShape(e, t, i) { Object(J.drawScaled)(e, t.pixelRatio, () => this._drawItemShapeUsingCSSPixels(e, i)) } _drawItemShapeUsingCSSPixels(e, t) {} _preDrawInit() {} _startPath(e, t, i, s) {} _endPath(e) {} _getTextCache(e) { const t = e.text || this._text, i = e.fontSize || this._fontSize, s = e.textAlign || this._textAlign; return this._textCache.get({ text: t, bold: !1, italic: !1, font: $.CHART_FONT_FAMILY, fontSize: i, align: s }) } } class ee extends Q { _startPath(e, t, i, s) { e.beginPath(), e.lineWidth = this._lineWidth(t), e.lineCap = "butt", e.strokeStyle = i } _endPath(e) { e.stroke() } _lineWidth(e) { return Math.max(1, Math.floor(2 * e.pixelRatio)) } } class te extends Q { _startPath(e, t, i, s) { e.beginPath(), e.lineWidth = this._lineWidth(t), e.lineCap = "butt", e.fillStyle = i, e.strokeStyle = s } _endPath(e) { e.fill(), e.stroke() } _lineWidth(e) { return Math.max(1, Math.floor(e.pixelRatio)) } } class ie extends te { constructor() { super(...arguments), this._sign = 0, this._thinArrow = !1, this._thinArrowLineWidth = 0, this._headHeight = 0, this._arrowWidth = 0 } setData(e, t) { this._setBaseData(e, t) } _drawItemShape(e, t, i) { const s = t.pixelRatio, r = this._lineWidth(t) % 2 ? .5 : 0, n = this._sign, o = this._arrowWidth, a = this._headHeight, l = Math.abs(i.height), c = Math.round(i.x * s) + r, h = i.vertOffset, u = Math.round((i.y + h + n * l / 2) * s) + r, d = Object(R.ceiledEven)(o * s), p = d / 2, _ = Math.round(l * s), m = Math.round(a * s); e.translate(c, u), this._thinArrow ? (e.moveTo(0, 0), e.lineTo(-p, -p * n), e .moveTo(0, 0), e.lineTo(p, -p * n), e.moveTo(0, 0), e.lineTo(0, -_ * n), e .moveTo(-p, -_ * n), e.lineTo(p, -_ * n)) : (e.moveTo(0, 0), _ < m ? (e .lineTo(d, -_ * n), e.lineTo(-d, -_ * n)) : (e.lineTo(d, -m * n), e .lineTo(p, -m * n), e.lineTo(p, -_ * n), e.lineTo(-p, -_ * n), e.lineTo( -p, -m * n), e.lineTo(-d, -m * n)), e.lineTo(0, 0)), e.translate(-c, -u) } _preDrawInit() { const e = this._calculateWidth(); this._arrowWidth = e, this._sign = this._isUp() ? -1 : 1, this._thinArrow = e < 4, this._thinArrowLineWidth = Math.max(e / 2, 1), this._headHeight = Math.round(e) } _startPath(e, t, i, s) { e.beginPath(), e.fillStyle = i, e.strokeStyle = s, e.lineWidth = this._lineWidth(t) } _lineWidth(e) { return this._thinArrow ? this._thinArrowLineWidth : super._lineWidth(e) } _calcBoundingBox(e) { const t = e.vertOffset, i = this._sign, s = this._arrowWidth, r = this._headHeight, n = Math.abs(e.height), o = e.x - s, a = o + 2 * s, l = e.y + t + i * Math.round(n / 2), c = l + (-n - r) * i, h = new I.Point(o, l), u = new I.Point(a, c); let d = Object(I.box)(h, u); const p = super._calcBoundingBox(e); return p && (d = this._unionBox(d, p)), d } _calculateWidth() { return Math.round(this._barSpacing / 4) } } const se = 2 * Math.PI; class re extends te { setData(e, t) { this._setBaseData(e, t); for (const e of this._items) { const t = e.height; e.stepX = Math.round(t / 2 * .65) + .5, e.stepY = e.stepX; const i = e.stepX / 2, s = this._getTextCache(e); if (null === s) { e.shapeWidth = 2 * e.stepX, e.shapeHeight = 2.5 * e.stepY, e.vertOffset = this._calcVertOffset(e); continue } const r = s.textImageWidth, n = s.textImageHeight; e.shapeWidth = r + 2 * e.stepX, e.shapeHeight = n + 2 * i + e.stepY, e .vertOffset = this._calcVertOffset(e), e.textHorizOffset = this ._getHorizontalTextOffset(e), e.textVertOffset = this ._getVerticalTextOffset(e) } } _calcVertOffset(e) { return e.vertOffset } _drawCorner(e, t, i, s, r) { const n = Math.max(1, Math.floor(2 * r)); e.lineTo(t - n * s.prevPointSignX, i - n * s.prevPointSignY), e.arcTo(t, i, t + n * s.nextPointSignX, i + n * s.nextPointSignY, n) } _getArrowSize(e) { return e.stepX } _getHorizontalTextOffset(e) { return 0 } _getVerticalTextOffset(e) { return 0 } _hasText(e) { return Boolean(e.text) || Boolean(this._text) } _drawItemText(e, t, i) { var r; const n = this._getTextCache(i); if (null === n) return; const o = i.textHorizOffset || 0, a = i.x + o, l = i.vertOffset, c = i.y + l + i.textVertOffset, h = (null === (r = i.style) || void 0 === r ? void 0 : r.textColor) || this ._textColor; n.paintTo(e, t, Object(s.ensureDefined)(h), a, c, G.Center, q.Middle) } } class ne { constructor(e, t, i, s) { this.prevPointSignX = e, this.prevPointSignY = t, this.nextPointSignX = i, this .nextPointSignY = s } } var oe; ! function(e) { e.rightUp = new ne(1, 0, 0, 1), e.rightDown = new ne(0, 1, -1, 0), e.leftDown = new ne(-1, 0, 0, -1), e.leftUp = new ne(0, -1, 1, 0) }(oe || (oe = {})); class ae extends te { _calcBoundingBox(e) { const t = e.width, i = e.height, s = t / 2, r = Math.round(i / 3), n = e.x, o = e.vertOffset - 2 * r, a = e.y + o, l = n - s, c = n + s, h = a, u = a + i, d = new I.Point(l, h), p = new I.Point(c, u); let _ = Object(I.box)(d, p); const m = super._calcBoundingBox(e); return m && (_ = this._unionBox(_, m)), _ } } const le = new Map; le.set("PaneRendererArrowUp", class extends ie { _isUp() { return !0 } }), le.set("PaneRendererArrowDown", class extends ie { _isUp() { return !1 } }), le.set("PaneRendererCircleShape", class extends te { _drawItemShapeUsingCSSPixels(e, t) { const i = Math.max(t.width, t.height) / 2, s = t.x, r = t.vertOffset, n = t.y + r; e.moveTo(s + i, n), e.arc(s, n, i, 0, se, !1) } _calcBoundingBox(e) { const t = Math.max(e.width, e.height) / 2, i = e.x, s = e.vertOffset, r = e.y + s, n = i - t, o = i + t, a = r - t, l = r + t, c = new I.Point(n, a), h = new I.Point(o, l); let u = Object(I.box)(c, h); const d = super._calcBoundingBox(e); return d && (u = this._unionBox(u, d)), u } }), le.set("PaneRendererCrossShape", class extends ee { _drawItemShape(e, t, i) { const s = i.width, r = i.height, n = i.x - s / 2, o = i.vertOffset, a = i.y - r / 2 + o, l = t.pixelRatio, c = this._lineWidth(t), h = c % 2 ? .5 : 0, u = Math.round(n * l); let d = Math.round((n + s) * l); (d - u) % 2 != c % 2 && (d += 1); const p = Math.floor((u + d) / 2) + h, _ = Math.round(a * l); let m = Math.round((a + r) * l); (m - _) % 2 != c % 2 && (m += 1); const f = Math.floor((_ + m) / 2) + h; e.moveTo(p, _), e.lineTo(p, m), e.moveTo(u, f), e.lineTo(d, f) } _calcBoundingBox(e) { const t = e.width, i = e.height, s = e.x - t / 2, r = e.vertOffset, n = e.y - i / 2 + r, o = s, a = s + t, l = n, c = n + i, h = new I.Point(o, l), u = new I.Point(a, c); let d = Object(I.box)(h, u); const p = super._calcBoundingBox(e); return p && (d = this._unionBox(d, p)), d } }), le.set("PaneRendererDiamond", class extends te { _drawItemShapeUsingCSSPixels(e, t) { const i = Math.round(t.height / 2), s = t.x, r = t.vertOffset, n = t.y + r; e.moveTo(s, n - i), e.lineTo(s + i, n), e.lineTo(s, n + i), e.lineTo(s - i, n), e.lineTo(s, n - i) } _calcBoundingBox(e) { const t = Math.round(e.height / 2), i = e.x, s = e.vertOffset, r = e.y + s, n = i - t, o = i + t, a = r - t, l = r + t, c = new I.Point(n, a), h = new I.Point(o, l); let u = Object(I.box)(c, h); const d = super._calcBoundingBox(e); return d && (u = this._unionBox(u, d)), u } }), le.set("PaneRendererFlagShape", class extends te { _drawItemShapeUsingCSSPixels(e, t) { const i = t.width, s = t.height, r = s / 2, n = (i - 3) / 3, o = t.x - i / 2, a = t.vertOffset, l = t.y - r + a; e.moveTo(o, l), e.lineTo(o + 3, l), e.bezierCurveTo(o + n, l - n, o + 2 * n, l + n, o + i, l), e.lineTo(o + i, l + r), e.bezierCurveTo(o + i - n, l + r + n, o + i - 2 * n, l + r - n, o + 3, l + r), e.lineTo(o + 3, l + s), e.lineTo(o, l + s), e.lineTo(o, l) } _calcBoundingBox(e) { const t = e.width, i = e.height, s = i / 2, r = e.x - t / 2, n = e.vertOffset, o = e.y - s + n, a = r, l = r + t, c = o, h = o + i, u = new I.Point(a, c), d = new I.Point(l, h); let p = Object(I.box)(u, d); const _ = super._calcBoundingBox(e); return _ && (p = this._unionBox(p, _)), p } }), le.set("PaneRendererLabelUp", class extends re { _calcBoundingBox(e) { const t = e.x - e.shapeWidth / 2, i = e.x + e.shapeWidth / 2, s = e.y + e.vertOffset, r = e.y + e.shapeHeight + e.vertOffset, n = new I.Point(t, s), o = new I.Point(i, r); return Object(I.box)(n, o) } _drawItemShape(e, t, i) { const s = t.pixelRatio, r = this._lineWidth(t) % 2 ? .5 : 0, n = Math.max(1, Math.floor(s)) % 2 ? .5 : 0, o = this._getArrowSize(i); let a = Math.round(o * s); (n + a) % 1 != r % 1 && (a += .5); let l = Math.round(i.shapeWidth / 2 * s); (n + l) % 1 != r % 1 && (l += .5); const c = Math.round(i.x * s) + n, h = Math.round((i.y + i.vertOffset) * s) + r, u = c - a, d = Math.round((i.y + i.vertOffset + o) * s) + r, p = c + a, _ = c + l, m = Math.round((i.y + i.vertOffset + i.shapeHeight) * s) + r, f = c - l; e.moveTo(u, d), e.lineTo(c, h), e.lineTo(p, d), i.shapeWidth <= 2 * o ? (e .lineTo(_, d), this._drawCorner(e, _, m, oe.rightDown, s), this ._drawCorner(e, f, m, oe.leftDown, s), e.lineTo(f, d)) : (this ._drawCorner(e, _, d, oe.rightUp, s), this._drawCorner(e, _, m, oe .rightDown, s), this._drawCorner(e, f, m, oe.leftDown, s), this ._drawCorner(e, f, d, oe.leftUp, s)), e.lineTo(u, d) } _getVerticalTextOffset(e) { return e.shapeHeight / 2 + this._getArrowSize(e) / 2 } _calcVertOffset(e) { return Math.sign(e.vertOffset) >= 0 ? e.vertOffset : e.vertOffset - e .shapeHeight } }), le.set("PaneRendererLabelDown", class extends re { _calcBoundingBox(e) { const t = e.x - e.shapeWidth / 2, i = e.x + e.shapeWidth / 2, s = e.y - e.shapeHeight + e.vertOffset, r = e.y + e.vertOffset, n = new I.Point(t, s), o = new I.Point(i, r); return Object(I.box)(n, o) } _drawItemShape(e, t, i) { const s = t.pixelRatio, r = this._lineWidth(t) % 2 ? .5 : 0, n = Math.max(1, Math.floor(s)) % 2 ? .5 : 0, o = this._getArrowSize(i); let a = Math.round(o * s); (n + a) % 1 != r % 1 && (a += .5); let l = Math.round(i.shapeWidth / 2 * s); (n + l) % 1 != r % 1 && (l += .5); const c = Math.round(i.x * s) + n, h = Math.round((i.y + i.vertOffset) * s) + r, u = c + a, d = Math.round((i.y + i.vertOffset - o) * s) + r, p = c - a, _ = c + l, m = Math.round((i.y + i.vertOffset - i.shapeHeight) * s) + r, f = c - l; e.moveTo(u, d), e.lineTo(c, h), e.lineTo(p, d), i.shapeWidth <= 2 * o ? (e .lineTo(f, d), this._drawCorner(e, f, m, oe.leftUp, s), this ._drawCorner(e, _, m, oe.rightUp, s), e.lineTo(_, d)) : (this ._drawCorner(e, f, d, oe.leftDown, s), this._drawCorner(e, f, m, oe .leftUp, s), this._drawCorner(e, _, m, oe.rightUp, s), this ._drawCorner(e, _, d, oe.rightDown, s)), e.lineTo(u, d) } _getVerticalTextOffset(e) { return -e.shapeHeight / 2 - this._getArrowSize(e) / 2 } _calcVertOffset(e) { return Math.sign(e.vertOffset) <= 0 ? e.vertOffset : e.vertOffset + e .shapeHeight } }), le.set("PaneRendererSquare", class extends te { _drawItemShape(e, t, i) { const s = t.pixelRatio, r = Math.max(1, Math.floor(s)) % 2 ? .5 : 0, n = this._lineWidth(t) % 2 ? .5 : 0; let o = Math.round(i.height / 2 * s); (r + o) % 1 != n % 1 && (o += .5); const a = Math.round(i.x * s) + r, l = Math.round((i.y + i.vertOffset) * s) + r, c = a - o, h = l - o, u = a + o, d = l + o; e.rect(c, h, u - c, d - h) } _calcBoundingBox(e) { const t = e.height, i = Math.round(t / 2), s = e.x - i, r = e.vertOffset, n = e.y + r - i, o = s, a = s + t, l = n, c = n + t, h = new I.Point(o, l), u = new I.Point(a, c); let d = Object(I.box)(h, u); const p = super._calcBoundingBox(e); return p && (d = this._unionBox(d, p)), d } }), le.set("PaneRendererTriangleApexUp", class extends ae { _drawItemShape(e, t, i) { const s = i.width, r = i.height, n = Math.round(r / 3), o = i.vertOffset - 2 * n, a = t.pixelRatio, l = this._lineWidth(t) % 2 ? .5 : 0, c = Math.max(1, Math.floor(a)), h = c % 2 ? .5 : 0; let u = Math.round(s * a); u % 2 != c % 2 && (u += 1); const d = Math.round(i.x * a) + h, p = Math.round((i.y + o) * a), _ = d + u / 2, m = Math.round((i.y + o + r) * a) + l, f = d - u / 2; e.moveTo(d, p), e.lineTo(_, m), e.lineTo(f, m), e.lineTo(d, p) } }), le.set("PaneRendererTriangleApexDown", class extends ae { _drawItemShape(e, t, i) { const s = i.width, r = i.height, n = Math.round(r / 3), o = i.vertOffset - n, a = t.pixelRatio, l = this._lineWidth(t) % 2 ? .5 : 0, c = Math.max(1, Math.floor(a)), h = c % 2 ? .5 : 0; let u = Math.round(s * a); u % 2 != c % 2 && (u += 1); const d = Math.round(i.x * a) + h, p = Math.round((i.y + o) * a) + l, _ = d + u / 2, m = Math.round((i.y + o + r) * a), f = d - u / 2; e.moveTo(f, p), e.lineTo(_, p), e.lineTo(d, m), e.lineTo(f, p) } }), le.set("PaneRendererXCross", class extends ee { _drawItemShapeUsingCSSPixels(e, t) { const i = t.width, s = t.height, r = t.x - i / 2, n = t.vertOffset, o = t.y - s / 2 + n; e.moveTo(r, o), e.lineTo(r + i, o + s), e.moveTo(r, o + s), e.lineTo(r + i, o) } _calcBoundingBox(e) { const t = e.width, i = e.height, s = e.x - t / 2, r = e.vertOffset, n = e.y - i / 2 + r, o = s, a = s + t, l = n, c = n + i, h = new I.Point(o, l), u = new I.Point(a, c); let d = Object(I.box)(h, u); const p = super._calcBoundingBox(e); return p && (d = this._unionBox(d, p)), d } }); class ce { constructor(e, t, i, s) { this._items = [], this._invalidated = !1, this._renderer = null, this ._isMarkersEnabled = T.enabled("source_selection_markers"), this ._selectionData = null, this._plotIndex = null, this._topCoord = 0, this ._bottomCoord = 0, this._study = e, this._series = t, this._model = i, this ._plotName = s; const r = e.metaInfo().plots; for (let e = 0; e < r.length; e++) if (r[e].id === this._plotName) { this._plotIndex = e; break } this._colorProvider = Object(E.createStudyPlotColorProvider)(e.metaInfo(), e .properties(), s), this._selectionIndexer = new j.SelectionIndexes(i .timeScale()) } items() { return this._items } update() { this._invalidated = !0 } renderer() { if (!this._study.properties().styles[this._plotName].visible) return null; if (!this._study.properties().styles[this._plotName].visible.value()) return null; if (!this._scalesReady()) return null; if (this._invalidated) { const e = this._study.properties().styles[this._plotName]; this._updateRenderer(e), this._invalidated = !1 } return this._renderer } _scalesReady() { const e = this._model.timeScale(), t = this._study.priceScale(); return e && null !== t && !e.isEmpty() && !t.isEmpty() } _updateImpl() { if (this._items = [], !this._scalesReady()) return; const e = this._model.timeScale(), t = this._study.priceScale(), i = e.visibleBarsStrictRange(); if (null === i || null === t) return; let r = this._series.nearestIndex(i.firstBar(), c.PlotRowSearchMode.NearestRight), n = this._series.nearestIndex(i.lastBar(), c.PlotRowSearchMode.NearestLeft); if (void 0 === r || void 0 === n) return; const o = this._study.offset(this._plotName); o > 0 ? (r -= o, n += o) : (r += o, n -= o); const a = this._study.getMinFirstBarIndexForPlot(this._plotName); if (a > n) return; r = Math.max(a, r); const l = this._study.data(), h = this._study.firstValue(); if (null === h) return; const u = l.rangeIterator(r, n), d = this._getTranspValue(); let p = []; const _ = this._model.selection().isSelected(this._study); _ ? (p = this._selectionIndexer.indexes(), this._selectionData = { points: [], hittestResult: N.HitTestResult.REGULAR, vertOffset: 0, bgColors: [], barSpacing: e.barSpacing(), visible: !0 }) : (this._selectionIndexer.clear(), this._selectionData = null); const m = this._series.properties().style.value(), f = 2 === m ? "lineStyle" : 3 === m ? "areaStyle" : null; let g, b; f ? (g = this._series.properties()[f].priceSource.value(), b = g) : (g = "high", b = "low"); const v = t.isInverted(), S = t.coordinateToPrice(t.height() * t.topMargin(), h), y = t.coordinateToPrice(t.height() * (1 - t.bottomMargin()), h); this._topCoord = v ? y : S, this._bottomCoord = v ? S : y; const w = Object(s.ensureNotNull)(this._model.paneForSource(this._study)).height(), P = this._study.properties().styles[this._plotName], C = P.color.value(), x = P.textColor ? P.textColor.value() : void 0, T = C, I = C, M = void 0 === x ? void 0 : x, O = Object(s.ensureNotNull)(this._plotIndex), L = Object(A.createEmptyStyle)(); for (; u.hasNext();) { const e = u.next(), t = e.index, i = e.value, s = Math.floor(t + o), r = i[O + 1]; if (null == r) continue; const n = this._createItem(s, r, g, b); if (null !== n) { if (this._colorProvider.isColorDefined()) { n.style = { color: T, borderColor: I, textColor: M }; const e = this._colorProvider.getPlotPointStyle(i, L); this._fillItemWithPointStyle(n, e, d) } _ && -1 !== p.indexOf(t) && null !== this._selectionData && (this ._selectionData.points.push(n), this._selectionData.bgColors.push( this._model.backgroundColorAtYPercentFromTop(n.y / w))), this ._items.push(n) } } this._convertItemsToCoordinates() } _fillItemWithPointStyle(e, t, i) { const r = Object(s.ensureDefined)(e.style); if (void 0 !== t.colors[A.ColorerType.Main]) { r.color = Object(M.generateColor)(Object(s.ensureDefined)(t.colors[A.ColorerType .Main]), i); const e = i > 9 ? i - 10 : 0; r.borderColor = Object(M.generateColor)(r.color, e) } void 0 !== t.colors[A.ColorerType.Text] && (r.textColor = Object(M.generateColor)( Object(s.ensureDefined)(t.colors[A.ColorerType.Text]), i)) } _updateRenderer(e) { this._updateImpl(); const t = this._model.timeScale(), i = {}, s = this._getTranspValue(), r = t.barSpacing(), n = this._calculateShapeHeight(r), o = this._study.properties().styles[this._plotName].location.value(), a = this._calculateVerticalOffset(o, n + n / 2); i.barSpacing = r, i.items = this._items, i.color = Object(M.generateColor)(this ._study.properties().styles[this._plotName].color.value(), s), i.height = n, i.vertOffset = a; const l = this._study.properties().styles[this._plotName].plottype.value(), c = B.a[l], h = new O.CompositeRenderer; c && h.append(this._createRenderer(c.paneRendererClass, i)), this._model.selection() .isSelected(this._study) && this._isMarkersEnabled && null !== this ._selectionData && (this._selectionData.vertOffset = a, h.append(new V .SelectionRenderer(this._selectionData))), this._renderer = h } _createRenderer(e, t) { const i = le.get(e); return new(Object(s.ensureDefined)(i))(t) } _getSeriesVal(e, t) { const i = Object(F.barFunction)(e), s = this._series.data().valueAt(t); return null === s ? null : i(s) } _getTranspValue() { let e = 0; this._study.properties().transparency && (e = this._study.properties().transparency .value(), e = Object(P.isNumber)(e) ? e : 50); const t = this._study.properties().styles[this._plotName]; return t.transparency && (e = t.transparency.value(), e = Object(P.isNumber)(e) ? e : 50), Object(R.clamp)(e, 0, 100) } _createItem(e, t, i, r) { const n = this._study.properties().styles[this._plotName].location.value(); if ((null === t || 0 === t) && n !== p.c.Absolute) return null; let o; switch (n) { case p.c.AboveBar: const a = this._getSeriesVal(i, e); if (null === a) return null; o = a; break; case p.c.BelowBar: const l = this._getSeriesVal(r, e); if (null === l) return null; o = l; break; case p.c.Top: o = this._topCoord; break; case p.c.Bottom: o = this._bottomCoord; break; case p.c.Absolute: o = Object(s.ensureNotNull)(t); break; default: throw new Error("Bad value: " + n) } return new I.Point(e, o) } _convertItemsToCoordinates() { const e = this._model.timeScale(), t = this._study.priceScale(); e.timedValuesToCoordinates(this._items); const i = Object(s.ensureNotNull)(this._study.firstValue()); Object(s.ensureNotNull)(t).pointsArrayToCoordinates(this._items, i) } _calculateVerticalOffset(e, t) { let i = 0; switch (e) { case p.c.AboveBar: case p.c.Bottom: i = -t; break; case p.c.BelowBar: case p.c.Top: i = t } return Object(s.ensureNotNull)(this._study.priceScale()).isInverted() && (i *= -1), i } _calculateShapeHeight(e, t) { let i = e; switch (t) { case x.PlotSymbolSize.Tiny: i = .3 * e; break; case x.PlotSymbolSize.Small: i = .6 * e; break; case x.PlotSymbolSize.Normal: i = e; break; case x.PlotSymbolSize.Large: i = 1.5 * e; break; case x.PlotSymbolSize.Huge: i = 2 * e } return i } } class he extends ce { renderer() { const e = this._study.properties().styles[this._plotName]; return e.visible && e.visible.value() && this._scalesReady() ? (this._invalidated && (this._updateRenderer(e), this._invalidated = !1), this._renderer) : null } _updateRenderer(e) { this._updateImpl(); const t = this._model.timeScale(), i = {}, s = this._getTranspValue(), r = t.barSpacing(); let n; if (e.size) { const t = e.size.value(); n = this._calculateShapeHeight(25, t) } else n = Math.round(r / 2); n = Math.max(n, 1); const o = e.location.value(), a = Object(M.generateColor)(e.color.value(), s), l = s > 19 ? s - 10 : 0, c = this._calculateVerticalOffset(o, Math.round(1.5 * n)); i.barSpacing = r, i.items = this.items(), i.color = a, i.borderColor = Object(M .generateColor)(e.color.value(), l), i.height = n, i.vertOffset = c; const h = e.plottype.value(), u = B.a[h], d = new O.CompositeRenderer, p = e.text ? e.text.value() : void 0; if (void 0 !== p && "" !== p.trim()) { let t = p.trim().replace(/\\n/gm, "\n"); t = Object(D.cleanButAmpersand)(t, !0), i.text = t, i.fontSize = 12; const r = e.textColor ? e.textColor.value() : void 0; i.textColor = r ? Object(M.generateColor)(r, s) : a } d.append(super._createRenderer(u.paneRendererClass, i)), this._model.selection() .isSelected(this._study) && this._isMarkersEnabled && null !== this ._selectionData && (this._selectionData.vertOffset = c, d.append(new V .SelectionRenderer(this._selectionData))), this._renderer = d } } var ue = i("/SnT"), de = i.n(ue), pe = i("Zp/P"); class _e extends Q { constructor(e, t) { super(e, t), this._heightEnsured = Object(s.ensureDefined)(this._height); const i = e.char.slice(0, 40); this._ch = de()(i)[0] || " ", this._fontFamily = e.fontFamily || $ .CHART_FONT_FAMILY, this._charCache = new Z(this._ch, !1, !1, this._fontFamily, this._heightEnsured) } hitTest(e) { const t = Object(pe.interactionTolerance)().series + this._heightEnsured / 2; for (const i of this._items) { if (new I.Point(i.x, i.y + i.vertOffset).subtract(e).length() <= t) return new N .HitTestResult(N.HitTestResult.REGULAR) } return null } _drawItemShape(e, t, i) { const s = i.x, r = i.vertOffset > 0 ? 1 : -1, n = i.y + i.vertOffset - r * Math.round(this._heightEnsured / 2); let o; o = i.style && void 0 !== i.style.color ? i.style.color : this._color, this ._charCache.paintTo(e, t, o, s, n, G.Center, i.vertOffset > 0 ? q.Top : q .Bottom) } _startPath(e, t, i, s) {} _endPath(e) {} } class me extends ce { renderer() { const e = this._study.properties().styles[this._plotName]; if (!e.visible || !e.visible.value()) return null; if (!this._scalesReady()) return null; const t = this._model.timeScale(); this._invalidated && (this._updateImpl(), this._invalidated = !1); const i = {}, s = this._getTranspValue(), r = t.barSpacing(); let n; if (e.size) { const t = e.size.value(); n = this._calculateShapeHeight(50, t) } else n = Math.round(r); const o = e.location.value(), a = Object(M.generateColor)(e.color.value(), s), l = this._calculateVerticalOffset(o, n); i.items = this.items(), i.barSpacing = r, i.char = e.char.value(), i.height = n, i .vertOffset = l, i.color = a; const c = new O.CompositeRenderer, h = e.text ? e.text.value() : void 0; if (void 0 !== h && "" !== h.trim()) { let t = h.trim().replace(/\\n/gm, "\n"); t = Object(D.cleanButAmpersand)(t, !0), i.text = t, i.fontSize = 12; const r = e.textColor ? e.textColor.value() : void 0; i.textColor = r ? Object(M.generateColor)(r, s) : a } return c.append(new _e(i)), this._model.selection().isSelected(this._study) && this ._isMarkersEnabled && null !== this._selectionData && (this._selectionData .vertOffset = l, c.append(new V.SelectionRenderer(this._selectionData))), c } } var fe = i("eJTA"); class ge extends I.Point { constructor(e, t, i, s) { super(e, t), this.height = i, this.isUp = s, this.style = {} } } function be(e) { return Math.round(e / 4) } function ve(e) { return Math.round(e / 2) } class Se { constructor(e) { this._data = e } draw(e, t) { var i; const s = t.pixelRatio, r = this._data, n = ve(r.barSpacing), o = be(r.barSpacing), a = n < 4, l = Math.max(n / 2, 1), c = Object(R.ceiledEven)(n * s), h = c / 2, u = Math.round(n * s); e.lineCap = "butt", e.lineWidth = Math.max(1, Math.floor(s)); const d = e.lineWidth % 2 ? .5 : 0; for (const t of r.items) { const n = t.isUp ? -1 : 1, p = Math.round(Math.abs(t.height) * s), _ = Math.round(t.x * s) + d, m = Math.round((t.y - n * o) * s) + d; e.beginPath(), e.translate(_, m); const f = null !== (i = t.style && t.style.color) && void 0 !== i ? i : t.isUp ? r.colorup : r.colordown; a ? (e.moveTo(0, 0), e.lineTo(-h, -h * n), e.moveTo(0, 0), e.lineTo(h, -h * n), e.moveTo(0, 0), e.lineTo(0, -p * n), e.moveTo(-h, -p * n), e.lineTo(h, - p * n), e.lineWidth = l, e.strokeStyle = f, e.stroke()) : (e.moveTo( 0, 0), p < u ? (e.lineTo(c, -p * n), e.lineTo(-c, -p * n)) : (e .lineTo(c, -u * n), e.lineTo(h, -u * n), e.lineTo(h, -p * n), e .lineTo(-h, -p * n), e.lineTo(-h, -u * n), e.lineTo(-c, -u * n)), e .lineTo(0, 0), e.strokeStyle = t.isUp ? r.colorBorderUp : r .colorBorderDown, e.stroke(), e.fillStyle = f, e.fill()), e.translate(- _, -m) } } hitTest(e) { const t = this._data, i = ve(t.barSpacing), s = Math.round(i / 2), r = Math.round(i), n = be(t.barSpacing); for (const i of t.items) { if (!i) continue; if (!Number.isFinite(i.x) || !Number.isFinite(i.y)) continue; const t = Math.abs(i.height), o = i.isUp ? -1 : 1, a = t + r, l = i.y - o * n, c = l - o * a, h = i.x - s, u = i.x + s; if (h < e.x && e.x < u && (i.isUp ? l < e.y && e.y < c : c < e.y && e.y < l)) return new N.HitTestResult(N.HitTestResult.REGULAR) } return null } } class ye extends V.SelectionRenderer { _drawMarker(e, t, i, r, n) { const o = Object(s.ensureNotNull)(this._data), a = t.isUp ? 1 : -1; const l = i + a * be(o.barSpacing) + a * ve(o.barSpacing); let c = Math.round(3.5 * n * 2); c % 2 != r % 2 && (c += 1); const h = r % 2 / 2, u = Math.round(t.x * n) + h, d = Math.round((t.y + l) * n) + h; e.beginPath(), e.arc(u, d, c / 2, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.stroke() } } class we extends ce { constructor() { super(...arguments), this._maxAbsValue = 0 } renderer() { if (!this._study.properties().styles[this._plotName].visible) return null; if (!this._study.properties().styles[this._plotName].visible.value()) return null; if (!this._scalesReady()) return null; this._invalidated && (this._updateImpl(), this._invalidated = !1); const e = {}, t = Object(R.clamp)(this._getTranspValue(), 0, 100), i = this._model.timeScale().barSpacing(); e.items = this._items, e.barSpacing = i, e.colorup = Object(M.generateColor)(this ._study.properties().styles[this._plotName].colorup.value(), t), e .colordown = Object(M.generateColor)(this._study.properties().styles[this ._plotName].colordown.value(), t); const s = Object(fe.parseRgba)(e.colorup), r = s ? 100 * (1 - s[3]) : 0, n = Object(fe.parseRgba)(e.colordown), o = n ? 100 * (1 - n[3]) : 0; e.colorBorderUp = Object(M.generateColor)("#000000", r), e.colorBorderDown = Object( M.generateColor)("#000000", o), e.minHeight = this._study.properties() .styles[this._plotName].minHeight.value(), e.maxHeight = this._study .properties().styles[this._plotName].maxHeight.value(); const a = new O.CompositeRenderer; if (a.append(new Se(e)), this._model.selection().isSelected(this._study) && null !== this._selectionData) { const e = this._selectionData; e.barSpacing = i, a.append(new ye(e)) } return a } _fillItemWithPointStyle(e, t, i) { const r = Object(s.ensureDefined)(e.style); e.isUp ? void 0 !== t.colors[A.ColorerType.Up] ? r.color = Object(M.generateColor)( Object(s.ensureDefined)(t.colors[A.ColorerType.Up]), i) : r.color = Object(M .generateColor)(this._study.properties().styles[this._plotName].colorup .value(), i) : void 0 !== t.colors[A.ColorerType.Down] ? r.color = Object(M .generateColor)(Object(s.ensureDefined)(t.colors[A.ColorerType.Down]), i) : r.color = Object(M.generateColor)(this._study.properties().styles[this ._plotName].colordown.value(), i) } _createItem(e, t, i, s) { if (0 === t) return null; Math.abs(t) > this._maxAbsValue && (this._maxAbsValue = Math.abs(t)); const r = t > 0; let n; if (r) { const t = this._getSeriesVal(s, e); if (null === t) return null; n = t } else { const t = this._getSeriesVal(i, e); if (null === t) return null; n = t } return new ge(e, n, t, r) } _convertItemsToCoordinates() { const e = this._model.timeScale(), t = Object(s.ensureNotNull)(this._study.priceScale()); e.timedValuesToCoordinates(this._items), t.pointsArrayToCoordinates(this._items, Object(s.ensureNotNull)(this._study.firstValue())); let i = Math.abs(this._study.properties().styles[this._plotName].minHeight.value()), r = Math.abs(this._study.properties().styles[this._plotName].maxHeight.value()); if (i > r) { const e = i; i = r, r = e } const n = (r - i) / this._maxAbsValue, o = this._items; for (let e = 0; e < o.length; e++) { const t = o[e], s = Math.abs(t.height); t.height = s * n + i } } } var Pe = i("29fS"); class Ce { constructor(e, t, i, s) { this._bars = [], this._invalidated = !1, this._isMarkersEnabled = T.enabled( "source_selection_markers"), this._selectionData = null, this ._ohlcPlotIndexes = new Map, this._study = e, this._series = t, this._model = i, this._plotName = s, this._isMarkersEnabled = T.enabled( "source_selection_markers"), this._colorProvider = Object(E .createStudyPlotColorProvider)(e.metaInfo(), e.properties(), s), this ._selectionIndexer = new j.SelectionIndexes(i.timeScale()); const r = this._study.metaInfo().plots; for (let e = 0; e < r.length; e++) { const t = r[e]; "target" in t && (t.target === this._plotName && (Object(x.isOhlcOpenPlot)(t) && this._ohlcPlotIndexes.set(1, e), Object(x.isOhlcHighPlot)(t) && this ._ohlcPlotIndexes.set(2, e), Object(x.isOhlcLowPlot)(t) && this ._ohlcPlotIndexes.set(3, e), Object(x.isOhlcClosePlot)(t) && this ._ohlcPlotIndexes.set(4, e))) } } update() { this._invalidated = !0 } items() { return this._bars } _updateImpl() { this._bars.length = 0; const e = this._study.priceScale(); if (this._model.timeScale().isEmpty() || null === e || e.isEmpty()) return; const t = this._model.timeScale().visibleBarsStrictRange(); if (null === t) return; let i = this._series.nearestIndex(t.firstBar(), c.PlotRowSearchMode.NearestRight); const r = this._series.nearestIndex(t.lastBar(), c.PlotRowSearchMode.NearestLeft); if (void 0 === i || void 0 === r) return; const n = this._study.getMinFirstBarIndexForPlot(this._plotName); if (n > r) return; i = Math.max(n, i); const o = this._study.data(), a = this._study.firstValue(); if (null === a) return; const l = o.rangeIterator(i, r), h = this._study.properties().ohlcPlots[this._plotName], u = new Map, d = (e, t) => { const i = e + "@" + t; if (!u.has(i)) { const s = Object(M.generateColor)(e, t); return u.set(i, s), s } return u.get(i) }, p = Object(A.createEmptyStyle)(); for (; l.hasNext();) { const e = l.next(); let t = e.index; const i = e.value; t = Math.floor(t); let r = !0; const n = new Map; for (let e = 1; e <= 4; ++e) { const t = this._ohlcPlotIndexes.get(e); if (void 0 === t) { r = !1; break } const s = i[t + 1]; if (null == s) { r = !1; break } n.set(e, s) } if (!r) continue; const o = Object(s.ensureDefined)(n.get(1)), a = Object(s.ensureDefined)(n.get(4)), c = Object(s.ensureDefined)(n.get(2)), u = Object(s.ensureDefined)(n.get(3)), _ = Math.max(o, c, u, a), m = Math.min(o, c, u, a); let f = Object(s.ensureDefined)(d(h.color.value(), 0)); const g = this._colorProvider.getPlotPointStyle(i, p); void 0 !== g.colors[A.ColorerType.Main] && (f = Object(s.ensureDefined)(g .colors[A.ColorerType.Main])); const b = { time: Math.round(t), open: o, high: _, low: m, close: a, color: f, wickColor: g.colors[A.ColorerType.Wick], borderColor: g.colors[A.ColorerType.Border], hollow: null }; this._bars.push(b) } if (e.barPricesToCoordinates(this._bars, a), this._model.timeScale() .barIndexesToCoordinates(this._bars), this._model.selection().isSelected(this ._study)) { const t = this._selectionIndexer.indexes(); this._selectionData = { points: [], hittestResult: N.HitTestResult.REGULAR, bgColors: [], visible: !0, barSpacing: this._model.timeScale().barSpacing() }; const i = Object(s.ensureNotNull)(this._model.paneForSource(this._study)) .height(), r = Object(s.ensureDefined)(this._ohlcPlotIndexes.get(4)); for (let s = 0; s < t.length; s++) { const n = t[s], o = this._study.data().valueAt(n); if (null === o) continue; const l = o[r + 1]; if (null == l) continue; const c = this._model.timeScale().indexToCoordinate(Math.floor(n)), h = e.priceToCoordinate(l, a); this._selectionData.points.push(new I.Point(c, h)), this._selectionData .bgColors.push(this._model.backgroundColorAtYPercentFromTop(h / i)) } } else this._selectionIndexer.clear() } } class xe extends Ce { renderer() { if (!this._study.properties().ohlcPlots[this._plotName].visible.value()) return null; this._invalidated && (this._updateImpl(), this._invalidated = !1); const e = { bars: this._bars, barSpacing: this._model.timeScale().barSpacing(), dontDrawOpen: this._series.properties().barStyle.dontDrawOpen.value(), thinBars: this._series.properties().barStyle.thinBars.value() }, t = new O.CompositeRenderer; return t.append(new Pe.PaneRendererBars(e)), this._model.selection().isSelected(this ._study) && this._isMarkersEnabled && this._selectionData && t.append(new V .SelectionRenderer(this._selectionData)), t } } var Te = i("/hKg"); class Ie extends Ce { renderer() { const e = this._study.properties().ohlcPlots[this._plotName]; if (!e.visible.value()) return null; this._invalidated && (this._updateImpl(), this._invalidated = !1); const t = this._model.timeScale().barSpacing(), i = { bars: this._bars, barSpacing: t, wickVisible: e.drawWick.value(), bodyVisible: !0, borderVisible: e.drawBorder.value(), barWidth: Object(pe.optimalBarWidth)(t), borderColor: e.borderColor.value(), wickColor: e.wickColor.value() }, s = new O.CompositeRenderer; return s.append(new Te.PaneRendererCandles(i)), this._model.selection().isSelected( this._series) && this._isMarkersEnabled && this._selectionData && s.append( new V.SelectionRenderer(this._selectionData)), s } } var Me = i("KtbP"), Oe = i("wYrq"), Le = i("2ijp"), Ae = i("8Uy/"); class Ee extends Le.a { constructor(e, t) { super(), this._lineRendererData.linestyle = Ae.LINESTYLE_DOTTED, this._study = e, this._plotName = t } _updateImpl() { this._lineRendererData.visible = !1; const e = this._study.properties().styles[this._plotName]; if (!e.trackPrice.value()) return; const t = this._study.lastValueData(this._plotName, !0); t.noData || (this._lineRendererData.visible = !0, this._lineRendererData.y = t .coordinate, this._lineRendererData.color = t.color, this ._lineRendererData.linewidth = e.linewidth.value()) } } var ke = i("cPgM"); class De { constructor() { this._items = [], this._actualLength = 0, this._invalidations = 0 } push(e) { this._items.length === this._actualLength ? this._items.push(e) : this._items[this ._actualLength] !== e && (this._items[this._actualLength] = e), this ._actualLength += 1 } newItem() { const e = this._items.length > this._actualLength ? this._items[this ._actualLength] : null; return null !== e && Boolean(e.invalidateCache) && e.invalidateCache(), e } invalidateCache() { this._invalidations += 1, 3e3 === this._invalidations && (this._items.splice(this ._actualLength), this._invalidations = 0), this._actualLength = 0 } at(e) { return this._items[e] } data() { return this._items } length() { return this._actualLength } } class Ve { constructor() { this._map = new Map, this._usedKeys = new Set, this._invalidations = 0 } invalidateCache() { this._invalidations += 1, 50 === this._invalidations && (this._deleteUnused(), this ._invalidations = 0), this._usedKeys.clear(), this._map.forEach((e, t) => e .invalidateCache()) } get(e) { const t = this._map.get(e); return void 0 !== t && this._usedKeys.add(e), t } set(e, t) { this._usedKeys.add(e), this._map.set(e, t) } forEach(e) { this._map.forEach((t, i) => { this._usedKeys.has(i) && e(t, i) }) } delete(e) { const t = this._map.get(e); void 0 !== t && t.invalidateCache(), this._usedKeys.delete(e) } _deleteUnused() { const e = []; this._map.forEach((t, i) => { this._usedKeys.has(i) || e.push(i) }); for (const t of e) this._map.delete(t) } } class Be extends De { constructor() { super(), this.points1 = new De, this.points2 = new De, this.push(this.points1), this.push(this.points2) } addPoints1Point(e, t) { let i = this.points1.newItem(); null !== i ? (i.x = e, i.y = t) : i = { x: e, y: t }, this.points1.push(i) } addPoints2Point(e, t) { let i = this.points2.newItem(); null !== i ? (i.x = e, i.y = t) : i = { x: e, y: t }, this.points2.push(i) } invalidateCache() { this.points1.invalidateCache(), this.points2.invalidateCache() } } class Re extends ke.ScaledPaneRenderer { constructor() { super(...arguments), this._data = null } setData(e) { this._data = e } hitTest(e, t) { return null } _drawImpl(e, t) { if (null === this._data) return; const i = .25 * this._data.barSpacing, s = this._data.transparency; this._data.colorAreas.forEach((t, r) => { e.beginPath(); for (let s = 0; s < t.length(); s++) { const r = t.at(s); if (0 === r.points1.length() || 0 === r.points2.length()) continue; const n = r.points1.at(0).x, o = r.points1.at(0).y; if (e.moveTo(n, o), 1 !== r.points1.length() && 1 !== r.points2 .length()) { for (let t = 1; t < r.points1.length(); t++) e.lineTo(r .points1.at(t).x, r.points1.at(t).y); for (let t = r.points2.length() - 1; t >= 0; t--) e.lineTo(r .points2.at(t).x, r.points2.at(t).y) } else { const t = r.points2.at(0).x, s = r.points2.at(0).y; e.lineTo(n + i, o), e.lineTo(t + i, s), e.lineTo(t - i, s), e.lineTo(n - i, o) } } e.closePath(), e.fillStyle = Object(M.generateColor)(r, s), e.fill() }) } } var Ne = i("ZJKN"); class je extends De { constructor() { super(...arguments), this._startIndex = 0 } setStartIndex(e) { this._startIndex = e } at(e) { const t = e - this._startIndex; for (; t >= this._actualLength;) { if (this._items.length <= t) this._items.push({ plot1Value: void 0, plot2Value: void 0, colorIndex: void 0 }); else { const e = this._items[this._actualLength]; e.plot1Value = void 0, e.plot2Value = void 0, e.colorIndex = void 0 } this._actualLength += 1 } return this._items[t] } } class Fe { constructor(e, t = !1) { this._isHlineFill = !1, this._bandAKey = null, this._bandBKey = null, this ._colorPlotIndex = null, this._colorValues = [], this._colors = new De, this ._areaRenderer = new Re, this._invalidated = !0, this._plIndex1 = null, this ._plIndex2 = null, this._level1 = 0, this._level2 = 0, this._studyValuesCache = new je, this._points1 = new De, this._points2 = new De, this._timePoints = new De, this._colorAreas = new Ve, this._source = e, this._fillGaps = t } update() { this._invalidated = !0 } renderer(e, t) { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._areaRenderer } _correctVisibleRange(e) { const t = this._source.data(), i = t.search(e.firstBar(), c.PlotRowSearchMode.NearestLeft, this._plotIndex1()), s = t.search(e.firstBar(), c.PlotRowSearchMode.NearestLeft, this._plotIndex2()), r = t.search(e.lastBar(), c.PlotRowSearchMode.NearestRight, this._plotIndex1()), n = t.search(e.lastBar(), c.PlotRowSearchMode.NearestRight, this._plotIndex2()), o = null !== i ? i.index : e.firstBar(), a = null !== s ? s.index : e.firstBar(), l = null !== r ? r.index : e.lastBar(), h = null !== n ? n.index : e.lastBar(); return [Math.min(o, a), Math.max(l, h)] } _plotNames() { return this._source.metaInfo().plots.map(e => e.id) } _plotIndex1() { return null === this._plIndex1 && (this._plIndex1 = this._plotNames().indexOf(this ._plotAId()) + 1), this._plIndex1 } _plotIndex2() { return null === this._plIndex2 && (this._plIndex2 = this._plotNames().indexOf(this ._plotBId()) + 1), this._plIndex2 } _updateImpl() { var e, t, i; if (this._areaRenderer.setData(null), !this._visible()) return; const r = this._source.priceScale(), n = this._source.model(), o = n.timeScale(); if (!r || r.isEmpty() || o.isEmpty()) return; if (n.mainSeries().bars().isEmpty()) return; const a = this._source.firstValue(); if (null === a) return; if (this._isHlineFill) { const e = this._source.properties().bands[Object(s.ensureNotNull)(this ._bandAKey)], t = this._source.properties().bands[Object(s.ensureNotNull)(this ._bandBKey)]; this._level1 = r.priceToCoordinate(e.value.value(), a), this._level2 = r .priceToCoordinate(t.value.value(), a) } const l = o.visibleBarsStrictRange(); if (null === l) return; this._timePoints.invalidateCache(), this._points1.invalidateCache(), this._points2 .invalidateCache(), null === (e = this._colors) || void 0 === e || e .invalidateCache(), this._colorAreas.invalidateCache(); const [c, h] = this._correctVisibleRange(l), u = this._isPerBarColoringSupported() ? this._colors : null, d = this._source.offset(this._plotAId()), p = this._source .offset(this._plotBId()), _ = Math.min(d, p), m = Math.max(d, p), f = this ._plotIndex1(), g = this._plotIndex2(), b = this._source.data(); if (b.isEmpty()) return; let v, S; const y = Object(s.ensureNotNull)(b.firstIndex()), w = Object(s.ensureNotNull)(b.lastIndex()), C = y - Math.max(0, -_), x = w + Math.max(0, m), T = Math.max(c - 1, C), I = Math.min(h + 1, x), M = this._studyValuesCache; M.invalidateCache(); const O = T - m, L = b.rangeIterator(O, I - _), A = Math.max(l.firstBar() - 1, Math.min(O - m - 1, O - 1 + _)); M.setStartIndex(A); const E = new Ne.BarsRange(l.firstBar() - 1, l.lastBar() + 1); for (; L.hasNext();) { const e = L.next(), t = e.index, i = e.value, r = i[f], n = i[g], o = t + d, a = t + p; if (o === a && E.contains(o)) { const e = M.at(o); e.plot1Value = r, e.plot2Value = n } else { if (E.contains(o)) { M.at(o).plot1Value = r } if (E.contains(a)) { M.at(a).plot2Value = n } } if (null !== u) { const e = t - 1 + _; if (l.contains(e)) { const t = i[Object(s.ensureNotNull)(this._colorPlotIndex) + 1]; M.at(e).colorIndex = t } } } const k = this._timePoints, D = this._points1, V = this._points2; let B = null; const R = A + M.length(); for (let e = A; e <= R; e++) { if (!this._fillGaps && (null === v || null === S)) { const t = e - 1; k.push(t), D.push(NaN), V.push(NaN), null == u || u.push(null) } const s = M.at(e); if (null !== u) { const e = s.colorIndex; B = null == e ? null : this._getColorByPlotValue(e) } if (this._isHlineFill) { k.push(e), null !== u && u.push(B); continue } const r = null !== (t = s.plot1Value) && void 0 !== t ? t : null, n = null !== (i = s.plot2Value) && void 0 !== i ? i : null; (null !== r || null !== n || Number.isFinite(v) || Number.isFinite(S)) && (v = r, S = n, D.push(r), V.push(n), k.push(e), null !== u && u.push(B)) } r.pricesArrayToCoordinates(D.data(), a, D.length()), r.pricesArrayToCoordinates(V .data(), a, V.length()), o.indexesToCoordinates(k.data(), k.length()); const N = this._transparency(); let j = Object(P.isNumber)(N) ? N : 50; j = Math.min(j, 100), j = Math.max(j, 0); const F = { barSpacing: this._source.model().timeScale().barSpacing(), transparency: j, colorAreas: this._getFilledAreas(k, D, V, u) }; this._areaRenderer.setData(F) } _getFilledAreas(e, t, i, s) { const r = this._isHlineFill; if (!r && (0 === t.length() || 0 === i.length())) return new Ve; const n = this._colorAreas; let o = null, a = null; const l = this._color(); for (let c = 0; c < e.length(); c++) { const h = r ? this._level1 : t.at(c), u = r ? this._level2 : i.at(c), d = e.at(c), p = Object(pe.coordinateIsValid)(h), _ = Object(pe.coordinateIsValid)(u); if (this._fillGaps ? p || _ : p && _) { const e = s ? s.at(c) || "" : l; if (a !== e || null === o) { a = e, null !== o && (p && o.addPoints1Point(d, h), _ && o .addPoints2Point(d, u)); const t = n.get(e) || new De; o = t.newItem() || new Be, t.push(o), n.set(e, t) } p && o.addPoints1Point(d, h), _ && o.addPoints2Point(d, u) } else this._fillGaps || (a = null, o = null) } return n.delete(""), n } } class We extends Fe { constructor(e) { super(e) } _plotAId() { return this._source.properties().area[0].name.value() } _plotBId() { return this._source.properties().area[1].name.value() } _color() { return this._source.properties().areaBackground.backgroundColor.value() } _transparency() { const e = this._source.properties().areaBackground.transparency.value(); return Object(R.clamp)(e, 0, 100) } _visible() { return this._source.properties().areaBackground.fillBackground.value() } _getColorByPlotValue(e) { return this._color() } _isPerBarColoringSupported() { return !1 } } class He extends Fe { constructor(e, t, i) { super(e, !!t.fillgaps), this._isHlineFill = "hline_hline" === t.type, Object(s .assert)(this._isHlineFill || "plot_plot" === t.type, "Wrong filledArea type: " + t.type), this._isHlineFill && this ._initBandIndexes(t.objAId, t.objBId), this._fillMetaInfo = t, this ._fillStyleProps = i; const r = e.metaInfo(); for (let i = 0; i < r.plots.length; ++i) { const n = r.plots[i]; if ("palette" in n && n.palette === t.palette) { this._colorPlotIndex = i, this._colorsMap = Object(s.ensureDefined)(Object(s .ensureDefined)(r.palettes)[t.palette]).valToIndex, this ._colorValues = e.properties().palettes[t.palette].colors; break } if (r.isRGB && "target" in n && n.target === t.id) { this._colorPlotIndex = i; break } } } _getColorByPlotValue(e) { if (this._colorsMap) { const t = Object(s.ensureDefined)(this._colorsMap)[e]; return this._colorValues[Object(s.ensureDefined)(t)].childs().color.value() } return Object(M.rgbaFromInteger)(e) } _isPerBarColoringSupported() { return null !== this._colorPlotIndex } _plotAId() { return this._fillMetaInfo.objAId } _plotBId() { return this._fillMetaInfo.objBId } _color() { return this._fillStyleProps.childs().color.value() } _transparency() { return this._fillStyleProps.childs().transparency.value() } _correctVisibleRange(e) { const [t, i] = super._correctVisibleRange(e), s = this._source .getMinFirstBarIndexForPlot(this._fillMetaInfo.id); return [Math.max(s, t), i] } _visible() { return this._fillStyleProps.childs().visible.value() } _initBandIndexes(e, t) { this._bandAKey = null, this._bandBKey = null; const i = this._source.metaInfo().bands; if (void 0 !== i) for (let s = 0; s < i.length; ++s) { const r = i[s]; null !== this._bandAKey || r.id !== e ? null === this._bandBKey && r.id === t && (this._bandBKey = s) : this._bandAKey = s } } } var Ue = i("l4sv"); class ze { constructor(e, t) { this._invalidated = !0, this._lineRenderer = new Ue.HorizontalLineRenderer, this ._source = t, this._points = [new I.Point(-1, -1)], this._invalidated = !0, this ._properties = e } update() { this._invalidated = !0 } renderer() { this._invalidated && (this._updateImpl(), this._invalidated = !1); const e = { y: this._points[0].y, color: this._properties.childs().color.value(), linewidth: this._properties.childs().linewidth.value(), linestyle: this._properties.childs().linestyle.value() }; return this._lineRenderer.setData(e), this._lineRenderer } _updateImpl() { const e = this._source.priceScale(); if (!e || e.isEmpty()) return void(this._points[0] = new I.Point(-1, -1)); const t = this._properties.childs().value.value(), i = this._source.firstValue(), s = Object(P.isNumber)(t) && null !== i ? e.priceToCoordinate(t, i) : NaN; this._points[0] = new I.Point(-1, s) } } class Ge extends ke.ScaledPaneRenderer { constructor() { super(), this._data = null, this._data = null } setData(e = null) { this._data = e } hitTest() { return null } _drawImpl(e, t) { if (null === this._data || 0 === this._data.points.length) return; const i = t.cssWidth; e.fillStyle = Object(M.generateColor)(this._data.backcolor, this._data .transparency); const s = Math.min(this._data.points[0], this._data.points[1]), r = Math.max(this._data.points[0], this._data.points[1]); e.fillRect(0, s, i, r - s) } } class qe { constructor(e) { this._points = [], this._bandBgRenderer = new Ge, this._source = e } update() { if (this._points = [], this._source.properties().bands.length < 2) return; if (!this._source.properties().bandsBackground.fillBackground.value()) return; const e = this._source.properties().bands[0], t = this._source.properties().bands[1], i = this._source.priceScale(), s = this._source.firstValue(); i && !i.isEmpty() && null !== s && (this._points.push(i.priceToCoordinate(e.value .value(), s)), this._points.push(i.priceToCoordinate(t.value.value(), s))) } renderer() { const e = { points: this._points, backcolor: this._source.properties().bandsBackground.backgroundColor .value(), transparency: this._source.properties().bandsBackground.transparency.value() }; return this._bandBgRenderer.setData(e), this._bandBgRenderer } } class Ye { constructor(e, t, i) { this._points = [], this._bandBgRenderer = new Ge, this._bandAKey = null, this ._bandBKey = null, this._source = e, Object(s.assert)("hline_hline" === t.type, "Wrong filledArea type: " + t.type), this._initBandIndexes(t.objAId, t .objBId), this._fillStyleProps = i, this._bandBgRenderer = new Ge } update() { if (this._points = [], !this._fillStyleProps.childs().visible.value()) return; if (null === this._bandAKey || null === this._bandBKey) return; const e = this._source.properties().bands[this._bandAKey], t = this._source.properties().bands[this._bandBKey], i = this._source.priceScale(), s = this._source.firstValue(); i && !i.isEmpty() && null !== s && (this._points.push(i.priceToCoordinate(e.value .value(), s)), this._points.push(i.priceToCoordinate(t.value.value(), s))) } renderer() { let e = this._fillStyleProps.childs().transparency.value(); e = Object(R.clamp)(e, 0, 100); const t = { points: this._points, backcolor: Object(M.generateColor)(this._fillStyleProps.childs().color .value(), e), transparency: this._fillStyleProps.childs().transparency.value() }; return this._bandBgRenderer.setData(t), this._bandBgRenderer } _initBandIndexes(e, t) { this._bandAKey = null, this._bandBKey = null; Object(s.ensureDefined)(this._source.metaInfo().bands).forEach((i, s) => { null === this._bandAKey && i.id === e && (this._bandAKey = s), null === this._bandBKey && i.id === t && (this._bandBKey = s) }) } } var Ke = i("bmVy"), Je = i("eCE5"); i.d(t, "StudyBase", (function() { return st })); const Ze = Object(r.getLogger)("Chart.Study"), Xe = window.t("Invalid Symbol"); const $e = { symbolsForDisplay: !1, symbolsForChartApi: !0, skipHiddenInputs: !1, skipFakeInputs: !1, skipBooleanInputs: T.enabled("dont_show_boolean_study_arguments"), asObject: !0, skippedGroups: [], skippedInputs: [], noExchanges: !1, noResolution: !1, keepOptionalSymbolsEmpty: !1, skipColorInputs: !1, skipTimeInputs: !1, skipOptionalEmptySymbolInputs: !1 }, Qe = T.enabled("study_symbol_ticker_description"); function et(e, t) { const i = e.plots[t]; if (!i || !Object(x.isOhlcPlot)(i)) return !1; const s = i.target, r = e.defaults.styles && e.defaults.styles[s], n = e.defaults.ohlcPlots && e.defaults.ohlcPlots[s], o = e.ohlcPlots && e.ohlcPlots[s]; return r && Object(x.isOhlcPlotStyleBars)(r) || n && Object(x.isOhlcPlotStyleBars)(n) || !! o && Object(x.isOhlcPlotStyleBars)(o) } function tt(e, t) { const i = e.plots[t]; if (!i || !Object(x.isOhlcPlot)(i)) return !1; const s = i.target, r = e.defaults.styles && e.defaults.styles[s], n = e.defaults.ohlcPlots && e.defaults.ohlcPlots[s], o = e.ohlcPlots && e.ohlcPlots[s]; return r && Object(x.isOhlcPlotStyleCandles)(r) || n && Object(x.isOhlcPlotStyleCandles)( n) || !!o && Object(x.isOhlcPlotStyleCandles)(o) } function it(e, t) { Object(s.assert)(void 0 !== e, "zOrder must be defined"), Object(s.assert)(!t.has(e), "zOrder must be unique") } class st extends a.PriceDataSource { constructor(e, t, i, s) { super(e), this.onStart = new o.a, this._symbolsResolved = new o.a, this ._statusChanged = new o.a, this._paneViews = [], this._priceAxisViews = [], this._resolvedSymbols = {}, this._resolvedSymbolsByInput = {}, this ._isChildStudy = !1, this._status = { type: Ke.StudyStatusType.Undefined }, this._studyId = null, this._isSubscribedToSessionId = !1, this ._titleStrCache = {}, this._titleInPartsCache = {}, this._children = [], this._numericFormatter = new C.NumericFormatter, this ._priceAxisViewsBase = [], this._priceLinesAxisViews = [], this ._labelPaneViews = [], this._ownFirstValue = null, this ._pendingResolveSymbols = new Map, this._onIsActualIntervalChange = new o.a, this._lastNonEmptyPlotRowCache = {}, this._chartApi = e.chartApi(), this ._properties = t, this._metaInfo = s, this._series = this._model .mainSeries(), this._series.onIntervalChanged().subscribe(this, this ._calcIsActualInterval), this._showStudyArgumentsProperty = e .properties().paneProperties.legendProperties.showStudyArguments, i instanceof st && (this._source = i, this._isChildStudy = !0, this._source .setChild(this)); const r = this.parentSource(); r.currencyChanged().subscribe(this, this._onSourceCurrencyChanged), r .unitChanged().subscribe(this, this._onSourceUnitChanged), r .priceRangeReadyChanged().subscribe(this, this ._onSourcePriceRangeReadyChanged), r.formatterChanged().subscribe(this, this._onSourceFormatterChanged), r.priceStepChanged().subscribe(this, this._onSourcePriceStepChanged), Qe && this._model.mainSeries() .properties().statusViewStyle.symbolTextSource.listeners().subscribe(this, () => { this.invalidateTitleCache(!0) }), this._properties.subscribe(this, this._onPropertiesChanged), this ._properties.visible.subscribe(this, this._visibleChanged), this._properties .visible.subscribe(this, this.processHibernate), this._properties.intervalsVisibilities.subscribe(this, this ._calcIsActualInterval); for (let e = 0; e < this._metaInfo.plots.length; e++) { const t = this._metaInfo.plots[e].id, i = this.properties().styles[t]; null != i && null != i.visible && i.visible.subscribe(this, this .processHibernate) } for (const e of Object.keys(this._metaInfo.graphics)) for (const t of Object.keys(this._metaInfo.graphics[e])) { const i = this._properties.graphics[e][t]; i.visible && i.visible.subscribe(this, this.processHibernate) } this._isActualInterval = Object(Je.a)(this._series.intervalObj(), this .properties().intervalsVisibilities) } destroy() { const e = this.parentSource(); e.currencyChanged().unsubscribeAll(this), e.unitChanged().unsubscribeAll(this), e.priceRangeReadyChanged().unsubscribeAll(this), e.formatterChanged() .unsubscribeAll(this), e.priceStepChanged().unsubscribeAll(this), this ._series.properties().statusViewStyle.symbolTextSource.unsubscribeAll(this), this._series.onIntervalChanged().unsubscribeAll(this) } isSymbolInvalid() { return this._status.type === Ke.StudyStatusType.Error && this._status .errorDescription.error === Xe } isActualInterval() { return this._isActualInterval } onIsActualIntervalChange() { return this._onIsActualIntervalChange } isVisible() { if (!this.properties().visible.value() || !this.isActualInterval()) return !1; const e = this.metaInfo(); if (e.plots.length > 0) return !0; for (const t of Object.keys(e.graphics)) for (const i of Object.keys(e.graphics[t])) { const e = this.properties().graphics[t][i]; if (!e.visible || e.visible.value()) return !0 } return !(!e.isTVScriptStrategy && !e.hasAlertFunction) } inputs(e) { const t = Object(P.merge)(Object(P.clone)($e), e || {}); return t.skipOptionalEmptySymbolInputs && (t.keepOptionalSymbolsEmpty = !0), this._buildInputs(t) } status() { return this._status } title(e, t, i, s) { i = void 0 === i ? !this._showStudyArgumentsProperty.value() : i; const r = JSON.stringify([e, t, i, s]); if (this._titleStrCache[r]) return this._titleStrCache[r]; if (this._titleInPartsCache[r]) return this._joinTitlesParts(this ._titleInPartsCache[r]); const n = this._title(e, t, i, s); return this._titleStrCache[r] = n, n } titleInParts(e, t, i, s) { i = void 0 === i ? !this._showStudyArgumentsProperty.value() : i; const r = JSON.stringify([e, t, i, s]); if (this._titleInPartsCache[r]) return this._titleInPartsCache[r]; const n = this._titleInParts(e, t, i, s); return this._titleInPartsCache[r] = n, n } invalidateTitleCache(e) { if (this._titleStrCache = {}, this._titleInPartsCache = {}, !0 === e && this ._children) for (let t = 0; t < this._children.length; ++t) this._children[t] .invalidateTitleCache(e) } setOwnFirstValue(e) { this._ownFirstValue = e } firstValue(e) { var t, i, s; if (!this._isChildStudy && "Compare@tv-basicstudies" === (null === (t = this ._metaInfo) || void 0 === t ? void 0 : t.id) || !(null === (i = this ._metaInfo) || void 0 === i ? void 0 : i.is_price_study)) { const t = this._model.timeScale().visibleBarsStrictRange(); if (null === t) return null; if (!this.properties().visible.value() || !this.isActualInterval()) return this._ownFirstValue; const i = t.firstBar(), r = t.lastBar(); let n = null; const o = (null === (s = this._metaInfo) || void 0 === s ? void 0 : s .plots) || []; if (null === n) { const t = this.data().rangeIterator(i, r); for (; t.hasNext();) { const i = t.next().value; for (let t = 0; t < o.length; ++t) { if (Object(x.isColorerPlot)(o[t])) continue; const s = i[t + 1]; if (null == s) continue; const r = o[t].id, a = this.properties().styles[r]; if (a.visible && a.visible.value() && !(e && Math.abs(s) < 1e-10)) { n = s; break } } if (null !== n) break } } return this._ownFirstValue = n, null !== n ? n : this._bandsFirstValue(e) } if (this._isChildStudy) { const e = this._getNonPriceParent(); if (e && this.priceScale() === e.priceScale()) return null !== e ._ownFirstValue ? e._ownFirstValue : e.firstValue() } return this._series.firstValue() } priceRange(e, t) { let i = null; const r = Object(s.ensureNotNull)(this._metaInfo), n = this._fillPrecalculatedAutoscaleInfo(e, t); let o = this.data().minMaxOnRangeCached(e, t, n.fields); if (o = Object(c.mergeMinMax)(n.baseValueMinMax, o), n.useMainSeriesRange) { const i = [{ name: "low", offset: 0 }, { name: "high", offset: 0 }], s = this.series().data().bars().minMaxOnRangeCached(e, t, i); o = Object(c.mergeMinMax)(o, s) } if (null !== o && (i = new l.PriceRange(o.min, o.max)), r.bands) for (let e = 0; e < r.bands.length; e++) if (this.properties().bands[e].visible.value()) { const t = this.properties().bands[e].value.value(); if (!Object(P.isNumber)(t)) continue; i ? i.apply(t, t) : i = new l.PriceRange(t, t) } return this._postProcessPriceRange(i) } autoScaleInfo(e, t) { const i = { topPixelMargin: 0, bottomPixelMargin: 0 }; return { range: this.priceRange(e, t), topPixelMargin: i.topPixelMargin, bottomPixelMargin: i.bottomPixelMargin } } resolvedSymbolInfoBySymbol(e) { return this._resolvedSymbols && e && this._resolvedSymbols[this ._getSymbolForResolve(e)] || null } currency() { const e = this.metaInfo(); return Boolean(e) && e.is_price_study ? this.parentSource().currency() : null } unit() { const e = this.metaInfo(); return Boolean(e) && e.is_price_study ? this.parentSource().unit() : null } sessionId() { return this.parentSource().sessionId() } sessionIdChanged() { return this.parentSource().sessionIdChanged() } getSymbolString(e) { return "" === e ? "" : Object(v.encodeExtendedSymbolOrGetSimpleSymbolString)( this._getSymbolObject(e)) } onStatusChanged() { return this._statusChanged } symbolsResolved() { return this._symbolsResolved } valuesProvider() { return new m.a(this, this.model()) } statusProvider(e) { return new w.a(this, this._model.properties().scalesProperties.textColor) } correctScaleMargins(e) { if ("Volume" === this.metaInfo().shortId) { const t = this.model().paneForSource(this); return null !== t && t.isOverlay(this) && t.containsMainSeries() ? { top: .75, bottom: 0 } : { top: e.top, bottom: 0 } } return e } canBeHiddenByGlobalFlag() { return !0 } isSourceHidden() { return !this.isVisible() || this.canBeHiddenByGlobalFlag() && g .hideAllIndicators().value() } _invalidateLastNonEmptyPlotRowCache() { this._lastNonEmptyPlotRowCache = {} } processHibernate() { this.isHibernateAllowed() && (!this.isStarted() && this.isVisible() && this .start(), this.isStarted() && !this.isVisible() && this.stop()) } isHibernated() { return !this.isVisible() && !this.isStarted() } _createViews() { var e, t, i; this._priceAxisViewsBase = [], this._priceLinesAxisViews = [], this ._paneViews = [], this._labelPaneViews = []; const r = new Set, n = this.metaInfo(), o = Boolean(n.usePlotsZOrder), a = new Map; if (n.plots) for (let t = 0; t < n.plots.length; t++) { const i = n.plots[t]; let l, c, h, u, d; if (Object(x.isNonVisualPlot)(i)) continue; let p = n.plots[t].id, _ = n.styles; if (Object(x.isBgColorerPlot)(i)) l = new k(this, this._series, this ._model, p); else if (Object(x.isShapesPlot)(i)) l = new he(this, this._series, this ._model, p); else if (Object(x.isCharsPlot)(i)) l = new me(this, this._series, this ._model, p); else if (Object(x.isArrowsPlot)(i)) l = new we(this, this._series, this ._model, p); else if (Object(x.isOhlcPlot)(i)) { const e = i.target; if (r.has(e)) continue; if (r.add(e), et(n, t)) l = new xe(this, this._series, this._model, e); else { if (!tt(n, t)) { Ze.logError(`plot ${i.id} looks to be invalid`); continue } l = new Ie(this, this._series, this._model, e) } u = this.createPriceAxisView(e), h = new Me.PanePriceAxisView(u, this, this._model), p = e, _ = n.ohlcPlots } else u = this.createPriceAxisView(p), d = this .createPriceLineAxisView(p), l = new Oe.a(this, this._series, this ._model, p), this.properties().styles[p].trackPrice.value() && ( c = new Ee(this, p)), h = new Me.PanePriceAxisView(u, this, this ._model); const m = o ? Object(s.ensureDefined)(null === (e = null == _ ? void 0 : _[p]) || void 0 === e ? void 0 : e.zorder) : a.size; it(m, a); const f = { paneViews: [l], labelView: h, priceAxisView: u, priceLineAxisView: d }; void 0 !== c && f.paneViews.push(c), a.set(m, f) }(null !== (i = null === (t = this._metaInfo) || void 0 === t ? void 0 : t .bands) && void 0 !== i ? i : []).forEach((e, t) => { const i = this._properties.bands[t]; if (i && i.visible.value()) { const t = new ze(i, this), r = o ? Object(s.ensureDefined)(e.zorder) : a.size; it(r, a), a.set(r, { paneViews: [t] }) } }), this._properties.bandsBackground && (Object(s.assert)(!o, "'usePlotsZOrder' flag does not supported"), a.set(a.size, { paneViews: [new qe(this)] })); const l = this._paneViews; Object(d.createGraphicsPaneViews)(this, this.model()).then(e => { for (let t = 0; t < e.length; t++) l.push(e[t]); this._model.lightUpdate() }), this._properties.areaBackground && (Object(s.assert)(!o, "'usePlotsZOrder' flag does not supported"), a.set(a.size, { paneViews: [new We(this)] })); const c = e => n.plots.some(t => Object(x.isColorerPlot)(t) && t.target === e); if (this._properties.filledAreas && n.filledAreas) for (let e = 0; e < n.filledAreas.length; ++e) { const t = n.filledAreas[e], i = this._properties.filledAreasStyle[t.id], r = c(t.id); let l; if ("plot_plot" === t.type || r ? l = new He(this, t, i) : "hline_hline" === t.type ? l = new Ye(this, t, i) : Ze.logWarn( "Unsupported filledArea type: " + t.type), void 0 !== l) { const e = o ? Object(s.ensureDefined)(t.zorder) : a.size; it(e, a), a.set(e, { paneViews: [l] }) } } const h = Array.from(a.keys()).sort((e, t) => e - t); for (let e = 0; e < h.length; e++) { const t = Object(s.ensureDefined)(a.get(h[e])); this._paneViews.push(...t.paneViews), t.labelView && this._labelPaneViews .push(t.labelView), t.priceAxisView && this._priceAxisViewsBase.push(t .priceAxisView), t.priceLineAxisView && this._priceLinesAxisViews .push(t.priceLineAxisView) } this._dataWindowView || (this._dataWindowView = new _.StudyDataWindowView(this, this._model)), this._legendView || (this._legendView = new f(this, this ._model)), this._statusView || (this._statusView = new b .StudyStatusView(this)), this._concatPriceAxisViews() } _titleInputs(e, t) { return this.inputs(this._titleInputsOptions(e, t)) } _titleInputsOptions(e, t) { return { symbolsForDisplay: !0, skipHiddenInputs: !0, skipFakeInputs: !1, fakeInputsForDisplay: !0, asObject: !1, skippedGroups: [], noExchanges: e, noResolution: t, skipColorInputs: !0, skipTimeInputs: !0 } } _subscribeToSessionId() { !this._isSubscribedToSessionId && this.hasSymbolInputs() && (this .sessionIdChanged().subscribe(this, this._onSessionIdChanged), this ._isSubscribedToSessionId = !0) } _unsubscribeToSessionId() { this._isSubscribedToSessionId && (this.sessionIdChanged().unsubscribe(this, this ._onSessionIdChanged), this._isSubscribedToSessionId = !1) } _onSessionIdChanged() { this.restart(!0) } _title(e, t, i, s) { const r = this._titleInParts(e, t, i, s); return this._joinTitlesParts(r) } _postProcessPriceRange(e) { if (e && e.minValue() === e.maxValue() && !this.metaInfo().is_price_study) { const t = .005 * e.minValue(); e = new l.PriceRange(e.minValue() - t, e.maxValue() + t) } const t = this.priceScale(); return t && t.isLog() && e ? new l.PriceRange(t.priceToLogical(e.minValue()), t .priceToLogical(e.maxValue())) : e } _joinTitlesParts(e) { const t = e[1] ? e[1].join(", ") : ""; return e[0] + (t.length > 0 ? " (" + t + ")" : "") } _titleInParts(e, t, i, s) { let r = ""; r = e ? this.metaInfo().shortDescription || this._properties.shortDescription && this._properties.shortDescription.value() || "Study" : this.metaInfo() .description || this._properties.description && this._properties.description .value() || "Study", t = t || {}; const n = [window.t(r, { context: "study" })]; let o = []; if (!i) { const i = this._getMTFResolutionInputTitle(); null !== i && i.length > 0 && n.push(i); const r = this.metaInfo(), a = this._titleInputs(s, !0) || []; if (a.length > 0) { const i = {}; if (this._isChildStudy) for (let t = 0; t < r.inputs.length; ++t) { const n = r.inputs[t]; if (!u.a.isSourceInput(n)) continue; const o = n.id, a = this._properties.inputs[o].value(); if (a.indexOf("$") >= 0 && this._source) { const t = this._source.metaInfo(), r = this._source.title(e, {}, !0, s); if (1 === t.plots.length) i[a] = r; else { const e = a.split("$")[1], s = t.plots[parseInt(e)].id, n = t.styles && t.styles[s], o = n && n.title || s; i[a] = r + ": " + o } } break } o = a.map(e => { let s = Object(P.isNumber)(e) ? this._numericFormatter .format(e) : i && i[e.toString()] || e.toString(); return t && t[s.toString()] && (s = t[s.toString()]), s }) } } return [n.join(" · "), o] } _getMTFResolutionInputTitle() { const e = this.metaInfo(); for (let t = 0; t < e.inputs.length; t++) { const i = e.inputs[t]; if ("resolution" === i.type && i.isMTFResolution) return this._properties .inputs[i.id].value() } return null } isHibernateAllowed() { return !this.hasChildren() } _getSymbolForResolve(e) { return this.getSymbolString(this._getSymbolForApi(e)) } _allSymbolsAreResolved() { const e = this.metaInfo(), t = []; let i = !1; for (let s = 0; s < e.inputs.length; s++) if ("symbol" === e.inputs[s].type) { const r = e.inputs[s].id, n = this._properties.inputs[r].value(), o = this._getSymbolForResolve(n); if ("" !== o) if (this._resolvedSymbols[o]) i = !0; else { const e = this._resolveSymbol(o, n); t.push(e) } } if (0 === t.length) { const e = Promise.resolve(); return i ? e.then(() => this._symbolsResolved.fire()) : e } return Promise.all(t).catch(e => (this._setStatus({ type: Ke.StudyStatusType.Error, errorDescription: { error: Xe } }), this.stop(!0), this._model.updateSource(this), Promise.reject( "Invalid symbol, " + e))).then(() => { null !== this._studyId && this.stop(!0), this.start(!0), this._symbolsResolved.fire(), this._recheckLineToolsActuality() }) } _getSymbolForApi(e) { return e } _resolveSymbol(e, t) { if ("" === e) return Promise.resolve(); let i = this._pendingResolveSymbols.get(e); return void 0 !== i || (i = new Promise((i, s) => { this._chartApi.resolveSymbol(Object(S.makeNextSymbolId)(), e, r => { switch (this._pendingResolveSymbols.delete(e), r .method) { case "symbol_resolved": this._setStatus({ type: Ke.StudyStatusType .Undefined }), this._resolvedSymbols[e] = r.params[ 1], this._resolvedSymbolsByInput[ t] = r.params[1], this ._onSymbolResolved(e, t, r.params[1]), this.invalidateTitleCache(!0), i(); break; case "symbol_error": if (this._setStatus({ type: Ke.StudyStatusType.Error, errorDescription: { error: r.params[1] } }), r.params[1] === y .permissionDenied && r.params[2]) switch (r.params[2]) { case y .SymbolErrorPermissionDeniedReason .Symbol: if (r.params[3]) return void this ._resolveSymbol(r .params[3], t).then( i); break; default: return void this._resolveSymbol( r.params[2], t).then(i) } 0, s() } }) }), this._pendingResolveSymbols.set(e, i)), i } _recheckLineToolsActuality() { const e = this._model.paneForSource(this); null !== e && e.sourcesByGroup().lineSourcesForAllSymbols().forEach(e => { e.ownerSource() === this && e.calcIsActualSymbol() }) } _getSymbolObject(e) { const t = { symbol: e }; return t.session = this.sessionId(), t } _onSymbolResolved(e, t, i) { 0 } _setStatus(e) { this._status = e, this._statusView && this._statusView.update(), this._model .updateSource(this), this._statusChanged.fire(e) } _bandsFirstValue(e) { const t = Object(s.ensureNotNull)(this._metaInfo); if (!t.bands) return null; for (let i = 0; i < t.bands.length; i++) { const t = this.properties().childs().bands.childs()[i]; if (t.childs().visible.value()) { const i = t.childs().value.value(); if (e && 0 === i) continue; return i } } return null } _prepareInputs(e) { Object(s.assert)(!!e, "options not set"); const t = this.metaInfo(), i = {}, r = e.allowedInputTypes ? new Set(e.allowedInputTypes) : null; for (let s = 0; s < t.inputs.length; s++) { const n = t.inputs[s]; if (null !== r && !r.has(n.type)) continue; if (n.isFake && e.skipFakeInputs) continue; if (n.isMTFResolution && e.noResolution) continue; if (n.isHidden && e.skipHiddenInputs) continue; if ("bool" === n.type && e.skipHiddenInputs && e.skipBooleanInputs) continue; if ("color" === n.type && e.skipHiddenInputs && e.skipColorInputs) continue; if ("time" === n.type && e.skipHiddenInputs && e.skipTimeInputs) continue; if (void 0 !== n.groupId && -1 !== e.skippedGroups.indexOf(n.groupId)) continue; if (-1 !== e.skippedInputs.indexOf(n.id)) continue; const o = this._prepareInput(n, e); "symbol" === n.type && e.skipOptionalEmptySymbolInputs && "" === o || (i[n .id] = Object(P.clone)(o)) } return i } _lastNonEmptyPlotRow(e) { var t; if (!Object(P.isInteger)(e)) return Ze.logDebug( "_lastNonEmptyPlotRow: incorrect plotIndex"), null; let i = null !== (t = this._lastNonEmptyPlotRowCache[e]) && void 0 !== t ? t : null; if (null !== i) return i; return i = this.data().findLast((t, i) => void 0 !== i[e], 1e3), null === i ? null : (this._lastNonEmptyPlotRowCache[e] = i, i) } _applyPlotToPrecalculatedAutoscaleInfo(e, t, i, s) { const r = s.id, n = this.properties().styles[r], o = Object(x.isShapesPlot)(s) || Object(x.isCharsPlot)(s); i.useMainSeriesRange = i.useMainSeriesRange || Object(x.isArrowsPlot)(s); let a = Object(x.isLinePlot)(s) || Object(x.isOhlcPlot)(s); if (o) { const e = n.location.value(), t = [p.c.Absolute, p.c.Top, p.c.Bottom].indexOf(e) < 0; i.useMainSeriesRange = i.useMainSeriesRange || o && t, a = a || e === p.c .Absolute } if (!a) return i; const l = { name: r, offset: this.offset(r) }, h = n.plottype.value(); if (!this.properties().skipHistogramBaseOnAutoScale && [x.LineStudyPlotStyle .Histogram, x.LineStudyPlotStyle.Columns, x.LineStudyPlotStyle.Area ].indexOf(h) >= 0) { const s = n.histogramBase.value(), r = this.data().minMaxOnRangeCached(e, t, [l]); return Object(P.isNumber)(s) && null !== r && (i.baseValueMinMax = Object(c .mergeMinMax)(i.baseValueMinMax, { min: s, max: s }), i.baseValueMinMax = Object(c.mergeMinMax)(i.baseValueMinMax, r)), i } return i.fields.push(l), i } _fillPrecalculatedAutoscaleInfo(e, t) { return Object(s.ensureNotNull)(this._metaInfo).plots.filter(e => !Object(x .isPlotWithTechnicalValues)(e)).filter(e => { const t = e.id; let i; if (Object(x.isOhlcPlot)(e)) { const t = e.target; i = this.properties().ohlcPlots[t] } else i = this.properties().styles[t]; return i.visible.value() }).reduce((i, s) => this._applyPlotToPrecalculatedAutoscaleInfo(e, t, i, s), { fields: [], useMainSeriesRange: !1, baseValueMinMax: null }) } _buildInputs(e) { Object(s.assert)(!!e, "options not set"); let t = {}; try { t = this._prepareInputs(e) } catch (e) { Ze.logWarn("Failed to prepare study inputs: " + e) } if (e.asObject) { const e = {}; return Object.keys(t).forEach(i => { null != t[i] && (e[i] = t[i]) }), e } { const e = []; return Object.keys(t).forEach(i => { null != t[i] && e.push(t[i]) }), e } } _prepareInput(e, t) { const i = this._prepareInputValue(e, t); return !e.isFake || t.fakeInputsForDisplay || t.onlyAtomValues ? i : { v: i, f: !0, t: e.type } } _calcIsActualInterval() { const e = this._isActualInterval; this._isActualInterval = Object(Je.a)(this._series.intervalObj(), this .properties().intervalsVisibilities), e !== this._isActualInterval && ( this._onIsActualIntervalChange.fire(), this._visibleChanged(), this .processHibernate()) } _visibleChanged() { this._series.invalidateBarColorerCache() } _getNonPriceParent() { const e = this.source(); if (e instanceof st) { const t = e.metaInfo(); return t.is_price_study && "Compare@tv-basicstudies" !== t.id ? e ._getNonPriceParent() : e } return null } } }, IiTo: function(e, t, i) { "use strict"; i.r(t); var s = i("jCNj"), r = i("LxhU"), n = i("Hr11"), o = i("ZmuQ"), a = i("E6p6"); class l extends o.a { constructor(e, t) { super(), this._sessionStartMs = -Number.MAX_VALUE, this._sessionEndMs = -Number .MAX_VALUE, this._periodSec = e, this._session = t } alignTimeIfPossible(e) { const t = this.alignTime(e); return isNaN(t) ? e : t } indexOfBar(e) { return e < this._sessionStartMs ? a.SessionStage.PRE_SESSION : e >= this ._sessionEndMs ? a.SessionStage.POST_SESSION : Object(n.toInt)(s .time_seconds_diff(e, this._sessionStartMs) / this._periodSec) } startOfBar(e) { if (e === a.SessionStage.PRE_SESSION) { const e = s.get_cal_from_unix_timestamp_ms(this._session.timezone, this ._sessionStartMs - 1), t = this._session.spec.alignToNearestSessionEnd(e, -1); return s.cal_to_utc(this._session.timezone, t) } if (e === a.SessionStage.POST_SESSION) return this._sessionEndMs; if (e < 0) throw new Error("Negative offset is not supported"); return this._sessionStartMs + s.time_seconds(this._periodSec * e) } endOfBar(e) { if (e < 0) throw new Error("Index cannot be negative"); const t = this.startOfBar(e) + 1e3 * this._periodSec; return t > this._sessionEndMs ? this._sessionEndMs : t } isLastBar(e, t) { return t >= this._sessionStartMs + s.time_seconds(this._periodSec * (e + 1) - 1) } moveTo(e) { const t = this._session.timezone, i = s.utc_to_cal(t, e), r = this._session.spec.alignToSessionStart(i); this._sessionStartMs = s.cal_to_utc(t, i), s.add_minutes(i, r), this ._sessionEndMs = s.cal_to_utc(t, i) } indexOfLastBarInSession() { return Object(n.toInt)((this._sessionEndMs - 1 - this._sessionStartMs) / 1e3 / this._periodSec) } moveNext() { this.moveTo(this._sessionEndMs) } } var c = i("OBgQ"); function h(e, t) { const i = s.clone(t), r = e.businessDaysToCalendarDays(i, 1); r > 1 && s.add_date(i, r - 1); const n = e.leftBorderOfDailyBar(i); if (null === n) throw new Error("Cannot calculate left border of daily bar"); return s.cal_to_utc(s.get_timezone(e.timezone()), n) } class u extends o.a { constructor(e, t, i, s, r = !1) { super(), this._periodStart = -Number.MAX_VALUE, this._periodEnd = -Number .MAX_VALUE, this._periodLastBarStart = -Number.MAX_VALUE, this ._periodStartDay = new c.a(0, 0, 0), this._periodEndDay = new c.a(0, 0, 0), this._period = i, this._sessionTgt = e, this._builder = s, this ._useBusinessDays = r, this._sessionSrc = r ? new o.b("Etc/UTC", "24x7") : t || e } builder() { return this._builder } alignTimeIfPossible(e) { return this.tradingDayToSessionStart(e) } tradingDayToSessionStart(e) { return this.moveTo(e), this.startOfBar(0) } indexOfBar(e) { if (this._useBusinessDays) { const t = c.a.fromCalendar(s.get_cal_from_unix_timestamp_ms(this._sessionSrc .timezone, e)); return t.before(this._periodStartDay) ? a.SessionStage.PRE_SESSION : this ._periodEndDay.before(t) ? a.SessionStage.POST_SESSION : 0 } return e < this._periodStart ? a.SessionStage.PRE_SESSION : e >= this ._periodEnd ? a.SessionStage.POST_SESSION : 0 } startOfBar(e) { if (e === a.SessionStage.PRE_SESSION) { const e = s.get_cal_from_unix_timestamp_ms(this._sessionTgt.timezone, this ._periodStart - 1), t = this._sessionTgt.spec.alignToNearestSessionEnd(e, -1); return s.cal_to_utc(this._sessionTgt.timezone, t) - 1 } return e === a.SessionStage.POST_SESSION || e > 0 ? this._periodEnd : e === a .SessionStage.LASTBAR_SESSION ? this._periodLastBarStart : this._periodStart } moveTo(e) { const t = s.get_cal_from_unix_timestamp_ms(this._sessionSrc.timezone, e); this._sessionSrc.spec.correctTradingDay(t); const i = s.get_year(t), r = this._indexOfPeriodInYear(t), n = r + this._period, o = this._sessionTgt.spec, a = this._sessionTgt.timezone, l = this._builder.startOfPeriod(a, r, i); this._periodStart = h(o, l); const u = s.clone(l), d = o.businessDaysToCalendarDays(u, 1); d > 1 && s.add_date(u, d - 1), this._periodStartDay = c.a.fromCalendar(u); const p = this._builder.startOfPeriod(a, n, i); this._periodEnd = h(o, p); const _ = s.clone(p); for (s.add_date(_, -1); o.isCalWeekEnd(_);) s.add_date(_, -1); this._periodEndDay = c.a.fromCalendar(_), s.add_date(p, -1), function(e, t) { for (; e.isCalWeekEnd(t);) s.add_date(t, -1) }(this._sessionTgt.spec, p), this._periodLastBarStart = h(o, p), (this ._periodLastBarStart < this._periodStart || this._periodLastBarStart === this._periodEnd) && (this._periodLastBarStart = this._periodStart) } endOfBar(e) { if (0 !== e) throw new Error("index should be 0"); return this._periodEnd } isLastBar(e, t) { if (0 !== e) throw new Error("index should be 0"); return t >= this._periodLastBarStart } currentRange() { return { from: this._periodStartDay, to: this._periodEndDay } } indexOfBarInYear(e) { const t = s.get_cal_from_unix_timestamp_ms(this._sessionSrc.timezone, e), i = s.get_year(t), r = this._builder.indexOfPeriod(t), o = this._sessionTgt.timezone; let a = this._builder.startOfPeriod(o, r, i), l = h(this._sessionTgt.spec, a); return a = s.get_cal_from_unix_timestamp_ms(s.get_timezone("Etc/UTC"), l), i < s .get_year(a) ? (a = this._builder.startOfPeriod(o, r - 1, i), l = h(this ._sessionTgt.spec, a), { index: (r - 1) / this._period, time: l }) : { index: Object(n.toInt)(r / this._period), time: l } } sessionSrc() { return this._sessionSrc } _indexOfPeriodInYear(e) { const t = this._builder.indexOfPeriod(e); let i = Object(n.toInt)(t / this._period) * this._period; return -1 === t && (i = -this._period), i } } function d(e, t) { const i = s.get_day_of_week(t) - e.firstDayOfWeek(); return i < 0 ? i + 7 : i } function p(e, t) { const i = s.get_day_of_year(t) - 1; let r = d(e, t) - i % 7; return 0 === r ? Object(n.toInt)(i / 7) : (r >= 0 && (r -= 7), Object(n.toInt)((r + i) / 7)) } class _ { indexOfPeriod(e) { return s.get_day_of_year(e) - 1 } startOfPeriod(e, t, i) { const r = s.days_per_year(i); return s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1 + Math.min(t, r)) } } class m extends _ { constructor(e) { super(), this._sessionsSpec = e } indexOfPeriod(e) { return super.indexOfPeriod(e) - function(e, t) { const i = p(e, t), r = s.get_cal(s.get_timezone("Etc/UTC"), s.get_year(t), s.JANUARY, 1); s.add_date(r, 7 * i); const n = i * e.weekEndsCount() + e.holidaysFromYearStart(r), o = s.get_day_of_year(t) - s.get_day_of_year(r); return n + o - e.calendarDaysToBusinessDays(r, o) }(this._sessionsSpec, e) } startOfPeriod(e, t, i) { const r = 7 - this._sessionsSpec.weekEndsCount(), o = Math.max(0, Object(n.toInt)(t / r) - 1), a = s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1), l = s.get_days_per_year(a); if (s.add_date(a, 7 * o), (t -= r * o - this._sessionsSpec.holidaysFromYearStart( a)) > 0) { const e = this._sessionsSpec.businessDaysToCalendarDays(a, t); s.add_date(a, e) } let c = s.get_day_of_year(a) - 1; return i < s.get_year(a) && (c += l), super.startOfPeriod(e, c, i) } } class f { constructor(e) { this._builder = null, this._initialized = !1, this._session = e } indexOfPeriod(e) { return this._getBuilder().indexOfPeriod(e) } startOfPeriod(e, t, i) { return this._getBuilder().startOfPeriod(e, t, i) } _getBuilder() { return null !== this._builder && this._initialized || (this._builder = this._session .spec.hasWeekEnds() ? new m(this._session.spec) : new _, this ._initialized = !0), this._builder } } class g { constructor(e) { this._session = e } indexOfPeriod(e) { let t = p(this._session.spec, e); if (0 === t) { const i = s.get_timezone(this._session.spec.timezone()); e < this.startOfPeriod(i, 0, s.get_year(e)) && (t = -1) } return t } startOfPeriod(e, t, i) { if (t < 0) { i--; const r = s.get_cal(s.get_timezone("Etc/UTC"), i, s.DECEMBER, 31, 23, 59, 59), o = this.indexOfPeriod(r), a = -1 * t, l = Object(n.toInt)(o / a) * a; return this.startOfPeriod(e, l, i) } const r = s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1), o = d(this._session.spec, r), a = 0 === o ? 7 * t : 7 * (t + 1) - o; return a > s.get_days_per_year(r) ? this.startOfPeriod(e, 0, i + 1) : (s.add_date(r, a), r) } } class b { indexOfPeriod(e) { return s.get_month(e) } startOfPeriod(e, t, i) { if (t < 0) { const e = Object(n.toInt)((11 - t) / 12); i -= e, t += 12 * e } else t > s.DECEMBER && (i++, t = s.JANUARY); return s.get_cal(s.get_timezone("Etc/UTC"), i, t, 1) } } function v(e, t, i, s = !1) { const n = r.Interval.parse(e), o = n.multiplier(); return n.isMinutes() ? new l(60 * o, t) : n.isSeconds() ? new l(o, t) : n.isTicks() ? new l( 1, t) : n.isRange() ? new l(60 * o, t) : new u(t, i, o, function(e, t) { switch (e) { case r.ResolutionKind.Days: return new f(t); case r.ResolutionKind.Weeks: return new g(t); case r.ResolutionKind.Months: return new b } throw new Error("Unknown dwm resolution: " + e) }(n.kind(), t), s) } function S(e, t, i, s, r, n, o) { return w(e, t, i, s, r, n, o, 0) } function y(e, t, i, s, r, n, o) { return w(e, t, i, s, r, n, o, 1) } function w(e, t, i, s, n, a, l, c) { const h = r.Interval.parse(n + s); if (h.isMonths()) { const e = new Date(l); return 0 === c && e.setUTCDate(1), function(e, t) { T(e, Math.floor(t / 12)); let i = e.getUTCMonth() - t % 12; i < 0 && (T(e, 1), i += 12); e.setUTCMonth(i); for (; e.getUTCMonth() !== i;) I(e, 1) }(e, a * h.multiplier()), e.getTime() } const u = new o.b("Etc/UTC", e, t, i), d = h.inMilliseconds(), p = h.isDWM(); let _; _ = p ? 864e5 : 60 * u.spec.maxTradingDayLength() * 1e3; let m = 0; m = h.isWeeks() ? 7 : 7 - u.spec.weekEndsCount(); const f = _ / d, g = m * f; let b; if (a < g) b = a / f; else { b = 7 * (a / g) } return p && (b = Math.floor(b)), l - 864e5 * b } function P(e, t, i, s, n, a, l) { const c = r.Interval.parse(n + s); if (c.isMonths()) { const e = new Date(a), t = new Date(l); let i = 12 * (t.getUTCFullYear() - e.getUTCFullYear()); return i += t.getUTCMonth() - e.getUTCMonth(), Math.ceil(i / c.multiplier()) } const h = new o.b("Etc/UTC", e, t, i), u = c.inMilliseconds(); let d; d = c.isDWM() ? 864e5 : 60 * h.spec.maxTradingDayLength() * 1e3; let p = 0; p = c.isWeeks() ? 7 : 7 - h.spec.weekEndsCount(); const _ = l - a, m = d / u, f = p * m; let g = _ / 864e5 * m; return g >= f && (g = _ / 6048e5 * f), Math.ceil(g) } function C(e, t) { const i = s.clone(t); return e.alignToSessionStart(i), s.cal_to_utc(s.get_timezone(e.timezone()), i) } function x(e, t) { const i = s.utc_to_cal(t.timezone, +e); let r = s.get_day_of_week(i), n = s.get_minutes_from_midnight(i); const o = t.spec.findSession(t.spec.getWeekIndex(i), r, n).getEntry(); return o.isOvernight() && n > o.startOffset() + o.length() && r === o.dayOfWeek() - 1 && ( r++, n -= 1440), r === o.dayOfWeek() && n >= o.startOffset() && n < o .startOffset() + o.length() } function T(e, t) { const i = e.getUTCMonth(); e.setUTCFullYear(e.getUTCFullYear() - t), e.getUTCMonth() !== i && I(e, 1) } function I(e, t) { e.setTime(e.getTime() - 864e5 * t) } i.d(t, "newBarBuilder", (function() { return v })), i.d(t, "alignPeriodsBackForDataRequest", (function() { return S })), i.d(t, "alignPeriodsBackForVisibleRange", (function() { return y })), i.d(t, "getPeriodsBetweenDates", (function() { return P })), i.d(t, "alignExchangeTimeToSessionStartAndReturnUTC", (function() { return C })), i.d(t, "isTradingNow", (function() { return x })), i.d(t, "SessionInfo", (function() { return o.b })) }, IjC5: function(e, t, i) { "use strict"; i.r(t), i.d(t, "RectangleRenderer", (function() { return u })); var s = i("Eyy1"), r = i("aO4+"), n = i("f6yo"), o = i("GEp6"), a = i("VdBB"), l = i("Tmoa"), c = i("8Uy/"), h = i("gAom"); class u { constructor(e, t, i) { this._data = null, this._hitTestResult = e || new a.HitTestResult(a.HitTestResult .MOVEPOINT), this._backHitTestResult = t || new a.HitTestResult(a.HitTestResult .MOVEPOINT_BACKGROUND), this._forceOverrideTransparency = Boolean(i) } setData(e) { this._data = e } hitTest(e, t) { if (null === this._data || this._data.points.length < 2 || this._data.nohittest) return null; const [i, s] = this._getPointsInPhysicalSpace(t), n = new r.Point(s.x, i.y), a = new r.Point(i.x, s.y), l = new r.Point(e.x * t.pixelRatio, e.y * t.pixelRatio), c = this._extendAndHitTestLineSegment(l, i, n, t); if (null !== c) return c; const h = this._extendAndHitTestLineSegment(l, a, s, t); if (null !== h) return h; let u = Object(o.distanceToSegment)(n, s, l); return u.distance <= 3 ? this._hitTestResult : (u = Object(o.distanceToSegment)(i, a, l), u.distance <= 3 ? this._hitTestResult : this._data .fillBackground ? this._hitTestBackground(l, i, s, t) : null) } getColor() { const e = Object(s.ensure)(this._data); return void 0 === e.transparency ? e.backcolor : Object(l.generateColor)(e .backcolor, e.transparency, this._forceOverrideTransparency) } draw(e, t) { if (null === this._data || this._data.points.length < 2 || this._data.linewidth <= 0 && !this._data.fillBackground) return; e.save(); const [i, s] = this._getPointsInPhysicalSpace(t), r = this._data.linewidth ? Math .max(1, Math.floor(this._data.linewidth * t.pixelRatio)) : 0, n = this._data .fillBackground ? this.getColor() : void 0, o = Math.max(1, Math.floor(t .pixelRatio)); Object(h.fillRectWithBorder)(e, i.x, i.y, s.x, s.y, n, this._data.color, r, c .LINESTYLE_SOLID, this._data.extendLeft, this._data.extendRight, "center", t .physicalWidth, this._data.includeRightEdge && 1 === o ? 1 : 0), e.restore() } _getPointsInPhysicalSpace(e, t = 0) { const i = Object(s.ensureNotNull)(this._data), [n, o] = i.points, a = e.pixelRatio, l = Math.min(n.x, o.x), c = Math.max(n.x, o.x), h = Math.min(n.y, o.y), u = Math.max(n.y, o.y), d = Math.round(l * a) + t, p = Math.round(c * a) + t, _ = Math.round(h * a) + t, m = Math.round(u * a) + t; return [new r.Point(d, _), new r.Point(p, m)] } _extendAndHitTestLineSegment(e, t, i, s) { const r = this._extendAndClipLineSegment(t, i, s); if (null !== r) { if (Object(o.distanceToSegment)(r[0], r[1], e).distance <= 3) return this ._hitTestResult } return null } _extendAndClipLineSegment(e, t, i) { const n = Object(s.ensureNotNull)(this._data); if (Object(r.equalPoints)(e, t)) return null; const o = i.physicalWidth, a = Math.min(e.x, t.x), l = Math.max(e.x, t.x), c = n.extendLeft ? 0 : Math.max(a, 0), h = n.extendRight ? o : Math.min(l, o); return c > h || h <= 0 || c >= o ? null : [new r.Point(c, e.y), new r.Point(h, t.y)] } _hitTestBackground(e, t, i, s) { const o = this._extendAndClipLineSegment(t, i, s); return null !== o && Object(n.pointInBox)(e, Object(r.box)(o[0], o[1])) ? this ._backHitTestResult : null } } }, InMJ: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()), this.version = n.version, i.e("lt-pane-views") .then(i.t.bind(null, "gr7S", 7)).then(({ FlatBottomPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 3 } name() { return "Flat Bottom" } hasEditableCoordinates() { return !1 } addPoint(e, t) { return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this.points()[this.points().length - 2]), s.prototype.addPoint.call(this, e) } setLastPoint(e, t) { return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this.points()[this.points().length - 2]), s.prototype.setLastPoint.call( this, e) } setPoint(e, t, i) { if (i && i.shift() && 1 === e) { this._snapPoint45Degree(t, this.points()[0]) } if (2 === e) this._points[1].index = t.index; else if (3 === e) return this._points[0].index = t.index, this._points[2].price = t .price, void this.normalizePoints(); super.setPoint(e, t) } getPoint(e) { return e < 3 ? s.prototype.getPoint.call(this, e) : 3 === e ? { index: this._points[0].index, price: this._points[2].price } : void 0 } canHasAlert() { return !0 } _getAlertPlots() { var e = this._points[0], t = this._points[1], i = []; e.index <= t.index ? (i.push(e), i.push(t)) : (i.push(t), i.push(e)); var s = this._points[2]; s.time = t.time, s.index = t.index; var r, n, o, a, l = { price: s.price, time: e.time, index: e.index }, c = []; s.index <= l.index ? (c.push(s), c.push(l)) : (c.push(l), c.push(s)), i[0].price > c[0].price ? (r = i, n = c) : c[0].price > i[0].price || c[1].price > i[1] .price ? (r = c, n = i) : (r = i, n = c); var h = this.properties().extendLeft.value(), u = this.properties().extendRight.value(); return e.index <= t.index ? (o = h, a = u) : (o = u, a = h), [this ._linePointsToAlertPlot(r, "Upper", o, a), this._linePointsToAlertPlot(n, "Lower", h, a) ] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "vm8R"))) .GeneralTrendFiguresDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolflatbottom", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } n.version = 1, t.LineToolFlatBottom = n }, J2xC: function(e, t, i) { e.exports = { "css-value-header-toolbar-height": "38px" } }, JT5O: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyMarket", (function() { return n })); var s = i("hY0g"), r = i.n(s); class n { constructor(e, t) { this._visibility = new r.a(!1), this._dialogPromise = null, this._dialog = null, this._chartWidgetCollection = e, this._options = t } visible() { return this._visibility.readonly() } show(e) { var t; null === this._dialog && this._requestDialog(e), null === (t = this._dialog) || void 0 === t || t.open(e, void 0) } hide() { var e; null === (e = this._dialog) || void 0 === e || e.hide() } resetAllPages() { var e; null === (e = this._dialog) || void 0 === e || e.resetAllStudies() } _requestDialog(e) { if (null === this._dialogPromise) { let t; t = Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(17), i.e(19), i.e(24), i.e(68), i.e(78), i.e(0), i.e(2), i.e(18), i.e( "study-market") ]).then(i.bind(null, "zbLM")).then(e => new e.IndicatorsLibraryContainer( this._chartWidgetCollection, this._options)), this._dialogPromise = t .then(t => { this._dialog = t, this._dialog.visible().subscribe(e => { this._visibility.setValue(e) }), this._dialog.open(e) }) } return this._dialogPromise } } }, JWMC: function(e, t, i) { "use strict"; i.r(t), i.d(t, "trackEvent", (function() { return l })); i("bSeV"); var s = i("FQhm"), r = i("Kxc7"), n = i("txPx"); const o = Object(n.getLogger)("Common.TrackEvent"), a = [/Study_(Drawing)_(.*)/, /(Study)_(.*)@tv-basicstudies/, /(Study)_(.*)/, /(Chart Style) (.*)/ ], l = (e, t, i) => { if (r.enabled("charting_library_base")) return void((e, t, i) => { t = t || e || i || ""; let r = ""; for (let e = 0; e < a.length; e++) { const i = t.match(a[e]); if (i && 3 === i.length) { t = i[1], r = i[2]; break } } Object(s.emit)(t.toLowerCase().replace(" ", "_"), { category: e, label: i, value: r }) })(e, t, i); let n = (e ? e + ":" : "") + t; i && (n += " " + i), o.logNormal(n), r.enabled("widget") || !window._UNIT_TESTS && window.gtag && window.gtag("event", t, { event_category: e, event_label: i }) }; "undefined" != typeof window && (window.TradingView = window.TradingView || {}, window .TradingView.trackEvent = l) }, JcHK: function(e, t, i) { "use strict"; function s(e) { return e.getAll().some(e => e.isInitialized()) } function r(e, t) { const i = e.getAll(), s = () => { t(), i.forEach(e => { e.chartWidgetInitialized.unsubscribe(null, s) }) }; i.forEach(e => { e.chartWidgetInitialized.subscribe(null, s, !0) }) } i.r(t), i.d(t, "isAnyChartWidgetInitialized", (function() { return s })), i.d(t, "waitAnyChartWidgetInitialized", (function() { return r })) }, JjUe: function(e, t, i) { "use strict"; i.r(t), i.d(t, "OverlayDataWindowView", (function() { return h })); var s = i("ivNn"), r = i("4miz"), n = i("qFKp"), o = i("e92V"), a = i("mMWL"), l = i("e1Hy"); const c = n.CheckMobile.any(); class h extends r.b { constructor(e, t) { super(), this._invalidated = !0, this._study = e, this._model = t, this ._valueProvider = this._createValuesProvider(e, t), this._items = this ._valueProvider.getItems().map(e => new r.a(e.title, "")), this.update() } items() { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._items } update() { this._invalidated = !0 } study() { return this._study } _updateImpl() { this._header = this._study.title(); let e; this._showLastPriceAndChangeOnly() ? e = this._study.data().lastIndex() : (e = this._model.crossHairSource().appliedIndex(), Object(s.isNumber)(e) || ( e = this._study.data().lastIndex())); const t = this._valueProvider.getValues(e); for (let e = 0; e < t.length; ++e) { const i = t[e], s = this._items[e]; s.setValue(i.value), s.setVisible(i.visible), s.setColor(i.color) } } _showLastPriceAndChangeOnly() { return c && (null === this._model.crossHairSource().pane || Object(o .isLineToolName)(a.tool.value()) || null !== this._model .lineBeingEdited()) } _createValuesProvider(e, t) { return new l.a(e, t) } } }, JmuD: function(e, t, i) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.hasProperty = t.isObject = void 0, t.isObject = function(e) { var t = typeof e; return null !== e && ("object" === t || "function" === t) }, t.hasProperty = function(e, t) { return t in e } }, JpbW: function(e, t, i) { "use strict"; i.r(t), i.d(t, "showChangeIntervalDialogAsync", (function() { return n })); var s = i("6KAu"); let r = null; function n(e) { const t = r = Object(s.a)().then(i => { t === r && i.showChangeIntervalDialog(e) }); return t } }, K4L1: function(e, t, i) { "use strict"; var s = i("Eyy1").assert, r = i("lCO3").Version, n = i("txPx").getLogger("Chart.Study.Versioning"), o = i("Wt0y"), a = i("0YCj"), l = i("TcSq").extractPineId, c = i("Si3H").migrateMetaInfoAndPropState; function h(e, t) { if (!e) throw new Error("No studies metainfo"); var s = i("EyEd"); if (this._studiesMetainfo = e, !t) throw new Error("No studies migrations"); this._studiesMigrations = t, this._migrations = {}; for (var r = 0; r < this._studiesMigrations.length; r++) for (var o = this._studiesMigrations[r], a = o.versFrom, l = o.versTo, c = 0; c < o .studyMigrations.length; c++) { var h = o.studyMigrations[c], u = h.studyId; if (0 !== h.rules.length) { var d = u in this._migrations ? this._migrations[u] : new s(u); d.addMigration(a, l, h.rules), this._migrations[u] = d } else n.logError("Study Migration should have at least one convertion rule") } this._clientMigrations = [function(e, t) { if (0 === this._studiesMetainfo.length || !e.isTVScript || e.version >= 22) return t; for (var i = {}, s = 0, r = 0;;) { var n = t[r]; if (void 0 === n) break; var o = t[n.id]; n.isFake && (n.id = "in_" + s++), i[r] = n, i[n.id] = o, r++ } return i }] } h.prototype.updateMetaInfo = function(e) { if (!e) return e; s(!e.isTVScript, "This method should update only built-in java indicators metaInfo. For Pine indicators use updateMetaInfoAsync" ); for (var t = null, i = this._studiesMetainfo, r = 0; r < i.length; r++) if (i[r].id === e.id) { t = i[r]; break } return TradingView.clone(t) }, h.prototype.updateMetaInfoAsync = function(e) { if (!e) return { sync: !1, result: Promise.reject("No old metaInfo was given") }; new a(e), a.versionOf(e); for (var t = null, i = this._studiesMetainfo, s = 0; s < i.length; s++) if (i[s].id === e.id) { t = i[s]; break } return { sync: !0, result: t ? TradingView.clone(t) : null } }, h.prototype.lastVersionOfStudy = function(e) { return this._studiesMetainfo.find((function(t) { return t.id === e })).version }, h.prototype.updateStudyInputs = function(e, t, i, s, o) { var a = TradingView.clone(s); if (e in this._migrations) { var l, c = r.parse(t); if ("last" === i) { var h = this.lastVersionOfStudy(e); l = r.parse(h) } else l = r.parse(i); a = this._migrations[e].updateInputs(c, l, a) } if (null == o) return a; for (var u in o) u in a || (a[u] = o[u]); for (var u in a) if (!(u in o)) { var d = a[u]; n.logWarn("Extra input detected, studyId=" + e + ", versionFrom=" + t + ", inputId=" + u + ", inputValue=" + d + ", removing it and continue..." ), delete a[u] } return a }, h.prototype.updateStudyState = function(e, t, i) { if (null == e || null == t || null == i) return e; if (e = TradingView.clone(e), !(t.isTVScript || !!t.pine) && t.version !== i.version) { var s = i && i.defaults.inputs, r = this.updateStudyInputs(t.id, t.version, i.version, e.inputs, s); e.inputs = r } for (var o = 0; o < this._clientMigrations.length; ++o) { r = this._clientMigrations[o].call(this, t, e.inputs); Object.keys(r).length === Object.keys(e.inputs).length ? e.inputs = r : n.logWarn( "StudyVersioning._clientMigrations application returned bad result. Skipping it..." ) } var l = a.versionOf(t); if (t.isTVScript && t.TVScriptSourceCode && l >= 12 && l <= 26) { var c = {}; for (o = 0; o < t.plots.length; ++o) { var h = t.plots[o], u = i.plots[o]; c[h.id] = u.id } var d = Object.keys(e.styles); for (o = 0; o < d.length; ++o) { var p = d[o], _ = e.styles[p]; delete e.styles[p]; var m = c[p]; e.styles[m] = _ } var f = Object.keys(e.plots); for (o = 0; o < f.length; ++o) { var g = f[o]; p = e.plots[g].id; e.plots[g].id = c[p] } } return e }, h.prototype.patchPointsBasedStudyState = function(e) { return h._fixInputsMaxValue(e.state, e.metaInfo), e }, h.prototype.patchPointsBasedStudyData = function(e, t) { if (!o.isProd()) return t; if (!e || !t) return t; var i = TradingView.clone(t); return "VbPFixed@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h ._patchOldVolumeProfiles(0, i), i }, h.prototype.patchStudyData = function(e, t, i, s) { if (!o.isProd()) return { data: t, nsData: i, indexes: s }; var r = TradingView.clone(t), n = TradingView.clone(i), l = TradingView.clone(s); "VbPVisible@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h ._patchOldVolumeProfiles(0, r.graphics), "VbPSessions@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h._patchOldVolumeProfiles(0, r.graphics); var c = a.versionOf(e); if (e.isTVScript && e.TVScriptSourceCode && c >= 12 && c <= 26) { var u = r.columns; r.columns = []; for (var d = 0; d < u.length; ++d) { var p = "plot_" + d; r.columns.push(p) } } return { data: r, nsData: n, indexes: l } }, h._patchOldVolumeProfiles = function(e, t) { var i = t.hhists[e].data, s = []; for (var r in i) s = s.concat(i[r]); t.hhists[0].data = s }, h._fixInputsOrder = function(e, t) { for (var i = a.getOrderedInputIds(t), s = h.splitInputs(e.inputs), r = s.arr, n = s.obj, o = TradingView.merge({}, n), l = 0; l < i.length; ++l) { var c = i[l], u = h.findInputKeyById(r, c); if (null !== u) { var d = r[u]; o[l] = d } } e.inputs = o }, h.INPUT_MAX_VALUE = 1e12, h._verifyInputsMaxValue = function(e) { var t = h.INPUT_MAX_VALUE; if (e.inputs) for (var i = 0; i < e.inputs.length; i++) { var s = e.inputs[i]; "integer" === s.type && (s.max && s.max > t && n.logWarn( "Bad integer input max value in metaInfo id=" + e.id + " title=" + e .description)) } }, h._fixInputsMaxValue = function(e, t) { if (!TradingView.isAbsent(t)) { var i = h.INPUT_MAX_VALUE; if (t.inputs) for (var s = 0; s < t.inputs.length; s++) { "integer" === (a = t.inputs[s]).type && (a.max && a.max > i && (a.max = i)) } if (e && e.inputs) { var r = h.splitInputs(e.inputs), n = r.arr; for (var o in n) { var a; "integer" === (a = n[o]).type && (a.max && a.max > i && (a.max = i)) } e.inputs = TradingView.merge(r.obj, r.arr) } } }, h.prototype.patchPropsStateAndMetaInfo = function(e, t, i) { "Script$BOOKER" !== t.productId || t.alerts || delete e.alerts, h._fixInputsOrder(e, t), h._fixInputsMaxValue(e, t); var s = h.splitInputs(e.inputs); e.inputs = s.obj; var r = a.versionOf(t); r < a.METAINFO_FORMAT_VERSION_SOS_V2 && t.isChildStudy && (e.isChildStudy = t .isChildStudy); if (t.isTVScript && t.version < 60 && ("Script$TV_EARNINGS@tv-scripting" !== t.id && "Script$TV_DIVIDENDS@tv-scripting" !== t.id && "Script$TV_SPLITS@tv-scripting" !== t.id || delete t.TVScriptSourceCode), "Volume" !== t.id && "Volume@tv-basicstudies" !== t.id || 0 !== t.inputs.length || ( t.inputs = [{ id: "length", type: "integer", defval: 20, min: 1, max: 1e3 }], t.plots.push({ id: "vol_ma", type: "line" })), "Volume@tv-basicstudies" === t.id && t.version && t.version <= 46 && void 0 === e.styles.vol.transparency && (e.styles.vol.transparency = e .transparency || 87), "PivotPointsStandard@tv-basicstudies" === t.id && (0 === t .inputs.length ? (e.inputs = { kind: "Traditional", showHistoricalPivots: !0 }, t.inputs = [{ defval: "Traditional", id: "kind", type: "text", options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark", "Camarilla" ] }, { id: "showHistoricalPivots", type: "bool", defval: !0 }]) : 1 === t.inputs.length && (e.inputs = { kind: "Traditional" }, t.inputs = [{ defval: "Traditional", id: "kind", type: "text", options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark", "Camarilla" ] }, { id: "showHistoricalPivots", type: "bool", defval: !0 }]), void 0 === e._hardCodedDefaultsVersion)) { e._hardCodedDefaultsVersion = 1; var n = e.color; delete e.color, e.levelsStyle = { colors: { P: n, "S1/R1": n, "S2/R2": n, "S3/R3": n, "S4/R4": n, "S5/R5": n } } } "CMF" === t.shortId && 2 === t.inputs.length && (e.inputs = { length: e.inputs["length fast"] }, t.inputs = t.inputs.splice(0, 1), t.inputs[0].id = "length"), t.defaults && void 0 === t.defaults.precision && r < a.VERSION_NEW_STUDY_PRECISION_FORMAT && (-1 !== ["Volume@tv-basicstudies", "VbPVisible@tv-volumebyprice", "VbPSessions@tv-volumebyprice" ].indexOf(t.id) ? t.defaults.precision = 0 : t.defaults.precision = 4); if (t.version < 60) for (var o = ["TV_DIVIDENDS", "TV_SPLITS", "TV_EARNINGS"], u = "Script".length, d = 0; d < o.length; d++) t.id.startsWith("Script$" + o[d] + "@tv-scripting") && (t.fullId = "ESD" + t.fullId.substring(u), t.id = "ESD" + t.id.substring(u), t .name = "ESD" + t.name.substring(u), t.shortId = "ESD" + t.shortId .substring(u), t.productId = "ESD" + t.productId.substring(u)); var p = { "ESD$TV_EARNINGS@tv-scripting": { fullId: "Earnings@tv-basicstudies-129!", id: "Earnings@tv-basicstudies", name: "Earnings@tv-basicstudies", shortId: "Earnings", productId: "tv-basicstudies" }, "ESD$TV_SPLITS@tv-scripting": { fullId: "Splits@tv-basicstudies-129!", id: "Splits@tv-basicstudies", name: "Splits@tv-basicstudies", shortId: "Splits", productId: "tv-basicstudies" }, "ESD$TV_DIVIDENDS@tv-scripting": { fullId: "Dividends@tv-basicstudies-129!", id: "Dividends@tv-basicstudies", name: "Dividends@tv-basicstudies", shortId: "Dividends", productId: "tv-basicstudies" } }; if (t.id in p && Object.assign(t, p[t.id]), r < a.VERSION_PINE_PROTECT_TV_4164) { var _ = { "StrategyScript$STD;Consecutive%1Ups/Downs%1Strategy": { pineId: "STD;Consecutive%1Ups%1Downs%1Strategy", className: "StrategyScript" }, Script$EDGR_NET_INCOME_FROM_CONTINUING_OPERATIONS_APPLICABLE_TO_COMMON_V2: { pineId: "Script$EDGR_NET_INCOME_FROM_CONTINUING_OPS_APPLICABLE_TO_COMMON_V2", className: "Script" } }; if (t.shortId in _) { var m = _[t.shortId].className + "$" + _[t.shortId].pineId, f = { scriptIdPart: _[t.shortId].pineId, fullId: t.fullId.replace(t.shortId, m), id: t.id.replace(t.shortId, m), name: t.name.replace(t.shortId, m), shortId: m }; TradingView.merge(t, f), TradingView.merge(e, f) } var g = l(t.fullId), b = g && g.match(/^(USER)(_\d+)(;)(.*)$/); if (b) { var v = b[0], S = b[1] + b[3] + b[2] + b[4]; f = { scriptIdPart: S, fullId: t.fullId.replace(v, S), id: t.id.replace(v, S), name: t.name.replace(v, S), shortId: t.shortId.replace(v, S) }; TradingView.merge(t, f), TradingView.merge(e, f) } } if ("MA" === t.id) { var y = new a({ id: "MAExp", properties: [{ id: "is_price_study", type: "bool", value: "true" }], inputs: [{ id: "length", type: "integer", defval: 20, min: 1, max: 500 }, { id: "source", type: "text", defval: "close", options: ["open", "high", "low", "close"] }], plots: [{ id: "MovAvgExp", type: "line" }], palettes: {} }), w = new a({ id: "MASimple", properties: [{ id: "is_price_study", type: "bool", value: "true" }], inputs: [{ id: "length", type: "integer", defval: 20, min: 1, max: 500 }, { id: "source", type: "text", defval: "close", options: ["open", "high", "low", "close"] }], plots: [{ id: "MovAvgSimple", type: "line" }], palettes: {} }), P = new a({ id: "MAVolumeWeighted", properties: [{ id: "is_price_study", type: "bool", value: "true" }], inputs: [{ id: "length", type: "integer", defval: 20, min: 1, max: 500 }, { id: "source", type: "text", defval: "close", options: ["open", "high", "low", "close"] }], plots: [{ id: "MovAvgVolumeWeighted", type: "line" }], palettes: {} }), C = new a({ id: "MAWeighted", properties: [{ id: "is_price_study", type: "bool", value: "true" }], inputs: [{ id: "length", type: "integer", defval: 20, min: 1, max: 500 }, { id: "source", type: "text", defval: "close", options: ["open", "high", "low", "close"] }], plots: [{ id: "MovAvgWeighted", type: "line" }], palettes: {} }); switch (e.inputs.type) { case "exp": t = y; break; case "simple": t = w; break; case "weighted": t = C; break; case "volume weighted": t = P } e.styles[t.plots[0].id] = e.styles.MovAvg, delete e.styles.MovAvg, delete e.inputs .type } return i.oldShowStudyLastValueProperty && (e.oldShowLastValue = e.showLastValue), delete e.showLastValue, delete e.showStudyArguments, c(t, e), { propsState: e, metaInfo: t } }, h.mergeInputs = function(e, t) { h.mergeInputsArrPart(e, t), h.mergeInputsObjPart(e, t) }, h.mergeInputsArrPart = function(e, t) { var i = h.splitInputs(t); for (var s in i.arr) { var r = h.findInputKeyById(e, i.arr[s].id); r ? TradingView.merge(e[r], i.arr[s]) : h.appendInputInfoToArr(e, i.arr[s]) } }, h.mergeInputsObjPart = function(e, t) { var i = h.splitInputs(t); TradingView.merge(e, i.obj) }, h.appendInputInfoToArr = function(e, t) { var i = -1; for (var s in e) { var r = parseInt(s, 10); isNumber(r) && (r > i && (i = r)) } e[i + 1] = t }, h.splitInputs = function(e) { var t = {}, i = {}; for (var s in e) isNumber(parseInt(s, 10)) ? t[s] = e[s] : i[s] = e[s]; return { arr: t, obj: i } }, h.findInputKeyById = function(e, t) { var i = null; for (var s in e) if (isNumber(parseInt(s, 10)) && e[s].id === t) { i = s; break } return i }, h.getInputKeyById = function(e, t) { var i = h.findInputKeyById(e, t); if (!i) throw new Error("Cannot find input with id: " + t); return i }, e.exports = h }, K5cv: function(e, t, i) { "use strict"; let s; function r() { return s } function n(e) { s = e } i.r(t), i.d(t, "getSearchRequestDelay", (function() { return r })), i.d(t, "setSearchRequestDelay", (function() { return n })) }, K8V9: function(e, t) { e.exports = '' }, K9GE: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return s })), i.d(t, "c", (function() { return r })), i.d(t, "a", (function() { return n })); const s = 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 n { constructor(e, t, i, s) { this._mX1 = e, this._mY1 = t, this._mX2 = i, this._mY2 = s } 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 i = 0; i < 4; ++i) { const i = this._getSlope(t); if (0 === i) return t; t -= (this._calcBezier(t) - e) / i } return t } } }, "KG+6": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })), i.d(t, "b", (function() { return r })), i.d(t, "d", (function() { return l })), i.d(t, "c", (function() { return c })); var s, r, n = i("Eyy1"), o = i("tqok"), a = i("hsV8"); function l(e, t) { if (e.firstBarTime >= t.length || e.lastBarTime >= t.length) return null; const i = t[e.firstBarTime], s = t[e.lastBarTime]; return i === o.INVALID_TIME_POINT_INDEX || s === o.INVALID_TIME_POINT_INDEX ? null : ( Object(n.assert)(i <= s, "firstBarTime should not exceed lastBarTime"), Object(n .assert)(e.priceLow <= e.priceHigh, "priceLow should not exceed priceHigh"), { firstBarTime: i, lastBarTime: s, rate: e.rate, priceHigh: e.priceHigh, priceLow: e.priceLow }) } function c(e, t, i) { const s = Object(a.ensureTimePointIndexIndex)(i.indexOf(e.firstBarTime)), r = Object(a.ensureTimePointIndexIndex)(i.indexOf(e.lastBarTime)); return { id: t, ...e, firstBarTime: s, lastBarTime: r } }! function(e) { e.LeftToRight = "left_to_right", e.RightToLeft = "right_to_left" }(s || (s = {})), function(e) { e.Relative = "relative", e.Absolute = "absolute" }(r || (r = {})) }, KcY8: function(e, t, i) { "use strict"; var s = i("aO4+"), r = i("f6yo"), n = i("VaSN"), o = i("Tmoa"), a = i("Ialn"), l = i("ikwP"), c = i("VdBB"), h = i("gAom"), u = i("//lt"); class d { constructor(e, t) { this.setData(e, t) } setData(e, t) { this._data = { ...e }, this._commonData = { ...t } } draw(e, t, i, s, r, n) { if (!this._data.visible) return; e.save(), e.font = t.font; const c = void 0 !== this._data.labelIcon, u = this._data.ignoreOffset ? 0 : t.offsetSize, d = t.borderSize, p = t.paddingTop + this._commonData.additionalPaddingTop, _ = t.paddingBottom + this._commonData.additionalPaddingBottom, m = t.paddingInner, f = t.paddingOuter, g = t.fontSize; let b = this._data.text, v = this._data.textColor || this._commonData.textColor, S = this._data.secondLine || "", y = this._commonData.secondLineTextColor || v, w = this._data.thirdLine || ""; const P = this._commonData.thirdLineTextColor || v; 0 === S.length && (S = w, y = P, w = ""), 0 === b.length && (b = S, v = y, S = w, y = P, w = ""); const C = i.yMidCorrection(e, b) * n, x = Math.ceil(i.measureText(e, b)), T = g + p + _, I = Boolean(S), M = Boolean(w), O = I ? Math.ceil(i.measureText(e, S)) : 0, L = M ? Math.ceil(i.measureText(e, w)) : 0, A = d + m + f + x + u, E = O > 0 ? d + m + f + O + u : 0, k = L > 0 ? d + m + f + L + u : 0, D = Math.max(A, E, k), V = Math.max(1, Math.floor(n)); let B = Math.round(T * n); B % 2 != V % 2 && (B += 1); const R = Math.round((g + t.lineSpacing) * n), N = Math.round(2 * (g + t.lineSpacing) * n), j = Math.max(1, Math.floor(d * n)), F = this._data.separatorVisible ? j : 0, W = this._data.borderVisible ? j : 0, H = c ? B : Math.round(D * n), U = Math.round(u * n), z = Math.ceil(s * n), G = Math.ceil(m * n); let q = this._commonData.coordinate; this._commonData.fixedCoordinate && (q = this._commonData.fixedCoordinate), q = Math .round(q * n) - Math.floor(.5 * n); const Y = Math.floor(q + V / 2 - B / 2), K = Y + B, J = "right" === r, Z = J ? z - F : F, X = z; let $, Q = Z; const ee = Object(o.resetTransparency)(this._data.backgroung || this._commonData .background); e.fillStyle = ee; const te = 2 * n; if (e.textAlign = J ? "right" : "left", e.textBaseline = "middle", J ? (Q = Z - H, $ = Z - U - G - 1) : (Q = Z + H, $ = Z + U + G), b || c) { const i = M ? B + N : I ? B + R : B; if (((t, s, r) => { J ? Object(h.drawRoundRectWithInnerBorder)(e, Q, Y, H, i, t, [te, 0, 0, te ], W, s, r) : Object(h.drawRoundRectWithInnerBorder)(e, Z, Y, H, i, t, [0, te, te, 0], W, s, r) })(ee, this._commonData.borderColor || ee, this._commonData.borderStyle), this._data.separatorVisible && (e.fillStyle = t.paneBackgroundColor, e .fillRect(J ? X - F : 0, Y, F, K - Y)), c) { switch (this._data.labelIcon) { case 0: this._drawPlusIcon(e, Z, Q, Y, q, K, V); break; case 1: this._drawClockIcon(e, Z, Q, q, V, n) } return } e.save(), e.translate($, (Y + K) / 2 + C), Object(l.drawScaled)(e, n, () => { e.fillStyle = v, e.fillText(b, 0, 0) }), e.restore() } I && (e.fillStyle = y, e.save(), e.translate($, (Y + K) / 2 + C + R), Object(l .drawScaled)(e, n, () => { e.fillText(Object(a.startWithLTR)(S), 0, 0) }), e.restore()), M && (e.fillStyle = P, e.save(), e.translate($, (Y + K) / 2 + C + N), Object(l.drawScaled)(e, n, () => { e.fillText(Object(a.startWithLTR)(w), 0, 0) }), e.restore()), e.restore() } height(e) { const t = this._data, i = (t.text ? 1 : 0) + (t.secondLine ? 1 : 0) + (t.thirdLine ? 1 : 0); return t.visible && 0 !== i ? i * e.fontSize + (i - 1) * e.lineSpacing + e .paddingTop + this._commonData.additionalPaddingTop + e.paddingBottom + this ._commonData.additionalPaddingBottom : 0 } hitTest(e) { const t = this._data.hitTestData; if (void 0 === t || !this._data.visible) return null; const i = Object(n.lastEventIsTouch)() ? 10 : 0, o = Object(s.box)(new s.Point(t.xl - i, t.y - i), new s.Point(t.xl + t .containerWidth + i, t.y + t.containerHeight + i)), a = t.left && Object(r.pointInBox)(e, o), l = Object(s.box)(new s.Point(t.xr - i, t.y - i), new s.Point(t.xr + t .containerWidth + i, t.y + t.containerHeight + i)), h = t.right && Object(r.pointInBox)(e, l); if (a || h) { const i = a ? "left" : "right"; return new c.HitTestResult(c.HitTestResult.CUSTOM, { cursorType: u.PaneCursorType.Default, clickHandler: void 0 === t.clickHandler ? void 0 : t.clickHandler .bind(this, e, i), tapHandler: void 0 === t.clickHandler ? void 0 : t.clickHandler .bind(this, e, i), tooltip: t.tooltip }) } return null } _drawPlusIcon(e, t, i, s, r, n, o) { e.fillStyle = this._commonData.textColor, e.strokeStyle = this._commonData .textColor, e.lineWidth = o; const a = Math.abs(t - i); let l = Math.round(.35 * a); l % 2 != o % 2 && (l += 1); let c = Math.round(.65 * a); c % 2 != o % 2 && (c += 1); const h = Math.floor((a - l) / 2), u = Math.min(t, i), d = u + Math.floor(a / 2 - o / 2); e.fillRect(u + h, r, l, o), e.fillRect(d, s + h, o, l), e.beginPath(), e.arc(d + o / 2, r + o / 2, c / 2, 0, 2 * Math.PI, !1), e.stroke() } _drawClockIcon(e, t, i, s, r, n) { e.fillStyle = this._commonData.textColor, e.lineWidth = r; const o = Math.abs(t - i); let a = Math.round(.35 * o); a % 2 != r % 2 && (a += 1); let l = Math.round(.65 * o); l % 2 != r % 2 && (l += 1); const c = Math.min(t, i) + Math.floor(o / 2 - r / 2); e.save(), e.translate(c + r / 2 - l / 2, s + r / 2 - l / 2), e.scale(n, n); const h = new Path2D( "M7.5 0.8a1 1 0 0 0 0 13.4 1 1 0 0 0 0-13.4zm0 1a1 1 0 0 1 0 11 1 1 0 0 1 0-11zm-.97-.25A3.5 3.5 0 0 0 3.5 0 3.5 3.5 0 0 0 0 3.5a3.5 3.5 0 0 0 1.75 3.03l.5-.86A2.5 2.5 0 0 1 1 3.5 2.5 2.5 0 0 1 3.5 1a2.5 2.5 0 0 1 2.17 1.25zm6.72 4.78A3.5 3.5 0 0 0 15 3.5 3.5 3.5 0 0 0 11.5 0a3.5 3.5 0 0 0-3.03 1.75l.86.5A2.5 2.5 0 0 1 11.5 1 2.5 2.5 0 0 1 14 3.5a2.5 2.5 0 0 1-1.25 2.17zM7 5h1v5H7zm3 2v1H5V7z" ); e.fill(h), e.restore() } } i.d(t, "a", (function() { return p })); class p { constructor(e) { this._commonRendererData = { coordinate: 0, textColor: "#FFF", background: "#000", additionalPaddingBottom: 0, additionalPaddingTop: 0 }, this._axisRendererData = { text: "", visible: !1, separatorVisible: !1, borderVisible: !1, ignoreOffset: !1 }, this._paneRendererData = { text: "", visible: !1, separatorVisible: !0, borderVisible: !1, ignoreOffset: !0 }, this._invalidated = !0, this._axisRenderer = new(e || d)(this ._axisRendererData, this._commonRendererData), this._paneRenderer = new(e || d)(this._paneRendererData, this._commonRendererData) } text() { return this._updateRendererDataIfNeeded(), this._axisRendererData.text } secondLineText() { return this._updateRendererDataIfNeeded(), this._axisRendererData.secondLine } thirdLineText() { return this._updateRendererDataIfNeeded(), this._axisRendererData.thirdLine } background() { return this._updateRendererDataIfNeeded(), this._commonRendererData.background } color() { return this._updateRendererDataIfNeeded(), this.generateTextColor(this.background()) } generateTextColor(e) { return Object(o.colorFromBackground)(e) } coordinate() { return this._updateRendererDataIfNeeded(), this._commonRendererData.coordinate } floatCoordinate() { return this._updateRendererDataIfNeeded(), this._commonRendererData .floatCoordinate || this._commonRendererData.coordinate } update() { this._invalidated = !0 } height(e) { return this._updateRendererDataIfNeeded(), Math.max(this._axisRenderer.height(e), this._paneRenderer.height(e)) } getFixedCoordinate() { return this._commonRendererData.fixedCoordinate || 0 } setFixedCoordinate(e) { this._commonRendererData.fixedCoordinate = e } isVisible() { return this._updateRendererDataIfNeeded(), this._axisRendererData.visible || this ._paneRendererData.visible } isAxisLabelVisible() { return this._updateRendererDataIfNeeded(), this._axisRendererData.visible } isPaneLabelVisible() { return this._updateRendererDataIfNeeded(), this._paneRendererData.visible } renderer() { return this._updateRendererDataIfNeeded(), this._axisRenderer } paneRenderer() { return this._updateRendererDataIfNeeded(), this._paneRenderer } setPaneRendererLabelIcon(e) { this._paneRendererData.labelIcon = e } setPaneLabelVisible(e) { this._paneRendererData.visible = e, this._invalidated = !0 } ignoreAlignment() { return !1 } _updateRendererDataIfNeeded() { this._invalidated && (this._updateRendererData(this._axisRendererData, this ._paneRendererData, this._commonRendererData), this._invalidated = !1), this ._axisRenderer.setData(this._axisRendererData, this._commonRendererData), this ._paneRenderer.setData(this._paneRendererData, this._commonRendererData) } } }, Khfk: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LollipopRenderer", (function() { return h })); var s = i("f6yo"), r = i("aO4+"), n = i("jFln"), o = i("8Uy/"), a = i("gAom"), l = i("ikwP"), c = i("Zp/P"); class h { constructor(e, t, i) { this._data = e, this._hittest = t, this._textWidthCache = i } draw(e, t) { const i = t.pixelRatio, s = this._data.centerPoint, n = Math.round(s.x * i), o = Math.round(s.y * i), a = Math.max(1, Math.floor(i)) % 2 / 2, l = new r.Point(n + a, o - a); this._drawLollipop(e, l, t), this._drawLabel(e, l, t.pixelRatio) } hitTest(e, t) { const i = Object(c.interactionTolerance)().esd, n = this._data.centerPoint.y - this._data.style.height / 2 - i, o = this._data.centerPoint.x - this._data.style.width / 2 - i, a = Object(r.box)(new r.Point(o, n), new r.Point(o + this._data.style.width + 2 * i, n + this._data.style.height + 2 * i)); return Object(s.pointInBox)(e, a) ? this._hittest : null } _drawLollipop(e, t, i) { const s = this._data.style, r = i.pixelRatio, l = Math.max(1, Math.floor(r)); let c = Math.round(s.width * r); c % 2 != l % 2 && (c += 1); const h = c / 2; s.fillCircle && s.backgroundColor && (e.fillStyle = s.backgroundColor, Object(a .createCircle)(e, t.x, t.y, h), e.fill()); const u = Math.round(s.lineWidth * r); e.strokeStyle = s.strokeStyle, e.lineWidth = u, Object(n.setLineStyle)(e, o .LINESTYLE_SOLID); const d = h - Math.round(1 * r + u / 2); Object(a.createCircle)(e, t.x, t.y, d), s.fillCircle && s.fillStyle && (e .fillStyle = s.fillStyle, e.fill()), e.stroke() } _drawLabel(e, t, i) { const s = this._data.style.text, r = s.label; e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = s.strokeStyle, e .font = s.font; const n = this._textWidthCache.yMidCorrection(e, r); e.translate(t.x, t.y + ((s.deltaY || 0) + n) * i), Object(l.drawScaled)(e, i, () => { e.fillText(r, 0, 0) }) } } }, KnF9: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("qFKp"); class r { constructor(e) { this._shift = !1, this._control = !1, this._alt = !1, void 0 !== e && (this._shift = Boolean(e.shiftKey), this._control = Boolean(Object(s.isMac)() ? e.metaKey : e.ctrlKey), this._alt = Boolean(e.altKey)) } shift() { return this._shift } control() { return this._control } alt() { return this._alt } shiftOnly() { return this._shift && !this._control && !this._alt } controlOnly() { return this._control && !this._shift && !this._alt } altOnly() { return this._alt && !this._shift && !this._control } controlShift() { return this._shift && this._control && !this._alt } static create(e = !1, t = !1, i = !1) { return new r({ shiftKey: e, ctrlKey: t, metaKey: t, altKey: i }) } } }, KtbP: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PanePriceAxisView", (function() { return n })); var s = i("u+0B"); class r { constructor(e) { this._priceAxisViewRenderer = null, this._rendererOptions = null, this._align = "right", this._width = 0, this._textWidthCache = e } setParams(e, t, i, s) { this._priceAxisViewRenderer = e, this._rendererOptions = t, this._width = i, this ._align = s } draw(e, t) { null !== this._rendererOptions && null !== this._priceAxisViewRenderer && this ._priceAxisViewRenderer.draw(e, this._rendererOptions, this._textWidthCache, this._width, this._align, t.pixelRatio) } hitTest(e) { var t, i; return void 0 === (null === (t = this._priceAxisViewRenderer) || void 0 === t ? void 0 : t.hitTest) ? null : null === (i = this._priceAxisViewRenderer) || void 0 === i ? void 0 : i.hitTest(e, this._width, this._align) } } class n { constructor(e, t, i) { this._renderer = null, this._invalidated = !0, this._priceAxisView = e, this ._textWidthCache = new s.TextWidthCache(50), this._dataSource = t, this ._chartModel = i, this._fontSize = -1, this._panePriceAxisViewRenderer = new r( this._textWidthCache) } update() { this._invalidated = !0 } renderer(e, t) { return this._invalidated && this._updateImpl(e, t), this._renderer } _updateImpl(e, t) { this._priceAxisView.update(), this._renderer = null; const i = this._chartModel.crossHairSource(), s = this._dataSource === i ? i.pane : this._chartModel.paneForSource(this ._dataSource); if (null === s) return; const r = this._priceScale(); if (null === r) return; let n = s.priceScalePosition(r); if ("overlay" === n && (n = s.priceScalePosition(s.defaultPriceScale())), "overlay" === n) return; const o = this._chartModel.priceAxisRendererOptions(); o.fontSize !== this._fontSize && (this._fontSize = o.fontSize, this._textWidthCache .reset()), this._panePriceAxisViewRenderer.setParams(this._priceAxisView.paneRenderer(), o, t, n), this._renderer = this._panePriceAxisViewRenderer, this ._invalidated = !1 } _priceScale() { return this._dataSource.priceScale() } } }, "L/Ed": function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "ToolboxType", (function() { return s })), function(e) { e[e.Delete = 0] = "Delete" }(s || (s = {})) }, L6rT: function(e, t, i) { "use strict"; function s(e) { return e.reduce((function(e, t, i) { return ~e.indexOf(t) || e.push(t), e }), []) } i.r(t), i.d(t, "uniq", (function() { return s })) }, LAp3: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return a })); var s = i("ogJP"), r = i("5rJj"), n = i.n(r); class o extends n.a { constructor(e, t) { super(e, t, !1, { names: ["width", "color", "visible"] }) } _iterateLevels(e, t) { for (const i in e.levels) if (e.levels[i] && Object(s.isSameType)(e.levels[i], t.typecheck())) { let s = t.tpl(); for (const r in this._map.names) this._map.names.hasOwnProperty(r) && ( s = t.fill(r, this._map.names[r], e.levels[i], s)); e.levels[i] = s } return e } } function a(e, t) { return new o(e, t) } }, LdoW: function(e, t) { e.exports = '' }, LxhU: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ResolutionKind", (function() { return n })), i.d(t, "SpecialResolutionKind", (function() { return o })), i.d(t, "Interval", (function() { return h })), i.d(t, "isHour", (function() { return d })); const s = /^(\d*)([TSHDWMR])$/, r = /^(\d+)$/; var n, o; ! function(e) { e.Ticks = "ticks", e.Seconds = "seconds", e.Minutes = "minutes", e.Days = "days", e.Weeks = "weeks", e.Months = "months", e.Range = "range", e.Invalid = "invalid" }(n || (n = {})), function(e) { e.Hours = "hours" }(o || (o = {})); const a = {}; a[n.Ticks] = 1e3, a[n.Seconds] = 1e3, a[n.Minutes] = 60 * a[n.Seconds], a[n.Days] = 1440 * a[n .Minutes], a[n.Weeks] = 7 * a[n.Days]; const l = { T: n.Ticks, S: n.Seconds, D: n.Days, W: n.Weeks, M: n.Months, R: n.Range }, c = new Set([n.Ticks, n.Seconds, n.Minutes]); class h { constructor(e, t) { this._kind = n.Invalid, this._multiplier = 0, e !== n.Invalid && t > 0 && (this ._kind = e, this._multiplier = t) } kind() { return this._kind } multiplier() { return this._multiplier } isValid() { return this.kind() !== n.Invalid && this.multiplier() > 0 } isDWM() { return this.isValid() && !this.isRange() && !this.isIntraday() && !this.isTicks() } isIntraday() { const e = c.has(this.kind()); return this.isValid() && e } isSeconds() { return this.kind() === n.Seconds } isMinutes() { return this.kind() === n.Minutes } isMinuteHours() { return this.kind() === n.Minutes && d(this.multiplier()) } isDays() { return this.kind() === n.Days } isWeeks() { return this.kind() === n.Weeks } isMonths() { return this.kind() === n.Months } isRange() { return this.kind() === n.Range } isTicks() { return this.kind() === n.Ticks } isTimeBased() { return !this.isRange() } letter() { return this.isValid() && this.kind() !== n.Minutes ? this.kind()[0].toUpperCase() : "" } value() { return this.isValid() ? this.kind() === n.Minutes ? this.multiplier() + "" : this .multiplier() + this.letter() : "" } isEqualTo(e) { if (!(e instanceof h)) throw new Error("Argument is not an Interval"); return !(!this.isValid() || !e.isValid()) && (this.kind() === e.kind() && this .multiplier() === e.multiplier()) } inMilliseconds(e = Date.now()) { if (!this.isValid() || this.isRange()) return NaN; if (this.isMonths()) { const t = new Date(e); t.setUTCMonth(t.getUTCMonth() + (this.multiplier() || 1)); return +t - e } const t = this.multiplier(); return a[this.kind()] * t } static isEqual(e, t) { return e === t || h.parse(e).isEqualTo(h.parse(t)) } static parse(e) { e = (e + "").toUpperCase().split(",")[0]; let t = s.exec(e); return null !== t ? "H" === t[2] ? new h(n.Minutes, 60 * u(t[1])) : new h(l[t[2]], u(t[1])) : (t = r.exec(e), null !== t ? new h(n.Minutes, u(t[1])) : new h(n .Invalid, 0)) } static kind(e) { return h.parse(e).kind() } static isValid(e) { return h.parse(e).isValid() } static isDWM(e) { return h.parse(e).isDWM() } static isIntraday(e) { return h.parse(e).isIntraday() } static isSeconds(e) { return h.parse(e).isSeconds() } static isMinutes(e) { return h.parse(e).isMinutes() } static isMinuteHours(e) { return h.parse(e).isMinuteHours() } static isDays(e) { return h.parse(e).isDays() } static isWeeks(e) { return h.parse(e).isWeeks() } static isMonths(e) { return h.parse(e).isMonths() } static isRange(e) { return h.parse(e).isRange() } static isTicks(e) { return h.parse(e).isTicks() } static isTimeBased(e) { return h.parse(e).isTimeBased() } static normalize(e) { const t = h.parse(e); return t.isValid() ? t.value() : null } } function u(e) { return 0 === e.length ? 1 : parseInt(e, 10) } function d(e) { return e >= 60 && !(e % 60) } }, "M7/j": function(e, t, i) { "use strict"; i.r(t), i.d(t, "itemsRangeIsValid", (function() { return h })), i.d(t, "splitItems", (function() { return u })), i.d(t, "PaneRendererBaseline", (function() { return d })); var s = i("aO4+"), r = i("hBTJ"), n = i("GEp6"), o = i("Zp/P"), a = i("Y7w9"), l = i("cPgM"), c = i("VdBB"); function h(e) { if (0 === e.length) return !1; const t = e.findIndex(e => Object(o.coordinateIsValid)(e.y)); if (-1 === t) return !1; let i = e.length - 1; for (; i > t && !Object(o.coordinateIsValid)(e[i].y);) i--; return !(t > i) } function u(e, t) { const i = [], n = []; let a = null; for (let l = 0; l < e.length; l++) { let c = e[l]; const h = e[l + 1] || {}; if (Object(o.coordinateIsValid)(c.y)) c.y <= t && i.push(c), c.y >= t && n.push(c), a = c; else { if (null === a) continue; c = a } if (Object(o.coordinateIsValid)(h.y) && (c.y > t && h.y < t || c.y < t && h.y > t)) if (Math.abs(c.x - h.x) < 1) { const e = new s.Point(c.x, t); i.push(e), n.push(e) } else { const e = Object(r.intersectLineSegments)(c, h, new s.Point(c.x, t), new s .Point(h.x, t)); if (null !== e) { const t = c.add(h.subtract(c).scaled(e)); i.push(t), n.push(t) } } } return { topItems: i, bottomItems: n } } class d extends l.ScaledPaneRenderer { constructor() { super(...arguments), this._data = null } setData(e) { this._data = e } hitTest(e) { if (null === this._data) return null; const { items: t, topLineWidth: i, bottomLineWidth: r } = this._data, l = Object(o.interactionTolerance)().series + (i + r) / 4, h = Object(a.lowerbound)(t, e, (e, t) => e.x <= t.x), u = Math.max(1, h - 1), d = Math.min(t.length - 1, h + 1); for (let i = u; i <= d; ++i) { const r = t[i - 1], o = t[i], { distance: a } = Object(n.distanceToSegment)(new s.Point(r.x, r.y), new s.Point(o.x, o.y), new s.Point(e.x, e.y)); if (a <= l) return new c.HitTestResult(c.HitTestResult.REGULAR) } return null } _drawImpl(e) { if (null === this._data) return; const { items: t, baseLevelCoordinate: i, bottom: s, bottomFillColor1: r, bottomFillColor2: n, topFillColor1: o, topFillColor2: a, topLineColor: l, bottomLineColor: c, topLineWidth: d, bottomLineWidth: p } = this._data; if (!h(t)) return; const { topItems: _, bottomItems: m } = u(t, i); e.lineCap = "round", e.lineJoin = "round", 0 !== _.length && (e.beginPath(), e .moveTo(_[0].x, i), this._makeLine(e, _, !0, 0), e.closePath(), e .fillStyle = this._makeLinearGradient(e, o, a, i - s, i), e.fill(), e .beginPath(), this._makeLine(e, _, !1, 0), e.lineWidth = d, e .strokeStyle = l, e.stroke()), 0 !== m.length && (e.beginPath(), e .moveTo(m[0].x, i), this._makeLine(e, m, !0, 1), e.closePath(), e .fillStyle = this._makeLinearGradient(e, r, n, i, i + s), e.fill(), e .beginPath(), this._makeLine(e, m, !1, 1), e.lineWidth = p, e .strokeStyle = c, e.stroke()) } _makeLine(e, t, i, s) { if (null === this._data) return; const r = t.findIndex(e => Object(o.coordinateIsValid)(e.y)); if (-1 === r) return; const { barSpacing: n, baseLevelCoordinate: a } = this._data, l = .25 * n; let c; const h = t.length; for (let n = r; n < h; n++) { const h = t[n], u = t[n + 1] || {}; if (Object(o.coordinateIsValid)(h.y)) { if (0 === s) { if (c && c.y >= a && h.y >= a) { e.moveTo(h.x, h.y); continue } } else if (c && c.y <= a && h.y <= a) { e.moveTo(h.x, h.y); continue } if (c && Object(o.coordinateIsValid)(c.y)) e.lineTo(h.x, h.y), i && ! Object(o.coordinateIsValid)(u.y) && e.lineTo(h.x, a); else if (u && Object(o.coordinateIsValid)(u.y)) i ? (n !== r && e .lineTo(h.x, a), e.lineTo(h.x, h.y)) : e.moveTo(h.x, h.y); else if (i) { if (0 === n) continue; n !== r && e.lineTo(h.x - l, a), e.lineTo(h.x - l, h.y), e.lineTo(h .x + l, h.y), e.lineTo(h.x + l, a) } else e.moveTo(h.x - l, h.y), e.lineTo(h.x + l, h.y); c = h } } } _makeLinearGradient(e, t, i, s, r) { const n = e.createLinearGradient(0, s, 0, r); return n.addColorStop(0, t), n.addColorStop(1, i), n } } }, MA5A: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolCrossLine", (function() { return a })); var s = i("Ocx9"), r = i("p1SQ"), n = i("GmZZ"), o = i("Ss5c"); class a extends o.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), this._priceAxisView = new r .LineToolHorzLinePriceAxisView(this), this._timeAxisView = new n.a(this), i .e("lt-pane-views").then(i.bind(null, "amUF")).then(({ CrossLinePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 1 } name() { return "Cross Line" } priceAxisViews(e, t) { return this.isSourceHidden() ? null : t === this.priceScale() && this .properties().showPrice.value() && this._model.paneForSource(this) === e ? [ this._priceAxisView ] : null } timeAxisViews() { return this.isSourceHidden() ? null : this.properties().showTime.value() ? [this ._timeAxisView ] : null } updateAllViews() { super.updateAllViews(), this._priceAxisView.update(), this._timeAxisView .update() } canHasAlert() { return !1 } lineColor() { return this.properties().linecolor.value() } lineWidth() { return this.properties().linewidth.value() } lineStyle() { return this.properties().linestyle.value() } static createProperties(e) { const t = new s.DefaultProperty("linetoolcrossline", e); return a._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "xrdl")).then( e => e.CrossLineDefinitionsViewModel) } static _configureProperties(e) { o.LineDataSource._configureProperties(e) } } }, MROS: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ModelSelection", (function() { return o })); var s = i("Y7w9"), r = i("GxN8"), n = i("CW80"); class o { constructor() { this._items = [], this._set = new Set } isEmpty() { return 0 === this._items.length } add(e) { if (this._items.length > 0 && !Object(n.isLineTool)(this._items[0]) && this.clear(), Object(n.isLineTool)(e)) { const t = Object(s.lowerbound)(this._items, e, (e, t) => e.zorder() < t .zorder()); this._items.splice(t, 0, e) } else this.clear(), this._items = [e]; this._set.add(e) } canBeAddedToSelection(e) { return 0 === this._items.length || Object(n.isLineTool)(this._items[0]) && Object(n .isLineTool)(e) } isSelected(e) { return this._set.has(e) } allSources() { return this._items.slice(0) } dataSources() { return this._items.filter(r.a) } lineDataSources() { return this._items.filter(n.isLineTool) } customSources() { return this._items.filter(e => !Object(r.a)(e)) } checkLineToolSelection() { this._items.forEach(e => Object(n.isLineTool)(e) && e.calcIsActualSymbol()), this ._items = this._items.filter(e => !Object(n.isLineTool)(e) || e .isActualSymbol()) } remove(e) { this._items = this._items.filter(t => t !== e), this._set.delete(e) } clear() { this._items = [], this._set.clear() } notFixedSources() { return this._items.filter(e => !Object(n.isLineTool)(e) || !e.isFixed()) } } }, MSvv: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyLineDataSource", (function() { return g })); var s = i("Eyy1"), r = i("ogJP"), n = i("k9/m"), o = i("Ss5c"), a = i("Ocx9"), l = i("0YCj"), c = i.n(l), h = i("jenN"), u = i("ZAxB"), d = i("gvrv"), p = i("w4Ji"), _ = i("GVHu"), m = i("jCNj"), f = i("OLhd"); class g extends o.LineDataSource { constructor(e, t, s, r) { super(e, r), this._indexes = null, this._inputs = null, this._pointsetPoints = null, this._loadedPlots = null, this._loadedGraphics = null, this ._beingCreatedPaneView = null, this._anchorsPaneView = null, this ._definitionsViewModel = null, this._alignerCache = null, Promise.all([i.e( "lt-pane-views").then(i.bind(null, "pGCE")), i.e( "lt-pane-views").then(i.bind(null, "AOzI"))]).then(t => { const { LineToolBeingCreatedPaneView: i } = t[0], { StudyLineDataSourceAnchorsPaneView: s } = t[1]; this._beingCreatedPaneView = new i(this, e), this._anchorsPaneView = new s(this, this.model()), this._model.lightUpdate() }), this._metaInfo = t, this._dataSource = new d.a(e.chartApi(), e .mainSeries().seriesSource(), s, t), this._dataSource.dataCleared() .subscribe(this, this._onDataCleared), this._dataSource.dataUpdated() .subscribe(this, this._onDataUpdated) } destroy() { this._dataSource.dataUpdated().unsubscribe(this, this._onDataUpdated), this ._dataSource.dataCleared().unsubscribe(this, this._onDataCleared), this ._dataSource.destroy(), null !== this._definitionsViewModel && (this ._definitionsViewModel.destroy(), this._definitionsViewModel = null), this._unsubscribeApplyInputsOnSeriesCompleted(), this._isDestroyed = !0, super.destroy() } stop() { super.stop(), this._isDestroyed || (this._dataSource.stop(), this.clearData()) } start() { super.start(), this._isDestroyed || null === this._inputs || this._dataSource .start() } metaInfo() { return this._metaInfo } graphicsInfo() { return this._metaInfo.graphics } series() { return this._model.mainSeries() } translatedType() { return this._metaInfo.description } name() { return this._metaInfo.description } studyId() { return this._metaInfo.id } setPoint(e, t, i) { super.setPoint(e, this._preparePoint(t, i)) } move(e) {} clearData() { this._clearAllDataExceptPointsetPoints(), this._pointsetPoints = null, this .updateAllViews() } data() { return this.plots() } plots() { return this._loadedPlots || this._dataSource.plots() } graphics() { return this._loadedGraphics || this._dataSource.graphics() } firstValue() { return this._model.mainSeries().firstValue() } state(e) { const t = super.state(e); let i; this.metaInfo() instanceof c.a ? i = this.metaInfo().state() : (i = Object(r .clone)(this.metaInfo()), i.id = c.a.parseIdString(i.id + (i .version ? "-" + i.version : "")).fullId); const s = { ...t, metaInfo: i }; return e && (s.data = this.plots().state(), s.nonseriesindexes = this._indexes, s.graphics = Object(h.saveStudyGraphics)(this.graphics())), s } restoreData(e) { void 0 !== e.data && (this._loadedPlots = new n.PlotList(Object(p .studyPlotFunctionMap)(this._metaInfo), p .studyEmptyPlotValuePredicate), this._loadedPlots.restoreState(e .data)), this._indexes = e.nonseriesindexes ? e.nonseriesindexes : null, this._loadedGraphics = e.graphics ? Object(h.loadStudyGraphics)(e .graphics) : null } getPropertyDefinitionsViewModel() { return null === this._definitionsViewModel ? this ._getPropertyDefinitionsViewModelClass().then(e => null === e || this ._isDestroyed ? null : (null === this._definitionsViewModel && (this ._definitionsViewModel = new e(this._model.undoModel(), this)), this._definitionsViewModel)) : Promise.resolve(this ._definitionsViewModel) } paneViews(e) { let t = []; if (this.isSourceHidden()) return t; if (this._isReady() && this._changeStatesStack.isEmpty()) { const i = super.paneViews(e); null !== i && (t = t.concat(i)) } else null !== this._beingCreatedPaneView && t.push(this ._beingCreatedPaneView); return null !== this._anchorsPaneView && t.push(this._anchorsPaneView), t } propertiesChanged(e) { super.propertiesChanged(e), this._onStudyInputsMayChange() } dataAndViewsReady() { return super.dataAndViewsReady() && this._isReady() } endChanging(e, t) { const i = super.endChanging(e, t); return i.indexesChanged ? this.clearData() : this._updateAnchorsPrice(), i } moveData(e) { this._dataSource.moveData(e) } static createPropertiesFromStudyMetaInfoAndState(e, t, i, s) { const r = Object(_.prepareStudyPropertiesForLoadChart)(e, t, i, null, s); return g._configureProperties(r), r } _isReady() { return !0 } _updateAllPaneViews() { var e, t; super._updateAllPaneViews(), null === (e = this._beingCreatedPaneView) || void 0 === e || e.update(), null === (t = this._anchorsPaneView) || void 0 === t || t.update() } _getPointTime(e, t) { const i = e.index, s = this._model.timeScale().indexToTimePoint(i); if (null !== s) return s; if (t || void 0 === e.time) return null; const r = this._model.mainSeries().symbolInfo(); if (null === r) return null; let n = this._model.properties().timezone.value(); "exchange" === n && (n = r.timezone); const o = Object(m.cal_to_utc)(Object(m.get_timezone)(n), e.time); return this._getStartBarAligner()(o) / 1e3 } _updateAnchorsPrice() {} _onPointsetUpdated(e) { super._onPointsetUpdated(e), this._pointsetPoints = this._points.map(e => ({ price: e.price, index: e.index, time: e.time })), this._onStudyInputsMayChange() } _onDataCleared() { this.updateAllViews(), this._model.updateSource(this) } _onDataUpdated(e, t, i) { this._updateAnchorsPrice(), this.updateAllViews(), this._model.updateSource( this) } _onStudyInputsMayChange() { let e = null; null !== this._pointsetPoints && this._pointsetPoints.length === this .pointsCount() && (e = this._studyInputs(this._pointsetPoints), null === e && (this._clearAllDataExceptPointsetPoints(), this.updateAllViews())), this._areInputsEqual(this._inputs, e) || this._applyStudyInputs(e) } _onMainSeriesSymbolResolved() { super._onMainSeriesSymbolResolved(), this._alignerCache = null } _preparePoint(e, t) { return super._preparePoint(this._alignPointToRangeOfActualData(e), t) } _getPropertyDefinitionsViewModelClass() { return Promise.resolve(null) } _subscribeApplyInputsOnSeriesCompleted() { this._unsubscribeApplyInputsOnSeriesCompleted(), this._model.mainSeries() .dataEvents().completed().subscribe(this, () => this ._onStudyInputsMayChange(), !0) } _unsubscribeApplyInputsOnSeriesCompleted() { this._model.mainSeries().dataEvents().completed().unsubscribeAll(this) } static _createPropertiesFromStudyIdAndState(e, t) { const i = c.a.getStudyPropertyRootNameById(e), s = new a.DefaultProperty(i, t); return g._configureProperties(s), s } static _createPropertiesFromStudyMetaInfo(e, t) { const i = Object(_.prepareStudyProperties)(e, null, null, t); return g._configureProperties(i), i } static _configureProperties(e) { o.LineDataSource._configureProperties(e) } _areInputsEqual(e, t) { return null === t ? null === e : null !== e && Object(u.a)(this._metaInfo .inputs, e, t) } _applyStudyInputs(e) { const t = this._inputs; this._inputs = e, null !== e && (this ._unsubscribeApplyInputsOnSeriesCompleted(), this._dataSource.setInputs( e), null === t && this.isStarted() && !this._dataSource.isStarted() && this ._dataSource.start()) } _clearAllDataExceptPointsetPoints() { this._inputs = null, this._dataSource.clearData(), this._loadedPlots = null, this._indexes = null, this._loadedGraphics = null } _getStartBarAligner() { const e = this._model.mainSeries().interval(); return null !== this._alignerCache && this._alignerCache.resolution === this ._model.mainSeries().interval() || (this._alignerCache = { resolution: e, aligner: Object(f.createTimeToBarTimeAligner)(e, Object(s .ensureNotNull)(this._model.mainSeries().symbolInfo())) }), this._alignerCache.aligner } } }, MWAT: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PriceScaleSelectionStrategyEvenly", (function() { return o })), i.d(t, "PriceScaleSelectionStrategyAllRight", (function() { return a })), i.d(t, "PriceScaleSelectionStrategyAllLeft", (function() { return l })), i.d(t, "createPriceScaleSelectionStrategy", (function() { return h })), i.d(t, "allPriceScaleSelectionStrategyInfo", (function() { return u })); var s = i("Eyy1"), r = i("3ClC"); class n { constructor(e) { this._priceScalesLimit = 8, this._metaInfo = e } metaInfo() { return this._metaInfo } findSuitableScale(e, t, i, s) { if (void 0 !== s) return this._tryToGetDesiredPriceScale(e, t, s, i); if (Object(r.isStudy)(t)) { const s = t.metaInfo(); if ("Volume" === s.shortId && e.containsMainSeries()) return e .createPriceScaleAtPosition("overlay"); const n = t.desiredPriceScalePosition(); if (null !== n) return this._tryToGetDesiredPriceScale(e, t, n, i); if (void 0 !== i && (Object(r.isStudy)(i) || e.isMainPane()) && s .is_price_study) return this._getPriceScaleTheSameAsForSource(i, e) } let n = !1; if (Object(r.isStudy)(t)) { const i = t.metaInfo().groupingKey; if (void 0 !== i) { const t = e.model().findNonOverlayStudyWithGroupingKey(i, e); if (null !== t) return this._getPriceScaleTheSameAsForSource(t.study, t .pane) } n = Boolean(t.metaInfo().is_price_study) } else t === e.model().mainSeries() && (n = !0); if (n) { const t = this._findFirstScaleForPriceStudy(e); if (null !== t) return t } return this.createNewPriceScaleIfPossible(e) } canCreateNewPriceScale(e) { return e.leftPriceScales().length + e.rightPriceScales().length < this ._priceScalesLimit } _getPriceScaleTheSameAsForSource(e, t) { return t.isOverlay(e) ? t.createPriceScaleAtPosition("overlay") : Object(s .ensureNotNull)(e.priceScale()) } _priceScaleIsPrice(e, t) { const i = e.mainSource(); return !!i && (i === t.mainSeries() || !!Object(r.isStudy)(i) && Boolean(i .metaInfo().is_price_study)) } _findFirstScaleForPriceStudy(e) { const t = e.model(); for (let i = 0; i < this._priceScalesLimit; i++) { if (e.rightPriceScales().length > i && this._priceScaleIsPrice(e .rightPriceScales()[i], t)) return e.rightPriceScales()[i]; if (e.leftPriceScales().length > i && this._priceScaleIsPrice(e .leftPriceScales()[i], t)) return e.leftPriceScales()[i] } return null } _targetPriceScaleIndex(e, t) { if (e.mainSource() === t.mainSeries()) return 0 } _tryToGetDesiredPriceScale(e, t, i, r) { switch (i) { case "left": return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition( "left") : e.createPriceScaleAtPosition("overlay"); case "right": return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition( "right") : e.createPriceScaleAtPosition("overlay"); case "as-series": return void 0 !== r ? Object(s.ensureNotNull)(r.priceScale()) : e .isMainPane() ? Object(s.ensureNotNull)(Object(s.ensureNotNull)(e .mainDataSource()).priceScale()) : this .createNewPriceScaleIfPossible(e); case "overlay": return e.createPriceScaleAtPosition("overlay") } } } class o extends n { constructor(e) { super(e) } apply(e) { if (e.containsMainSeries()) { const t = Object(s.ensureNotNull)(Object(s.ensureNotNull)(e.mainDataSource()) .priceScale()); e.movePriceScale(t, "right", 0) } const t = e.model(); for (; e.leftPriceScales().length > e.rightPriceScales().length;) { const i = e.leftPriceScales()[e.leftPriceScales().length - 1]; e.movePriceScale(i, "right", this._targetPriceScaleIndex(i, t)) } for (; e.rightPriceScales().length - e.leftPriceScales().length > 1;) { const i = e.rightPriceScales()[e.rightPriceScales().length - 1]; e.movePriceScale(i, "left", this._targetPriceScaleIndex(i, t)) } } createNewPriceScaleIfPossible(e) { if (!this.canCreateNewPriceScale(e)) return e.createPriceScaleAtPosition("overlay"); const t = e.leftPriceScales().length < e.rightPriceScales().length ? "left" : "right"; return e.createPriceScaleAtPosition(t) } } class a extends n { constructor(e) { super(e) } apply(e) { const t = e.model(); e.leftPriceScales().slice(0).forEach(i => e.movePriceScale(i, "right", this ._targetPriceScaleIndex(i, t))) } createNewPriceScaleIfPossible(e) { return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition("right") : e .createPriceScaleAtPosition("overlay") } } class l extends n { constructor(e) { super(e) } apply(e) { const t = e.model(); e.rightPriceScales().slice(0).forEach(i => e.movePriceScale(i, "left", this ._targetPriceScaleIndex(i, t))) } createNewPriceScaleIfPossible(e) { return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition("left") : e .createPriceScaleAtPosition("overlay") } } const c = [{ name: "left", title: window.t("Stack On The Left"), ctor: l }, { name: "right", title: window.t("Stack On The Right"), ctor: a }, { name: "auto", title: window.t("Auto"), ctor: o }]; function h(e) { const t = Object(s.ensureDefined)(c.find(t => t.name === e)); return new t.ctor(t) } function u() { return c } }, MXV9: function(e, t) { e.exports = '' }, MY2c: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return l })); var s = i("RDU5"), r = i("aIyQ"), n = i.n(r), o = i("txPx"); const a = Object(o.getLogger)("Common.UndoStack"); class l { constructor() { this._commands = [], this._onChange = new n.a } onChange() { return this._onChange } isEmpty() { return 0 === this._commands.length } clear() { this.isEmpty() || (this._commands.length = 0, this._onChange.fire()) } push(e) { if (!(e instanceof s.UndoCommand)) throw new TypeError( "argument must be an instance of UndoCommand"); this._commands.push(e), this._onChange.fire(e) } pop() { if (this.isEmpty()) return void a.logDebug("pop: undo stack is empty"); const e = this._commands.pop(); return this._onChange.fire(e), e } head() { if (!this.isEmpty()) return this._commands[this._commands.length - 1] } } }, MbIA: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); var s = i("4kQX"), r = i("gQ5K"); const n = { dateFormat: "yyyy-MM-dd", timeFormat: "%h:%m:%s", dateTimeSeparator: " " }; class o { constructor(e = {}) { const t = Object.assign({}, n, e); this._dateFormatter = new r.DateFormatter(t.dateFormat), this._timeFormatter = new s .TimeFormatter(t.timeFormat), this._separator = t.dateTimeSeparator } format(e) { return `${this._dateFormatter.format(e)}${this._separator}${this._timeFormatter.format(e)}` } formatLocal(e) { return `${this._dateFormatter.formatLocal(e)}${this._separator}${this._timeFormatter.formatLocal(e)}` } } }, MrEN: function(e, t, i) { "use strict"; var s = i("aIyQ"), r = function(e, t) { this._server = e, this._session = t, this.seriesCompleted = new s, this.seriesError = new s }; r.prototype.onRequestMetadata = function(e, t) { this._server.receiveLocalResponse({ method: "studies_metadata", params: [this._session, e, { errors: [], hash: "", metainfo: t, migrations: [] }] }) }, r.prototype.onSymbolResolved = function(e, t) { this._server.receiveLocalResponse({ method: "symbol_resolved", params: [this._session, e, t] }) }, r.prototype.onSymbolError = function(e, t) { this._server.receiveLocalResponse({ method: "symbol_error", params: [this._session, e, t] }) }, r.prototype.onStudyError = function(e, t, i) { this._server.receiveLocalResponse({ method: "study_error", params: [this._session, e, t, i] }) }, r.prototype.onSeriesLoading = function(e, t) { this._server.receiveLocalResponse({ method: "series_loading", params: [this._session, e, t] }) }, r.prototype.onSeriesCompleted = function(e, t, i) { this._server.receiveLocalResponse({ method: "series_completed", params: [this._session, e, i, t] }), this.seriesCompleted.fire(e, t) }, r.prototype.onSeriesError = function(e, t, i) { this._server.receiveLocalResponse({ method: "series_error", params: [this._session, e, t, i] }), this.seriesError.fire(e, t) }, r.prototype.onStudyCompleted = function(e, t) { this._server.receiveLocalResponse({ method: "study_completed", params: [this._session, e, t] }) }, r.prototype.onStudyLoading = function(e, t) { this._server.receiveLocalResponse({ method: "study_loading", params: [this._session, e, t] }) }, r.prototype.onTickmarksUpdated = function(e, t) { var i = { method: "tickmark_update", params: [this._session, { index: e, zoffset: 0, changes: [], marks: t, index_diff: [] }] }; this._server.receiveLocalResponse(i) }, r.prototype.onTimescaleUpdate = function(e, t) { var i = { method: "timescale_update", params: [this._session, this._prepareDataUpdateObjects(t), { index: e.pointsIndex, zoffset: 0, changes: e.points, marks: e.marks, index_diff: e.indexChange, baseIndex: e.baseIndex }] }; this._server.receiveLocalResponse(i) }, r.prototype.onTimescaleCompleted = function(e) { this._server.receiveLocalResponse({ method: "timescale_completed", params: [this._session, e] }) }, r.prototype.onSeriesTimeframeUpdate = function(e, t, i, s, r) { var n = { method: "series_timeframe", params: [this._session, e, t, i, s, null, !0, r] }; this._server.receiveLocalResponse(n) }, r.prototype.onPointsetDataUpdate = function(e, t, i) { this.onDataUpdate(e, t, i, null) }, r.prototype._prepareDataUpdateObjects = function(e) { var t = {}; return e.forEach((function(e) { t[e.objId] = { series: e.data, turnaround: e.turnaround }, e.nonSeriesData && (e.nonSeriesData.data ? t[e.objId] .nonseries = { d: JSON.stringify(e.nonSeriesData.data), indexes: e.nonSeriesData.indexes } : t[e.objId].nonseries = { d: "", indexes: [] }) })), t }, r.prototype.onDataUpdate = function(e, t, i, s) { var r = { method: "data_update", params: [this._session, this._prepareDataUpdateObjects([{ objId: e, turnaround: t, data: i, nonSeriesData: s }])] }; this._server.receiveLocalResponse(r) }, r.prototype.onQuotesData = function(e) { this._server.receiveLocalResponse({ method: "quote_symbol_data", params: e }) }, r.prototype.onDepthData = function(e) { this._server.receiveLocalResponse({ method: "dd", params: e }) }, r.prototype.onDepthUpdate = function(e) { this._server.receiveLocalResponse({ method: "dpu", params: e }) }, r.prototype.onClearData = function(e) { this._server.receiveLocalResponse({ method: "clear_data", params: [this._session, e] }) }, TradingView.ChartapiMessagerInstances = [], e.exports = r }, "N+BX": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolBezierCubic", (function() { return n })); var s = i("Ocx9"), r = i("Ss5c"); class n extends r.LineDataSource { constructor(e, t) { const s = t || n.createProperties(); super(e, s), this._controlPoints = null, i.e("lt-pane-views").then(i.bind(null, "a6on")).then(t => { this._setPaneViews([new t.BezierCubicPaneView(this, e)]) }) } pointsCount() { return 2 } name() { return "Double Curve" } properties() { return super.properties() } setLastPoint(e, t) { super.setLastPoint(e, t), this._controlPoints = this._calculateControlPoints() } addPoint(e, t, i) { const s = super.addPoint(e, t, i); if (s) { const e = this._calculateControlPoints(); this._controlPoints = null, this._points.push(e[0]), this._points.push(e[ 1]), i || (this.normalizePoints(), this.createServerPoints()), this ._createPointProperty(2), this._createPointProperty(3) } return s } restorePoints(e, t, i) { super.restorePoints(e, t, i), this._createPointProperty(2), this ._createPointProperty(3) } controlPoints() { return this._controlPoints } static createProperties(e) { const t = new s.DefaultProperty("linetoolbeziercubic", e); return n._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "b4fl")).then( e => e.GeneralBezierDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e) } _calculateControlPoints() { const e = this.pointToScreenPoint(this.points()[0])[0], t = this.pointToScreenPoint(this.points()[1])[0], i = t.subtract(e).scaled(.5).transposed().scaled(.3), s = e.add(t).scaled(.33), r = e.add(t).scaled(.67), n = s.add(i), o = r.subtract(i); return [this.screenPointToPoint(n), this.screenPointToPoint(o)] } } }, N1UO: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyApi", (function() { return v })); var s = i("Eyy1"), r = i("aIyQ"), n = i.n(r), o = i("ogJP"), a = i("9iCb"), l = i("xo8u"), c = i("gaBL"), h = i("HGup"), u = i("jRfx"), d = i("/ToI"), p = i("HZKX"), _ = i("SwuQ"), m = i("Yt+L"), f = i("GD+X"), g = i("bmVy"), b = i("pZDF"); class v { constructor(e, t) { this._onStudyCompleted = new n.a, this._onStudyError = new n.a, this._study = e, this._chartWidget = t, this._undoModel = this._chartWidget.model(), this ._model = this._undoModel.model(), this._study.onAboutToBeDestroyed().subscribe( this, () => { this._study.onStatusChanged().unsubscribeAll(this), this._study .onAboutToBeDestroyed().unsubscribeAll(this) }), this._study.onStatusChanged().subscribe(this, e => { switch (e.type) { case g.StudyStatusType.Completed: this._onStudyCompleted.fire(); break; case g.StudyStatusType.Error: this._onStudyError.fire() } }) } isUserEditEnabled() { return this._study.userEditEnabled() } setUserEditEnabled(e) { this._study.setUserEditEnabled(e) } getInputsInfo() { return Object(b.getStudyInputsInfo)(this._study.metaInfo()) } getInputValues() { const e = this._study.inputs({ symbolsForChartApi: !1, asObject: !0 }); return Object.keys(e).map(t => { const i = e[t]; return { id: t, value: Object(o.isObject)(i) ? i.v : i } }) } setInputValues(e) { const t = this.getInputValues(); for (const i of e) { void 0 !== t.find(e => e.id === i.id) ? this._study.properties().inputs[i.id] .setValue(i.value) : console.warn(`There is no such input: "${i.id}"`) } } mergeUp() { this._model.isMergeUpAvailableForSource(this._study) && new u.c(this._model, this ._study, "").redo() } mergeDown() { this._model.isMergeDownAvailableForSource(this._study) && new u.a(this._model, this ._study, "").redo() } unmergeUp() { this._model.isUnmergeAvailableForSource(this._study) && new h.c(this._model, this ._study, "").redo() } unmergeDown() { this._model.isUnmergeAvailableForSource(this._study) && new h.a(this._model, this ._study, "").redo() } onDataLoaded() { return this._onStudyCompleted } onStudyError() { return this._onStudyError } mergeUpWithUndo() { this._model.isMergeUpAvailableForSource(this._study) && this._undoModel .mergeSourceUp(this._study) } mergeDownWithUndo() { this._model.isMergeDownAvailableForSource(this._study) && this._undoModel .mergeSourceDown(this._study) } unmergeUpWithUndo() { this._model.isUnmergeAvailableForSource(this._study) && this._undoModel .unmergeSourceUp(this._study) } unmergeDownWithUndo() { this._model.isUnmergeAvailableForSource(this._study) && this._undoModel .unmergeSourceDown(this._study) } priceScale() { return new f.a(this._undoModel, Object(s.ensureNotNull)(this._study.priceScale())) } symbolSource() { const e = Object(s.ensureNotNull)(this._study.symbolSource()); return { symbol: e.symbol(), currencyId: e.currency(), unitId: e.unit() } } changePriceScale(e) { const t = Object(s.ensureNotNull)(this._model.paneForSource(this._model .mainSeries())), i = Object(s.ensureNotNull)(this._model.paneForSource(this._study)); switch (e) { case "no-scale": Object(s.assert)(i.actionNoScaleIsEnabled(this._study), "Unable to leave a pane without any non-overlay price scale"), new d .b(this._model, this._study, i, "overlay", "").redo(); break; case "as-series": Object(s.assert)(i === t, "Study should be on the main pane"), new d.a(this ._model, this._study, i, this._model.mainSeries().priceScale(), "") .redo(); break; case "new-left": new d.b(this._model, this._study, i, "left", "").redo(); break; case "new-right": new d.b(this._model, this._study, i, "right", "").redo(); break; default: const r = this._model.dataSourceForId(e); if (null === r) throw new Error(`There is no study with entityId='${e}'`); const n = i === this._model.paneForSource(r); Object(s.assert)(n, "Both studies should be on the same pane"); const o = Object(s.ensureNotNull)(r.priceScale()), a = Object(c.sourceNewCurrencyOnPinningToPriceScale)(this._study, o, this._model), h = Object(_.sourceNewUnitOnPinningToPriceScale)(this._study, o, this ._model); new d.a(this._model, this._study, i, o, "").redo(), null !== a && new l.a(o, a, this._undoModel.chartWidget(), "").redo(), null !== h && new m.a( o, h, this._undoModel.chartWidget(), "").redo() } } isVisible() { return this._study.properties().visible.value() } setVisible(e) { this._study.properties().visible.setValue(e) } bringToFront() { this._model.bringToFront([this._study]) } sendToBack() { this._model.sendToBack([this._study]) } applyOverrides(e) { Object(a.applyOverridesToStudy)(this._study, e) } dataLength() { return this._study.status().type !== g.StudyStatusType.Completed ? 0 : this._study .metaInfo().plots.length > 0 ? this._study.data().size() : this._model .mainSeries().bars().size() } isLoading() { return this._study.isLoading() } async applyToEntireLayout() { const e = new p.ActionsProvider(this._chartWidget), t = (await e.contextMenuActionsForSources([this._study])).find(e => "applyStudyToEntireLayout" === e.id); t && t.execute() } } }, N22A: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("eqEH"); const r = { id: "TradingService" }; function n() { return Object(s.hasService)(r) ? Object(s.service)(r) : null } }, NJRZ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineTool5PointsPattern", (function() { return a })); var s = i("Eyy1"), r = i("Ocx9"), n = i("Ss5c"), o = i("j3hX"); class a extends n.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), this._loadPaneViews(e) } pointsCount() { return 5 } name() { return "XABCD Pattern" } properties() { return super.properties() } static createProperties(e) { const t = new r.DefaultProperty("linetool5pointspattern", e); return a._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then( e => e.PatternWithBackgroundDefinitionViewModel) } _loadPaneViews(e) { i.e("lt-pane-views").then(i.bind(null, "6MfG")).then(t => { this._setPaneViews([new t.Pattern5pointsPaneView(this, e)]) }) } static _configureProperties(e) { n.LineDataSource._configureProperties(e), e.addChild("linesColors", new o .LineToolColorsProperty([Object(s.ensureDefined)(e.child("color"))])), e .addChild("textsColors", new o.LineToolColorsProperty([Object(s .ensureDefined)(e.child("textcolor"))])) } } }, NSoL: function(e, t, i) { "use strict"; i.r(t), i.d(t, "clientSnapshot", (function() { return y })); var s = i("aO4+"), r = i("eJTA"), n = i("zM7N"), o = i("Y7w9"), a = i("ikwP"), l = i("zDbI"), c = i("XlJ7"), h = i("EsvI"), u = i("Dq3s"), d = i("Kxc7"), p = i("4GHa"); const _ = !d.enabled("widget_logo"); function m(e, t = null, i = null) { let s = {}; if ("number" == typeof e) return { relativePositions: { [e]: { l: t, t: i } }, nextElementLeft: e, nextElementTop: e }; const [r, ...n] = e; if ("v" === r) { let e = null; for (const r of n) { const n = m(r, t, i); s = { ...s, ...n.relativePositions }, i = n.nextElementTop, e = n.nextElementLeft } t = e } if ("h" === r) { let e = null; for (const r of n) { const n = m(r, t, i); s = { ...s, ...n.relativePositions }, t = n.nextElementLeft, e = n.nextElementTop } i = e } return { relativePositions: s, nextElementTop: i, nextElementLeft: t } } const f = function(e) { const t = {}; for (const i of Object.keys(e)) { const s = m(e[i]).relativePositions; t[i] = s } return t }(u); function g(e, t, i, s) { return Object(a.drawScaled)(e, s, () => { e.fillText(i, t.x / s, t.y / s) }), e.measureText(i).width * s } function b(e) { return e.map(e => ({ ...e, title: "" })) } function v(e, t) { const i = [{ text: e.trim() }]; for (const e of t) e.visible && ("" !== i[i.length - 1].text && i.push({ text: " " }), e.title && i.push({ text: e.title }), i.push({ text: e.value, color: e.color })); return i } class S { constructor(e, t) { this._logoTextColor = null, this._snapshotData = e, t = t || {}, this._options = { backgroundColor: h.themes[e.theme].getThemedColor("color-bg-primary"), borderColor: h.themes[e.theme].getThemedColor("color-border"), font: l.CHART_FONT_FAMILY, fontSize: 12, legendMode: "vertical", hideResolution: !1, header: void 0, ...t }; const i = f[e.layout], s = e.charts.map(e => function(e) { const t = e.panes[0], i = t.canvas.width + t.leftAxis.canvas.width + t.rightAxis.canvas .width; let s = 0; for (const t of e.panes) s += t.canvas.height; return void 0 !== e.timeAxis && (s += e.timeAxis.canvas.height), new a .Size(i, s) }(e)); if (this._pixelRatio = e.hidpiRatio, this._chartsGeometry = e.charts.map((e, t) => function e(t, i, s, r) { let n = Math.round(10 * r), o = Math.round(10 * r); const a = s[t]; if (null !== a.l) { const t = e(a.l, i, s, r); n = t.x + t.width + Math.round(5 * r) } if (null !== a.t) { const t = e(a.t, i, s, r); o = t.y + t.height + Math.round(5 * r) } const l = i[t]; return { x: n, y: o, width: l.w, height: l.h } }(t, s, i, this._pixelRatio)), !_) { let i = e.theme; void 0 !== t.backgroundColor && (i = "black" === Object(r.rgbToBlackWhiteString) (Object(r.parseRgb)(t.backgroundColor), 150) ? n.a.Dark : n.a.Light), this._logoTextColor = h.themes[i].getThemedColor("color-text-primary") } this._headerDefaultTextColor = h.themes[e.theme].getThemedColor( "color-text-primary") } async getImage() { const e = this._pixelRatio; let t = 0, i = 0, r = 0; if (this._options.header) { r = Math.ceil(1.4 * this._options.fontSize * e) * this._options.header.length } i += r; let n = 0, o = 0; for (const e of this._chartsGeometry) n = Math.max(n, e.x + e.width), o = Math.max( o, e.y + e.height); const h = i; t += n, i += o, t += Math.round(10 * e); const u = _ ? Math.round(10 * e) : Math.round(35 * e), d = i; i += u; const m = Object(a.createDisconnectedCanvas)(document, new a.Size(t, i), 1), f = Object(a.getContext2D)(m); f.font = Object(c.makeFont)(this._options.fontSize, this._options.font), f .textBaseline = "top", f.fillStyle = this._options.backgroundColor, f.fillRect( 0, 0, t, i), this._options.header && this._drawHeader(f, t, new s.Point(Math .round(10 * e), Math.round(10 * e))); for (let e = 0; e < this._snapshotData.charts.length; ++e) { const t = this._snapshotData.charts[e], i = this._chartsGeometry[e]; this._drawChart(t, i, f, new s.Point(0, h)) } if (null !== this._logoTextColor) { const t = await function(e, t, i) { var s; const r = (new DOMParser).parseFromString(p, "image/svg+xml"); null === (s = null == r ? void 0 : r.firstElementChild) || void 0 === s || s .setAttribute("color", i); const n = URL.createObjectURL(new Blob([(new XMLSerializer) .serializeToString(r) ], { type: "image/svg+xml" })); return new Promise(i => { const s = new Image; s.width = e, s.height = t, s.onload = () => { i({ image: s, width: e, height: t }) }, s.src = n }) }(Math.round(20 * e), Math.round(15 * e), this._logoTextColor); f.fillStyle = this._logoTextColor, f.font = Object(c.makeFont)(13, l .CHART_FONT_FAMILY); const i = d + Math.round(u / 2 - t.height / 2); ! function(e, t, i, s, r) { e.save(), e.drawImage(s.image, t, i, s.width, s.height), e.textBaseline = "bottom"; const n = (t + s.width) / r + 3, o = (i + s.height) / r; Object(a.drawScaled)(e, r, () => { e.fillText("TradingView", n, o) }), e.restore() }(f, Math.round(10 * e), i, t, e) } return m } _drawChart(e, t, i, r) { i.save(), i.translate(t.x + r.x, t.y + r.y); let n = 0; for (const t of e.panes) { let r = 0; const o = t.leftAxis.canvas.width + Math.round(8 * this._pixelRatio), a = n, l = n + Math.round(10 * this._pixelRatio); t.leftAxis.contentWidth > 0 && (i.drawImage(t.leftAxis.canvas, r, n), r += t.leftAxis.canvas.width), i.drawImage(t.canvas, r, n), r += t .canvas.width, t.rightAxis.contentWidth > 0 && i.drawImage(t.rightAxis .canvas, r, n), "pane" === t.type && (i.fillStyle = e.colors.text, this ._drawLegend(t, i, new s.Point(o, l), a)), n += t.canvas.height } if (void 0 !== e.timeAxis) { let t = 0; e.timeAxis.lhsStub.contentWidth > 0 && (i.drawImage(e.timeAxis.lhsStub.canvas, t, n), t += e.timeAxis.lhsStub.canvas.width), i.drawImage(e.timeAxis .canvas, t, n), t += e.timeAxis.canvas.width, e.timeAxis.rhsStub .contentWidth > 0 && i.drawImage(e.timeAxis.rhsStub.canvas, t, n) } i.strokeStyle = this._options.borderColor, i.strokeRect(0, 0, t.width, t.height), i .restore() } _drawHeader(e, t, i) { const { header: r } = this._options; if (!r) return; e.save(), e.fillStyle = this._headerDefaultTextColor; const n = Math.ceil(1.4 * this._options.fontSize * this._pixelRatio); r.forEach((r, o) => { this._drawLegendLine(e, new s.Point(i.x, i.y + n * o), t, [{ ...r, text: r.text.trim() }], !0) }), e.restore() } _drawLegend(e, t, i, r) { let n = !0; const o = Math.ceil(1.4 * this._options.fontSize * this._pixelRatio); let a = i.x, l = i.y; if (e.mainSeriesText && l + o < r + e.canvas.height) { const i = this._drawLegendLine(t, new s.Point(a, l), e.contentWidth * this ._pixelRatio, v(e.mainSeriesText, e.mainSeriesValues), !0); "horizontal" !== this._options.legendMode ? l += o : (a = i + 1.4 * this ._options.fontSize * this._pixelRatio, n = !1) } for (let c = 0; c < e.studies.length; ++c) if (l + o < r + e.canvas.height) { const r = e.studies[c], h = e.studiesValues[c]; let u = null; for (; null === u;) u = this._drawLegendLine(t, new s.Point(a, l), e .contentWidth * this._pixelRatio, v(r, b(h)), n), "horizontal" !== this._options.legendMode ? l += o : null === u ? (n = !0, a = i.x, l += o) : (a = u + 1.4 * this._options.fontSize * this._pixelRatio, n = ! 1) } } _drawLegendLine(e, t, i, r, n) { const a = r.map(e => e.text).join(""); let l = t.x; const c = function(e, t, i, s) { if (e.measureText(t).width * s <= i) return { text: t, elided: !1 }; const r = e.measureText("...").width * s, n = []; for (let e = 0; e < t.length; ++e) n.push(e); const a = Object(o.upperbound)(n, i, (n, o) => e.measureText(t.slice(0, o + 1)).width * s + r > i); return { text: (t = t.slice(0, a)).trim(), elided: !0 } }(e, a, i - l, this._pixelRatio); if (c.elided && !n) return null; const h = []; let u = 0; for (const e of r) { if (u + e.text.length > c.text.length) break; h.push(e.text), u += e.text.length } const d = h.join("").trim().length; u = 0; for (const i of r) { if (u + i.text.length > d) break; i.color && (e.save(), e.fillStyle = i.color), l += g(e, new s.Point(l, t.y), i .text, this._pixelRatio), i.color && e.restore(), u += i.text.length } return c.elided && (l += g(e, new s.Point(l, t.y), "...", this._pixelRatio)), l } } async function y(e, t) { return new S(e, t).getImage() } }, NhkU: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "l5Au", 7)).then(({ PitchfanLinePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 3 } name() { return "Pitchfan" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "D+Nk"))) .PitchBaseDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolpitchfan", e, !1, { range: [0, 8] }); return l._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("median").child("linewidth")], i = [e.child("median").child( "color")], r = 0; r <= l.LevelsCount; r++) t.push(e.child("level" + r) .child("linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.LevelsCount = 8, t.LineToolPitchfan = l }, NsVT: function(e, t, i) { "use strict"; i.r(t); var s = i("hY0g"), r = i.n(s), n = i("HySD"); function o(e, t) { let i = 0; for (const { min: s, max: r } of t) { if (e < s || r < s) continue; const t = Math.min(e, r); if (i = Math.max(i, t), e === i) break } return i } function a(e) { const t = []; if (void 0 === e) return []; Array.isArray(e) || (e = [e]); for (const i of e) { let e, s; isFinite(i) ? e = s = Number(i) : (e = +i.min, s = +i.max), (e < 0 || isNaN(e)) && (e = 0), isNaN(s) && (s = 1 / 0), e <= s && s > 0 && t.push({ min: e, max: s }) } return t.sort((e, t) => e.min - t.min || e.max - t.max), t } function l(e, t) { if (e.length !== t.length) return !1; for (let i = e.length; i--;) { if (e[i].min !== t[i].min) return !1; if (e[i].max !== t[i].max) return !1 } return !0 } var c = i("+GxX"), h = i("Kxc7"); i.d(t, "ChartPage", (function() { return d })); const u = h.enabled("no_min_chart_width"); class d { constructor(e) { this._processVisibility = e => { const t = e.container.value(); return this._affectsLayout(e.name) ? (t && t.classList.toggle("js-hidden", ! 1), !0) : (t && t.classList.toggle("js-hidden", !0), !1) }, this._setWidth = (e, t) => { let i = t; this._fullscreenArea !== e.name && (e.availWidth.setValue(t), e.canNegotiate .width && (i = o(t, e.negotiations.width))); const s = e.container.value(); return s && (s.style.width = i + "px"), e.width.setValue(i), i }, this._setHeight = (e, t) => { let i = t; this._fullscreenArea !== e.name && (e.availHeight.setValue(t), e .canNegotiate.height && (i = o(t, e.negotiations.height))); const s = e.container.value(); return s && (s.style.height = i + "px"), e.height.setValue(i), i }; const t = e.container.value(); if (!t) throw new Error("bridge.container.value() must be an element"); this._container = t, this._availableAreas = ["left", "tradingpanel", "right", "top", "bottom", "center", "topleft", "extratop" ], this._areas = {}, this._bridge = e, this._width = e.width, this._height = e .height, this._width.subscribe(() => this.recalculate()), this._height .subscribe(() => this.recalculate()), this._bridge.visible.subscribe(() => this ._updateVisibility()), this._bridge.fullscreen.subscribe(() => this ._onParentFullscreenChange()), this.recalculate() } allocate(e) { const t = e && e.areaName; if (-1 === this._availableAreas.indexOf(t)) throw new Error( "unknown options.areaName"); this.free(t); const i = this._createDOM(t), s = { name: t, canNegotiate: { width: "left" === t || "right" === t || "tradingpanel" === t || "topleft" === t, height: "top" === t || "bottom" === t || "topleft" === t || "extratop" === t }, negotiations: { width: [], height: [] }, remove: () => { for (const e in this._areas) this._areas[e] === s && this.free(e) }, negotiateWidth: e => { if (!s.canNegotiate.width) return; const t = a(e); l(s.negotiations.width, t) || (s.negotiations.width = t, this .recalculate()) }, negotiateHeight: e => { if (!s.canNegotiate.height) return; const t = a(e); l(s.negotiations.height, t) || (s.negotiations.height = t, this .recalculate()) }, requestFullscreen: () => { this._fullscreenArea || ("right" !== t && "center" !== t || (this ._fullscreenArea = t), "center" === t && this._bridge .requestFullscreen(), this._updateFullscreen()) }, exitFullscreen: () => { t === this._fullscreenArea && (this._fullscreenArea = void 0, "center" === t && this._bridge.exitFullscreen(), this ._updateFullscreen()) }, width: new r.a, height: new r.a, availWidth: new r.a, availHeight: new r.a, alive: new r.a(!0), container: new r.a(i), visible: new r.a(!0), fullscreen: new r.a(!0), rdState: new n.ResizerDetacherState }; return s.rdState.pushOwner(s), this._areas[t] = s, s.rdState.owner.subscribe(e => { const i = s.container.value(); if (e !== s) i && (i.innerHTML = "", i.parentElement && i.parentElement .removeChild(i)); else { let e = null; for (let i = this._availableAreas.indexOf(t); i--;) { const t = this._availableAreas[i]; if (this._affectsLayout(t)) { e = this._areas[t].container.value(); break } } i && (e && i.parentElement ? i.insertAdjacentElement("afterend", e) : this._container.appendChild(i)) } this.recalculate() }, { callWithLast: !0 }), s.rdState.bridge() } free(e) { const t = this._areas[e]; if (!t) return; this._areas[e] = void 0; const i = t.container.value(); i && i.parentElement && i.parentElement.removeChild(i), t.alive.setValue(!1) } recalculate() { const e = {}; this._recalcSingleRunToken = e; const t = this._areas.topleft, i = this._areas.left, s = this._areas.tradingpanel, r = this._areas.right, n = this._areas.top, o = this._areas.bottom, a = this._areas.center, l = this._areas.extratop, c = this._width.value(), h = this._height.value(); let d = 0, p = 0, _ = 0, m = 0, f = 0, g = 0, b = 0, v = 0; if (e === this._recalcSingleRunToken && l && this._processVisibility(l) && (v = this ._setHeight(l, h), this._setWidth(l, c)), e === this ._recalcSingleRunToken && t && this._processVisibility(t)) { b = this._setHeight(t, h), g = this._setWidth(t, c), g && (g += 4); const e = t.container.value(); e && (e.style.top = v + "px") } if (e === this._recalcSingleRunToken && i && this._processVisibility(i)) { const e = i.container.value(); e && (e.style.top = b + v + "px"), this._setHeight(i, h - b - v), _ = this ._setWidth(i, c), _ && (_ += 4) } if (e === this._recalcSingleRunToken && s && this._processVisibility(s)) { this._setHeight(s, h); let e = c - _; u || (e -= 300), f = this._setWidth(s, e) } if (e === this._recalcSingleRunToken && r && this._processVisibility(r)) { this._setHeight(r, h - v); let e = c - _ - f; u || (e -= 300), m = this._setWidth(r, e); const t = r.container.value(); t && (t.style.top = v + "px") } const S = f + m, y = S ? 4 : 0; if (e === this._recalcSingleRunToken && n && this._processVisibility(n)) { const e = Math.max(g, _), t = n.container.value(); t && (t.style.left = e + "px", t.style.top = v + "px"); const i = c - e - f - m - y; this._setWidth(n, i), d = this._setHeight(n, h) } let w = 0; const P = c - _ - f - m - y; if (e === this._recalcSingleRunToken && o && this._processVisibility(o)) { const e = o.container.value(); e && (e.style.left = _ + "px", e.classList.toggle("no-border-top-left-radius", ! _), e.classList.toggle("no-border-top-right-radius", !S)), this ._setWidth(o, P); const t = h - d - v; w = Math.min(300, t - 0), p = this._setHeight(o, t) + 4 } if (e === this._recalcSingleRunToken && a && this._processVisibility(a)) { const e = a.container.value(); e && (e.style.left = _ + "px", e.style.top = d + v + "px", e.classList.toggle( "no-border-bottom-left-radius", !p || !_), e.classList.toggle( "no-border-bottom-right-radius", !S || !p)), this._setWidth(a, P); const t = h - d - p - v; this._setHeight(a, Math.max(t, w)) } if (e === this._recalcSingleRunToken && s && this._affectsLayout("tradingpanel")) { const e = s.container.value(); e && (e.style.right = m + "px", e.style.top = v + "px") } e === this._recalcSingleRunToken && this._updateVisibility() } _affectsLayout(e) { const t = this._areas[e]; if (!t) return !1; if (t.rdState.owner.value() !== t) return !1; if (this._fullscreenArea && this._fullscreenArea !== e) return p(e); if (this._width.value() <= 567 || this._height.value() <= 445) { const t = ["center", "top", "left", "topleft", "extratop"]; if (Object(c.isFeatureEnabled)("mobile_show_bottom_panel") && t.push("bottom"), !t.includes(e)) return !1 } return !0 } _updateVisibility() { const e = this._bridge.visible.value(); for (let t = 0; t < this._availableAreas.length; t++) { const i = this._availableAreas[t], s = this._areas[i]; s && (e && this._affectsLayout(i) ? s.visible.setValue(!0) : s.visible.setValue( !1)) } } _onParentFullscreenChange() { this._bridge.fullscreen.value() || (this._fullscreenArea = void 0, this ._updateFullscreen()) } _updateFullscreen() { const e = void 0 !== this._fullscreenArea; for (let t = 0; t < this._availableAreas.length; t++) { const i = this._availableAreas[t], s = this._areas[i]; if (!s) continue; if (i === this._fullscreenArea) { s.fullscreen.setValue(!0); continue } const r = s.container.value(); r && r.classList.toggle("js-hidden", e && !p(i)) } this._updateVisibility(), this.recalculate() } _createDOM(e) { const t = document.createElement("div"); return t.classList.add("layout__area--" + e), t.style.position = "absolute", "bottom" === e ? t.style.bottom = "0" : t.style.top = "0", "right" === e || "tradingpanel" === e ? t.style.right = "0" : t.style.left = "0", t } } function p(e) { const t = h.enabled("side_toolbar_in_fullscreen_mode"), i = h.enabled("header_in_fullscreen_mode"); return "center" === e || "left" === e && t || "top" === e && i } }, Nu4p: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); i("YFKU"); const s = { shape_arrow_down: { guiName: window.t("Arrow Down"), id: "shape_arrow_down", paneRendererClass: "PaneRendererArrowDown", pineName: "shape.arrowdown", icon: "arrow_down" }, shape_arrow_up: { guiName: window.t("Arrow Up"), id: "shape_arrow_up", paneRendererClass: "PaneRendererArrowUp", pineName: "shape.arrowup", icon: "arrow_up" }, shape_circle: { guiName: window.t("Circle"), id: "shape_circle", paneRendererClass: "PaneRendererCircleShape", pineName: "shape.circle", icon: "circle" }, shape_cross: { guiName: window.t("Cross"), id: "shape_cross", paneRendererClass: "PaneRendererCrossShape", pineName: "shape.cross", icon: "cross" }, shape_diamond: { guiName: window.t("Diamond"), id: "shape_diamond", paneRendererClass: "PaneRendererDiamond", pineName: "shape.diamond", icon: "diamond" }, shape_flag: { guiName: window.t("Flag"), id: "shape_flag", paneRendererClass: "PaneRendererFlagShape", pineName: "shape.flag", icon: "flag" }, shape_label_down: { guiName: window.t("Label Down"), id: "shape_label_down", paneRendererClass: "PaneRendererLabelDown", pineName: "shape.labeldown", icon: "label_down" }, shape_label_up: { guiName: window.t("Label Up"), id: "shape_label_up", paneRendererClass: "PaneRendererLabelUp", pineName: "shape.labelup", icon: "label_up" }, shape_square: { guiName: window.t("Square"), id: "shape_square", paneRendererClass: "PaneRendererSquare", pineName: "shape.square", icon: "square" }, shape_triangle_down: { guiName: window.t("Triangle Down"), id: "shape_triangle_down", paneRendererClass: "PaneRendererTriangleApexDown", pineName: "shape.triangledown", icon: "triangle_down" }, shape_triangle_up: { guiName: window.t("Triangle Up"), id: "shape_triangle_up", paneRendererClass: "PaneRendererTriangleApexUp", pineName: "shape.triangleup", icon: "triangle_up" }, shape_xcross: { guiName: window.t("X Cross"), id: "shape_xcross", paneRendererClass: "PaneRendererXCross", pineName: "shape.xcross", icon: "x_cross" } } }, "O+9b": function(e, t, i) { "use strict"; var s = i("ocLq"), r = i("LxhU"); class n { constructor(e, t) { this._minTick = NaN, this._minPrice = NaN, this._maxPrice = NaN, this._low = NaN, this._high = NaN, this._startPrice = NaN, this._indexLowVbP = NaN, this ._indexHighVbP = NaN, this._rowSize = e, this._type = t } init(e, t, i, s, r) { this._minTick = e, this._minPrice = t, this._maxPrice = i, this._low = s, this ._high = r } getStartPrice() { return this._startPrice } setStartPrice(e) { this._startPrice = e } getIndexLowVbP() { return this._indexLowVbP } setIndexLowVbP(e) { this._indexLowVbP = e } getIndexHighVbP() { return this._indexHighVbP } setIndexHighVbP(e) { this._indexHighVbP = e } type() { return this._type } } class o extends n { constructor(e) { super(e, 0) } calculate() { this.setStartPrice(this._minPrice); const e = this.rowWidth(); let t = Math.floor((this._low - this._minPrice) / e), i = Math.ceil((this._high - this._minPrice) / e) - 1; t = Math.max(t, 0), i = Math.max(i, 0), i = Math.min(i, this._rowSize - 1), t = Math .min(t, i), this.setIndexLowVbP(t), this.setIndexHighVbP(i) } rowWidth() { return Math.max((this._maxPrice - this._minPrice) / this._rowSize, this._minTick) } } class a extends n { constructor(e) { super(e, 1) } calculate() { this.setStartPrice(0); const e = this.rowWidth(); let t = Math.floor(this._low / e); const i = Math.ceil(this._high / e) - 1; t = Math.min(t, i), this.setIndexLowVbP(t), this.setIndexHighVbP(i) } rowWidth() { return this._minTick * this._rowSize } } var l = i("Kxc7"); function c() { return 6e3 } function h(e) { switch (e) { case "Up/Down": return 2; case "Total": return 1; default: s.Std.error("Invalid study argument value: " + e) } } i.d(t, "b", (function() { return c })), i.d(t, "c", (function() { return h })), i.d(t, "a", (function() { return u })); class u { findBasicResolutionForFromTo(e, t, i, n) { const o = Object(s.getVolumeProfileResolutionForPeriod)(e.value(), t, i, n), a = r.Interval.parse(o); return l.enabled("charting_library_debug_mode") && console.log( `Selected resolution ${a.value()} for (${e.value()}, ${t}, ${i})`), a } verifyRowSizeInput(e, t) { "Number Of Rows" === t && e > 6e3 && s.Std.error( 'Histogram is too large, please reduce "Row Size" input.') } _getRowsLayout(e, t) { return "Number Of Rows" === e ? new o(t) : new a(t) } } }, OBgQ: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("jCNj"); class r { constructor(e, t, i) { this.year = e, this.month = t, this.day = i } toString() { return `${this.year}-${this.month}-${this.day}` } compareTo(e) { return this.year > e.year || this.year === e.year && this.month > e.month || this .year === e.year && this.month === e.month && this.day > e.day ? 1 : this .year === e.year && this.month === e.month && this.day === e.day ? 0 : -1 } before(e) { return -1 === this.compareTo(e) } toCalendar(e) { return s.get_cal(s.get_timezone("Etc/UTC"), this.year, this.month - 1, this.day) } addDays(e) { const t = this.toCalendar(s.get_timezone("Etc/UTC")); return s.add_date(t, e), r.fromCalendar(t) } static fromCalendar(e) { return new r(s.get_year(e), s.get_month(e) + 1, s.get_day_of_month(e)) } } }, OH2X: function(e, t, i) { "use strict"; t.LineToolFibRetracement = i("t2ex").LineToolFibRetracement, t.LineToolFibChannel = i("xnA2") .LineToolFibChannel, t.LineToolFibSpeedResistanceArcs = i("Yjuu") .LineToolFibSpeedResistanceArcs, t.LineToolProjection = i("68at").LineToolProjection, t .LineToolTrendBasedFibExtension = i("ZtA1").LineToolTrendBasedFibExtension, t .LineToolElliott = i("xz+e").LineToolElliott, t.LineToolFibCircles = i("4bfY") .LineToolFibCircles, t.LineToolVertLine = i("n40Z").LineToolVertLine, t.LineToolCrossLine = i("MA5A").LineToolCrossLine, t.LineToolBarsPattern = i("2bPF").LineToolBarsPattern, t .LineToolTrendBasedFibTime = i("yUly").LineToolTrendBasedFibTime, t.LineToolFibTimeZone = i( "FsE7").LineToolFibTimeZone, t.LineToolCircleLines = i("tG6Q").LineToolCircleLines, t .LineToolDateRange = i("WkYF").LineToolDateRange, t.LineToolPriceRange = i("RDDl") .LineToolPriceRange, t.LineToolDateAndPriceRange = i("UCMi").LineToolDateAndPriceRange, t .LineToolParallelChannel = i("qcGP").LineToolParallelChannel, t.LineToolTrendAngle = i( "nW7S").LineToolTrendAngle, t.LineToolTrendLine = i("WPQD").LineToolTrendLine, t .LineToolInfoLine = i("yi8X").LineToolInfoLine, t.LineToolArrowMark = i("TohL") .LineToolArrowMark, t.LineToolExecution = i("704P").LineToolExecution, t.LineToolPitchfan = i("NhkU").LineToolPitchfan, t.LineToolGannSquare = i("Z0Sh").LineToolGannSquare, t .LineToolFibSpeedResistanceFan = i("zZ5f").LineToolFibSpeedResistanceFan, t .LineToolGannComplex = i("nd9+").LineToolGannComplex, t.LineToolGannFixed = i("TBaH") .LineToolGannFixed, t.LineToolGannFan = i("4u8j").LineToolGannFan, t.LineToolFibWedge = i( "9QkW").LineToolFibWedge, t.LineToolPitchfork = i("aDyP").LineToolPitchfork, t .LineToolDisjointAngle = i("oIoN").LineToolDisjointChannel, t.LineToolFlatBottom = i("InMJ") .LineToolFlatBottom, t.LineToolIcon = i("icPo").LineToolIcon, t.LineToolRotatedRectangle = i("Az04").LineToolRotatedRectangle, t.LineToolFibSpiral = i("i80N").LineToolFibSpiral, t .LineToolHeadAndShoulders = i("aILO").LineToolHeadAndShoulders, t.LineToolTriangle = i( "isVH").LineToolTriangle, t.LineToolTrianglePattern = i("lNN+").LineToolTrianglePattern, t.LineTool5PointsPattern = i("NJRZ").LineTool5PointsPattern, t.LineToolThreeDrivers = i( "PYn8").LineToolThreeDrivers, t.LineToolABCD = i("pKDv").LineToolABCD, t .LineToolPolyline = i("hP9j").LineToolPolyline, t.LineToolPath = i("YdVo").LineToolPath, t .LineToolPrediction = i("Wh6B").LineToolPrediction, t.LineToolPriceLabel = i("zqZp") .LineToolPriceLabel, t.LineToolArrowMarker = i("wiuq").LineToolArrowMarker, t.LineToolNote = i("gLxC").LineToolNote, t.LineToolNoteAbsolute = i("gLxC").LineToolNoteAbsolute, t.LineToolSignpost = i("gASG") .LineToolSignpost, t.LineToolBrush = i("+hLl").LineToolBrush, t.LineToolArc = i("0Pxc") .LineToolArc, t.LineToolCallout = i("odCa").LineToolCallout, t.LineToolBalloon = i("me8f") .LineToolBalloon, t.LineToolText = i("V3Oj").LineToolText, t.LineToolHorzLine = i("/DxK") .LineToolHorzLine, t.LineToolHorzRay = i("CJIV").LineToolHorzRay, t.LineToolRectangle = i( "7qI1").LineToolRectangle, t.LineToolEllipse = i("V086").LineToolEllipse, t .LineToolTimeCycles = i("kIXa").LineToolTimeCycles, t.LineToolSineLine = i("bv/X") .LineToolSineLine, t.LineToolGhostFeed = i("XUCF").LineToolGhostFeed, t .LineToolBezierQuadro = i("Xyly").LineToolBezierQuadro, t.LineToolBezierCubic = i("N+BX") .LineToolBezierCubic, t.LineToolArrow = i("QQu0").LineToolArrow, t.LineToolRay = i("5ZUI") .LineToolRay, t.LineToolExtended = i("CHw2").LineToolExtended, t.LineToolSchiffPitchfork = i("v5F8").LineToolSchiffPitchfork, t.LineToolSchiffPitchfork2 = i("XFad") .LineToolSchiffPitchfork2, t.LineToolInsidePitchfork = i("EqoR").LineToolInsidePitchfork, t .LineToolTextAbsolute = i("V3Oj").LineToolTextAbsolute, t.LineToolArrowMarkLeft = i("TohL") .LineToolArrowMarkLeft, t.LineToolArrowMarkRight = i("TohL").LineToolArrowMarkRight, t .LineToolArrowMarkUp = i("TohL").LineToolArrowMarkUp, t.LineToolArrowMarkDown = i("TohL") .LineToolArrowMarkDown, t.LineToolFlagMark = i("aIha").LineToolFlagMark, t .LineToolCypherPattern = i("bTqm").LineToolCypherPattern, t.LineToolElliottImpulse = i( "xz+e").LineToolElliottImpulse, t.LineToolElliottTriangle = i("xz+e") .LineToolElliottTriangle, t.LineToolElliottTripleCombo = i("xz+e") .LineToolElliottTripleCombo, t.LineToolElliottCorrection = i("xz+e") .LineToolElliottCorrection, t.LineToolElliottDoubleCombo = i("xz+e") .LineToolElliottDoubleCombo, t.LineToolRiskRewardLong = i("tDUI").LineToolRiskRewardLong, t .LineToolRiskRewardShort = i("tDUI").LineToolRiskRewardShort, t.LineToolPosition = i("ziJ5") .LineToolPosition, t.LineToolOrder = i("B4/o").LineToolOrder, t.LineToolHighlighter = i( "SMvR").LineToolHighlighter, t.LineToolPriceNote = i("Zl0W").LineToolPriceNote }, "OK+B": function(e, t, i) { "use strict"; var s = i("Eyy1").assert, r = i("eJTA"), n = r.rgba, o = r.rgbaToString, a = r.parseRgb, l = (i("vTIA").TradingSourcesHorizontalAlignment, i("cWHH")), c = i("1Wlv").PriceScale, h = i("8sOK").StudyStub, u = i("CW80"), d = u.createLineTool, p = u.createLineToolProperties, _ = u.createStudyLineToolProperties, m = u.isLineToolName, f = u.isStudyLineToolName, g = i("Ss5c").LineDataSource, b = i("OH2X").LineToolBarsPattern, v = i("OH2X").LineToolCallout, S = i("CW80").isLineTool, y = i("HLXm"), w = i("GVHu"), P = w.Study, C = w.prepareStudyPropertiesForLoadChart, x = i("3ClC").createStudy, T = i("qJq3").Series, I = i("dfhE"), M = i("n5al"), O = i("0YCj"), L = i("Kxc7"), A = i("txPx").getLogger("Chart.Serialization"), E = i("OH2X").LineToolParallelChannel, k = i("OH2X").LineToolTrendAngle, D = i("OH2X").LineToolGhostFeed, V = i("OH2X").LineToolElliott, B = i("7ktv").PriceDataSource, R = i("iDOr").Pane, N = i("Tmoa"), j = i("jofe").createDeferredPromise, F = i("ApcL").preferencesByWhiteList, W = (A = i("txPx").getLogger("Chart.Serialization"), i("mPvX").LineToolsGroupModel), H = i("bmVy").StudyStatusType; const { isLineToolState: U, isMainSeriesState: z, isStudyState: G } = i("Vs8b"), { reorderDataSourcesStateZOrder: q } = i("2jby"); l.prototype.state = function(e, t, i, s) { for (var r = { panes: [] }, n = 0; n < this.panes().length; n++) r.panes.push(this.panes()[n].state(!0, e, ! 1, t, i, s)); r.timeScale = this._timeScale.state(e); var o = null, a = this.properties(), l = a.tradingProperties.state(); return r.chartProperties = { paneProperties: a.paneProperties.state(), scalesProperties: a.scalesProperties.state(), publishedChartsTimelineProperties: o ? o.state(e) : void 0, chartEventsSourceProperties: a.chartEventsSourceProperties.state(), tradingProperties: l, priceScaleSelectionStrategyName: a.priceScaleSelectionStrategyName.value() }, a.chartEventsSourceProperties && (r.chartProperties.chartEventsSourceProperties = a.chartEventsSourceProperties.state()), s || (r.lineToolsGroups = this .lineToolsGroupModel().state(t)), r.version = this.version(), r.timezone = this .timezone(), r.sessions = this.sessions().state(e), r.shouldBeSavedEvenIfHidden = this._shouldBeSavedEvenIfHidden, r }, l.prototype.chartPropertiesTransparencyMigrate = function(e) { var t, i, s; e.chartProperties.paneProperties.crossHairProperties && (s = e.chartProperties .paneProperties.crossHairProperties, N.isHexColor(s.color) && (i = s .transparency / 100, t = a(s.color), s.color = o(n(t, i)))), e .chartProperties.paneProperties.dataWindowProperties && (s = e.chartProperties .paneProperties.dataWindowProperties, N.isHexColor(s.color) && (i = s .transparency / 100, t = a(s.color), s.color = o(n(t, i)))) }, l.prototype.resetDeferredStudies = function() { new Y(this).reset() }, l.prototype._getExceedingChildStudies = function(e) { for (var t = [], i = 0; i < e.length; ++i) t = t.concat(e[i].sources || []); var s = 0; for (var r = [], n = {}, o = 0, a = 1e6; t.length && --a;) { var l = t[o]; (l.ownerSource && n[l.ownerSource] || !l.ownerSource) && (n[l.id] = l, t.splice(t .indexOf(l), 1), l.ownerSource && "Study" === l.type && l.state && l.state .isChildStudy && ++s > 1 && r.push(l)), o = (o + 1) % t.length } return r }, l.prototype.restoreState = function(e, t, i) { new Y(this).reset(); var s = {}; if (!e.panes) return void A.logDebug("ChartModel.restoreState: invalid state"); if (!Array.isArray(e.panes)) return void A.logDebug( "ChartModel.restoreState: invalid state"); if (e.panes.length < 1) return void A.logDebug( "ChartModel.restoreState: invalid state"); if (this._shouldBeSavedEvenIfHidden = void 0 === e.shouldBeSavedEvenIfHidden || e .shouldBeSavedEvenIfHidden, e.chartProperties && !e.chartProperties.timezone && (e .chartProperties.timezone = e.timezone), e.chartProperties) { var r = TradingView.factoryDefaults("chartproperties").scalesProperties; if (TradingView.merge(r, e.chartProperties.scalesProperties), !("showLastValue" in r) || "showSeriesLastValue" in r || "showStudyLastValue" in r || (r .showSeriesLastValueProperty = r.showLastValue, r .showStudyLastValueProperty = r.showLastValue), "showSeriesLastValue" in r && (s.showSeriesLastValueProperty = !0), "showStudyLastValue" in r && (s .showStudyLastValueProperty = !0), e.chartProperties.paneProperties .vertGridProperties = e.chartProperties.paneProperties.vertGridProperties || TradingView.clone(e.chartProperties.paneProperties.gridProperties), e.chartProperties.paneProperties.horzGridProperties = e.chartProperties .paneProperties.horzGridProperties || TradingView.clone(e.chartProperties .paneProperties.gridProperties), "backgroundType" in e.chartProperties .paneProperties || (e.chartProperties.paneProperties.backgroundType = "solid"), this._properties.paneProperties.mergeAndFire(e.chartProperties.paneProperties), this._properties.scalesProperties.mergeAndFire(r), e.chartProperties.timezone && this._properties.timezone.setValue(e.chartProperties.timezone), e .chartProperties.chartEventsSourceProperties && this._properties .chartEventsSourceProperties && this._properties.chartEventsSourceProperties .mergeAndFire(e.chartProperties.chartEventsSourceProperties), e.chartProperties .tradingProperties && this._properties.tradingProperties) { e.chartProperties.tradingProperties.lineLength; 0, this._properties.tradingProperties.mergeAndFire(e.chartProperties .tradingProperties) } this._timeScale.restoreState(e.timeScale, t), this._updateDateTimeFormatter() } if (e.timeScale && this._timeScale.restoreState(e.timeScale, t), !this.readOnly()) { var n = this._getExceedingChildStudies(e.panes); if (n.length) { for (var o = e.panes.length - 1; o >= 0; --o) { for (var a = (d = e.panes[o]).sources.length - 1; a >= 0; --a) { var l = d.sources[a]; ~n.indexOf(l) && d.sources.splice(a, 1) } d.sources.length || e.panes.splice(o, 1) } 0 } } const c = e.version || 0; var h = e.panes; this.panes()[0].restoreState(h[0], t, c, s, i, !0); var u = 1; for (o = 1; o < e.panes.length; o++) { var d, p = e.panes[o]; if (0 !== p.sources.length)(d = this.panes()[u] || this.createPane()).restoreState( p, t, c, s, i, !0), d.mainDataSource() ? u += 1 : this.removePane(d); else A.logWarn("Empty pane detected - restoring is skipped. idx=" + o + ", state=" + JSON.stringify(p)) } this._invalidateBarColorerCaches(); var _ = this.dataSources(), m = 0; for (o = 0; o < _.length; o++) { var f = _[o]; TradingView.isInherited(f.constructor, g) && (m++, f.calcIsActualSymbol()) } this.updateTimeScaleBaseIndex(), this.recalculateAllPanes(), this.fullUpdate(), this .syncESD(); var b = TVLocalStorage.getItem("linetools_limit") || 1e3; return window.is_authenticated && window.user && window.user.settings && (b = window .user.settings.linetools_limit || b), e.sessions && this.sessions() .restoreState(e.sessions, t), e.lineToolsGroups && (this._lineToolsGroupModel = W .fromState(this, e.lineToolsGroups)), m > b && m % 100 == 0 ? { lines_limit_exceeded: !0, line_tools_count: m } : (this.panes().forEach(function(e) { this._dataSourceCollectionChanged.fire(e) }.bind(this)), this._lineToolsGroupModel.fireChangedAll(), {}) }, R.prototype.state = function(e, t, i, s, r, n) { var o = {}, a = new Map; function l(e) { if (a.has(e)) return a.get(e); var o = null, l = i && !e.isSavedInStudyTemplates() || !e.state || S(e) && n || !(o = e.state( t, r)) || !e.isSavedInChart(t) || s && e.isActualSymbol && !e .isActualSymbol() || e.isPhantom() ? null : o; return a.set(e, l), l } if (e) { o.sources = []; for (var c = 0; c < this.m_dataSources.length; c++) { var h = l(this.m_dataSources[c]); null !== h && o.sources.push(h) } } function u(e) { return null !== a.get(e) } function d(e) { return !n || !S(e) } o.leftAxisesState = this._leftPriceScales.map((function(e) { var t = {}; return t.state = e.state(), t.sources = e.dataSources().filter(u) .filter(d).map((function(e) { return e.id() })), t })), o.rightAxisesState = this._rightPriceScales.map((function(e) { var t = {}; return t.state = e.state(), t.sources = e.dataSources().filter(u) .filter(d).map((function(e) { return e.id() })), t })), o.overlayPriceScales = {}; for (c = 0; c < this.m_dataSources.length; c++) { var p = this.m_dataSources[c]; if (this.isOverlay(p) && p.isSavedInChart(t)) { var _ = p.priceScale(); o.overlayPriceScales[p.id()] = _ ? _.state() : null } } return o.stretchFactor = this._stretchFactor, this.m_mainDataSource && (o.mainSourceId = this.m_mainDataSource.id()), o.priceScaleRatio = this._currentPriceScaleRatio, o }, R.prototype.sourceById = function(e) { for (var t = 0; t < this.m_dataSources.length; t++) if (this.m_dataSources[t].id() === e) return this.m_dataSources[t]; return null }, R.prototype.isESDStudy = function(e) { return "Script$TV_EARNINGS@tv-scripting" === e.id || "Script$TV_DIVIDENDS@tv-scripting" === e.id || "Script$TV_SPLITS@tv-scripting" === e .id || "ESD$TV_EARNINGS@tv-scripting" === e.id || "ESD$TV_DIVIDENDS@tv-scripting" === e.id || "ESD$TV_SPLITS@tv-scripting" === e.id || "Earnings@tv-basicstudies" === e.id || "Dividends@tv-basicstudies" === e.id || "Splits@tv-basicstudies" === e.id }, R.prototype.isStudyToSkip = function(e) { return !!this.isESDStudy(e) }, R.prototype.restoreState = function(e, t, i, s, r, n) { s = s || {}, e.stretchFactor && (this._stretchFactor = e.stretchFactor); var o = {}; if (e.sources) { var a = e.sources.filter((function(e) { return !!e && ("MainSeries" === e.type || (!e.points || !e.points .some((function(e) { return null === e.time_t || !isFinite(e .time_t) })) || (A.logNormal("Dropped invalid " + e.type + ". Reason: non-numeric point time"), !1))) }), this); const c = a.findIndex(z); - 1 !== c && this.model().mainSeries().setObsoleteZOrder( a[c].zorder), i < 3 && q(a); var l = -1 !== this.m_dataSources.indexOf(this._model.mainSeries()); this.clearSeries(n), this.m_mainDataSource = null, l && this ._addSourceToCollections(this._model.mainSeries(), n), function() { var t = a.find((function(t) { return t.id === e.mainSourceId })); if (void 0 !== t) if (TradingView[t.type] && m(t.type)) { for (var i = null, s = 0; s < a.length; s++) { var r = a[s]; if (!TradingView[t.type] || !m(r.type)) { if (null !== i) return void A.logWarn( "Pane contains more than 1 possibly main sources - auto fix cannot be applied" ); i = r } } if (null !== i) { var n = e.mainSourceId, o = 0; e.mainSourceId = i.id, a.forEach((function(e) { e.ownerSource === n && (e.ownerSource = i.id, o += 1) })), A.logNormal( "Auto fix broken pane is applied, changed line tools=" + o + ", changed from=" + n + " to=" + i.id) } else A.logWarn( "Pane contains only line tools - possible we need to remove this pane?" ) } else A.logNormal( "The type of main source is not line tool - fix is unnecessary"); else A.logWarn("There is no main source with id " + e.mainSourceId + ", total sources=" + a.length) }(); for (var h = 0; h < a.length; h++) { if ("study_Sessions" === (u = a[h]).type) { this.model().sessions().restoreOldState(u, t); break } } for (h = 0; h < a.length; h++) { var u; if ("study_Sessions" !== (u = a[h]).type) { var d = u.id; null === this._model.dataSourceForId(u.id) || "MainSeries" === u.type ? (o[ d] = u.ownerSource, z(u) ? this._restoreMainSeries(u, t, l, s, r, n) : G(u) ? this.restoreStudy(u, t, s, n) : U(u) ? (u .state && (u.state.zOrderVersion = 2), this.restoreLineTool(u, t, void 0, n)) : TradingView[u.type] && TradingView[u.type].createFromState && this._restoreSpecialSource(u, t, n)) : A.logError("Duplicate id while restoring pane: " + u .type + "," + u.id) } } } var p, _, f = new Set, b = this; function v(e) { var t = defaults("chartproperties").paneProperties.axisProperties, i = new c(b.model().properties().scalesProperties, t); return i.restoreState(e.state), e.sources.forEach((function(e) { var s = b.dataSourceForId(e); s && function e(t, i, s) { f.has(t) || (f.add(t), void 0 !== s.m_showSymbolLabels && t instanceof T && b.model().properties() .scalesProperties.showSymbolLabels.setValue(s .m_showSymbolLabels), L(t, i), b._model .children(t, !0).forEach((function(t) { e(t, i, s) }))) }(s, i, t) })), 0 === i.dataSources().length ? null : i } if (e.leftAxisesState) p = e.leftAxisesState.map(v).filter((function(e) { return null !== e })); else { var S = v({ state: e.leftAxisState, sources: e.leftAxisSources }); p = null !== S ? [S] : [] } if (this._leftPriceScales.slice().forEach(function(e) { this.removePriceScale(e) }.bind(this)), this._leftPriceScales = [], p.forEach((function(e) { b._placePriceScale(e, "left") })), e.rightAxisesState) _ = e.rightAxisesState.map(v).filter((function(e) { return null !== e })); else { var y = v({ state: e.rightAxisState, sources: e.rightAxisSources }); _ = null !== y ? [y] : [] } this._rightPriceScales.forEach(function(e) { this.removePriceScale(e) }.bind(this)), this._rightPriceScales = [], _.forEach((function(e) { b._placePriceScale(e, "right") })), this._currentPriceScaleRatio = e.priceScaleRatio || e.leftPriceScaleRatio || e .rightPriceScaleRatio || null; var w = new Map; for (h = 0; h < this.m_dataSources.length; h++) { var C = this.m_dataSources[h]; if (!f.has(C)) { var x; if (e.overlayPriceScales && e.overlayPriceScales[C.id()]) { var I = e.overlayPriceScales[C.id()]; w.has(I.id) ? x = w.get(I.id) : ((x = new c(this._model.properties() .scalesProperties)).setHeight(this.m_height), I .m_isAutoScale = !0, I.m_isLog = !1, I.m_isPercentage = !1, I .m_isLockScale = !1, x.restoreState(I), w.set(I.id, x)) } else(x = new c(this._model.properties().scalesProperties)).setHeight(this .m_height); L(C, x) } } for (var d in o) { var M = o[d]; if (M)(C = this.dataSourceForId(d)) && this.dataSourceForId(d).setOwnerSource(this .dataSourceForId(M)) } if (e.mainSourceId && !this.containsMainSeries() && (this.m_mainDataSource = this .dataSourceForId(e.mainSourceId)), !this.m_mainDataSource) for (h = 0; h < this.m_dataSources.length; h++) { C = this.m_dataSources[h]; if (TradingView.isInherited(C.constructor, B)) { this.m_mainDataSource = C; break } } for (h = 0; h < this.m_dataSources.length; h++) { C = this.m_dataSources[h]; if (TradingView.isInherited(C.constructor, g)) C.ownerSource() || C.setOwnerSource( this.mainDataSource()), C.isFixed() && C.restoreFixedPoints(); else if (TradingView.isInherited(C.constructor, P)) { var O = C.properties(); O.linkedToSeries && O.linkedToSeries.value() && (C.ownerSource() || C .setOwnerSource(this.model().mainSeries())) } } function L(e, t) { b.removeSourceFromPriceScale(e), e.setPriceScale(t), t.addDataSource(e) } this._updateMargins(), this._cachedOrderedSources.clear() }, R.prototype._restoreMainSeries = function(e, t, i, s, r, n) { var o = e.id, a = e.state; if (a && r && (a.style = r.style || a.style, a.interval = r.interval || a.interval, a.symbol = r.symbol || a.symbol, r.symbol && delete a.currencyId), a && (a .style, I.STYLE_HILO), a && ["candleStyle", "hollowCandleStyle", "haStyle"] .forEach((function(e) { a[e] && (a[e].wickUpColor = a[e].wickUpColor || a[e].wickColor, a[e] .wickDownColor = a[e].wickDownColor || a[e].wickColor) })), a && (a.statusViewStyle = a.statusViewStyle || {}, !a.statusViewStyle .symbolTextSource)) { var l = !!a.statusViewStyle.showSymbolAsDescription; a.statusViewStyle.symbolTextSource = l ? "ticker" : "description" } if (a && (a.extendedHours ? a.sessionId = "extended" : a.sessionId || (a.sessionId = "regular"), delete a.extendedHours), !i) { var c = this._model.mainSeries(); this._model.paneForSource(c).removeDataSource(c, !1, n), this ._addSourceToCollections(c, n) } const h = this.model().mainSeries(), u = h.properties(); if (this.m_mainDataSource = h, (g = a && a.style ? a.style : void 0) === T.STYLE_PNF && "ATR" === u.pnfStyle.inputs.style.value() ? u.pnfStyle.inputs.style._value = "Traditional" : g === T.STYLE_RENKO && "ATR" === u.renkoStyle.inputs.style .value() && (u.renkoStyle.inputs.style._value = "Traditional"), a && !a .hasOwnProperty( "showSessions") && (a.showSessions = !1), a && t && (a.showCountdown = !1), a && (t && !("showSeriesLastValueProperty" in s) && "showLastValue" in a && this._model .properties().scalesProperties.showSeriesLastValue.setValue(a.showLastValue), delete a.showLastValue), a) for (var d = { haStyle: M.chartStyleStudyId(T.STYLE_HEIKEN_ASHI, !0), renkoStyle: M.chartStyleStudyId(T.STYLE_RENKO, !0), pbStyle: M.chartStyleStudyId(T.STYLE_PB, !0), kagiStyle: M.chartStyleStudyId(T.STYLE_KAGI, !0), pnfStyle: M.chartStyleStudyId(T.STYLE_PNF, !0), rangeStyle: M.chartStyleStudyId(T.STYLE_RANGE, !0) }, p = this._model.studyVersioning(), _ = h.styleStudyInfos(), m = Object .keys(I.SYMBOL_STRING_DATA), f = 0; f < m.length; f++) { var g = m[f], b = I.STYLE_SHORT_NAMES[g] + "Style", v = b in e ? e[b].studyId : d[b]; if (null != (g = a[b])) { var S = g.inputs, y = O.parseIdString(v), w = _[b].studyId, P = O.parseIdString(w), C = p.updateStudyInputs(y.id, y.version, P.version, S, null); g.inputs = C } } const x = h.sessionId(); h.restoreState(e, t), this.changeSourceId(h, o), h.sessionId() !== x && u.sessionId .listeners().fire(u.sessionId) }, R.prototype.restoreStudy = function(e, t, i, s) { if (t && void 0 === e.data && void 0 === e.nonSeriesData && void 0 === e.indexes) A .logError("Cannot restore (skipping) study without data " + e.id + ", " + e.metaInfo .id); else { var r = e.id, n = e.state, o = e.zorder, a = e.ownerSource, l = TradingView.clone(e.metaInfo); if (Object.assign(l, O.parseIdString(l.id)), !this.isStudyToSkip(l) || t) { var c = n, u = this._model.studyVersioning(), d = u.patchPropsStateAndMetaInfo(c, l, { oldShowStudyLastValueProperty: t && !i.showStudyLastValueProperty }); c = d.propsState, l = d.metaInfo; var p = new h(this._model, e, l.shortDescription); p.setId(r), p.setZorder(o); var _ = this; if (t) f(null); else { var m = u.updateMetaInfoAsync(l); m.sync ? f(m.result) : m.result.then((function(e) { f(e) })).catch((function(e) { p.setFailed("error: " + e) })) } return p && (p.setZorder(o), this._addSourceToCollections(p, s), this ._processMainSourceChange()), this._cachedOrderedSources.clear(), p } A.logNormal("Skipping study " + l.id) } function f(i) { p.setStatus({ type: H.Undefined }); var s = i || new O(l), n = new Y(_._model); function o(o) { var a = C(l, i, c, null, u, o), h = x(_._model, a, o || _._model.mainSeries(), s); if (h.setId(r), h.setOwnFirstValue(void 0 === e.ownFirstValue ? null : e .ownFirstValue), t) { var d = u.patchStudyData(l, e.data, e.nonSeriesData, e.indexes); h.restoreData(d.data, d.nsData, d.indexes) } _._model.replaceStudyStub(p, h) || (p = h), n.add(r, h) } a && e.state.isChildStudy ? n.get(a).then(o) : o() } }, R.prototype.restoreLineTool = function(e, t, i, r) { delete e.state.lastUpdateTime, i = void 0 === i || i, V.migrateState(e), y.migrateState( e); var n = e.type, o = e.id, a = e.state, l = i ? e.zorder : this.newLineToolZOrder(); s(m(n), "invalid data source type:" + n + " (expected to be a Line Tool)"); var c, h, u = null; if (f(n)) { var g = (e = (u = this._model.studyVersioning()).patchPointsBasedStudyState(e)) .metaInfo; Object.assign(g, O.parseIdString(g.fullId)); var S = u.updateMetaInfo(g) || g; h = _(n, g, S, a, u), t ? h.merge({ fixedSize: !1 }) : h.merge({ fixedSize: !0 }), c = d(n, this._model, h, S, !0) } else h = p(n, a), t ? h.merge({ fixedSize: !1 }) : h.merge({ fixedSize: !0 }), c = d(n, this._model, h, null, !0); c.setId(o), c.linkKey().setValue(e.linkKey || null); var w = e.alertId; w && c.canHasAlert() && "function" == typeof c.setAlert && L.enabled("alerts") && !this ._model.readOnly() && !this._model.isJustClonedChart() && c.setAlert(w, { noChartSave: !0 }); var P = e.indexes ? e.indexes : []; if (P = P.slice(0, e.points.length), c.isFixed() ? c.restorePositionPercents(e .positionPercents) : c.restorePoints(e.points, P, t), c instanceof b || c instanceof v || c instanceof k || c instanceof D || c instanceof E || c instanceof E) c.restoreData(e); else if (t && c.restoreData) { var C = e; u && (C.graphics = u.patchPointsBasedStudyData(C.metaInfo, C.graphics)), c .restoreData(C) } var x = null == e.version ? 1 : e.version, T = null == c.version ? 1 : c.version; return x !== T && "function" == typeof c.migrateVersion && c.migrateVersion(x, T, { pane: this, model: this._model, properties: h }), void 0 !== l && c.setZorder(l), this._addSourceToCollections(c, r), this ._cachedOrderedSources.clear(), c }, R.prototype._restoreSpecialSource = function(e, t, i) { var s = TradingView[e.type]; if (s && s.createFromState) { var r = s.createFromState(e, t, this._model); r && (r.setId(e.id), this._addSourceToCollections(r, i), r.zorder && r.setZorder(r .zorder)) } }, l.prototype.restoreTheme = function(e, t, i) { var s = { hollowCandle: { related: "candle" } }; for (var r in s) if (!e.mainSourceProperties[r + "Style"]) { var n = e.mainSourceProperties[s[r].related + "Style"]; e.mainSourceProperties[r + "Style"] = TradingView.clone(n) } this._undoModel.chartLoadTheme(this, e, t, i) }, l.prototype.preferences = function() { return F(this, this.mainSeries()) }; var Y = function() { var e = [], t = []; function i(s) { var r = e.indexOf(s); return ~r ? t[r] : this instanceof i ? (this._source = s, this._studies = {}, this ._deferreds = {}, e.push(s), void t.push(this)) : new i(s) } return i.prototype.add = function(e, t) { this._deferreds[e] && (this._deferreds[e].resolve(t), delete this._deferreds[ e]), this._studies[e] = t }, i.prototype.get = function(e) { return this._studies[e] ? Promise.resolve(this._studies[e]) : (this._deferreds[ e] || (this._deferreds[e] = j()), this._deferreds[e].promise) }, i.prototype.reset = function() { var i = e.indexOf(this._source); ~i && (e.splice(i, 1), t.splice(i, 1)) }, i }(); e.exports = l }, OLhd: function(e, t, i) { "use strict"; i.r(t), i.d(t, "createDwmAligner", (function() { return c })), i.d(t, "isAlignmentEnabled", (function() { return h })), i.d(t, "createTimeToBarTimeAligner", (function() { return u })); var s = i("jCNj"), r = i("Kxc7"), n = i("LxhU"), o = i("ZmuQ"), a = i("IiTo"); const l = new o.b("Etc/UTC", "0000-0000:1234567"); function c(e, t) { if (!h() || !n.Interval.isDWM(e)) return null; const i = new o.b(t.timezone, t.session, t.session_holidays, t.corrections), r = Object(a.newBarBuilder)(e, i, l); return { timeToSessionStart: e => r.tradingDayToSessionStart(e), timeToExchangeTradingDay: e => { const t = s.utc_to_cal(i.timezone, e), r = i.spec.correctTradingDay(t); return s.set_hms(r, 0, 0, 0, 0, s.get_timezone("Etc/UTC")), r.getTime() } } } function h() { return !r.enabled("disable_resolution_rebuild") } function u(e, t) { if (!h()) return e => e; const i = new o.b(t.timezone, t.session, t.session_holidays, t.corrections), s = Object(a.newBarBuilder)(e, i, i, !1); return e => s.alignTimeIfPossible(e) } }, Ocx9: function(e, t, i) { "use strict"; (function(e) { var s = i("wZIs"), r = i("tc+8"); function n(e, t, i, r) { var n = e ? s.defaults : s.factoryDefaults, a = t.startsWith("study_") ? TradingView.clone(n("study")) : {}, l = TradingView.clone(n(t, r)); return t.startsWith("study_") && l.inputs && delete l.inputs.symbol, "linetoolicon" === t && e && (l.icon = s.defaults(t).icon), l = o(l, i), TradingView.merge(a, l), a } function o(e, t) { var i = {}; for (var s in e) t.indexOf(s) < 0 && (i[s] = e[s]); return i } function a(t, i, s, o) { var l; void 0 === o && (o = !0), this._defaultName = t, s ? l = i : (l = n(o, t, [], null), i && TradingView.merge(l, i)), r.call(this, l), this._defaultName = t, this ._useUserPreferences = o, this.listeners().subscribe(this, a.prototype .onPropertyChanged), this._exclusions = [], this ._restoreFactoryDefaultsEvent = new e } inherit(a, r), a._saveDefaults = !1, a.prototype.preferences = function() { return this.state(this._exclusions) }, a.prototype.mergePreferences = function(e) { this.mergeAndFire(o(e, this._exclusions)) }, a.prototype.addExclusion = function(e) { this._exclusions.indexOf(e) < 0 && this._exclusions.push(e) }, a.prototype.restoreFactoryDefaults = function() { var e = n(!1, this._defaultName, this._exclusions, null); this.mergeAndFire(e), this._defaultName.startsWith("study_") && !this ._defaultName.startsWith("study_VbPFixed") || this.saveDefaults(), this ._restoreFactoryDefaultsEvent.fire() }, a.prototype.onRestoreFactoryDefaults = function() { return this._restoreFactoryDefaultsEvent }, a.prototype.onPropertyChanged = function() { !a._saveDefaults || this._defaultName.startsWith("study_") && !this._defaultName .startsWith("study_VbPFixed") || this.saveDefaults() }, a.prototype.saveDefaults = function() { this._useUserPreferences && s.saveDefaults(this._defaultName, this .preferences()) }, a.prototype.clone = function(e) { for (var t = new a(this._defaultName, this.state(), e && e.replaceByState, this ._useUserPreferences), i = 0; i < this._exclusions.length; ++i) t .addExclusion(this._exclusions[i]); return t }, t.DefaultProperty = a, t.saveDefaultProperties = function(e) { a._saveDefaults = e } }).call(this, i("aIyQ")) }, OiSa: function(e, t, i) { "use strict"; i.r(t), i.d(t, "isDrawingToolbarVisible", (function() { return c })); var s = i("Vdly"), r = i("Kxc7"), n = i("hY0g"), o = i.n(n); const a = !r.enabled("hide_left_toolbar_by_default"), l = s.getBool("ChartDrawingToolbarWidget.visible", a), c = new o.a(l) }, OsWk: function(e, t) { e.exports = '' }, OwDf: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PivotPointsStandardLastPricesView", (function() { return o })); var s = i("k9/m"); const r = ["p", "s1", "r1", "s2", "r2", "s3", "r3", "s4", "r4", "s5", "r5"], n = { P: "P", S1: "S1/R1", S2: "S2/R2", S3: "S3/R3", S4: "S4/R4", S5: "S5/R5", R1: "S1/R1", R2: "S2/R2", R3: "S3/R3", R4: "S4/R4", R5: "S5/R5" }; class o { constructor(e) { this._visiblePivots = new Set, this._invidated = !0, this._prices = [], this ._source = e } visiblePivots() { return this._visiblePivots } update() { this._invidated = !0 } prices() { return this._invidated && (this._updateImpl(), this._invidated = !1), this._prices } _updateImpl() { this._visiblePivots.clear(); const e = this._source.model(), t = this._source.priceScale(); if (null === t) return; if (e.timeScale().isEmpty() || t.isEmpty()) return; const i = e.timeScale().visibleBarsStrictRange(); if (null === i) return; if (!this._source.customData() || !this._source.customData().pivots) return; const o = e.mainSeries().bars().search(i.lastBar(), s.PlotRowSearchMode .NearestLeft); if (null === o) return; const a = o.index, l = this._source.customData().pivots, c = this._source.indexes(), h = this._source.properties(), u = this._source.firstValue(); for (let e = 0; e < l.length; e++) { if (!l[e]) continue; const i = c[l[e].startIndex], s = c[l[e].endIndex], o = h.inputs.showHistoricalPivots.value(); if (i <= a && (s >= a || o)) { this._visiblePivots.add(l[e]), this._prices = []; for (let i = 0; i < r.length; i++) { const s = r[i], o = l[e][s]; if (void 0 === o || null === u) continue; const a = t.priceToCoordinate(o, u), c = s.toUpperCase(), d = n[c], p = h.levelsStyle.colors[d].value(); this._prices.push({ formatted: t.formatPrice(o, u), price: o, coordinate: a, color: p }) } } } } } }, Owlf: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); const s = "large" }, Oy0l: function(e, t, i) {}, PAcw: function(e, t, i) { "use strict"; i.r(t), i.d(t, "GridRenderer", (function() { return n })); var s = i("jFln"), r = i("gAom"); class n { constructor() { this._data = null } setData(e) { this._data = e } draw(e, t) { if (null === this._data) return; const i = t.pixelRatio, n = Math.max(1, Math.floor(i)); e.lineWidth = n; const o = Math.ceil(this._data.h * i), a = Math.ceil(this._data.w * i); if (e.save(), e.lineCap = "butt", this._data.vertLinesVisible) { e.strokeStyle = this._data.vertLinesColor, Object(s.setLineStyle)(e, this._data .vertLineStyle); for (const t of this._data.timeMarks) { const s = Math.round(t.coord * i); Object(r.drawVerticalLine)(e, s, 0, o) } } if (this._data.horzLinesVisible) { e.strokeStyle = this._data.horzLinesColor, Object(s.setLineStyle)(e, this._data .horzLineStyle); for (const t of this._data.priceMarks) { const s = Math.round(t.coord * i); Object(r.drawHorizontalLine)(e, s, 0, a) } } e.restore() } hitTest(e) { return null } } }, PL0c: function(e, t, i) { "use strict"; (function(e) { var s = i("aO4+").Point, r = i("2kV1").StudyStatusView, n = i("it7y").StudyDataWindowView, o = i("Qq0B").NonSeriesStudy, a = i("UHyS").StandardPivotPointsPriceAxisView, l = i("KtbP").PanePriceAxisView, c = i("VdBB").HitTestResult, h = i("Zy3/").CompositeRenderer, u = i("c44N").areEqualPaneRenderParams, d = i("2EnG").StandardPivotPointsImageCache, p = i("OwDf").PivotPointsStandardLastPricesView, _ = i("Fdrt").PaneRendererStandardPivotLabel, m = i("l4sv").HorizontalLineRenderer; class f { constructor(e, t) { this._model = e, this._source = t, this._pivots = [], this._textCache = {} } setCache(e) { this._cache = e } priceAxisViews(e, t) { return this._priceAxisViews } mergeLabel(e, t, i) { var s = "" + t; void 0 === e[s] ? (e[s] = {}, e[s].text = i, e[s].ids = [this.complete( i)]) : (e[s].text += "/" + i, e[s].ids.push(this.complete(i))) } complete(e) { return "P" === e ? e : "S" + e[1] + "/R" + e[1] } update() { this._invalidated = !0 } _updateImpl() { if (this._source.pricesView().prices(), this._pivots = [], this._source .customData() && this._source.customData().pivots && this._source .properties().visible.value()) { var e = this._source.customData().pivots, t = this._source._indexes, i = this._model.timeScale(), s = this._source.priceScale(); if (s && !s.isEmpty() && !i.isEmpty() && e) { var r = i.visibleBarsStrictRange(), n = r.firstBar(), o = r.lastBar(); if (this._source.ownerSource()) for (var a = this._source.ownerSource().firstValue(), l = 0; l < e.length; l++) if (e[l]) { var c = t[e[l].startIndex], h = t[e[l].endIndex]; if (!(h < n || c > o)) { var u = {}, d = this._source.properties().levelsStyle .visibility; d.P.value() && this.mergeLabel(u, e[l].p, "P"), d[ "S1/R1"].value() && (this.mergeLabel(u, e[l] .s1, "S1"), this.mergeLabel(u, e[l].r1, "R1")), d["S2/R2"].value() && (this .mergeLabel(u, e[l].s2, "S2"), this.mergeLabel(u, e[l].r2, "R2")), d[ "S3/R3"].value() && (this.mergeLabel(u, e[l] .s3, "S3"), this.mergeLabel(u, e[l].r3, "R3")), d["S4/R4"].value() && (this .mergeLabel(u, e[l].s4, "S4"), this .mergeLabel(u, e[l].r4, "R4")), d["S5/R5"] .value() && (this.mergeLabel(u, e[l].s5, "S5"), this.mergeLabel(u, e[l].r5, "R5")); var p = i.indexToCoordinate(c), _ = i.indexToCoordinate(h); for (var m in u) { var f = parseFloat(m), g = s.priceToCoordinate(f, a); this._pivots.push({ x1: p, x2: _, y: g, label: u[m].text, labelIds: u[m].ids, src: e[l] }) } } } } } } renderer() { this._invalidated && (this._updateImpl(), this._invalidated = !1); for (var e = new h, t = this._source.properties().levelsStyle.colors, i = this._source.properties().levelsStyle.widths, r = this._source .visiblePivots(), n = 0; n < this._pivots.length; n++) { var o = this._pivots[n]; if (r.has(o.src)) { var a = { width: this._model.timeScale().width(), height: this._source.priceScale().height(), color: t[o.labelIds[0]].value(), linewidth: i[o.labelIds[0]].value(), linestyle: CanvasEx.LINESTYLE_SOLID, y: o.y, left: o.x1, right: o.x2 }, l = new m; if (l.setData(a), l.setHitTest(new c(c.REGULAR)), e.append(l), this ._source.properties().levelsStyle.showLabels.value()) { var u = function(e) { return this._source.getCache(e) }.bind(this); e.append(new _(u, new s(o.x1, o.y), o.label)) } } } return e } } t.study_PivotPointsStandard = class extends o { constructor(e, t, i, s) { super(e, t, i, s); for (var r = ["P", "S1/R1", "S2/R2", "S3/R3", "S4/R4", "S5/R5"], n = this.properties().levelsStyle.visibility, o = 0; o < r .length; o++) n[r[o]].listeners().subscribe(this, this .processHibernate); this._cacheDrawParams = null, this._cache = null } indexes() { return this._indexes } getCache(e) { return this.createCacheIfRequred(e), this._cache } createCacheIfRequred(e) { if (null === this._cache || null == this._cacheDrawParams || !u(e, this ._cacheDrawParams)) { this._cache && this._cache.destroy(); var t = this._getActualCacheParams(); this._cache = new d(e, t.font, t.fontSize, t.backColors), this ._cache.setPrices(this._pricesView.prices()), this ._cacheDrawParams = e, this._cacheInvalidated = !1, this._cache .reset(t), this._cache.setPrices(this._pricesView.prices()) } } lastValueData(e, t, i) { var s = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5" ].indexOf(e.toUpperCase()), r = this._pricesView.prices()[s]; return null != r ? r : { noData: !0 } } priceLabelText(e) { return this._metaInfo.shortDescription + ":" + e.toUpperCase() } pricesView() { return this._pricesView } _getActualCacheParams() { var e = {}; return e.font = this.properties().font.value(), e.fontSize = this .properties().fontsize.value(), e.backColors = [this.properties() .levelsStyle.colors.P.value(), this.properties().levelsStyle .colors["S1/R1"].value(), this.properties().levelsStyle.colors[ "S1/R1"].value(), this.properties().levelsStyle.colors[ "S2/R2"].value(), this.properties().levelsStyle.colors[ "S2/R2"].value(), this.properties().levelsStyle.colors[ "S3/R3"].value(), this.properties().levelsStyle.colors[ "S3/R3"].value(), this.properties().levelsStyle.colors[ "S4/R4"].value(), this.properties().levelsStyle.colors[ "S4/R4"].value(), this.properties().levelsStyle.colors[ "S5/R5"].value(), this.properties().levelsStyle.colors[ "S5/R5"].value() ], e } updateAllViews() { super.updateAllViews(), this._pricesView.update() } _createViews() { this._cache && (this._cache.destroy(), this._cache = null), this ._priceAxisViews = []; var e = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5" ]; this._paneViews.length = 0, this._labelPaneViews = []; var t = new f(this._model, this); t.setCache(this._cache), this._paneViews.push(t), this._mainPaneView = t; for (var i = 0; i < e.length; i++) { var s = new a(this, { name: e[i], cache: this._cache }); this._priceAxisViews.push(s), this._labelPaneViews.push(new l(s, this, this._model)) } this._dataWindowView || (this._dataWindowView = new n(this, this ._model)), this._statusView || (this._statusView = new r(this, this._model.properties().scalesProperties.textColor)), this ._legendView = null, this._pricesView = new p(this) } visiblePivots() { return this._pricesView.visiblePivots() } _postProcessGraphics() {} isVisible() { if (!this.properties().visible.value() || !this.isActualInterval()) return !1; for (var e = ["P", "S1/R1", "S2/R2", "S3/R3", "S4/R4", "S5/R5"], t = this.properties().levelsStyle.visibility, i = 0; i < e .length; i++) if (t[e[i]].value()) return !0; return !1 } stop() { super.stop(), this._cache && (this._cache.destroy(), this._cache = null) } priceRange(t, i) { if (!this.customData() || !this.customData().pivots || !this._indexes) return null; if (!this.priceScale()) return null; for (var s = this.customData().pivots, r = this._indexes, n = null, o = 0; o < s.length; o++) if (s[o]) { var a = r[s[o].startIndex]; if (!(r[s[o].endIndex] < t || a > i)) { var l = [], c = this._properties.levelsStyle.visibility; c.P.value() && l.push(s[o].p), c["S1/R1"].value() && l.push( s[o].s1, s[o].r1), c["S2/R2"].value() && l.push(s[o] .s2, s[o].r2), c["S3/R3"].value() && l.push(s[o].s3, s[o].r3), c["S4/R4"].value() && l.push(s[o].s4, s[o] .r4), c["S5/R5"].value() && l.push(s[o].s5, s[o].r5); for (var h = 0; h < l.length; h++) l[h] && (null === n ? n = new e(l[h], l[h]) : n.apply(l[h], l[h])) } } return this.priceScale().isLog() && n ? new e(this.priceScale() .priceToLogical(n.minValue()), this.priceScale().priceToLogical( n.maxValue())) : n } } }).call(this, i("Qb4w").PriceRange) }, PT1i: function(e, t, i) { "use strict"; i.r(t), i.d(t, "Linking", (function() { return h })), i.d(t, "linking", (function() { return u })); var s = i("hbEN"), r = i("hY0g"), n = i.n(r), o = i("Kxc7"), a = i("txPx"); const l = Object(a.getLogger)("Linking"); var c; ! function(e) { e[e.NotBound = 0] = "NotBound", e[e.BoundToWidget = 1] = "BoundToWidget", e[e.BoundToModel = 2] = "BoundToModel" }(c || (c = {})); class h { constructor() { this._watchedSymbol = new n.a, this._seriesShortSymbol = new n.a, this._proSymbol = new n.a, this._watchedInterval = new n.a, this._watchedIntraday = new n.a, this ._watchedSeconds = new n.a, this._watchedTicks = new n.a, this ._watchedSupportedResolutions = new n.a, this._symbolNamesList = new n.a, this ._chartWidgetBindingState = c.NotBound, this._activeChartWidget = null, this ._watchedSymbolListenerBound = this._watchedSymbolListener.bind(this), this ._watchedIntervalListenerBound = this._watchedIntervalListener.bind(this), this ._onSymbolLinkBound = this._onSymbolLink.bind(this), this._searchCharts = null, this._searchChartsLoadDebounced = null, this._selfEmit = !1, this ._preventFeedBySymbol = !1, this._feedBySymbolDebounceCounter = 0 } get symbol() { return this._watchedSymbol } get proSymbol() { return this._proSymbol } get symbolNamesList() { return this._symbolNamesList } get seriesShortSymbol() { return this._seriesShortSymbol.readonly() } get interval() { return this._watchedInterval } get intraday() { return this._watchedIntraday.readonly() } get seconds() { return this._watchedSeconds.readonly() } get ticks() { return this._watchedTicks.readonly() } get supportedResolutions() { return this._watchedSupportedResolutions.readonly() } get preventFeedBySymbol() { return this._preventFeedBySymbol } bindToChartWidget(e) { if (this.unbindFromChartWidget(), this._activeChartWidget = e, e.hasModel()) return void this._onChartModelCreated(e.model()); e.modelCreated().subscribe(this, this._onChartModelCreated), this ._chartWidgetBindingState = c.BoundToWidget; const t = e.properties().childs().mainSeriesProperties.childs(); this._watchedSymbol.setValue(t.symbol.value()), this._watchedInterval.setValue(t .interval.value()) } unbindFromChartWidget() { switch (this._chartWidgetBindingState) { case c.BoundToWidget: if (!this._activeChartWidget) throw new Error("ChartWidget is undefined"); this._activeChartWidget.modelCreated().unsubscribe(this, this ._onChartModelCreated); break; case c.BoundToModel: this._symbolProperty().unsubscribe(this, this._onSymbolPropertyChange), this ._watchedSymbol.unsubscribe(this._watchedSymbolListenerBound), this ._mainSeries().dataEvents().symbolResolved().unsubscribe(this, this ._updateSeriesSymbolInfo), this._mainSeries().dataEvents() .symbolError().unsubscribe(this, this._updateSeriesSymbolInfo), this ._intervalProperty().unsubscribe(this, this._onIntervalPropertyChange), this._watchedInterval.unsubscribe(this._watchedIntervalListenerBound), delete this._watchedSymbol.hook, delete this._watchedSymbol.writeLock } this._activeChartWidget = null, this._chartWidgetBindingState = c.NotBound } getChartWidget() { return this._activeChartWidget } bindToChartWidgetCollection(e) { this._chartWidgetCollection = e, this.unbindFromChartWidget(), e.activeChartWidget .subscribe(e => { this.unbindFromChartWidget(), this.bindToChartWidget(e) }, { callWithLast: !0 }) } bindToSearchCharts(e) { this.unbindFromSearchCharts(), this._searchCharts = e, e.onSearchBySymbol.subscribe( this, this._onSearchBySymbol), e.loadingSymbol.subscribe(e => { !1 === e && (this._feedBySymbolDebounceCounter = 0) }), this._watchedSymbol.subscribe(this._onSymbolLinkBound) } unbindFromSearchCharts() { this._searchCharts && (this._searchCharts.onSearchBySymbol.unsubscribe(this, this ._onSearchBySymbol), this._watchedSymbol.unsubscribe(this ._onSymbolLinkBound), this._searchCharts = null) } setPreventFeedBySymbol(e) { this._preventFeedBySymbol = e } _onSearchBySymbol(e) { if (!e.resolved_symbol) throw new Error("no resolved_symbol"); this._selfEmit = !0, this._watchedSymbol.setValue(e.resolved_symbol), this ._selfEmit = !1 } _onSymbolLink(e) { if (!this._selfEmit) { if (!this._searchCharts) { const e = "No search charts defined"; throw l.logError(e), new Error(e) } this._preventFeedBySymbol || this._loadSearchCharts(e) } } _loadSearchCharts(e) { if (!this._searchCharts) { const e = "No search charts defined"; throw l.logError(e), new Error(e) } if (this._searchChartsLoadDebounced) return void(this._feedBySymbolDebounceCounter < 100 && (this._feedBySymbolDebounceCounter++, this ._searchChartsLoadDebounced(e))); const t = e => this._searchCharts ? (!0 === this._searchCharts.loadingSymbol .value() ? this._feedBySymbolDebounceCounter < 100 && (this ._feedBySymbolDebounceCounter++, this._searchChartsLoadDebounced = Object(s.default)(t, 2e3), this._searchChartsLoadDebounced(e)) : this ._searchChartsLoadDebounced = null, this._searchCharts.feedBySymbol.call( this._searchCharts, e)) : () => {}; !0 === this._searchCharts.loadingSymbol.value() ? this ._feedBySymbolDebounceCounter < 100 && (this._feedBySymbolDebounceCounter++, this._searchChartsLoadDebounced = Object(s.default)(t, 2e3), this ._searchChartsLoadDebounced(e)) : this._searchCharts.feedBySymbol(e) } _mainSeries() { if (!this._activeChartWidget) throw new Error("ChartWidget is undefined"); return this._activeChartWidget.model().mainSeries() } _properties() { return this._mainSeries().properties() } _symbolProperty() { return this._properties().symbol } _intervalProperty() { return this._properties().interval } _watchedSymbolListener(e) { this._symbolProperty().value() !== e && this._chartWidgetCollection.setSymbol(e) } _sendSnowplowAnalytics() { if (!window.user.do_not_track) throw new Error("unsupported") } _onSymbolPropertyChange() { const e = this._symbolProperty().value() !== this._watchedSymbol.value(); this._watchedSymbol.setValue(this._symbolProperty().value()), e && this ._chartWidgetCollection.setSymbol(this._symbolProperty().value()) } _onSymbolResolved(e) { const t = this._mainSeries().symbolInfo(); t && this._applyValuesFromSymbolInfo(t) } _applyValuesFromSymbolInfo(e) { const t = e.pro_name || o.enabled("trading_terminal") && (e.full_name || e.name) || ""; this._proSymbol.setValue(t), e.aliases && this._symbolNamesList.setValue(e.aliases) } _updateSeriesSymbolInfo() { this._seriesShortSymbol.setValue(this._properties().shortName.value()); const e = this._mainSeries().symbolInfo(); e ? (this._applyValuesFromSymbolInfo(e), e.hasOwnProperty("supported_resolutions") ? this._watchedSupportedResolutions.setValue(e.supported_resolutions) : this ._watchedSupportedResolutions.setValue(void 0), this._watchedIntraday .setValue(!!e.has_intraday), this._watchedSeconds.setValue(!!e.has_seconds), this._watchedTicks.setValue(!!e.has_ticks)) : (this._watchedIntraday .deleteValue(), this._watchedSeconds.deleteValue(), this._watchedTicks .deleteValue(), this._proSymbol.deleteValue()) } _watchedIntervalListener(e) { this._intervalProperty().value() !== e && this._chartWidgetCollection.setResolution( e) } _onIntervalPropertyChange() { const e = this._intervalProperty().value() !== this._watchedInterval.value(); this._watchedInterval.setValue(this._intervalProperty().value()), e && this ._chartWidgetCollection.setResolution(this._intervalProperty().value()) } _onChartModelCreated(e) { if (!this._activeChartWidget) throw new Error("ChartWidget is undefined"); this._chartWidgetBindingState = c.BoundToModel, this._activeChartWidget .modelCreated().unsubscribe(this, this._onChartModelCreated); const t = this._symbolProperty(); t.subscribe(this, this._onSymbolPropertyChange), this._watchedSymbol.setValue(t .value()), this._watchedSymbol.subscribe(this._watchedSymbolListenerBound); const i = this._mainSeries(); i.dataEvents().symbolResolved().subscribe(this, this._onSymbolResolved), this ._watchedSymbol.hook = e => (i.symbolSameAsCurrent(e) && (e = i.symbol()), e), i .dataEvents().symbolResolved().subscribe(this, this._updateSeriesSymbolInfo), i .dataEvents().symbolError().subscribe(this, this._updateSeriesSymbolInfo), i .dataEvents().symbolNotPermitted().subscribe(this, this ._updateSeriesSymbolInfo), i.dataEvents().symbolGroupNotPermitted() .subscribe( this, this._updateSeriesSymbolInfo), this._updateSeriesSymbolInfo(); const s = this._intervalProperty(); s.subscribe(this, this._onIntervalPropertyChange), this._watchedInterval.setValue(s .value()), this._watchedInterval.subscribe(this ._watchedIntervalListenerBound), this._activeChartWidget.readOnly() && (this ._watchedSymbol.writeLock = !0) } } window.TradingView = window.TradingView || {}; const u = new h; window.TradingView.Linking = u }, PYn8: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolThreeDrivers", (function() { return o })); var s = i("Ocx9"), r = i("Ss5c"), n = i("j3hX"); class o extends r.LineDataSource { constructor(e, t) { const s = t || o.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "S6aM")).then(t => { this._setPaneViews([new t.LineToolThreeDrivesPaneView(this, e)]) }) } pointsCount() { return 7 } name() { return "Three Drives Pattern" } properties() { return super.properties() } static createProperties(e) { const t = new s.DefaultProperty("linetoolthreedrivers", e); return o._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "aMeN")).then( e => e.PatternWithoutBackgroundDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n .LineToolColorsProperty([e.childs().color])), e.addChild("textsColors", new n.LineToolColorsProperty([e.childs().textcolor])), e.addChild( "linesWidths", new n.LineToolWidthsProperty([e.childs().linewidth])), e .hasChild("backgroundsColors") && e.removeProperty("backgroundsColors") } } }, PzPU: function(e, t, i) { "use strict"; i.r(t), i.d(t, "copyToClipboardImageOfChart", (function() { return r })), i.d(t, "getImageOfChartSilently", (function() { return n })), i.d(t, "copyToClipboardClientScreenshot", (function() { return o })), i.d(t, "downloadClientScreenshot", (function() { return a })); const s = () => i.e("take-chart-image-impl").then(i.bind(null, "13es")); function r(e, t = {}) { return s().then(i => i.copyToClipboardImageOfChart(e, t)) } function n(e, t = {}) { return s().then(i => i.getImageOfChartSilently(e, t)) } function o(e) { return s().then(t => t.copyToClipboardClientScreenshot(e)) } function a(e) { return s().then(t => t.downloadClientScreenshot(e)) } }, Q19o: function(e, t, i) { "use strict"; var s = i("Eyy1").ensureNotNull, r = i("jA0t"), n = i("9iCb").applyOverridesToStudy, o = i("0YCj"), a = i("5JMW"), l = a.LineDataSourceApi, c = a.isLineToolRiskReward, h = i("N1UO").StudyApi, u = i("ltKl").SeriesApi, d = i("QrSB").SelectionApi, p = i("mf9N").PaneApi, _ = i("OLhd").createDwmAligner, m = i("LxhU").Interval, f = i("2jXJ").supportedLineTools, g = i("vwKG").showTooManyStudiesNotice, b = i("ogJP"), v = b.isNumber, S = b.deepEquals, y = i("CW80").createLineToolProperties, w = i("CW80").prepareLineToolPropertiesByOwnerSource, P = i("96Yh").lineToolEntityInfo, C = i("lReN").LineToolsGroupControllerApi, x = i("ocrj").RemoveSourcesCommand, T = i("e92V").isLineDrawnWithPressedButton, I = i("FDyI").ChartWidgetApiBase, M = i("mMWL"); function O(e, t) { return t.map((function(t) { return e.dataSourceForId(t) })) } e.exports = class extends I { constructor(e, t) { super(e, t), this._panes = new WeakMap, this._studies = new WeakMap, this ._lineDataSources = new WeakMap, this._selectionApi = null, this ._prevVisibleRange = null, this._chartWidget.onAboutToBeDestroyed() .subscribe(this, this._destroy, !0), this._chartWidget.withModel(this, ( function() { this._chartWidget.model().timeScale().logicalRangeChanged() .subscribe(this, this._onLogicalRangeChanged) })) } id() { return this._chartWidget.id() } _getPaneApi(e) { var t = this._panes.get(e); return void 0 === t && (t = new p(e, this._chartWidget), this._panes.set(e, t)), t } _getStudyApi(e) { var t = this._studies.get(e); return void 0 === t && (t = new h(e, this._chartWidget), this._studies.set(e, t)), t } _getLineDataSourceApi(e) { var t = this._lineDataSources.get(e); return void 0 === t && (t = new l(e, this._chartWidget.model().model(), { apiPointsToDataSource: this._convertUserPointsToDataSource.bind( this), dataSourcePointsToPriced: e => { var t = this._chartWidget.model().mainSeries() .syncModel(), i = this._chartWidget.model().timeScale(); return e.map(e => { var s = i.normalizeBarIndex(e.index); return { price: e.price, time: this._convertTimeToPublic(t .projectTime(s.time_t, s.offset) ) } }) } }), this._lineDataSources.set(e, t)), t } executeActionById(e) { this._chartWidget.executeActionById(e) } getCheckableActionState(e) { return this._chartWidget.getCheckableActionState(e) } setZoomEnabled(e) { this._chartWidget.model().model().setZoomEnabled(e) } setScrollEnabled(e) { this._chartWidget.model().model().setScrollEnabled(e) } refreshMarks() { this._chartWidget.refreshMarks() } clearMarks() { this._chartWidget.clearMarks() } symbol() { return this._chartWidget.getSymbol() } symbolExt() { var e = this._chartWidget.model().mainSeries().symbolInfo(); return e ? { symbol: e.name, full_name: e.full_name, exchange: e.exchange, description: e.description, type: e.type, pro_name: e.pro_name } : null } resolution() { return this._chartWidget.model().mainSeries().properties().interval.value() } resetData() { this._chartWidget.model().mainSeries().rerequestData() } setEntityVisibility(e, t) { console.warn( "`setEntityVisibility` is deprecated. Use shape/study API instead"); var i = this._chartWidget.model().model().dataSourceForId(e); if (i) { var s = i.properties(); s && s.visible && s.visible.setValue(t) } } availableZOrderOperations(e) { var t = O(this._chartWidget.model().model(), e); return this._chartWidget.model().availableZOrderOperations(t) } sendToBack(e) { var t = O(this._chartWidget.model().model(), e); this._chartWidget.model().sendToBack(t) } bringToFront(e) { var t = O(this._chartWidget.model().model(), e); this._chartWidget.model().bringToFront(t) } insertAfter(e, t) { var i = this._chartWidget.model().model(), s = O(i, e), r = i.dataSourceForId(t); this._chartWidget.model().insertAfter(s, r) } insertBefore(e, t) { var i = this._chartWidget.model().model(), s = O(i, e), r = i.dataSourceForId(t); this._chartWidget.model().insertBefore(s, r) } bringForward(e) { var t = O(this._chartWidget.model().model(), e); this._chartWidget.model().bringForward(t) } sendBackward(e) { var t = O(this._chartWidget.model().model(), e); this._chartWidget.model().sendBackward(t) } showPropertiesDialog(e) { var t = this._chartWidget.model().model().dataSourceForId(e); if (null === t) throw new Error("Study or shape " + e + " does not exist"); this._chartWidget.showChartPropertiesForSource(t) } getAllShapes() { return this._chartWidget.model().model().allLineTools().map(P).filter((function( e) { return null !== e.name })) } removeAllShapes() { this._chartWidget.removeAllDrawingTools() } removeAllStudies() { this._chartWidget.removeAllStudies() } removeEntity(e, t) { var i = this._chartWidget.model().chartModel().dataSourceForId(e); i ? t && t.disableUndo ? new x(this._chartWidget.model().chartModel(), [i], "") .redo() : this._chartWidget.model().removeSource(i, !0, !0) : console.warn( "Can't find a source with id: " + e) } removeEntityWithUndo(e) { var t = this._chartWidget.model().chartModel().dataSourceForId(e); this._chartWidget.model().removeSource(t, !1) } selection() { return null === this._selectionApi && (this._selectionApi = new d(this ._chartWidget.model().model())), this._selectionApi } createStudyTemplate(e) { return this._chartWidget.model().model().studyTemplate(e.saveSymbol, e .saveInterval) } drawOnAllCharts(e) { M.drawOnAllCharts.setValue(e) } applyStudyTemplate(e) { this._chartWidget.model().applyStudyTemplate(e, "" + 1e3 * Math.random()) } setVisibleRange(e, t) { return new Promise(function(i) { this._chartWidget.setVisibleTimeRange(e.from, e.to, t, i) }.bind(this)) } getVisibleRange() { var e = { from: 0, to: 0 }, t = this._chartWidget.model().timeScale(); if (t.isEmpty()) return e; var i = t.coordinateToVisibleIndex(0), s = t.coordinateToVisibleIndex(t.width() - 1), r = this._convertIndexToPublicTime(s); return null === r || (e.from = this._convertIndexToPublicTime(Math.max(t .points().firstIndex(), i)), e.to = r), e } getVisiblePriceRange() { return console.warn( "`getVisiblePriceRange` is deprecated. Use Price Scale API instead"), this._chartWidget.model().mainSeries() ? this._chartWidget.model() .mainSeries().priceScale().priceRangeInPrice() : null } scrollPosition() { return this._chartWidget.model().timeScale().rightOffset() } defaultScrollPosition() { return this._chartWidget.model().timeScale().defaultRightOffsetProperty() .value() } _createTradingPrimitive(e, t) { var i = this; var r, n, o = this._chartWidget.model().model(), a = o.paneForSource(o.mainSeries()); return (t ? o : this._chartWidget.model()).createLineTool(a, (r = TradingView .CLOSE_PLOT, { index: (n = s(i._chartWidget.model().mainSeries().bars() .last())).index, price: n.value[r] }), e)._adapter } createOrderLine(e) { e = e || {}; return this._createTradingPrimitive("LineToolOrder", e.disableUndo) } createPositionLine(e) { e = e || {}; return this._createTradingPrimitive("LineToolPosition", e.disableUndo) } createExecutionShape(e) { e = e || {}; return this._createTradingPrimitive("LineToolExecution", e.disableUndo) } createShape(e, t) { return this.createMultipointShape([e], t) } _alignPoints(e) { var t = this._chartWidget.model().model(), i = t.mainSeries(), s = i.interval(); if (t.timeScale().isEmpty() || !m.isDWM(s)) return e; var r = _(s, i.symbolInfo()); return null === r ? e : e.map((function(e) { return r.timeToSessionStart(1e3 * e) / 1e3 })) } _convertUserPointsToDataSource(e) { var t = this._chartWidget.model().model(), i = t.mainSeries(), s = t.timeScale().points(), r = i.data(); if (t.timeScale().isEmpty()) return null; var n = e.map((function(e) { return e.time || 0 })), o = this._alignPoints(n); function a(e, t, n) { var o = s.closestIndexLeft(e) || 0, a = { index: o }, l = s.valueAt(o); if (e > l && o === s.lastIndex())(c = i.syncModel().distance(l, e)) .success && (a.index = a.index + c.result); else if (e < l && o === s.firstIndex()) { var c; (c = i.syncModel().distance(e, l)).success && (a.index = a.index - c .result) } if (v(t)) a.price = t; else { var h = n ? ["open", "high", "low", "close"].indexOf(n) + 1 : 1; h <= 0 && (h = 1), a.price = r.valueAt(o)[h] } return a } for (var l = [], c = 0; c < e.length; c++) { var h = e[c]; l.push(a(o[c], h.price, h.channel)) } return l } createMultipointShape(e, t, i) { var s = t.disableUndo ? this._chartWidget.model().model() : this._chartWidget .model(), r = this._chartWidget.model().model(), n = r.mainSeries(); if (!r.timeScale().isEmpty()) { var o = r.dataSourceForId(t.ownerStudyId) || n, a = r.paneForSource(o), l = this._convertUserPointsToDataSource(e), h = f[t.shape] || f.flag; if (h.onlySelectable) throw new Error('Cannot create "' + t.shape + '" shape'); if ("LineToolPolyline" === h.name || "LineToolPath" === h.name || "LineToolGhostFeed" === h.name) l[0].price === l[l.length - 1].price && l[0].index === l[l.length - 1].index || l.push(l[0]); else if ("LineToolIcon" === h.name) { if (t.icon = t.icon || t.overrides && t.overrides.icon, !t .hasOwnProperty("icon")) throw new Error( "icon must be specified in options"); t.overrides = t.overrides || {}, t.overrides.icon = t.icon } var u = y(h.name); if (w(u, o), t.overrides) for (var d in t.overrides) u[d] ? u[d].mergeAndFire(t.overrides[d]) : c( h.name) && -1 !== ["profitLevel", "stopLevel"].indexOf(d) && u .addProperty(d, t.overrides[d]); void 0 !== u.text && t.text && u.text.setValue(t.text); var p = s.createLineTool(a, l[0], h.name, u, void 0, o); if (c(h.name)) { if (l.length > 2) throw new Error("Wrong points count for " + t.shape + ". Required 1 or 2"); 2 === l.length && (p.startChanging(1, l[1]), p.setPoint(1, l[1]), p .endChanging()) } else { var _ = p.pointsCount(); if (_ !== l.length && -1 !== _) throw new Error( "Wrong points count for " + t.shape + ". Required " + _); for (var m = T(h.name), g = 1; g < l.length && this._chartWidget.model() .lineBeingCreated(); g++) s.continueCreatingLine(l[g], null, g < l .length - 1 || m); m && (s.finishLineTool(p), s.continueCreatingLine(l[l.length - 1], null, !1)) } if (t.lock && p.setUserEditEnabled(!1), t.disableSelection && p .setSelectionEnabled(!1), t.disableSave && (p.customization .disableSave = !0), t.hasOwnProperty("showInObjectsTree") && (p .customization.showInObjectsTree = t.showInObjectsTree), t.zOrder) { var b = this._chartWidget.model().availableZOrderOperations([p]); "top" === t.zOrder && b.bringToFrontEnabled ? s.bringToFront([p]) : "bottom" === t.zOrder && b.sendToBackEnabled && s.sendToBack([p]) } return p.id() } } getShapeById(e) { var t = this._chartWidget.model().model().getLineToolById(e); if (null === t) throw new Error("There is no such shape"); return this._getLineDataSourceApi(t) } createStudy(e, t, i, s, a, l) { if ("function" == typeof a) return console.warn( '"createStudy" does not take "callback" parameter anymore'), Promise .resolve(null); if (l = l || {}, "string" != typeof e) return this._createStudy(e); if (l.checkLimit && !this._chartWidget.model().canCreateStudy()) return g(), Promise.resolve(null); e = e.toLowerCase(); var c = l.disableUndo ? this._chartWidget.model().model() : this._chartWidget .model(), h = o.findStudyMetaInfoByDescription(c.studiesMetaData(), e).id, u = c.createStudyInserter({ type: "java", studyId: h }); return u.setForceOverlay(t), l.priceScale && u.setPreferredPriceScale(function( e) { switch (e) { case "no-scale": return "overlay"; case "as-series": return "as-series"; case "new-left": return "left"; case "new-right": return "right"; default: throw new Error('The pricescale "' + e + '" is invalid, the only valid options are "no-scale", "as-series", "new-left" and "new-right".' ) } }(l.priceScale)), l.allowChangeCurrency && u.setAllowChangeCurrency(!0), l .allowChangeUnit && u.setAllowChangeUnit(!0), s && (s = r .getStudyRecordFromArray([e].concat(s), this._chartWidget).inputs), u .insert((function() { return Promise.resolve(s || {}) })).then((function(e) { return a && n(e, a), i && e.setUserEditEnabled(!1), e.id() })) } getStudyById(e) { var t = this._chartWidget.model().model().getStudyById(e); if (null === t) throw new Error("There is no such study"); return this._getStudyApi(t) } getSeries() { var e = this._chartWidget.model(), t = e.mainSeries(); return new u(t, e) } chartType() { return this._chartWidget.model().mainSeries().properties().style.value() } priceFormatter() { return this._chartWidget.model().mainSeries().priceScale().formatter() } dataReady(e) { var t = !this._chartWidget.hasModel() || !this._chartWidget.model() .mainSeries() || this._chartWidget.model().mainSeries().data().isEmpty(); return e && (t ? this.onDataLoaded().subscribe(null, e, !0) : e()), !t } _onLogicalRangeChanged() { var e = this._chartWidget.model().mainSeries(), t = e.data().isEmpty(); if (null !== this._chartWidget.model().timeScale().visibleBarsStrictRange() && t) e.dataEvents().completed().subscribe(this, this._onLogicalRangeChanged, ! 0); else { var i = this.getVisibleRange(); null !== this._prevVisibleRange && S(this._prevVisibleRange, i)[0] || (this ._prevVisibleRange = i, this._visibleBarsChanged.fire(i)) } } _destroy() { super._destroy(), this._chartWidget.hasModel() && this._chartWidget.model() .timeScale().logicalRangeChanged().unsubscribe(this, this ._onLogicalRangeChanged) } setTimezone(e) { this._chartWidget.setTimezone(e) } getTimezone() { return this._chartWidget.getTimezone() } getPanes() { return this._chartWidget.model().chartModel().panes().map((function(e) { return this._getPaneApi(e) }), this) } canZoomOut() { return !this._chartWidget.model().zoomStack().isEmpty() } zoomOut() { this.canZoomOut() && this._chartWidget.model().zoomFromViewport() } shapesGroupController() { return new C(this._chartWidget.model().lineToolsGroupController(), this ._chartWidget.model()) } isSelectBarRequested() { return this._chartWidget.selectPointMode().value() } requestSelectBar() { if (this.isSelectBarRequested()) return Promise.reject("already requested"); var e = this; return new Promise((function(t, i) { e._chartWidget.requestSelectPoint("time").then((function(i) { t(e._convertTimeToPublic(i.point.time)) })).catch((function() { i("cancelled") })) })) } cancelSelectBar() { this.isSelectBarRequested() && this._chartWidget.cancelRequestSelectPoint() } } }, QCyK: function(e, t, i) { "use strict"; i.r(t), i.d(t, "spreadStudyItem", (function() { return n })); var s = i("7dm8"); class r extends s.a { _doCalculation(e, t, i, s) { return e * t - i * s } } const n = { name: "Spread", metainfo: { _metainfoVersion: 15, defaults: s.b, plots: s.d, styles: s.e, description: "Spread", shortDescription: "Spread", is_price_study: !1, inputs: s.c, id: "Spread@tv-basicstudies-1" }, constructor: r } }, QIuV: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("ivNn").fixComputationError; class n extends s { constructor(e, t) { super(e, t), this.customization.forcePriceAxisLabel = !0, this.customization .disableErasing = !0, this.customization.showInObjectsTree = !1, this .setSelectionEnabled(!1) } isSynchronizable() { return !1 } pointsCount() { return n.POINTS_COUNT } hasContextMenu() { return !1 } state() { return null } startMoving() { s.prototype.startMoving.apply(this, arguments), this._cursorMoved = !1 } endMoving() { s.prototype.endMoving.apply(this, arguments), this._cursorMoved = !1 } _correctPoints(e) { this._currentMovingPoint && this._startMovingPoint ? this._currentMovingPoint .logical.price - this._startMovingPoint.logical.price && (this._cursorMoved = ! 0) : this._cursorMoved = !1; for (var t = 1 / this.priceScale().mainSource().base(), i = 0; i < e.length; i++) { var s = e[i]; this._cursorMoved && (s.price = this._currentMovingPoint.logical.price), s .price = r(t * Math.round(s.price / t)), e[i] = s } } userEditEnabled() { return !0 } movable() { return !1 } canBeHidden() { return !1 } isUserDeletable() { return !1 } showInObjectTree() { return !1 } doesMovingAffectsUndo() { return !1 } isAvailableInFloatingWidget() { return !1 } timeAxisViews() { return null } cloneable() { return !1 } copiable() { return !1 } static _configureProperties(e) { s._configureProperties(e) } } n.POINTS_COUNT = 1, e.exports.LineToolTrading = n }, QQu0: function(e, t, i) { "use strict"; var s = i("WPQD").LineToolTrendLine, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Arrow" } static createProperties(e) { var t = new r("linetoolarrow", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolArrow = n }, QTwd: function(e, t, i) { "use strict"; i.r(t), i.d(t, "RestoreDefaultsPreferencesUndoCommand", (function() { return h })); var s = i("Eyy1"), r = i("RDU5"), n = i("ApcL"), o = i("3t3b"), a = i("x2L+"), l = i("N22A"), c = i("GDWD"); class h extends r.UndoCommand { constructor(e) { super("Apply All Chart Properties"), this._trading = null, this ._oldShowSellBuyButtons = null, this._oldNoConfirmEnabled = null, this._oldShowOnlyRejectionNotifications = null, this ._oldShowPricesWithZeroVolume = null, this._oldShowPricesWithSpread = null, this._oldOrderExecutedSoundEnabled = null, this._prevWatermarkPreferences = null, this._model = e, this._trading = Object(l.a)(), null !== this ._trading && (this._oldShowSellBuyButtons = this._trading.showSellBuyButtons .value(), this._oldNoConfirmEnabled = this._trading.noConfirmEnabled .value(), this._oldShowOnlyRejectionNotifications = this._trading .showOnlyRejectionNotifications.value(), this ._oldShowPricesWithZeroVolume = this._trading.showPricesWith() .zeroVolume.value(), this._oldShowPricesWithSpread = this._trading .showPricesWith().spread.value(), this._oldOrderExecutedSoundEnabled = this._trading.orderExecutedSoundParams.enabled.value()), this ._defaultsPreferences = Object(n.defaultsPreferencesByWhiteList)(this ._model, this._model.mainSeries()), this._oldPreferences = e .preferences(), this._prevDateFormat = o.dateFormatProperty.value(), this ._prevAddPlusButton = c.addPlusButtonProperty.value(), this ._prevShowOpenMarkerStatus = a.b.value(); const t = this._model.watermarkSource(); null !== t && (this._prevWatermarkPreferences = t.properties().state()) } redo() { null !== this._trading && (this._trading.showSellBuyButtons.setValue(!0), this ._trading.noConfirmEnabled.setValue(!1), this._trading .showOnlyRejectionNotifications.setValue(!1), this._trading .showPricesWith().zeroVolume.setValue(!0), this._trading .showPricesWith().spread.setValue(!0), this._trading .orderExecutedSoundParams.enabled.setValue(!1)), this._model .applyPreferences(this._defaultsPreferences), this._model.mainSeries() .onChartStyleChanged(), this._model.updateScales(), Object(o .restoreDateFormatSettingsValue)(), Object(c .restoreAddPlusButtonSettingsValue)(), Object(a.a)(); const e = this._model.watermarkSource(); null !== e && e.restorePropertiesDefaults() } undo() { null !== this._trading && (this._trading.showSellBuyButtons.setValue(Object(s .ensureNotNull)(this._oldShowSellBuyButtons)), this._trading .noConfirmEnabled.setValue(Object(s.ensureNotNull)(this ._oldNoConfirmEnabled)), this._trading .showOnlyRejectionNotifications.setValue(Object(s.ensureNotNull)(this ._oldShowOnlyRejectionNotifications)), this._trading .showPricesWith().zeroVolume.setValue(Object(s.ensureNotNull)(this ._oldShowPricesWithZeroVolume)), this._trading.showPricesWith() .spread.setValue(Object(s.ensureNotNull)(this ._oldShowPricesWithSpread)), this._trading.orderExecutedSoundParams .enabled.setValue(Object(s.ensureNotNull)(this ._oldOrderExecutedSoundEnabled))), this._model.applyPreferences(this ._oldPreferences), this._model.mainSeries().onChartStyleChanged(), this ._model.updateScales(), o.dateFormatProperty.setValue(this._prevDateFormat), a.b.setValue(this._prevShowOpenMarkerStatus), c.addPlusButtonProperty .setValue(this._prevAddPlusButton); const e = this._model.watermarkSource(); null !== e && null !== this._prevWatermarkPreferences && e.properties() .mergeAndFire(this._prevWatermarkPreferences) } } }, Qb4w: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PriceRange", (function() { return o })); var s = i("ogJP"), r = i("txPx"); const n = Object(r.getLogger)("Chart.PriceRange"); class o { constructor(e, t) { if (null !== e && "object" == typeof e) { const t = e; this._minValue = t.m_minValue, this._maxValue = t.m_maxValue } else { const i = e; this._minValue = i, void 0 !== t && (this._maxValue = t) } } equals(e) { return this._minValue === e._minValue && this._maxValue === e._maxValue } clone() { return new o(this._minValue, this._maxValue) } minValue() { return this._minValue } setMinValue(e) { this._minValue = e } maxValue() { return this._maxValue } setMaxValue(e) { this._maxValue = e } length() { return this._maxValue - this._minValue } isEmpty() { return this._maxValue === this._minValue || this._maxValue != this._maxValue || this ._minValue != this._minValue } serialize() { return { m_maxValue: this._maxValue, m_minValue: this._minValue } } state() { return { max: this._maxValue, min: this._minValue } } merge(e) { return new o(Math.min(this.minValue(), e.minValue()), Math.max(this.maxValue(), e .maxValue())) } apply(e, t) { this._minValue = Math.min(this._minValue, e), this._maxValue = Math.max(this ._maxValue, t) } set(e, t) { this._minValue = e, this._maxValue = t } scaleAroundCenter(e) { if (!Object(s.isNumber)(e)) return void n.logDebug( "PriceRange.scaleAroundCenter: invalid coeff"); if (0 === this._maxValue - this._minValue) return; const t = .5 * (this._maxValue + this._minValue); let i = this._maxValue - t, r = this._minValue - t; i *= e, r *= e, this._maxValue = t + i, this._minValue = t + r } shift(e) { Object(s.isNumber)(e) ? (this._maxValue += e, this._minValue += e) : n.logDebug( "PriceRange.shift: invalid coeff") } containsStrictly(e) { return e.minValue() > this._minValue && e.maxValue() < this._maxValue } static compare(e, t) { return null === e || null === t ? e === t : e.equals(t) } } }, QfUd: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return a })); var s = i("hY0g"), r = i.n(s), n = i("ogJP"); function o(e, t) { return Object(n.deepEquals)(e, t)[0] } class a extends r.a { constructor(e, t = o) { super(e), this._comparator = t } setValue(e, t) { !1 === this._comparator(this.value(), e) && super.setValue(e, t) } } }, QloM: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "TabNames", (function() { return s })), function(e) { e.background = "Background", e.coordinates = "Coordinates", e.drawings = "Drawings", e .events = "Events", e.eventsAndAlerts = "Events & Alerts", e.inputs = "Inputs", e .properties = "Properties", e.scales = "Scales", e.legend = "Legend", e.sourceCode = "Source Code", e.style = "Style", e.symbol = "Symbol", e.timezoneSessions = "Timezone/Sessions", e.trading = "Trading", e.visibility = "Visibility", e.text = "Text" }(s || (s = {})) }, Qq0B: function(e, t, i) { "use strict"; i.r(t), i.d(t, "NonSeriesStudy", (function() { return n })); var s = i("Eyy1"), r = i("GVHu"); class n extends r.Study { clearData() { this._customData = null, this._indexes = null } restoreData(e, t, i) { r.Study.prototype.restoreData.call(this, e), this._customData = t, this ._indexes = i } state(e) { const t = super.state(e); return e && (t.nonSeriesData = this._customData, t.indexes = this._indexes), t } customData() { return this._customData } _setPaneViews(e) { this._paneViews = e, this.model().lightUpdate() } _onDataUpdated(e, t, i) { null !== t && (t.indexes_replace ? (Object(s.assert)("nochange" !== i), this ._indexes = i) : (this._customData = t.data, "nochange" !== i && ( this._indexes = i))), super._onDataUpdated(e, t, i) } } }, QrSB: function(e, t, i) { "use strict"; function s(e, t) { const i = e.dataSourceForId(t); if (null === i) throw new Error(`Chart has no study or shape with id "${t}"`); return i } i.r(t), i.d(t, "SelectionApi", (function() { return r })); class r { constructor(e) { this._model = e } add(e) { Array.isArray(e) ? this._model.selectionMacro(t => { e.map(s.bind(null, this._model)).forEach(e => t.addSourceToSelection(e)) }) : this.add([e]) } canBeAddedToSelection(e) { const t = s(this._model, e); return this._model.selection().canBeAddedToSelection(t) } set(e) { Array.isArray(e) ? this._model.selectionMacro(t => { t.clearSelection(), e.map(s.bind(null, this._model)).forEach(e => t .addSourceToSelection(e)) }) : this.set([e]) } remove(e) { Array.isArray(e) ? this._model.selectionMacro(t => { e.map(s.bind(null, this._model)).forEach(e => t .removeSourceFromSelection(e)) }) : this.remove([e]) } contains(e) { const t = s(this._model, e); return this._model.selection().isSelected(t) } allSources() { return this._model.selection().dataSources().map(e => e.id()) } isEmpty() { return this._model.selection().isEmpty() } clear() { this._model.selectionMacro(e => { e.clearSelection() }) } onChanged() { return this._model.onSelectedSourceChanged() } } }, Qtjj: function(e, t, i) { "use strict"; i.r(t), i.d(t, "TimeSynchronizer", (function() { return l })); var s = i("LxhU"), r = i("jCNj"), n = i.n(r), o = i("IiTo"); let a = null; class l { constructor(e, t) { var i, r; this._sourceTargetBarBuilder = null, this._cache = new Map, this._source = e, this ._target = t, this._isResolutionTheSame = s.Interval.isEqual(e.getResolution(), t.getResolution()), this._isSessionTheSame = (i = e.getSymbolInfo(), r = t .getSymbolInfo(), i.timezone === r.timezone && i.session === r.session), this._shouldCorrectTradingDay = s.Interval.isDWM(e.getResolution()) && !this ._isSessionTheSame } sourceTimeToTargetTime(e) { if (this._isSessionTheSame && this._isResolutionTheSame) return e; if (!this._source.isValid() || !this._target.isValid()) return e; let t = this._cache.get(e); if (void 0 === t) { let i = 1e3 * e; if (this._shouldCorrectTradingDay) { let e = n.a.utc_to_cal(this._source.getSession().timezone, i); e = this._source.getSession().spec.correctTradingDay(e); const t = new Date(e); n.a.set_hms(t, 0, 0, 0, 0, this._source.getSession().timezone), i = t .valueOf() } const s = this._sourceTargetBuilder(); s.moveTo(i); const r = s.indexOfBar(i); t = s.startOfBar(Math.max(0, r)) / 1e3, this._cache.set(e, t) } return t } _sourceTargetBuilder() { if (null === this._sourceTargetBarBuilder) { const e = this._isSessionTheSame ? this._target.getSession() : (null === a && ( a = new o.SessionInfo("Etc/UTC", "24x7")), a); this._sourceTargetBarBuilder = Object(o.newBarBuilder)(this._target .getResolution(), this._target.getSession(), e) } return this._sourceTargetBarBuilder } } }, RBvv: function(e) { e.exports = JSON.parse( '{"color-bg-primary":"color-white","color-bg-primary-hover":"color-cold-gray-100","color-bg-secondary":"color-white","color-bg-highlight":"color-cold-gray-50","color-bg-scroll-buttons":"color-cold-gray-100","color-legacy-bg-scroll-buttons":"color-cold-gray-850","color-legacy-bg-widget":"color-white","color-text-primary":"color-cold-gray-900","color-text-secondary":"color-cold-gray-500","color-text-tertiary":"color-cold-gray-400","color-text-disabled":"color-cold-gray-300","color-accent-content":"color-cold-gray-900","color-box-shadow":"color-cold-gray-300","color-divider":"color-cold-gray-150","color-divider-hover":"color-cold-gray-100","color-active-hover-text":"color-cold-gray-900","color-alert-text":"color-cold-gray-900","color-border-table":"color-cold-gray-100","color-brand":"color-tv-blue-500","color-brand-active":"color-tv-blue-700","color-brand-hover":"color-tv-blue-600","color-chart-page-bg":"color-cold-gray-150","color-common-tooltip-bg":"color-cold-gray-800","color-danger":"color-ripe-red-400","color-danger-hover":"color-ripe-red-500","color-danger-active":"color-ripe-red-600","color-depthrenderer-stroke-style":"color-cold-gray-100","color-highlight-new":"color-tan-orange-50","color-input-bg":"color-white","color-input-publish-bg":"color-white","color-link":"color-tv-blue-500","color-link-hover":"color-tv-blue-600","color-link-active":"color-tv-blue-700","color-list-nth-child-bg":"color-cold-gray-50","color-pane-bg":"color-white","color-pane-secondary-bg":"color-cold-gray-100","color-popup-menu-item-hover-bg":"color-cold-gray-100","color-popup-menu-separator":"color-cold-gray-150","color-screener-description":"color-cold-gray-650","color-success":"color-minty-green-500","color-success-hover":"color-minty-green-600","color-success-active":"color-minty-green-700","color-toolbar-button-text":"color-cold-gray-900","color-toolbar-button-text-hover":"color-cold-gray-900","color-toolbar-button-text-active":"color-tv-blue-500","color-toolbar-button-text-active-hover":"color-tv-blue-600","color-toolbar-button-background-hover":"color-cold-gray-100","color-toolbar-button-background-secondary-hover":"color-cold-gray-150","color-toolbar-toggle-button-background-active":"color-tv-blue-500","color-toolbar-toggle-button-background-active-hover":"color-tv-blue-600","color-toolbar-interactive-element-text-normal":"color-cold-gray-900","color-toolbar-interactive-element-text-hover":"color-cold-gray-900","color-toolbar-opened-element-bg":"color-cold-gray-100","color-tooltip-bg":"color-cold-gray-800","color-tv-dialog-caption":"color-cold-gray-650","color-tv-dropdown-item-hover-bg":"color-cold-gray-100","color-underlined-text":"color-cold-gray-500","color-widget-pages-bg":"color-white","color-warning":"color-tan-orange-500","color-growing":"color-minty-green-400","color-falling":"color-ripe-red-400","color-forex-icon":"color-cold-gray-750","color-list-item-active-bg":"color-tv-blue-400","color-list-item-hover-bg":"color-tv-blue-50","color-list-item-text":"color-cold-gray-800","color-price-axis-label-back":"color-cold-gray-150","color-price-axis-label-text":"color-cold-gray-650","color-price-axis-gear":"color-cold-gray-900","color-price-axis-gear-hover":"color-black","color-price-axis-highlight":"color-cold-gray-150","color-bid":"color-tv-blue-500","color-border":"color-cold-gray-150","color-border-chat-fields":"color-cold-gray-250","color-border-hover":"color-cold-gray-250","color-button-hover-bg":"color-cold-gray-150","color-depthrenderer-fill-style":"color-cold-gray-650","color-disabled-border-and-color":"color-cold-gray-150","color-disabled-input":"color-cold-gray-150","color-empty-container-message":"color-cold-gray-500","color-icons":"color-cold-gray-500","color-input-textarea-readonly":"color-cold-gray-650","color-input-placeholder-text":"color-cold-gray-350","color-item-active-blue":"color-tv-blue-50","color-item-hover-active-bg":"color-tv-blue-100","color-item-hover-bg":"color-tv-blue-100","color-item-hover-blue":"color-tv-blue-100","color-item-selected-blue":"color-tv-blue-50","color-item-active-text":"color-white","color-item-active-bg":"color-tv-blue-500","color-list-item":"color-cold-gray-450","color-news-highlight":"color-tv-blue-100","color-placeholder":"color-cold-gray-350","color-row-hover-active-bg":"color-cold-gray-100","color-sb-scrollbar-body-bg":"color-cold-gray-200","color-section-separator-border":"color-cold-gray-300","color-separator-table-chat":"color-cold-gray-150","color-tag-active-bg":"color-cold-gray-200","color-tag-hover-bg":"color-cold-gray-150","color-text-regular":"color-cold-gray-700","color-tv-button-checked":"color-cold-gray-550","color-scroll-bg":"color-cold-gray-400","color-scroll-border":"color-cold-gray-100","color-widget-border":"color-cold-gray-100","color-scroll-buttons-arrow":"color-white","color-control-intent-default":"color-cold-gray-200","color-control-intent-success":"color-minty-green-600","color-control-intent-primary":"color-tv-blue-500","color-control-intent-warning":"color-tan-orange-500","color-control-intent-danger":"color-ripe-red-500","color-pre-market":"color-tan-orange-600","color-pre-market-bg":"color-tan-orange-400","color-post-market":"color-tv-blue-500","color-post-market-bg":"color-tv-blue-400","color-market-open":"color-minty-green-500","color-market-open-bg":"color-minty-green-400","color-market-closed":"color-cold-gray-400","color-market-holiday":"color-cold-gray-400","color-invalid-symbol":"color-ripe-red-400","color-invalid-symbol-hover":"color-ripe-red-700","color-replay-mode":"color-tv-blue-500","color-replay-mode-icon":"color-white","color-replay-mode-hover":"color-tv-blue-600","color-notaccurate-mode":"color-berry-pink-700","color-notaccurate-mode-bg":"color-berry-pink-400","color-delay-mode":"color-tan-orange-700","color-delay-mode-bg":"color-tan-orange-400","color-eod-mode":"color-grapes-purple-700","color-eod-mode-bg":"color-grapes-purple-400","color-data-problem":"color-ripe-red-600","color-data-problem-bg":"color-ripe-red-400","color-data-problem-hover":"color-ripe-red-700","color-list-item-bg-highlighted":"color-tv-blue-50","color-list-item-bg-selected":"color-tv-blue-100","color-list-item-bg-highlighted-hover":"color-tv-blue-100","color-list-item-bg-selected-hover":"color-tv-blue-200","color-screener-header-bg":"color-white","color-screener-header-bg-hover":"color-cold-gray-100","color-marker-flagged":"color-ripe-red-400","color-marker-flagged-hovered":"color-ripe-red-600","color-ask":"color-ripe-red-400","color-sell":"color-ripe-red-400","color-buy":"color-tv-blue-500","color-neutral":"color-cold-gray-500","color-pro":"color-minty-green-400","color-pro-hover":"color-minty-green-600","color-pro-plus":"color-tv-blue-500","color-pro-plus-hover":"color-tv-blue-600","color-pro-premium":"color-tan-orange-500","color-pro-premium-hover":"color-tan-orange-700","color-trial":"color-cold-gray-500","color-trial-hover":"color-cold-gray-600","color-mod":"color-ripe-red-400","color-mod-hover":"color-ripe-red-600","color-top":"color-banana-yellow-700","color-top-hover":"color-banana-yellow-800","color-ad":"color-banana-yellow-a700","color-broker-featured":"color-minty-green-400","color-broker-featured-hover":"color-minty-green-600","color-alert-status-active":"color-minty-green-400","color-alert-status-stopped":"color-ripe-red-500","color-alert-status-triggered":"color-tan-orange-500","color-covid19-confirmed":"color-ripe-red-500","color-covid19-recovered":"color-minty-green-500","color-covid19-deaths":"color-cold-gray-450","color-overlay":"color-cold-gray-400","color-search-button-hover":"color-cold-gray-150","color-brand-light":"color-tv-blue-500","color-common-tooltip-text":"color-cold-gray-100","color-replay-data-mode":"color-radical-red","color-legacy-success":"color-keppel-1","color-collapse-tabs-border":"color-athens-gray-3","color-site-widget-hover":"color-athens-gray-1","color-attention":"color-sunglow","color-card-border":"color-cold-gray-150","color-card-border-hover":"color-cold-gray-300"}' ) }, RDDl: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolPriceRange", (function() { return n })); var s = i("Ocx9"), r = i("Ss5c"); class n extends r.LineDataSource { constructor(e, t) { super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.bind(null, "VghZ")).then(e => { this._setPaneViews([new e.PriceRangePaneView(this, this._model)]) }) } pointsCount() { return 2 } properties() { return super.properties() } name() { return "Price Range" } static createProperties(e) { const t = new s.DefaultProperty("linetoolpricerange", e); return n._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76"))) .GeneralDatePriceRangeDefinitionsViewModel } static _configureProperties(e) { r.LineDataSource._configureProperties(e) } } }, RDU5: function(e, t, i) { "use strict"; i.r(t), i.d(t, "UndoCommand", (function() { return s })); class s { constructor(e, t = !0) { this._customFlags = {}, this._text = e, this._executeOnPush = t } text() { return this._text } executeOnPush() { return this._executeOnPush } customFlag(e) { return this._customFlags[e] } setCustomFlag(e, t) { this._customFlags[e] = t } canMerge(e) { return !1 } merge(e) { throw new Error("Should be re-implemented in child classes") } } }, RTYN: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PositionAveragePriceAxisView", (function() { return r })); var s = i("4TVt"); class r extends s.LineToolPriceAxisView { _formatPrice(e, t) { return this._source.formatter().format(e) } } }, RXmj: function(e, t, i) { "use strict"; (function(e) { var s = i("FIi8").deepExtend, r = i("ogJP").deepEquals, n = i("zUrt").backend, o = i("l+oz").ChartSaverBase; window.t( "The publication preview could not be loaded. Please disable your browser extensions and try again." ); function a(e, t) { e.content = JSON.stringify(t) } t.ChartSaver = class extends o { constructor(t) { super(t), this._chartAboutToBeSavedDelegate = new e, this ._chartSavedDelegate = new e, this._prevChartState = null, this ._chartSizeLimitExceededDelegate = new e } chartSizeLimitExceeded() { return this._chartSizeLimitExceededDelegate } chartAboutToBeSaved() { return this._chartAboutToBeSavedDelegate } chartSaved() { return this._chartSavedDelegate } whenReadyToSave(e) { var t = this._chartWidgetCollection.activeChartWidget.value().model() .mainSeries(); if (t.hasDelayedSymbolIntervalChange()) { var i, s = null; i = function() { t.dataEvents().symbolError().unsubscribe(null, s, !0), e() }, s = function() { t.dataEvents().symbolResolved().unsubscribe(null, i, !0) }, t.dataEvents().symbolResolved().subscribe(null, i, !0), t .dataEvents().symbolError().subscribe(null, s, !0) } else e() } saveToJSON() { var e = this._getCommonSavingInfo(!1); return a(e, this._getChartWidgetCollectionState(!1, !0)), e } _fillAsyncInfo(e, t) { var i = JSON.parse(e.content), r = this._chartWidgetCollection; return (t ? r.asyncState() : r.activeChartWidget.value().asyncState()) .then((function(t) { return e.content = JSON.stringify(s(i, t)), e })) } _getChartWidgetCollectionState(e, t, i, s, r) { return e || (t = !0, s = !1), t ? this._chartWidgetCollection.state(!!e, i, s, r) : this._chartWidgetCollection.activeChartWidget.value() .state(!!e, i, s, r) } publishChart(e) {} publishScript(e, t, i) {} onPublish(e, t) {} saveChartLineTools(e, t) { var i = (void 0)(), s = this._chartWidgetCollection.metaInfo.uid.value(); return i.saveLineToolsAndGroups(s, e, t) } _saveLineToolsToStorage() { return Promise.resolve() } _saveChartImpl(e, t, i, s, r, o) { var a = i, l = s; if (a = function(s) { t.id.value() || (t.id.setValue(s), t.uid.setValue(s)), "function" == typeof i && i(t, e) }, !e.name) return console.warn( "Saving chart with empty name is not allowed"), void s(); n.saveChart(e.name, e.short_name, e.resolution, e, t).then(a.bind(this)) .catch(l.bind(this)) } _saveChart(e, t, i, s) { var n = this._chartWidgetCollection.metaInfo, o = function(o) { return r(this._prevChartState, o)[0] && null != n.id.value() ? ( this._chartSavedDelegate.fire(!0), void(t && t(n, o))) : this._saveChartImpl(o, n, t, i, s, e) }.bind(this); this._saveLineToolsToStorage().then((function() { var t = e(!0); return o(t) })).catch((function(t) { var i = e(!1); return o(i) })) } saveChartSilently(e, t, i) { i = i || {}; var s = function(e) { var t = e && (void 0)("remove_line_tools_from_content"), s = this._getChartWidgetCollectionState(!1, void 0, void 0, void 0, t), r = this._getCommonSavingInfo(!1, t); return a(r, s), i.chartName && (r.name = i.chartName), r.name && 0 !== r.name.length || !i.defaultChartName || (r.name = i .defaultChartName), i.autoSave && (r.autoSave = !0), r }.bind(this); this._isSaveInProcess = !0, this._chartAboutToBeSavedDelegate.fire(), this._saveChart(s, function(t, i) { this._chartWidgetCollection.metaInfo.name.setValue(i.name), this._prevChartState = i, this._chartSavedDelegate.fire( !0), this._isSaveInProcess = !1, e && e({ uid: t.uid.value(), data: i }), delete this._prevChartState.savingToken }.bind(this), function() { this._chartSavedDelegate.fire(!1), this._isSaveInProcess = ! 1, t && t.apply(null, arguments) }.bind(this), i) } isSaveInProcess() { return this._isSaveInProcess } } }).call(this, i("aIyQ")) }, RspR: function(e, t, i) { "use strict"; i.r(t), i.d(t, "property", (function() { return n })), i.d(t, "availableValues", (function() { return o })), i.d(t, "actualBehavior", (function() { return a })); var s = i("+jnJ"), r = i("1ANp"); const { property: n, availableValues: o, actualBehavior: a } = Object(s.a)("PaneButtons.visibility", r.navigationButtonsVisibilityKey) }, S8xo: function(e, t, i) { "use strict"; i.r(t), i.d(t, "MouseEventHandler", (function() { return h })); var s = i("qFKp"), r = i("Eyy1"), n = i("ogJP"), o = i("GUQs"), a = i("VaSN"); const l = s.isSafari ? "click" : "auxclick", c = { treatVertTouchDragAsPageScroll: !1, treatHorzTouchDragAsPageScroll: !1 }; class h { constructor(e, t, i) { this._clickCount = 0, this._clickTimeoutId = null, this._clickPosition = { x: Number.NEGATIVE_INFINITY, y: Number.POSITIVE_INFINITY }, this._tapCount = 0, this._tapTimeoutId = null, this._tapPosition = { x: Number.NEGATIVE_INFINITY, y: Number.POSITIVE_INFINITY }, this._longTapTimeoutId = null, this._longTapActive = !1, this ._mouseMoveStartPosition = null, this._touchMoveStartPosition = null, this ._touchMoveExceededManhattanDistance = !1, this._cancelClick = !1, this ._cancelTap = !1, this._unsubscribeOutsideMouseEvents = null, this ._unsubscribeOutsideTouchEvents = null, this._unsubscribeMobileSafariEvents = null, this._unsubscribeMousemove = null, this._unsubscribeRootMouseEvents = null, this._unsubscribeRootTouchEvents = null, this._startPinchMiddlePoint = null, this._startPinchDistance = 0, this._pinchPrevented = !1, this ._preventTouchDragProcess = !1, this._mousePressed = !1, this ._lastTouchEventTimeStamp = 0, this._activeTouchId = null, this ._acceptMouseLeave = !s.CheckMobile.iOS(), this._onFirefoxOutsideMouseUp = e => { this._mouseUpHandler(e) }, this._onMobileSafariDoubleClick = e => { if (this._firesTouchEvents(e)) { const t = this._makeCompatEvent(e); if (++this._tapCount, this._tapTimeoutId && this._tapCount > 1) { const { manhattanDistance: i } = this._touchMouseMoveWithDownInfo(u(e), this._tapPosition); i < 30 && !this._cancelTap && this._processTouchEvent(t, this ._handler.doubleTapEvent), this._resetTapTimeout() } } else { const t = this._makeCompatEvent(e); if (++this._clickCount, this._clickTimeoutId && this._clickCount > 1) { const { manhattanDistance: i } = this._touchMouseMoveWithDownInfo(u(e), this._clickPosition); i < 5 && !this._cancelClick && this._processMouseEvent(t, this ._handler.mouseDoubleClickEvent), this._resetClickTimeout() } } }, this._target = e, this._handler = t, this._options = Object(n.merge)(Object(n .clone)(c), i || {}), this._init() } destroy() { null !== this._unsubscribeOutsideMouseEvents && (this ._unsubscribeOutsideMouseEvents(), this._unsubscribeOutsideMouseEvents = null), null !== this._unsubscribeOutsideTouchEvents && (this ._unsubscribeOutsideTouchEvents(), this._unsubscribeOutsideTouchEvents = null), null !== this._unsubscribeMousemove && (this._unsubscribeMousemove(), this._unsubscribeMousemove = null), null !== this ._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this ._unsubscribeRootMouseEvents = null), null !== this ._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this ._unsubscribeRootTouchEvents = null), null !== this ._unsubscribeMobileSafariEvents && (this._unsubscribeMobileSafariEvents(), this ._unsubscribeMobileSafariEvents = null), this._clearLongTapTimeout(), this ._resetClickTimeout() } _mouseEnterHandler(e) { this._unsubscribeMousemove && this._unsubscribeMousemove(); const t = this._mouseMoveHandler.bind(this); if (this._unsubscribeMousemove = () => { this._target.removeEventListener("mousemove", t) }, this._target.addEventListener("mousemove", t), this._firesTouchEvents(e)) return; const i = this._makeCompatEvent(e); this._processMouseEvent(i, this._handler.mouseEnterEvent), this ._acceptMouseLeave = !0 } _resetClickTimeout() { null !== this._clickTimeoutId && clearTimeout(this._clickTimeoutId), this ._clickCount = 0, this._clickTimeoutId = null, this._clickPosition = { x: Number.NEGATIVE_INFINITY, y: Number.POSITIVE_INFINITY } } _resetTapTimeout() { null !== this._tapTimeoutId && clearTimeout(this._tapTimeoutId), this._tapCount = 0, this._tapTimeoutId = null, this._tapPosition = { x: Number.NEGATIVE_INFINITY, y: Number.POSITIVE_INFINITY } } _mouseMoveHandler(e) { if (this._mousePressed || null !== this._touchMoveStartPosition) return; if (this._firesTouchEvents(e)) return; const t = this._makeCompatEvent(e); this._processMouseEvent(t, this._handler.mouseMoveEvent), this._acceptMouseLeave = ! 0 } _touchMoveHandler(e) { const t = _(e.changedTouches, Object(r.ensureNotNull)(this._activeTouchId)); if (null === t) return; if (this._lastTouchEventTimeStamp = p(e), null !== this._startPinchMiddlePoint) return; if (this._preventTouchDragProcess) return; this._pinchPrevented = !0; const i = this._touchMouseMoveWithDownInfo(u(t), Object(r.ensureNotNull)(this ._touchMoveStartPosition)), { xOffset: s, yOffset: n, manhattanDistance: a } = i; if (this._touchMoveExceededManhattanDistance || !(a < 5)) { if (!this._touchMoveExceededManhattanDistance) { const e = .5 * s, t = n >= e && !this._options.treatVertTouchDragAsPageScroll, i = e > n && !this._options.treatHorzTouchDragAsPageScroll; t || i || (this._preventTouchDragProcess = !0), this ._touchMoveExceededManhattanDistance = !0, this._cancelTap = !0, this ._clearLongTapTimeout(), this._resetTapTimeout() } if (!this._preventTouchDragProcess) { const i = this._makeCompatEvent(e, t); this._processTouchEvent(i, this._handler.touchMoveEvent), Object(o.a)(e) } } } _mouseMoveWithDownHandler(e) { if (0 !== e.button) return; const t = this._touchMouseMoveWithDownInfo(u(e), Object(r.ensureNotNull)(this ._mouseMoveStartPosition)), { manhattanDistance: i } = t; if (i >= 5 && (this._cancelClick = !0, this._resetClickTimeout()), this ._cancelClick) { const t = this._makeCompatEvent(e); this._processMouseEvent(t, this._handler.pressedMouseMoveEvent) } } _touchMouseMoveWithDownInfo(e, t) { const i = Math.abs(t.x - e.x), s = Math.abs(t.y - e.y); return { xOffset: i, yOffset: s, manhattanDistance: i + s } } _touchEndHandler(e) { let t = _(e.changedTouches, Object(r.ensureNotNull)(this._activeTouchId)); if (null === t && 0 === e.touches.length && (t = e.changedTouches[0]), null === t) return; this._activeTouchId = null, this._lastTouchEventTimeStamp = p(e), this ._clearLongTapTimeout(), this._touchMoveStartPosition = null, this ._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this ._unsubscribeRootTouchEvents = null); const i = this._makeCompatEvent(e, t); if (this._processTouchEvent(i, this._handler.touchEndEvent), ++this._tapCount, this ._tapTimeoutId && this._tapCount > 1) { const { manhattanDistance: e } = this._touchMouseMoveWithDownInfo(u(t), this._tapPosition); e < 30 && !this._cancelTap && this._processTouchEvent(i, this._handler .doubleTapEvent), this._resetTapTimeout() } else this._cancelTap || (this._processTouchEvent(i, this._handler.tapEvent), this ._handler.tapEvent && Object(o.a)(e)); 0 === this._tapCount && Object(o.a)(e), 0 === e.touches.length && this ._longTapActive && (this._longTapActive = !1, Object(o.a)(e)) } _mouseUpHandler(e) { if (0 !== e.button) return; const t = this._makeCompatEvent(e); if (this._mouseMoveStartPosition = null, this._mousePressed = !1, this ._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this ._unsubscribeRootMouseEvents = null), s.isFF) { this._target.ownerDocument.documentElement.removeEventListener("mouseleave", this._onFirefoxOutsideMouseUp) } if (!this._firesTouchEvents(e)) if (this._processMouseEvent(t, this._handler.mouseUpEvent), ++this._clickCount, this._clickTimeoutId && this._clickCount > 1) { const { manhattanDistance: i } = this._touchMouseMoveWithDownInfo(u(e), this._clickPosition); i < 5 && !this._cancelClick && this._processMouseEvent(t, this._handler .mouseDoubleClickEvent), this._resetClickTimeout() } else this._cancelClick || this._processMouseEvent(t, this._handler .mouseClickEvent) } _clearLongTapTimeout() { null !== this._longTapTimeoutId && (clearTimeout(this._longTapTimeoutId), this ._longTapTimeoutId = null) } _touchStartHandler(e) { if (null !== this._activeTouchId) return; const t = e.changedTouches[0]; this._activeTouchId = t.identifier, this._lastTouchEventTimeStamp = p(e); const i = this._target.ownerDocument.documentElement; this._cancelTap = !1, this._touchMoveExceededManhattanDistance = !1, this ._preventTouchDragProcess = !1, this._touchMoveStartPosition = u(t), this ._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this ._unsubscribeRootTouchEvents = null); { const t = this._touchMoveHandler.bind(this), s = this._touchEndHandler.bind(this); this._unsubscribeRootTouchEvents = () => { i.removeEventListener("touchmove", t), i.removeEventListener("touchend", s) }, i.addEventListener("touchmove", t, { passive: !1 }), i.addEventListener("touchend", s, { passive: !1 }), this._clearLongTapTimeout(), this._longTapTimeoutId = setTimeout(this ._longTapHandler.bind(this, e), 240) } const s = this._makeCompatEvent(e, t); this._processTouchEvent(s, this._handler.touchStartEvent), this._tapTimeoutId || ( this._tapCount = 0, this._tapTimeoutId = setTimeout(this._resetTapTimeout .bind(this), 500), this._tapPosition = u(t)) } _wheelClickHandler(e) { if (1 !== e.button) return; if (this._firesTouchEvents(e)) return; const t = this._makeCompatEvent(e); this._processMouseEvent(t, this._handler.wheelClickEvent) } _mouseDownHandler(e) { if (0 !== e.button) return; const t = this._target.ownerDocument.documentElement; s.isFF && t.addEventListener("mouseleave", this._onFirefoxOutsideMouseUp), this ._cancelClick = !1, this._mouseMoveStartPosition = u(e), this ._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this ._unsubscribeRootMouseEvents = null); { const e = this._mouseMoveWithDownHandler.bind(this), i = this._mouseUpHandler.bind(this); this._unsubscribeRootMouseEvents = () => { t.removeEventListener("mousemove", e), t.removeEventListener("mouseup", i) }, t.addEventListener("mousemove", e), t.addEventListener("mouseup", i) } if (this._mousePressed = !0, this._firesTouchEvents(e)) return; const i = this._makeCompatEvent(e); this._processMouseEvent(i, this._handler.mouseDownEvent), this._clickTimeoutId || ( this._clickCount = 0, this._clickTimeoutId = setTimeout(this ._resetClickTimeout.bind(this), 500), this._clickPosition = u(e)) } _init() { this._target.addEventListener("mouseenter", this._mouseEnterHandler.bind(this)), this._target.addEventListener("touchcancel", this._clearLongTapTimeout.bind( this)); { const e = this._target.ownerDocument, t = e => { this._handler.mouseDownOutsideEvent && (e.target && this._target .contains(e.target) || this._handler.mouseDownOutsideEvent()) }; this._unsubscribeOutsideTouchEvents = () => { e.removeEventListener("touchstart", t) }, this._unsubscribeOutsideMouseEvents = () => { e.removeEventListener("mousedown", t) }, e.addEventListener("mousedown", t), e.addEventListener("touchstart", t, { passive: !0 }) } s.CheckMobile.iOS() && (this._unsubscribeMobileSafariEvents = () => { this._target.removeEventListener("dblclick", this ._onMobileSafariDoubleClick) }, this._target.addEventListener("dblclick", this ._onMobileSafariDoubleClick)), this._target.addEventListener("mouseleave", this._mouseLeaveHandler.bind(this)), this._target.addEventListener( "contextmenu", this._contextMenuHandler.bind(this)), this._target.addEventListener("touchstart", this._touchStartHandler.bind( this), { passive: !0 }), Object(o.b)(this._target), this._target.addEventListener("mousedown", this ._mouseDownHandler.bind(this)), this._target.addEventListener(l, this ._wheelClickHandler.bind(this)), this._initPinch(), this._target .addEventListener("touchmove", () => {}, { passive: !1 }) } _initPinch() { void 0 === this._handler.pinchStartEvent && void 0 === this._handler.pinchEvent && void 0 === this._handler.pinchEndEvent || (this._target.addEventListener( "touchstart", e => this._checkPinchState(e.touches), { passive: !0 }), this._target.addEventListener("touchmove", e => { if (2 === e.touches.length && null !== this ._startPinchMiddlePoint && void 0 !== this._handler.pinchEvent ) { const t = d(e.touches[0], e.touches[1]) / this ._startPinchDistance; this._handler.pinchEvent(this._startPinchMiddlePoint, t), Object(o.a)(e) } }, { passive: !1 }), this._target.addEventListener("touchend", e => { this._checkPinchState(e.touches) })) } _checkPinchState(e) { 1 === e.length && (this._pinchPrevented = !1), 2 !== e.length || this ._pinchPrevented || this._longTapActive ? this._stopPinch() : this._startPinch( e) } _startPinch(e) { const t = this._target.getBoundingClientRect() || { left: 0, top: 0 }; this._startPinchMiddlePoint = { x: (e[0].clientX - t.left + (e[1].clientX - t.left)) / 2, y: (e[0].clientY - t.top + (e[1].clientY - t.top)) / 2 }, this._startPinchDistance = d(e[0], e[1]), void 0 !== this._handler .pinchStartEvent && this._handler.pinchStartEvent(), this._clearLongTapTimeout() } _stopPinch() { null !== this._startPinchMiddlePoint && (this._startPinchMiddlePoint = null, void 0 !== this._handler.pinchEndEvent && this._handler.pinchEndEvent()) } _mouseLeaveHandler(e) { if (this._unsubscribeMousemove && this._unsubscribeMousemove(), this ._firesTouchEvents(e)) return; if (!this._acceptMouseLeave) return; const t = this._makeCompatEvent(e); this._processMouseEvent(t, this._handler.mouseLeaveEvent), this ._acceptMouseLeave = !s.CheckMobile.iOS() } _longTapHandler(e) { const t = _(e.touches, Object(r.ensureNotNull)(this._activeTouchId)); if (null === t) return; const i = this._makeCompatEvent(e, t); this._processTouchEvent(i, this._handler.longTapEvent), this._processTouchEvent(i, this._handler.touchContextMenuEvent), this._cancelTap = !0, this ._longTapActive = !0 } _contextMenuHandler(e) { if (Object(o.a)(e), null !== this._touchMoveStartPosition) return; if (this._firesTouchEvents(e)) return; const t = this._makeCompatEvent(e); this._processMouseEvent(t, this._handler.contextMenuEvent), this._cancelClick = !0 } _firesTouchEvents(e) { return e.sourceCapabilities && void 0 !== e.sourceCapabilities.firesTouchEvents ? e .sourceCapabilities.firesTouchEvents : p(e) < this._lastTouchEventTimeStamp + 500 } _processTouchEvent(e, t) { Object(a.setLastEventIsTouch)(!0), t && t.call(this._handler, e) } _processMouseEvent(e, t) { "mouseleave" !== e.srcType && Object(a.setLastEventIsTouch)(!1), t && t.call(this ._handler, e) } _makeCompatEvent(e, t) { const i = t || e, s = this._target.getBoundingClientRect() || { left: 0, top: 0 }; return { clientX: i.clientX, clientY: i.clientY, pageX: i.pageX, pageY: i.pageY, screenX: i.screenX, screenY: i.screenY, localX: i.clientX - s.left, localY: i.clientY - s.top, ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey, metaKey: e.metaKey, isTouch: !e.type.startsWith("mouse") && "contextmenu" !== e.type && "click" !== e.type, srcType: e.type, target: i.target, view: e.view, preventDefault: () => { "touchstart" !== e.type && Object(o.a)(e) } } } } function u(e) { return { x: e.pageX, y: e.pageY } } function d(e, t) { const i = e.clientX - t.clientX, s = e.clientY - t.clientY; return Math.sqrt(i * i + s * s) } function p(e) { return e.timeStamp || performance.now() } function _(e, t) { for (let i = 0; i < e.length; ++i) if (e[i].identifier === t) return e[i]; return null } }, SMvR: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolHighlighter", (function() { return n })); var s = i("Ocx9"), r = i("DVnF"); class n extends r.a { constructor(e, t) { super(e, t || n.createProperties()), this._loadPaneViews(e) } properties() { return super.properties() } smooth() { return this.properties().childs().smooth.value() } name() { return "Highlighter" } static createProperties(e) { const t = new s.DefaultProperty("linetoolhighlighter", e); return n._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "/a/6")).then( e => e.HighlighterDefinitionsViewModel) } _loadPaneViews(e) { i.e("lt-pane-views").then(i.bind(null, "uRW3")).then(t => { this._setPaneViews([new t.HighlighterPaneView(this, e)]) }) } static _configureProperties(e) { r.a._configureProperties(e) } } }, Si3H: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("0YCj"), n = i.n(r), o = i("ogJP"); i.d(t, "migrateMetaInfoAndPropState", (function() { return l })); const a = [new class { targetMetaInfoVersion() { return 47 } migrateMetaInfo(e) { const t = e, i = e; if (i._metainfoVersion = 47, !t.defaults || void 0 === t.defaults.precision) return void(i.format = { type: "inherit" }); const s = t.defaults && t.defaults.precision, r = Object(o.isNumber)(s) ? s : parseInt(s); 0 === r ? i.format = { type: "volume" } : isFinite(r) ? i.format = { type: "price", precision: r } : i.format = { type: "inherit" }, delete t.defaults.precision } migratePropState(e) {} }, new class { targetMetaInfoVersion() { return 50 } migrateMetaInfo(e) { const t = e, i = e; if (i._metainfoVersion = 50, void 0 === t.defaults || void 0 === t.defaults .ohlcPlots || void 0 === t.ohlcPlots) return; const r = t.ohlcPlots, n = t.defaults.ohlcPlots, o = Object(s.ensureDefined)(Object(s.ensureDefined)(i.defaults) .ohlcPlots); for (const e of Object.keys(n)) { const t = n[e]; if ("ohlc_candles" === t.plottype) { let i = !1; const s = r[e]; void 0 !== s && (i = !!s.drawBorder, delete s.drawBorder), o[e] = { borderColor: "#000000", drawBorder: i, ...t } } } } migratePropState(e) {} }]; function l(e, t) { const i = n.a.versionOf(e), r = e; void 0 === r._serverMetaInfoVersion && (r._serverMetaInfoVersion = i), a.forEach(r => { i < 0 || i >= r.targetMetaInfoVersion() || (r.migrateMetaInfo(e), void 0 !== t && r.migratePropState(t), Object(s.assert)(e._metainfoVersion === r .targetMetaInfoVersion())) }) } a.sort((function(e, t) { return e.targetMetaInfoVersion() - t.targetMetaInfoVersion() })) }, SqfW: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return n })), i.d(t, "a", (function() { return o })); var s = i("tqok"), r = i("hsV8"); function n(e, t) { if (e.index >= t.length) return null; const i = t[e.index]; return i === s.INVALID_TIME_POINT_INDEX ? null : { startPrice: e.startPrice, endPrice: e.endPrice, index: i, extendTop: e.extendTop, extendBottom: e.extendBottom } } function o(e, t, i) { const s = Object(r.ensureTimePointIndexIndex)(i.indexOf(e.index)); return { id: t, ...e, index: s } } }, Ss5c: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("dOnf").deepCopy, n = i("4TVt").LineToolPriceAxisView, o = i("fJhV").LineDataSourceTimeAxisView, a = i("mMWL"), l = i("LxhU").Interval, c = i("txPx").getLogger("Chart.LineDataSource"), h = i("FQhm"), u = i("aIyQ"), d = i("tc+8"), p = i("Ocx9").DefaultProperty, _ = i("Kxc7"), m = i("0qMc").lineToolsLocalizedNames, f = _.enabled("datasource_copypaste"), g = i("ng+v").LineDataSourceBase, b = i("0C7r").intervalsVisibilitiesDefaults; class v extends g { constructor(e, t) { super(e, t), this._onTemplateApplying = new u, this._onTemplateApplied = new u, this ._properties.hasChild("interval") || this._properties.addChild("interval", new d(e.mainSeries().interval())), this.calcIsActualSymbol(), this ._properties.intervalsVisibilities.listeners().subscribe(this, v.prototype .calcIsActualSymbol); var i = this; if (this._properties.listeners().subscribe(this, (function(e) { i.propertiesChanged() })), this._createPointsProperties(), this.pointsCount() > 0) for (var s = 0; s < this.pointsCount(); s++) this._priceAxisViews.push(this .createPriceAxisView(s)), this._timeAxisViews.push(new o(this, s)); this._properties.visible.listeners().subscribe(this, (function(e) { var t = !1 === a.hideAllDrawings().value(); e.value() ? e.value() && t && h.emit("drawing_event", this._id, "show") : (i._model.selection().isSelected(this) && i._model .selectionMacro((function(e) { e.removeSourceFromSelection(i) })), t && h.emit("drawing_event", this._id, "hide")), i ._onSourceHiddenMayChange() })), a.hideAllDrawings().subscribe(this, this._onSourceHiddenMayChange), this .customization = { forcePriceAxisLabel: !1, disableErasing: !1, disableSave: !1, showInObjectsTree: !0 }, this._syncStateExclusions = [], this._definitionsViewModel = null, this ._isDestroyed = !1, this._syncLineStyleMuted = !1 } getType() { return TradingView.className(this.constructor) } isSavedInChart(e) { return !this.customization.disableSave } setSavingInChartEnabled(e) { this.customization.disableSave = !e } showInObjectTree() { return this.customization.showInObjectsTree } isAvailableInFloatingWidget() { return !0 } setShowInObjectsTreeEnabled(e) { this.customization.showInObjectsTree = e } visibilityKeyByInterval(e) { var t, i = l.parse(e); return v.IntervalsVisibilities.forEach((function(e) { e.kind === i.kind() && e.from <= i.multiplier() && e.to >= i .multiplier() && (t = e.key) })), t } priceScale() { return this._ownerSource ? this._ownerSource.m_priceScale : null } symbol() { return this._properties.symbol.value() } properties() { return this._properties } isSavedInStudyTemplates() { return !1 } state(e) { var t = { type: TradingView.className(this.constructor), id: this.id(), state: this.properties().state(this._propertiesStateExclusions()), points: r(this._timePoint), zorder: this.zorder() }; return this.linkKey().value() && (t.linkKey = this.linkKey().value()), delete t .state.points, e && (t.indexes = this._points), this.ownerSource() && (t .ownerSource = this.ownerSource().id()), this.isFixed() && (t .positionPercents = this._positionPercents || this.calcPositionPercents()), "version" in this && 1 !== this.version && (t.version = this.version), this .hasAlert.value() && (t.alertId = this._alertId), t } _propertiesStateExclusions() { return null } template() { return this.properties().preferences() } applyTemplate(e) { this._onTemplateApplying.fire(e), this._applyTemplateImpl(e), this .calcIsActualSymbol(), this.updateAllViews(), this.model().lightUpdate(), this ._onTemplateApplied.fire() } _applyTemplateImpl(e) { var t = this.properties(); t.mergePreferences(e), t.saveDefaults(), this.propertiesChanged() } restoreExternalState(e) { this.properties().mergeAndFire(e) } restorePositionPercents(e) { this._positionPercents = e } propertiesChanged(e) { this.calcIsActualInterval(), this.updateAllViewsAndRedraw(), e || this ._syncLineStyleIfNeeded() } syncLineStyleState() { const e = this.properties().state(this._syncStateExclusions); return delete e.interval, e } _syncLineStyleIfNeeded() { !this._syncLineStyleMuted && this.linkKey().value() && a.changeLineStyle({ linkKey: this.linkKey().value(), state: this.syncLineStyleState(), model: this._model }) } _muteSyncLineStyle() { this._syncLineStyleMuted = !0 } _unmuteSyncLineStyleWithoutApplyingChanges() { this.propertiesChanged(), this._syncLineStyleMuted = !1 } fixedPoints() { var e = []; if (this._positionPercents && !this.priceScale().isEmpty()) for (var t = 0; t < this._positionPercents.length; t++) { var i = this._positionPercents[t], r = this._model.timeScale().width() * i.x, n = this.priceScale().height() * i.y; e.push(new s(r, n)) } else for (t = 0; t < this._fixedPoints.length; t++) e.push(this._fixedPoints[t] .clone()); return this._lastPoint && e.push(this._lastPoint.clone()), this ._currentMovingPoint && this._startMovingPoint && this._correctFixedPoints(e), e } addFixedPoint(e) { this._fixedPoints.push(e); var t = this._fixedPoints.length === this.pointsCount(); return t && this.calcPositionPercents(), t } calcPositionPercents() { if (!this.priceScale() || this.priceScale().isEmpty()) return []; this._positionPercents = []; for (var e = 0; e < this._fixedPoints.length; e++) { var t = this._fixedPoints[e], i = t.x / this._model.timeScale().width(), s = t.y / this.priceScale().height(); this._positionPercents.push({ x: i, y: s }) } return this._positionPercents } calcMiddlePoint(e, t) { return new s((e.x + t.x) / 2, (e.y + t.y) / 2) } getPointByPosition(e, t, i, s) { return [t, i, s][e] } restoreFixedPoints() { this._fixedPoints = this.fixedPoints() } dataWindowView() { return null } statusView() { return null } isSynchronizable() { return this.priceScale() === this._model.mainSeries().priceScale() } priceAxisViews(e, t) { if (t !== this.priceScale() || this.isSourceHidden()) return null; if (this._model.lineBeingEdited() === this) { var i = this._model.linePointBeingEdited(); if (null !== i && i < this._priceAxisViews.length) { var s = this._priceAxisViews.slice(), r = s[i]; return s.splice(i, 1), s.push(r), s } return this._priceAxisViews } return this._priceAxisViews } timeAxisViews() { if (this.isSourceHidden()) return null; if (this._model.lineBeingEdited() === this) { var e = this._model.linePointBeingEdited(); if (null !== e && e < this._timeAxisViews.length) { var t = this._timeAxisViews.slice(), i = t[e]; return t.splice(e, 1), t.push(i), t } return this._timeAxisViews } return this._timeAxisViews } updateAllViews() { if (!this._isActualSymbol || !this._isActualCurrency || !this._isActualUnit) return null; if (!this._properties.visible.value()) return null; this._updateAllPaneViews(); for (var e = this._priceAxisViews, t = 0; t < e.length; t++) e[t].update(); for (e = this._timeAxisViews, t = 0; t < e.length; t++) e[t].update() } setLastFixedPoint(e) { this._lastFixedPoint = e, this.updateAllViews() } title() { return this.translatedType() } translatedType() { return void 0 !== m[this.toolname] ? m[this.toolname] : "Line Tool" } name() { return "Line Tool" } isBeingEdited() { return this === this._model.lineBeingEdited() || this === this._model .sourceBeingMoved } isFixed() { return !1 } isLocked() { return this.properties().frozen && this.properties().frozen.value() } pointToScreenPoint(e) { var t = this._model.timeScale(), i = this.priceScale(), r = this.ownerSource().firstValue(); if (!i || i.isEmpty() || t.isEmpty() || null == r) return [new s(0, 0), new s(0, 0)]; var n = t.indexToCoordinate(e.index, !0), o = e.price, a = i.priceToCoordinate(o, r), l = new s(n, a); n = t.indexToCoordinate(e.index, !1), a = i.priceToCoordinate(o, r); return [l, new s(n, a)] } screenPointToPoint(e) { var t = this._model.timeScale(), i = this.priceScale(), s = t.coordinateToIndex(e.x), r = this.ownerSource().firstValue(); if (null !== r && isFinite(r)) return { price: i.coordinateToPrice(e.y, r), index: s } } tags() { return [this.toolname] } createPriceAxisView(e) { return new n(this, { pointIndex: e }) } alertId() { return this._alertId } setAlert(e, t) { throw new Error("not implemented") } removeAlert() { delete this._alertId, delete this._alert, this.hasAlert.setValue(!1) } _processAlertHandlers(e) { var t, i, s = this; if ("unsubscribe" !== (e = "subscribe" === e ? "subscribe" : "unsubscribe") || s ._alertCallbacks) { i = "subscribe" === e ? "on" : "off", t = s.properties(); var r = s._alertCallbacks || { remove: s.removeAlert.bind(s), hovered: function(e, t) { var i = s._model.hoveredSource() === s; t && !i ? s._model.setHoveredSource(s, null) : !t && i && s ._model.setHoveredSource(null, null) }, selected: function(e, t) { t && s._model.selectionMacro((function(e) { e.addSourceToSelection(s) })) }, synchronizeSilently: function(e) { s.synchronizeAlert(!1) } }; s._alertCallbacks || (s._alertCallbacks = r), s.getAlert().then((function(n) { n && (n[i]("destroy", r.remove), n[i]("change:hovered", r .hovered), n[i]("change:selected", r.selected), t .extendLeft && t.extendLeft[e](s, r .synchronizeSilently), t.extendRight && t .extendRight[e] (s, r.synchronizeSilently)) })) } } editAlert(e) {} getAlert() { throw new Error("not implemented") } getAlertSync() { return null } synchronizeAlert(e) {} _getUndoHistory() { return this._model._undoModel.undoHistory() } stateForAlert() { if (!this.canHasAlert()) return null; var e = this.state(); e.id = this.idForAlert(), e.uniqueId = this.idForAlert(), e.title = this.title(), e .interval = this._model.mainSeries().interval(); var t = this._getAlertPlots(); return t && (e.plots = t), e } _getAlertPlots() { return null } _linePointsToAlertPlot(e, t, i, s) { if (2 !== e.length) return c.logError("[Drawing Alert] Wrong points"), null; var r = this._model.timeScale(); return !r || r.isEmpty() ? null : { type: "LinePlot", title: t || this.title(), timestamp: r.indexToTimePoint(0), offset1: e[0].index, offset2: e[1].index, price1: e[0].price, price2: e[1].price, extendBackward: i || !1, extendForward: s || !1 } } getAlertIsActive() { return !1 } geometry() { var e = this; return this.points().map((function(t) { return function(t) { var i = t.x / e._model.timeScale().width(), r = t.y / e.priceScale().height(); return new s(i, r) }(e.pointToScreenPoint(t)[0]) })) } model() { return this._model } isForcedDrawPriceAxisLabel() { return this.customization.forcePriceAxisLabel } _getPropertyDefinitionsViewModelClass() { return Promise.resolve(null) } getPropertyDefinitionsViewModel() { if (null === this._definitionsViewModel) { var e = this; return e._getPropertyDefinitionsViewModelClass().then((function(t) { return null === t || e._isDestroyed ? null : (null === e ._definitionsViewModel && (e._definitionsViewModel = new t(e._model.undoModel(), e)), e ._definitionsViewModel) })) } return Promise.resolve(this._definitionsViewModel) } hasEditableCoordinates() { return !0 } getSourceIcon() { return { type: "loadSvg", svgId: "linetool." + this.getType() } } destroy() { super.destroy(), this.stop(), null !== this._definitionsViewModel && (this ._definitionsViewModel.destroy(), this._definitionsViewModel = null), null !== this._ownerSource && (this._ownerSource.currencyChanged() .unsubscribeAll(this), this._ownerSource.unitChanged().unsubscribeAll(this) ), a.hideAllDrawings().unsubscribeAll(this), this._isDestroyed = !0 } getOrderTemplate() { return null } copiable() { return f } cloneable() { return null !== this._ownerSource && null !== this._ownerSource.firstValue() } movable() { return !0 } static _configureProperties(e) { if (g._addCollectedProperties(e), e.hasChild("symbolStateVersion") || e.addChild( "symbolStateVersion", new d(g._initialSymbolStateVersion())), e.hasChild( "zOrderVersion") || e.addChild("zOrderVersion", new d(g ._initialZOrderVersion())), e.hasChild("visible") || e.addChild("visible", new d(!0)), e.hasChild("frozen") || e.addChild("frozen", new d(!1)), e .hasChild("symbol") || e.addChild("symbol", new d("")), e.hasChild( "currencyId") || e.addChild("currencyId", new d(null)), e.hasChild( "unitId") || e.addChild("unitId", new d(null)), e instanceof p && (e.addExclusion( "symbolStateVersion"), e.addExclusion("zOrderVersion"), e.addExclusion( "visible"), e.addExclusion("frozen"), e.addExclusion("symbol"), e .addExclusion("currencyId"), e.addExclusion("unitId")), e.hasChild( "intervalsVisibilities")) { const t = e.childs().intervalsVisibilities, i = t.state(); t.merge(b), t.merge(i) } else e.addChild("intervalsVisibilities", new d(b)); e.hasChild("title") || e.addChild("title", new d("")), e instanceof p && (e .addExclusion("symbolInfo"), e.addExclusion("points"), e.addExclusion( "interval"), e.addExclusion("title")), e.hasChild("singleChartOnly") && e.removeProperty("singleChartOnly") } } v.prototype.version = 1, t.LineToolPriceAxisView = n, t.LineDataSource = v }, SwuQ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "unitConvertibleGroups", (function() { return n })), i.d(t, "sourceNewUnitOnPinningToPriceScale", (function() { return o })); var s = i("/tGj"), r = i("n5al"); function n(e, t, i) { const s = Object(r.symbolUnitConvertibleGroupsIfExist)(e); if (null !== s) return s; const n = i.unitGroupById(t); return null === n ? [] : [n] } function o(e, t, i, r) { let o = null; if (i.unitConversionEnabled() && Object(s.isSymbolSource)(e)) { const s = i.availableUnits(), a = t.unit(s), l = e.unit(), c = null === l ? [] : n(e.symbolInfo(), l, s); null !== a && null !== a.selectedUnit && !a.allUnitsAreOriginal && a.selectedUnit !== l && (r && null === l || null !== l && s.convertible(l, c)) && (o = a.selectedUnit) } return o } }, SzKR: function(e, t, i) {}, T6Of: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LimitedPrecisionNumericFormatter", (function() { return r })); var s = i("ogJP"); class r { constructor(e = 1) { this._precision = e } format(e) { Object(s.isNumber)(e) || (e = parseFloat(e)); const t = e.toFixed(this._precision), i = Math.pow(10, -this._precision); return Math.max(parseFloat(t), i) + "" } parse(e) { const t = parseFloat(e); return isNaN(t) ? { res: !1 } : { res: !0, value: t, suggest: this.format(t) } } } }, TBaH: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolGannFixed", (function() { return a })); var s = i("aO4+"), r = i("Ss5c"), n = i("j3hX"), o = i("LAp3"); class a extends r.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), this._constructor = "LineToolGannFixed", i .e("lt-pane-views").then(i.bind(null, "wdUH")).then(({ GannFixedPaneView: e }) => { this._setPaneViews([new e(this, this.model())]) }), this.properties().childs().reverse.subscribe(this, this._reversePoints) } pointsCount() { return 2 } name() { return "Gann Square Fixed" } properties() { return super.properties() } axisPoints() { const e = this.points(), t = this.getScreenPoints(); return e.length < 2 || t.length < 2 ? [] : [e[0], this.screenPointToPoint(t[1])] } getScreenPoints() { const e = this.points(); if (e.length < 2) return []; const t = this._calcAngle(); if (null === t) return []; const [i, r] = e, n = this.pointToScreenPoint(i)[0], o = this .pointToScreenPoint(r)[0], a = Math.sqrt(Math.pow(n.x - o.x, 2) + Math.pow(n .y - o.y, 2)), l = new s.Point(Math.cos(t), -Math.sin(t)), c = l .normalized(), h = c.x < 0 ? -1 : 1, u = c.y < 0 ? -1 : 1; return [n.addScaled(l, a), n.add(new s.Point(5 * a * h, 5 * a * u))] } levelsCount() { return this.properties().childs().levels.childCount() } levels() { const e = [], t = this.properties().childs(), i = t.levels.childCount(); for (let s = 0; s < i; s++) { const i = t.levels.childs()[s].childs(); e.push({ index: s, visible: i.visible.value(), color: i.color.value(), width: i.width.value() }) } return e } fanLinesCount() { return this.properties().childs().fanlines.childCount() } fanLines() { const e = [], t = this.properties().childs(), i = t.fanlines.childCount(); for (let s = 0; s < i; s++) { const i = t.fanlines.childs()[s].childs(); e.push({ index: s, visible: i.visible.value(), x: i.x.value(), y: i.y.value(), color: i.color.value(), width: i.width.value() }) } return e } arcsCount() { return this.properties().childs().arcs.childCount() } arcs() { const e = [], t = this.properties().childs(), i = t.arcs.childCount(); for (let s = 0; s < i; s++) { const i = t.arcs.childs()[s].childs(); e.push({ index: s, visible: i.visible.value(), x: i.x.value(), y: i.y.value(), color: i.color.value(), width: i.width.value() }) } return e } arcsBackgroundTransparency() { return this.properties().childs().arcsBackground.childs().transparency.value() } isArcsBackgroundFilled() { return this.properties().childs().arcsBackground.childs().fillBackground.value() } static createProperties(e) { const t = Object(o.a)("linetoolgannfixed", e); return a._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "WfUZ")).then( e => e.GannComplexAndFixedDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e); const t = [], i = [], s = e.childs(); { const e = s.levels.childCount(); for (let r = 0; r < e; r++) { const e = s.levels.childs()[r].childs(); t.push(e.width), i.push(e.color) } } { const e = s.fanlines.childCount(); for (let r = 0; r < e; r++) { const e = s.fanlines.childs()[r].childs(); t.push(e.width), i.push(e.color) } } { const e = s.arcs.childCount(); for (let r = 0; r < e; r++) { const e = s.arcs.childs()[r].childs(); t.push(e.width), i.push(e.color) } } e.addChild("linesColors", new n.LineToolColorsProperty(i)), e.addChild( "linesWidths", new n.LineToolWidthsProperty(t)) } _calcAngle() { const e = this.points(); if (e.length < 2) return null; const [t, i] = e, s = this.pointToScreenPoint(t)[0]; let r = this.pointToScreenPoint(i)[0].subtract(s); if (r.length() <= 0) return null; r = r.normalized(); let n = Math.acos(r.x); return r.y > 0 && (n = -n), n } _reversePoints() { const [e, t] = this._points; this._points[0] = t, this._points[1] = e, this.normalizePoints(), this.restart() } } }, TCfT: function(e, t, i) { "use strict"; i.r(t); var s = i("sQaR"); i.d(t, "CompareDialogRenderer", (function() { return r })); class r extends s.a { constructor(e) { super(), this._dialog = null, this._subscribe = e => { this._setVisibility(e) }, this._chartWidgetCollection = e } show() { this._load().then(e => { var t, i; null === (t = this._dialog) || void 0 === t || t.hide(), null === ( i = this._dialog) || void 0 === i || i.visible() .unsubscribe(this._subscribe), this._dialog = e, e.visible() .subscribe(this._subscribe), e.show() }) } hide() { var e; null === (e = this._dialog) || void 0 === e || e.hide() } _load() { return Promise.all([i.e("compare-model").then(i.bind(null, "cK0E")), Promise .all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i .e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(19), i.e(21), i.e(26), i.e(69), i.e(82), i.e(0), i.e(2), i.e(7), i.e(10), i.e(18), i.e(20), i.e(25), i.e("add-compare-dialog") ]).then(i.bind(null, "a+BI")) ]).then(([e, t]) => { const i = new e.CompareModel(this._chartWidgetCollection); return t.getCompareDialogRenderer(i) }) } } }, TMWk: function(e, t, i) { "use strict"; var s = i("Eyy1").assert, r = i("ogJP").clone, n = i("GVHu").Study, o = i("k9/m").PlotList, a = i("w4Ji").studyPlotFunctionMap, l = i("w4Ji").studyEmptyPlotValuePredicate; class c { constructor(e, t, i) { this._strategyPlotIndex = e, this._targetPlotIndex = t, this._startIndex = i } rebuildData(e) { var t = this._targetPlotIndex + 1, i = this._strategyPlotIndex + 1, s = null, r = null; e.range(this._startIndex || e.firstIndex(), e.lastIndex()).each((function(n, o) { var a = o[t], l = o[i] ? Math.round(o[i]) : null; if (o[t] = null, o[i] = null, !l || l > 0) return !1; var c = n + l, h = { pointIndex: c, value: a }; if (r) { if (r.pointIndex !== h.pointIndex) { c >= 0 && (e.valueAt(c)[t] = a); var u = !1; s && (u = s.value <= r.value && r.value <= a || s.value >= r .value && r.value >= a), u ? r.pointIndex >= 0 && (e .valueAt(r.pointIndex)[t] = null) : s = r, r = h } } else r = h; return !1 })) } } t.study_ScriptWithDataOffset = class extends n { constructor(e, t, i, s) { super(e, t, i, s), this._underlyingData = new o(a(s), l) } clearData() { super.clearData(), this._underlyingData.clear() } _mergeData(e) { this._invalidateLastNonEmptyPlotRowCache(); var t = this._underlyingData.firstIndex(); this._underlyingData.merge(e), t !== this._underlyingData.firstIndex() && (this .m_data = new o(a(this._metaInfo), l)); var i = this.m_data.lastIndex(); this._underlyingData.range(i, this._underlyingData.lastIndex()).each(function(e, t) { return this.m_data.add(e, r(t)), !1 }.bind(this)), this._plotsForStrategyProcessing().forEach((function(e) { new c(e.strategyIndex, e.targetIndex, i).rebuildData(this .m_data) }), this) } _plotsForStrategyProcessing() { var e = []; return this._metaInfo.plots.forEach((function(t, i) { if ("dataoffset" === t.type) { var r = this._metaInfo.plots.findIndex((function(e) { return e.id === t.target })); s(r >= 0, "target plot not found for strategy plot " + t .id); var n = { strategyIndex: i, targetIndex: r }; e.push(n) } }), this), e } } }, TTFo: function(e, t, i) { "use strict"; i.r(t), i.d(t, "fromPercent", (function() { return n })), i.d(t, "toPercent", (function() { return o })), i.d(t, "toPercentRange", (function() { return a })), i.d(t, "fromIndexedTo100", (function() { return l })), i.d(t, "toIndexedTo100", (function() { return c })), i.d(t, "toIndexedTo100Range", (function() { return h })), i.d(t, "toLog", (function() { return u })), i.d(t, "fromLog", (function() { return d })); var s = i("Qb4w"), r = i("Hr11"); function n(e, t) { return t < 0 && (e = -e), e / 100 * t + t } function o(e, t) { const i = 100 * (e - t) / t; return t < 0 ? -i : i } function a(e, t) { const i = o(e.minValue(), t), r = o(e.maxValue(), t); return new s.PriceRange(i, r) } function l(e, t) { return t < 0 && (e = -e), (e -= 100) / 100 * t + t } function c(e, t) { const i = 100 * (e - t) / t + 100; return t < 0 ? -i : i } function h(e, t) { const i = c(e.minValue(), t), r = c(e.maxValue(), t); return new s.PriceRange(i, r) } function u(e) { const t = Math.abs(e); if (t < 1e-8) return 0; const i = Object(r.log10)(t + 1e-4) + 4; return e < 0 ? -i : i } function d(e) { const t = Math.abs(e); if (t < 1e-8) return 0; const i = Math.pow(10, t - 4) - 1e-4; return e < 0 ? -i : i } }, TcSq: function(e, t, i) { "use strict"; function s(e) { return e === r(e) } function r(e) { const t = e.indexOf("$"), i = e.indexOf("@"); return t < 0 && i >= 0 ? null : e.substring(Math.max(t + 1, 0), i >= 0 ? i : e.length) } function n(e) { return e.startsWith("PUB;") } function o(e) { return e.startsWith("USER;") } function a(e) { return e.startsWith("STD;") } function l(e) { return e.includes("Candlestick%1Pattern%1") } function c(e) { return e.startsWith("EDGR_") } i.r(t), i.d(t, "isPineIdString", (function() { return s })), i.d(t, "extractPineId", (function() { return r })), i.d(t, "isPublishedPineId", (function() { return n })), i.d(t, "isCustomPineId", (function() { return o })), i.d(t, "isStandardPineId", (function() { return a })), i.d(t, "isCandleStickId", (function() { return l })), i.d(t, "isEdgrPineId", (function() { return c })) }, TlGQ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "visitObject", (function() { return n })); var s = i("ogJP"); function r(e, t, i) { return Object(s.isArray)(e) ? function(e, t, i) { return e.map(e => { const s = r(e, t, i), n = t(s); return void 0 !== n ? n : s }) }(e, t, i) : Object(s.isObject)(e) && (Object(s.isHashObject)(e) || i && i .visitInstances) ? function(e, t, i) { const s = {}; return Object.keys(e).forEach(n => { const o = r(e[n], t, i), a = t(o); s[n] = void 0 !== a ? a : o }), s }(e, t, i) : e } function n(e, t, i) { const s = r(e, t, i), n = t(s); return void 0 !== n ? n : s } }, TmNs: function(e, t, i) { "use strict"; i.r(t); var s = i("KcY8"), r = i("Eyy1"), n = i("jFln"), o = i("8Uy/"), a = i("gAom"); class l { constructor(e, t) { this.setData(e, t) } setData(e, t) { this._data = e, this._commonData = t } draw(e, t, i, s, l, c) { if (!this._data.visible) return; let h = this._commonData.coordinate; void 0 !== this._commonData.fixedCoordinate && (h = this._commonData .fixedCoordinate), e.lineWidth = Math.max(1, Math.floor(Object(r .ensureDefined)(this._data.linewidth) * c)), e.lineCap = "butt", Object(n .setLineStyle)(e, void 0 === this._data.linestyle ? o.LINESTYLE_DOTTED : this._data.linestyle), e.strokeStyle = this._commonData.textColor, Object(a .drawHorizontalLine)(e, Math.round(h * c), 0, Math.ceil(s * c)) } height(e) { return 0 } } i.d(t, "PriceLineAxisView", (function() { return c })), i.d(t, "SeriesPriceLineAxisView", (function() { return h })), i.d(t, "StudyPriceLineAxisView", (function() { return u })); class c extends s.a { constructor(e) { super(e || l) } ignoreAlignment() { return !0 } _updateRendererData(e, t, i) { if (t.visible = !1, e.visible = !1, !this._isVisible()) return; const s = this._value(); s.noData || (i.background = "", i.textColor = this._priceLineColor(s.color), i .coordinate = s.coordinate, i.floatCoordinate = s.floatCoordinate, e .linewidth = this._lineWidth(), e.linestyle = this._lineStyle(), e .backgroundAreaVisible = this._backgroundAreaVisible(), e .backgroundAreaColor = this._backgroundAreaColor(), e .backgroundAreaHeight = this._backgroundAreaHeight(), e.visible = !0) } _lineStyle() { return o.LINESTYLE_DOTTED } _backgroundAreaVisible() { return !1 } _backgroundAreaColor() { return "" } _backgroundAreaHeight() { return 0 } } class h extends c { constructor(e) { super(), this._series = e } _value() { return this._series.lastValueData(void 0, !0) } _priceLineColor(e) { return this._series.priceLineColor(e) } _lineWidth() { return this._series.properties().priceLineWidth.value() } _isVisible() { const e = this._series.model().properties().scalesProperties.showSeriesLastValue .value(); return this._series.properties().showPriceLine.value() && e } } class u extends c { constructor(e, t) { super(), this._study = e, this._plotname = t } _value() { return this._study.lastValueData(this._plotname, !0) } _lineWidth() { return this._study.properties().styles[this._plotname].linewidth.value() } _lineStyle() { return o.LINESTYLE_DOTTED } _priceLineColor(e) { return e } _isVisible() { const e = this._study.model().properties().scalesProperties.showStudyLastValue .value(); return this._study.properties().styles[this._plotname].trackPrice.value() && e } } }, Tmoa: function(e, t, i) { "use strict"; i.r(t), i.d(t, "generateColor", (function() { return r })), i.d(t, "alphaToTransparency", (function() { return n })), i.d(t, "transparencyToAlpha", (function() { return o })), i.d(t, "applyTransparency", (function() { return a })), i.d(t, "resetTransparency", (function() { return l })), i.d(t, "getLuminance", (function() { return c })), i.d(t, "isHexColor", (function() { return h })), i.d(t, "colorFromBackground", (function() { return u })), i.d(t, "gradientColorAtPercent", (function() { return d })), i.d(t, "isColorDark", (function() { return p })), i.d(t, "rgbaFromInteger", (function() { return _ })), i.d(t, "rgbaToInteger", (function() { return m })), i.d(t, "colorToInteger", (function() { return f })); var s = i("eJTA"); function r(e, t, i) { if (t = t || 0, !h(e)) return i ? Object(s.rgbaToString)(Object(s.rgba)(Object(s.parseRgb)( e), Object(s.normalizeAlphaComponent)(o(t)))) : e; const [r, n, a] = Object(s.parseRgb)(e), l = Object(s.normalizeAlphaComponent)(o(t)); return Object(s.rgbaToString)([r, n, a, l]) } function n(e) { return 100 * (1 - e) } function o(e) { if (e < 0 || e > 100) throw new Error("invalid transparency"); return 1 - e / 100 } function a(e, t) { if ("transparent" === e) return e; const i = Object(s.parseRgba)(e), r = i[3]; return Object(s.rgbaToString)(Object(s.rgba)(i[0], i[1], i[2], o(t) * r)) } function l(e) { return "transparent" === e || h(e) ? e : Object(s.rgbaToString)(Object(s.rgba)(Object(s .parseRgb)(e), Object(s.normalizeAlphaComponent)(1))) } function c(e) { const t = Object(s.parseRgb)(e).map(e => (e /= 255) <= .03928 ? e / 12.92 : Math.pow((e + .055) / 1.055, 2.4)); return Number((.2126 * t[0] + .7152 * t[1] + .0722 * t[2]).toFixed(3)) } function h(e) { return 0 === e.indexOf("#") } function u(e) { return "black" === Object(s.rgbToBlackWhiteString)(Object(s.parseRgb)(e), 150) ? "#ffffff" : "#000000" } function d(e, t, i) { const [r, n, o, a] = Object(s.parseRgba)(e), [l, c, h, u] = Object(s.parseRgba)(t), d = Object(s.rgba)(Math.round(r + i * (l - r)), Math.round(n + i * (c - n)), Math.round(o + i * (h - o)), a + i * (u - a)); return Object(s.rgbaToString)(d) } function p(e) { return c(l(e)) < .5 } function _(e) { const t = (e = Math.round(e)) % 256; e -= t; const i = (e /= 256) % 256; e -= i; const s = (e /= 256) % 256; e -= s; return `rgba(${t},${i},${s},${(e /= 256) / 255})` } function m(e) { const t = Math.round(255 * e[3]); return e[0] + 256 * e[1] + 65536 * e[2] + 16777216 * t } function f(e) { const t = Object(s.tryParseRgba)(e); return null === t ? 0 : m(t) } }, TohL: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolArrowMark", (function() { return l })), i.d(t, "LineToolArrowMarkLeft", (function() { return c })), i.d(t, "LineToolArrowMarkUp", (function() { return h })), i.d(t, "LineToolArrowMarkRight", (function() { return u })), i.d(t, "LineToolArrowMarkDown", (function() { return d })); var s = i("Ocx9"), r = i("Ss5c"), n = i("tc+8"), o = i.n(n), a = i("j3hX"); class l extends r.LineDataSource { constructor(e, t, s) { const r = t || l.createProperties(null, s); super(e, r), this._textPaneView = null, i.e("lt-pane-views").then(i.bind(null, "ct+2")).then(({ ArrowMarkPaneView: t }) => { const i = [new t(this, e)]; this._setPaneViews(i) }) } paneViews(e) { const t = super.paneViews(); return null !== t && this._textPaneView && t.push(this._textPaneView), t } pointsCount() { return 1 } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e } static createProperties(e, t) { const i = new s.DefaultProperty(t, e); return l._configureProperties(i), i } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "5sLb")).then( e => e.ArrowMarkDefinitionsViewModel) } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } static _configureProperties(e) { r.LineDataSource._configureProperties(e), e.addChild("linesColors", new a .LineToolColorsProperty([e.childs().arrowColor])), e.addChild( "textsColors", new a.LineToolColorsProperty([e.childs().color])), e .hasChild("text") || e.addChild("text", new o.a("")), e.addExclusion("text") } } l.version = 2; class c extends l { constructor(e, t) { super(e, t, "linetoolarrowmarkleft") } direction() { return "left" } name() { return "Arrow Mark Left" } textAlignParams() { return { horzAlign: "left", vertAlign: "middle", offsetX: 22, offsetY: 3 } } static createProperties(e) { return l.createProperties(e, "linetoolarrowmarkleft") } } class h extends l { constructor(e, t) { super(e, t, "linetoolarrowmarkup") } direction() { return "up" } name() { return "Arrow Mark Up" } textAlignParams() { return { horzAlign: "center", vertAlign: "top", offsetX: 0, offsetY: 20 } } static createProperties(e) { return l.createProperties(e, "linetoolarrowmarkup") } } class u extends l { constructor(e, t) { super(e, t, "linetoolarrowmarkright") } direction() { return "right" } name() { return "Arrow Mark Right" } textAlignParams() { return { horzAlign: "right", vertAlign: "middle", offsetX: 22, offsetY: 3, forceTextAlign: !0 } } static createProperties(e) { return l.createProperties(e, "linetoolarrowmarkright") } } class d extends l { constructor(e, t) { super(e, t, "linetoolarrowmarkdown") } direction() { return "down" } name() { return "Arrow Mark Down" } textAlignParams() { return { horzAlign: "center", vertAlign: "bottom", offsetX: 0, offsetY: 20 } } static createProperties(e) { return l.createProperties(e, "linetoolarrowmarkdown") } } }, "U0+/": function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyMetaInfoRepository", (function() { return h })); i("YFKU"); var s = i("Eyy1"), r = i("0YCj"), n = i.n(r), o = i("Si3H"), a = i("lCO3"), l = i("txPx"); const c = Object(l.getLogger)("Chart.Studies.StudyMetaInfoRepository", { color: "#606" }); class h { constructor(e) { this._nextRequestNumber = 1, this._rawStudiesMetaInfo = [], this._isReady = !1, this ._metaInfoQueryQueue = [], this._javaMetaInfoQueryQueue = [], this ._javaStudiesMetaInfo = [], this._pineMetaInfoCache = [], this ._studiesMigrations = [], this._gateway = e } requestMetaInfo() { this._requestStarted(); const e = this._makeNextRequestId(); return c.logNormal("Requesting metainfo #" + e), new Promise(t => { c.logNormal("Requesting studies metadata #" + e), this._gateway .requestMetadata(e, i => { c.logNormal(`Requesting studies metadata #${e} finished`); const s = i.params[1].metainfo.slice(); this._processLibraryMetaInfo(s), this._requestFinished(), t() }) }) } findById(e) { if (!this._isReady) return this._enqueueMetaInfoQuery(e); const t = this._findStudyMetaInfo(e); return null !== t ? Promise.resolve(t) : "pine" === e.type ? this._compilePine(e) : Promise.reject(`unexpected study id=${e.studyId} with type=${e.type}`) } findByIdSync(e) { return this._findStudyMetaInfo(e) } isReady() { return this._isReady } findAllJavaStudies() { return this._isReady ? Promise.resolve(this._javaStudiesMetaInfo) : this ._enqueueJavaMetaInfoQuery() } getInternalMetaInfoArray() { return this._javaStudiesMetaInfo } getMigrations() { return this._studiesMigrations } addPineMetaInfo(e) { return d(this._pineMetaInfoCache, e) } _processMigrations(e) { throw new Error("not implemented") } _processSiteMetaInfo(e, t) { throw new Error("not implemented") } _processLibraryMetaInfo(e) { for (const t of e) u(t), d(this._javaStudiesMetaInfo, t); this._javaStudiesMetaInfo = this._javaStudiesMetaInfo.sort((e, t) => { const i = e.description_localized || e.description, s = t.description_localized || t.description; return i > s ? 1 : i < s ? -1 : 0 }), n.a.overrideDefaults(this._javaStudiesMetaInfo) } _requestStarted() { this._isReady = !1, this._javaStudiesMetaInfo = [], this._pineMetaInfoCache = [], this._studiesMigrations = [], this._rawStudiesMetaInfo = [] } _requestFinished() { this._isReady = !0, this._processPendingMetaInfoQueries(), this ._processPendingFullMetaInfoQueries() } _enqueueMetaInfoQuery(e) { return new Promise(t => { this._metaInfoQueryQueue.push({ studyDescriptor: e, resolver: t }) }) } _enqueueJavaMetaInfoQuery() { return new Promise(e => { this._javaMetaInfoQueryQueue.push({ resolver: e }) }) } _processPendingMetaInfoQueries() { for (; this._metaInfoQueryQueue.length;) { const e = this._metaInfoQueryQueue.shift(); this.findById(e.studyDescriptor).then(e.resolver) } } _processPendingFullMetaInfoQueries() { for (; this._javaMetaInfoQueryQueue.length;) { this._javaMetaInfoQueryQueue.shift().resolver(this._javaStudiesMetaInfo) } } _findStudyMetaInfo(e) { return "java" === e.type ? this._javaStudiesMetaInfo.find(t => t.id === e .studyId) || null : this._pineMetaInfoCache.find(t => t.scriptIdPart === e .pineId && (void 0 === e.pineVersion || Object(s.ensureDefined)(t.pine) .version === e.pineVersion)) || null } _makeNextRequestId() { return "metadata_" + this._nextRequestNumber++ } _compilePine(e) { throw new Error("unsupported") } } function u(e) { e.description_localized = window.t(e.description, { context: "study" }) } function d(e, t) { const i = new n.a(t); Object(o.migrateMetaInfoAndPropState)(i); let s = !0; const r = e.findIndex(e => e.id === i.id); if (-1 === r) e.push(i); else { const t = e[r], n = void 0 !== t.pine ? a.Version.parse(t.pine.version) : null, o = void 0 !== i.pine ? a.Version.parse(i.pine.version) : null; null === o || null === n || o.isGreaterOrEqual(n) ? (t.removeDefaults(), e[r] = i) : s = !1 } return s && i.createDefaults(), i } }, UAFa: function(e, t, i) { "use strict"; i.r(t); var s = i("i6cO"), r = i("23IT"), n = i("Eyy1"); const o = new Map([ [s.ColorerType.Main, "color"], [s.ColorerType.Text, "textColor"], [s.ColorerType.Border, "borderColor"], [s.ColorerType.Wick, "wickColor"], [s.ColorerType.Up, "colorup"], [s.ColorerType.Down, "colordown"] ]); class a { constructor(e) { this._plotStyle = e } getPlotPointStyle(e, t) { const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)(); return o.forEach((e, t) => { this._plotStyle[e] && (i.colors[t] = this._plotStyle[e].value()) }), i.lineWidth = this._plotStyle.linewidth ? this._plotStyle.linewidth .value() : void 0, i.lineStyle = this._plotStyle.linestyle ? this._plotStyle .linestyle.value() : void 0, i } isColorDefined() { return !0 } singleColor() { return !0 } getDefaultPlotPointStyle() { return null } } class l { constructor(e, t, i, s) { this._palettes = new Map, this._metaInfo = e, this._properties = t, this._indexes = s, this._plotStyle = t.styles[i]; const r = Object(n.ensureDefined)(this._metaInfo.palettes); s.forEach((t, i) => { const s = e.plots[t]; if (s && "palette" in s) { const e = r[s.palette], t = this._properties.palettes[s.palette]; e && t && this._palettes.set(i, { palette: e, props: t }) } }) } getPlotPointStyle(e, t) { const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)(); if (this._palettes.has(s.ColorerType.Main)) { const t = Object(n.ensureDefined)(this._indexes.get(s.ColorerType.Main)), r = e[t + 1]; if (null != r) { const e = Object(n.ensureDefined)(this._palettes.get(s.ColorerType.Main)), t = e.palette, o = e.props, a = Object(n.ensureDefined)(t.valToIndex ? t.valToIndex[r] : r), l = o.colors[a]; i.lineWidth = l.width.value(), i.lineStyle = l.style.value() } } return Object.keys(s.ColorerType).forEach(t => { const s = parseInt(t); if (this._palettes.has(s)) { const t = Object(n.ensureDefined)(this._indexes.get(s)), r = e[t + 1]; if (null != r) { const e = Object(n.ensureDefined)(this._palettes.get(s)), t = Object(n.ensureDefined)(e.palette.valToIndex ? e.palette .valToIndex[r] : r), o = e.props.colors[t]; i.colors[s] = o.color.value() } else i.colors[s] = "transparent" } else if (this._plotStyle) { const e = o.get(s); void 0 !== e && this._plotStyle[e] && (i.colors[s] = this ._plotStyle[e].value()) } }), i } getDefaultPlotPointStyle() { const e = Object(n.ensureDefined)(this._palettes.get(s.ColorerType.Main)).props .colors[0]; if (null != e) { return { colors: [e.color.value(), void 0, void 0, void 0, void 0, void 0, void 0], lineWidth: e.width.value() } } return null } isColorDefined() { return !!this._palettes.size } singleColor() { return !1 } } var c = i("Tmoa"); class h { constructor(e) { this._indexes = e } getPlotPointStyle(e, t) { const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)(); return this._indexes.forEach((t, s) => { const r = e[t + 1]; if (null != r) { const e = Object(c.rgbaFromInteger)(r); i.colors[s] = e } else i.colors[s] = "transparent" }), i } isColorDefined() { return !0 } singleColor() { return !1 } getDefaultPlotPointStyle() { return null } } i.d(t, "createStudyPlotColorProvider", (function() { return d })); const u = new Map([ [s.ColorerType.Main, function(e, t) { const i = Object(r.isColorerPlot)(t) || Object(r.isOhlcColorerPlot)(t); return "target" in t && t.target === e && i }], [s.ColorerType.Text, function(e, t) { const i = Object(r.isTextColorerPlot)(t); return "target" in t && t.target === e && i }], [s.ColorerType.Background, function(e, t) { return Object(r.isBgColorerPlot)(t) && t.id === e }], [s.ColorerType.Border, function(e, t) { const i = Object(r.isCandleBorderColorerPlot)(t); return "target" in t && t.target === e && i }], [s.ColorerType.Wick, function(e, t) { const i = Object(r.isCandleWickColorerPlot)(t); return "target" in t && t.target === e && i }], [s.ColorerType.Up, function(e, t) { const i = Object(r.isUpColorerPlot)(t); return "target" in t && t.target === e && i }], [s.ColorerType.Down, function(e, t) { const i = Object(r.isDownColorerPlot)(t); return "target" in t && t.target === e && i }] ]); function d(e, t, i) { const { colorers: s } = function(e, t) { const i = e.plots, s = i.findIndex(e => e.id === t), r = new Map; return i.forEach((e, i) => { u.forEach((s, n) => { s(t, e) && r.set(n, i) }) }), { plotIndex: -1 === s ? null : s, colorers: r } }(e, i); if (s.size) return e.isRGB ? new h(s) : new l(e, t, i, s); { const e = t.ohlcPlots; if (e && e[i]) return new a(e[i]); const s = t.styles[i]; return new a(s) } } }, UCMi: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolDateAndPriceRange", (function() { return a })); var s = i("Eyy1"), r = i("Ocx9"), n = i("Ss5c"), o = i("585y"); class a extends n.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), this._volumeCalculator = null, i.e( "lt-pane-views").then(i.bind(null, "UcQu")).then(e => { this._setPaneViews([new e.DateAndPriceRangePaneView(this, this ._model)]) }) } destroy() { super.destroy(), null !== this._volumeCalculator && this._volumeCalculator.destroy() } pointsCount() { return 2 } properties() { return super.properties() } name() { return "Date and Price Range" } volume() { if (null === this._volumeCalculator) return NaN; const e = this.points(); return this._volumeCalculator.volume(e[0].index, e[1].index) } setOwnerSource(e) { e === this._model.mainSeries() && (Object(s.assert)(null === this ._volumeCalculator), this._volumeCalculator = new o.a(this._model .mainSeries())), super.setOwnerSource(e) } static createProperties(e) { const t = new r.DefaultProperty("linetooldateandpricerange", e); return a._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76"))) .GeneralDatePriceRangeDefinitionsViewModel } static _configureProperties(e) { n.LineDataSource._configureProperties(e) } } }, UCjq: function(e, t, i) { "use strict"; i.r(t); var s = i("YFKU"), r = i("Eyy1"), n = i("aO4+"), o = i("qFKp"), a = i("VaSN"), l = i("FQhm"), c = i("ogJP"), h = i("FIi8"), u = i("VdBB"), d = i("vTIA"), p = i("KnF9"), _ = i("3ClC"), m = i("GxN8"), f = i("CW80"), g = i("mMWL"), b = i("bOGh"), v = i("fTGZ"), S = i("ikwP"), y = i("gAom"), w = i("mE5r"), P = i("1IXQ"); function C(e, t) { return e.position - t.position } function x(e, t, i) { const s = (e.position - t.position) / (e.time - t.time); return Math.sign(s) * Math.min(Math.abs(s), i) } class T { constructor(e, t, i, s) { this._position1 = null, this._position2 = null, this._position3 = null, this ._position4 = null, this._animationStartPosition = null, this._durationMsecs = 0, this._speedPxPerMsec = 0, this._terminated = !1, this._minSpeed = e, this ._maxSpeed = t, this._dumpingCoeff = i, this._minMove = s } addPosition(e, t) { if (null !== this._position1) { if (this._position1.time === t) return void(this._position1.position = e); if (Math.abs(this._position1.position - e) < this._minMove) return } this._position4 = this._position3, this._position3 = this._position2, this ._position2 = this._position1, this._position1 = { time: t, position: e } } start(e, t) { if (null === this._position1 || null === this._position2) return; if (t - this._position1.time > 50) return; let i = 0; const s = x(this._position1, this._position2, this._maxSpeed), r = C(this._position1, this._position2), n = [s], o = [r]; if (i += r, null !== this._position3) { const e = x(this._position2, this._position3, this._maxSpeed); if (Math.sign(e) === Math.sign(s)) { const t = C(this._position2, this._position3); if (n.push(e), o.push(t), i += t, null !== this._position4) { const e = x(this._position3, this._position4, this._maxSpeed); if (Math.sign(e) === Math.sign(s)) { const t = C(this._position3, this._position4); n.push(e), o.push(t), i += t } } } } let a = 0; for (let e = 0; e < n.length; ++e) a += o[e] / i * n[e]; Math.abs(a) < this._minSpeed || (this._animationStartPosition = { position: e, time: t }, this._speedPxPerMsec = a, this._durationMsecs = function(e, t) { const i = Math.log(t); return Math.log(1 * i / -e) / i }(Math.abs(a), this._dumpingCoeff)) } getPosition(e) { const t = Object(r.ensureNotNull)(this._animationStartPosition), i = e - t.time; return t.position + this._speedPxPerMsec * (Math.pow(this._dumpingCoeff, i) - 1) / Math.log(this._dumpingCoeff) } finished(e) { return null === this._animationStartPosition || this._progressDuration(e) === this ._durationMsecs } terminated() { return this._terminated } terminate() { this._terminated = !0 } _progressDuration(e) { const t = e - Object(r.ensureNotNull)(this._animationStartPosition).time; return Math.min(t, this._durationMsecs) } } var I = i("hY0g"), M = i.n(I), O = i("1AAW"), L = i("XcdR"), A = i("7MWe"), E = i("HZKX"), k = i("5VQP"), D = i("7ktv"), V = i("Fixu"), B = i("e92V"), R = i("QloM"), N = i("Kxc7"), j = i("//lt"), F = i("+6II"), W = i("JWMC"), H = i("7KDR"), U = i("ZBiT"), z = i("zL3Q"), G = i("/3z9"), q = i("H0vP"), Y = i("m/3z"); function K(e) { return "startMoving" in e && "move" in e && "endMoving" in e } i.d(t, "PaneWidgetBase", (function() { return ce })); const J = parseInt(U["css-value-pane-controls-padding-left"]), Z = parseInt(U["css-value-pane-controls-padding-right"]), X = ["AlertLabel"]; function $(e) { return !(null === e || !Object(_.isStudy)(e)) && "Volume@tv-basicstudies" === e.metaInfo() .id } function Q(e, t, i) { e.drawBackground && e.drawBackground(t, i) } function ee(e, t, i) { e.draw(t, i) } function te(e, t) { return e.paneViews(t) } function ie(e, t) { return e.topPaneViews() } function se(e, t) { return e.labelPaneViews(t) } function re(e, t) { const i = e.strategyOrdersPaneView(); return null === i ? null : [i] } function ne(e, t) { return null === e || null === e.hittest || e.source !== t ? null : e.hittest.data() } const oe = { contextMenuEnabled: !0, contextMenu: E.defaultContextMenuOptions, priceScaleContextMenuEnabled: !0, legendWidgetEnabled: !0, controlsEnabled: !0, propertyPagesEnabled: !0, sourceSelectionEnabled: !0, countdownEnabled: !0 }, ae = new Map([ [u.AreaName.Text, "Text"], [u.AreaName.Style, "Style"] ]), le = !N.enabled("display_legend_on_all_charts"); class ce { constructor(e, t, i, s) { this._legendWidget = null, this._paneControls = null, this._isDestroyed = !1, this ._trackCrosshairOnlyAfterLongTap = Object(a.lastEventIsTouch)(), this ._startTrackPoint = null, this._exitTrackingModeOnNextTry = !1, this ._startMoveSourceParams = null, this._startChangeLineToolParams = null, this ._preventSourceChange = !1, this._clonningAtMoveLineTools = null, this ._startCloningPoint = null, this._size = new S.Size(0, 0), this ._themedTopColor = null, this._themedBottomColor = null, this ._initCrossHairPosition = null, this._firstZoomPoint = null, this._editDialog = null, this._processing = !1, this._touchMove = !1, this._startTouchPoint = null, this._isSelecting = !1, this._prevHoveredHittest = null, this._contextMenuX = 0, this._contextMenuY = 0, this._startScrollingPos = null, this._isScrolling = !1, this._scrollPriceScale = null, this._scrollXAnimation = null, this ._scrollYAnimation = null, this._prevPinchScale = 1, this._pinching = !1, this ._wasPinched = !1, this._longTap = !1, this._contextMenuOpenedOnLastTap = !1, this._paneControlsResizeObserver = null, this._hideNotMainSourcesInLegendSpawn = null, this._hideWholeLegend = null, this._lastClickedSource = null, this ._customLegendWidgetsFactoryMap = new Map, this._prevMoveEventPosition = null, this._onMagnetStateChangedListener = this._onMagnetStateChanged.bind(this), this ._onShiftKeyStateChangedListener = this._onShiftKeyStateChanged.bind(this), this ._currentCursorClassName = "", this._lastFinishedToolId = null, this ._needResetMeasureLater = !1, this._currentChangingLineToolHitTest = null, this ._lastCommonTooltipData = null, this._canvasConfiguredHandler = () => this._state && this._chartModel() .lightUpdate(), this._topCanvasConfiguredHandler = () => this._state && this ._chartModel().lightUpdate(), this._recalculateLegendVisibility = () => { const e = Object(r.ensureNotNull)(this._hideWholeLegend), t = this._chartModel().crossHairSource().measurePane(); null !== t ? e.setValue(t === this._state) : e.setValue(Object(g .toolIsMeasure)(g.tool.value())) }, this._chart = e, this._state = t, this._options = Object(c.merge)(Object(c .clone)(oe), i), this._paneWidgetsSharedState = s, this._state && (this ._state.onDestroyed().subscribe(this, this._onStateDestroyed, !0), this ._state.dataSourcesCollectionChanged().subscribe(this, this ._onDataSourcesCollectionChanged)); const n = { contextMenuEnabled: this._options.priceScaleContextMenuEnabled, pressedMouseMoveScale: this._options.handleScale.axisPressedMouseMove.price, mouseWheelScale: this._options.handleScale.mouseWheel, currencyConversionEnabled: this._options.currencyConversionEnabled, unitConversionEnabled: this._options.unitConversionEnabled, countdownEnabled: this._options.countdownEnabled, croppedTickMarks: this._options.croppedTickMarks }; void 0 !== this._options.priceScaleContextMenu && (n.contextMenu = this._options .priceScaleContextMenu); const o = (e, t, i, s, r) => new P.PriceAxisWidget(this, this._chartUndoModel(), i, t, e, n, s, r), l = e.properties().childs().scalesProperties, h = this._chartModel().rendererOptionsProvider(), u = { backgroundBasedTheme: e.backgroundBasedTheme(), rendererOptionsProvider: h, getBackgroundTopColor: () => this._chartModel().backgroundTopColor() .value(), getBackgroundBottomColor: () => this._chartModel().backgroundColor().value() }, d = { showLabels: !1 }; this._lhsPriceAxisesContainer = new w.a(l, "left", o, u, d), this ._rhsPriceAxisesContainer = new w.a(l, "right", o, u, d), this._paneCell = document.createElement("td"), this._paneCell.classList.add("chart-markup-table", "pane"), this._div = document.createElement("div"), this._div.classList.add( "chart-gui-wrapper"), this._paneCell.appendChild(this._div), this ._canvasBinding = Object(S.createBoundCanvas)(this._div, new S.Size(16, 16)), this._canvasBinding.subscribeCanvasConfigured(this._canvasConfiguredHandler); const p = this._canvasBinding.canvas; p.style.position = "absolute", p.style.left = "0", p.style.top = "0", this ._topCanvasBinding = Object(S.createBoundCanvas)(this._div, new S.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this ._topCanvasConfiguredHandler); const _ = this._topCanvasBinding.canvas; _.style.position = "absolute", _.style.left = "0", _.style.top = "0", this ._rowElement = document.createElement("tr"), this._rowElement.appendChild(this ._lhsPriceAxisesContainer.getElement()), this._rowElement.appendChild(this ._paneCell), this._rowElement.appendChild(this._rhsPriceAxisesContainer .getElement()), this._options.legendWidgetEnabled && (this._options .customLegendWidgetFactories && (this._customLegendWidgetsFactoryMap = this ._options.customLegendWidgetFactories), this ._loadAndCreateLegendWidget()), this._state && !this._chart.readOnly() && this._options.controlsEnabled && this._loadAndCreatePaneControlsWidget(), Object(z.a)().subscribe(this._onMagnetStateChangedListener), Object(Y.d)().subscribe(this._onShiftKeyStateChangedListener), this._paneCell .addEventListener("dragover", e => { e.dataTransfer && Array.from(e.dataTransfer.files).some( blobImageFilter) && e.preventDefault() }) } destroy() { this._chart.onPaneWidgetDestroyed(this), this._customLegendWidgetsFactoryMap .clear(), this._topCanvasBinding.unsubscribeCanvasConfigured(this ._topCanvasConfiguredHandler), this._topCanvasBinding.destroy(), this ._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this ._canvasBinding.destroy(), null !== this._hideNotMainSourcesInLegendSpawn && this._hideNotMainSourcesInLegendSpawn.destroy(), this._legendWidget && (this ._legendWidget.destroy(), this._legendWidget = null), null !== this ._paneControlsResizeObserver && this._paneControlsResizeObserver.disconnect(), null !== this._paneControls && (this._paneControls.destroy(), this ._paneControls = null), this._lhsPriceAxisesContainer.destroy(), this ._rhsPriceAxisesContainer.destroy(), this.hasState() && (this.state() .onDestroyed().unsubscribeAll(this), this.state() .dataSourcesCollectionChanged().unsubscribeAll(this)), Object(z.a)() .unsubscribe(this._onMagnetStateChangedListener), Object(Y.d)().unsubscribe(this ._onShiftKeyStateChangedListener), this._paneWidgetsSharedState .onPaneDestroyed(this), null !== this._hideWholeLegend && (g.tool.unsubscribe( this._recalculateLegendVisibility), this._chartModel().crossHairSource() .measuringEnabled().unsubscribeAll(this)) } size() { return this._size } setSize(e) { Object(r.assert)(e.w >= 0 && e.h >= 0, "Try to set invalid size to PaneWidget " + JSON.stringify(e)), this._size.equals(e) || (this._size = e, this ._canvasBinding.resizeCanvas({ width: e.w, height: e.h }), this._topCanvasBinding.resizeCanvas({ width: e.w, height: e.h }), this._paneCell.style.width = e.w + "px", this._paneCell.style.height = e .h + "px", this._div.style.width = e.w + "px", this._div.style.height = e .h + "px", this._rowElement.classList.toggle("js-hidden", 0 === e.h), null !== this._legendWidget && this._legendWidget.updateWidgetModeBySize(e), null !== this._paneControls && this._paneControls.updateWidgetModeByWidth(e .w)) } width() { return this._size.w } height() { return this._size.h } backgroundColor() { return this._chartModel().backgroundColor().value() } processDoubleClickOnSource(e, t) { e.id() !== this._lastFinishedToolId && this._showEditDialogForSource(e, t) } setCursorForTool(e, t, i) { if (t && t.control() && e) return void this._setCursorClassName("pointer"); if (void 0 !== i) { switch (i) { case j.PaneCursorType.VerticalResize: this._setCursorClassName("ns-resize"); break; case j.PaneCursorType.HorizontalResize: this._setCursorClassName("ew-resize"); break; case j.PaneCursorType.DiagonalNeSwResize: this._setCursorClassName("nesw-resize"); break; case j.PaneCursorType.DiagonalNwSeResize: this._setCursorClassName("nwse-resize"); break; case j.PaneCursorType.Default: this._setCursorClassName("default"); break; case j.PaneCursorType.Pointer: this._setCursorClassName("pointer"); break; case j.PaneCursorType.Grabbing: this._setCursorClassName("grabbing") } return } const s = g.tool.value(); if (Object(g.toolIsCursor)(s)) { if (null !== this._paneWidgetsSharedState.draggingSource() || this ._isScrolling || this._chartUndoModel() && this._chartUndoModel().model() .sourcesBeingMoved().length) return void this._setCursorClassName( "grabbing"); if (e && this._options.sourceSelectionEnabled) return void this ._setCursorClassName("pointer") } if ("eraser" === s) return void this._setCursorClassName("eraser"); if ("zoom" === s) return void this._setCursorClassName("zoom-in"); const r = g.cursorTool.value(); "dot" !== r ? "arrow" !== r ? this._setCursorClassName("") : this ._setCursorClassName("default") : this._setCursorClassName("dot") } showContextMenuForSelection(e) { const t = this._chartUndoModel().selection(); if (t.isEmpty()) return; const i = t.dataSources().filter(e => e.hasContextMenu()); this.showContextMenuForSources(i, e) } async showContextMenuForSources(e, t, i) { if (!e.length) return Promise.resolve(null); const s = e[0], r = Object(c.merge)(Object(c.clone)(this._options.contextMenu), i || {}), n = new E.ActionsProvider(this._chart, r); if (s === this._chartUndoModel().crossHairSource()) return s.handleContextMenuEvent( t), Promise.resolve(null); { const i = await n.contextMenuActionsForSources(e); return 0 === i.length ? Promise.resolve(null) : k.ContextMenuManager.createMenu( i).then(e => (e.show(t), e)) } } leftPriceAxisesContainer() { return this._lhsPriceAxisesContainer } rightPriceAxisesContainer() { return this._rhsPriceAxisesContainer } setPriceAxisSizes(e, t, i) { this._priceAxisesContainer(e).setSizes(t, i) } state() { return Object(r.ensureNotNull)(this._state) } hasState() { return null !== this._state } setState(e) { this._state !== e && (this.hasState() && (this.state().onDestroyed().unsubscribeAll( this), this.state().dataSourcesCollectionChanged().unsubscribeAll( this)), this._state = e, this.hasState() && (this.state().onDestroyed() .subscribe(this, this._onStateDestroyed, !0), this.state() .dataSourcesCollectionChanged().subscribe(this, this ._onDataSourcesCollectionChanged), this.updatePriceAxisWidgets())) } getScreenshotData(e) { const t = [], i = []; let s, r = []; const n = this.state().sourcesByGroup().allExceptSpecialSources().slice().reverse(), o = this._chart.properties().childs().paneProperties.childs().legendProperties .childs(); for (const a of n) { const n = a.statusView(); Object(_.isStudy)(a) && (o.showLegend.value() || (null == e ? void 0 : e .showCollapsedStudies)) ? a.properties().visible.value() && n && o .showStudyTitles.value() && (t.push(a.statusProvider(null == e ? void 0 : e .status).text()), i.push(a.valuesProvider().getValues(null))) : a === this._chartModel().mainSeries() && n && o.showSeriesTitle.value() && (s = a .statusProvider((null == e ? void 0 : e.status) || {}).text(), r = a .valuesProvider().getValues(null)) } return { type: "pane", leftAxis: this._lhsPriceAxisesContainer.getScreenshotData(), rightAxis: this._rhsPriceAxisesContainer.getScreenshotData(), content: this._canvasBinding.canvas.toDataURL(), canvas: this._canvasBinding.canvas, contentWidth: this._size.w, contentHeight: this._size.h, studies: t, studiesValues: i, containsMainSeries: this.containsMainSeries(), mainSeriesText: s, mainSeriesValues: r } } hardResetCanvas() { this._size.equals(new S.Size(0, 0)) || (Object(S.hardResizeCanvas)(this ._canvasBinding, this._size), Object(S.hardResizeCanvas)(this._topCanvasBinding, this._size), this ._lhsPriceAxisesContainer.hardResetCanvas(), this._rhsPriceAxisesContainer .hardResetCanvas()) } updatePriceAxisWidgets() { if (!this.hasState()) return; const e = this._chartModel(), t = e.paneForSource(e.mainSeries()); if (!t) return; const i = e.priceScaleSlotsCount(), s = this.state(), r = s.visibleLeftPriceScales(), n = s.visibleRightPriceScales(); this._lhsPriceAxisesContainer.setScales(r, i.left, t.leftPriceScales().length, i .left + i.right), this._rhsPriceAxisesContainer.setScales(n, i.right, t .rightPriceScales().length, i.left + i.right) } update() { this.hasState() && (this._lhsPriceAxisesContainer.update(), this ._rhsPriceAxisesContainer.update(), null !== this._legendWidget && this ._legendWidget.update(), this.updateControls()) } updateStatusWidget(e = q.InvalidationLevel.None) { this.hasState() && null !== this._legendWidget && (e === q.InvalidationLevel.Full ? this._legendWidget.updateLayout() : this._legendWidget.update()) } updateControls() { this.hasState() && null !== this._paneControls && this._paneControls.update() } updateThemedColors(e, t) { this._themedTopColor = e, this._themedBottomColor = t, this._updateByThemedColors() } statusWidget() { return this._legendWidget } getElement() { return this._rowElement } canvasElement() { return this._canvasBinding.canvas } hasCanvas(e) { return this._canvasBinding.canvas === e || this._topCanvasBinding.canvas === e } pinchStartEvent() { null === this._paneWidgetsSharedState.scrollingPane() && null === this ._paneWidgetsSharedState.pinchingPane() && (this._onTouchEvent(), this._options .handleScale.pinch && (this._terminateActiveAnimations(), this ._prevPinchScale = 1, this._pinching = !0, this._wasPinched = !0, this ._paneWidgetsSharedState.setPinchingPane(this))) } pinchEvent(e, t) { if (null !== this._paneWidgetsSharedState.scrollingPane() || this ._paneWidgetsSharedState.pinchingPane() !== this) return; if (this._onTouchEvent(), !this._options.handleScale.pinch) return; const i = 10 * (t - this._prevPinchScale); this._prevPinchScale = t, this._chartModel().zoomTime(e.x, i, !0), this ._prevPinchScale = t } pinchEndEvent() { null === this._paneWidgetsSharedState.scrollingPane() && this ._paneWidgetsSharedState.pinchingPane() === this && (this._onTouchEvent(), this ._pinching = !1, this._paneWidgetsSharedState.setPinchingPane(null)) } mouseClickEvent(e) { this._onMouseEvent(), this._mouseClickOrTapEvent(e) } tapEvent(e) { this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this ._mouseClickOrTapEvent(e)) } mouseDownEvent(e) { this._onMouseEvent(), this.hasState() && this._mouseDownOrTouchStartEvent(e, Object( r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY))) } touchStartEvent(e) { if (this._paneWidgetsSharedState.startTouch(this), this ._preventTouchEventsExceptPinch()) return; const t = this._chartModel().crossHairSource(), i = !this._trackCrosshairOnlyAfterLongTap && t.pane === this._state && Number .isFinite(t.originX()) && Number.isFinite(t.originY()) && Math.abs(t.originX() - e.localX) + Math.abs(t.originY() - e.localY) < 5; this._onTouchEvent(), this._chart.setActivePaneWidget(this); const s = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)); i && (s.source === t || t.selectPointMode().value() ? this.startTrackingMode(new n .Point(e.localX, e.localY), new n.Point(e.localX, e.localY)) : !this ._chart.readOnly() && Object(f.isLineTool)(s.source) && s.source .userEditEnabled() && this._chartUndoModel().selectionMacro(e => { var t; e.clearSelection(), e.addSourceToSelection(s.source, null === (t = s .hittest) || void 0 === t ? void 0 : t.data()) })), this._mouseDownOrTouchStartEvent(e, s), this._mouseOrTouchMoveEvent(e) } mouseUpEvent(e) { this._onMouseEvent(), this._mouseUpOrTouchEndEvent(e) } touchEndEvent(e) { this._paneWidgetsSharedState.endTouch(this), this ._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this ._mouseOrTouchLeaveEvent(e), this._mouseUpOrTouchEndEvent(e)) } mouseMoveEvent(e) { this._onMouseEvent(), this._mouseOrTouchMoveEvent(e) } pressedMouseMoveEvent(e) { this._onMouseEvent(), this._pressedMouseOrTouchMoveEvent(e) } touchMoveEvent(e) { this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this ._pressedMouseOrTouchMoveEvent(e)) } mouseLeaveEvent(e) { this._onMouseEvent(), this._mouseOrTouchLeaveEvent(e) } mouseDoubleClickEvent(e) { this._onMouseEvent(), this._mouseDoubleClickOrDoubleTapEvent(e) } wheelClickEvent(e) { var t, i; if (this._chart.readOnly()) return; const s = this._dataSourceAtPoint(e.localX, e.localY); if (null === s || s.isCustom || null === s.source) return; if (((null === (t = s.hittest) || void 0 === t ? void 0 : t.result()) || 0) <= u .HitTestResult.MOVEPOINT_BACKGROUND) return; const n = new p.a(e), o = null === (i = s.hittest) || void 0 === i ? void 0 : i.eraseMarker(); if (n.control() && void 0 !== o && s.source.processErase) return void s.source .processErase(this._chartUndoModel(), o); const a = this._chartUndoModel(); a.selection().isSelected(s.source) || a.selectionMacro(e => { e.clearSelection(); const t = Object(r.ensureNotNull)(s.source); e.addSourceToSelection(t, ne(s, t)) }), this._chart.removeSelectedSources() } doubleTapEvent(e) { this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this ._mouseDoubleClickOrDoubleTapEvent(e)) } longTapEvent(e) { this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this._longTap = !0, null === this._startTrackPoint && this._trackingModeShouldBeActive() && this .startTrackingMode(new n.Point(e.localX, e.localY), new n.Point(e.localX, e .localY), new p.a(e))) } mouseEnterEvent(e) { this._onMouseEvent(), this.hasState() && (this._chart.setActivePaneWidget(this), this._setCursorPosition(e.localX, e.localY, new p.a(e))) } contextMenuEvent(e) { this._onMouseEvent(), this._contextMenuEvent(e) } touchContextMenuEvent(e) { this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this ._contextMenuEvent(e)) } mouseDownOutsideEvent() { this._processOutsideClick({ hittest: null, isCustom: !1, renderer: null, source: null }) } cancelZoom() { this._chartModel().crossHairSource().clearSelection(), this._firstZoomPoint = null, this._preventCrossHairMove() && this._clearCursorPosition() } startTrackingMode(e, t, i) { this._startChangeLineToolParams = null, this._startMoveSourceParams = null, this ._currentChangingLineToolHitTest = null, this._chartUndoModel().selectionMacro( e => e.clearSelection()), this._startTrackPoint = e, this ._exitTrackingModeOnNextTry = !1, this._setCursorPosition(t.x, t.y, i), this._initCrossHairPosition = this._chartModel().crossHairSource() .currentPoint() } setDragToAnotherPaneCursor() { this._setCursorClassName("grabbing") } cloneLineTools(e, t) { return this._chartUndoModel().cloneLineTools(e, t) } exitTrackingMode() { null !== this._state && null !== this._startTrackPoint && (this ._exitTrackingModeOnNextTry = !0, this._tryExitTrackingMode()) } trackingModeEnabled() { return null !== this._state && null !== this._startTrackPoint } addCustomWidgetToLegend(e, t) { this._options.legendWidgetEnabled && (this._customLegendWidgetsFactoryMap.set(e, t), null !== this._legendWidget && this._legendWidget.addCustomWidgetToLegend(e, t)) } containsMainSeries() { return !!this.hasState() && this.state().containsMainSeries() } paint(e, t) { if (!this._chartUndoModel() || !this.hasState()) return; this._state && (e.priceScaleSideMaxLevel("left") > q.InvalidationLevel.Cursor || e .priceScaleSideMaxLevel("right") > q.InvalidationLevel.Cursor) && (this ._recalculatePriceScales(), this._chartModel() .updateCrosshairPositionByOriginCoords()); const i = e.fullInvalidation(); if (i > q.InvalidationLevel.Cursor) { const e = this._chartModel().crossHairSource(), t = e.originX(), i = e.originY(); if (e.pane === this._state && Number.isFinite(t) && Number.isFinite(i)) { const e = this._dataSourceAtPoint(t, i); null !== e && this._updateHoveredSource(e, Object(Y.b)()) } } if (this._lhsPriceAxisesContainer.paint(e .getterForPriceScaleInvalidationLevelBySide("left")), this ._rhsPriceAxisesContainer.paint(e.getterForPriceScaleInvalidationLevelBySide( "right")), i !== q.InvalidationLevel.None) { if (i > q.InvalidationLevel.Cursor) { const e = Object(r.ensureNotNull)(this._canvasBinding.canvas.getContext( "2d")); e.setTransform(1, 0, 0, 1, 0, 0); const i = this._canvasRenderParams(); this._drawBackground(e, i), this._state && this._drawSources(e, i, t) } if (this._state) { const e = Object(r.ensureNotNull)(this._topCanvasBinding.canvas.getContext( "2d")); e.setTransform(1, 0, 0, 1, 0, 0); const t = this._topCanvasRenderParams(); e.clearRect(0, 0, Math.ceil(this._size.w * t.pixelRatio), Math.ceil(this ._size.h * t.pixelRatio)), this._drawSeriesTopViews(e, t), this ._drawCrossHair(e, t), this._drawActiveLineTools(e, t) } } } cancelCreatingLineTool() { const e = this._chartUndoModel(), t = this._chartUndoModel().lineBeingCreated(); if (t) if (t.pointsCount() <= 0) { const i = t.points(); if (i.length > 2) { const s = i[i.length - 2]; e.continueCreatingLine(s), this._finishTool(t) } else e.cancelCreatingLine() } else e.cancelCreatingLine(); null !== this._firstZoomPoint && this.cancelZoom(), this.setCursorForTool() } cancelMeasuring() { this._chartUndoModel().crossHairSource().clearMeasure(), Object(g.resetToCursor)(), this.setCursorForTool() } _topCanvasRenderParams() { return { pixelRatio: this._topCanvasBinding.pixelRatio, physicalWidth: this._topCanvasBinding.canvas.width, physicalHeight: this._topCanvasBinding.canvas.height, cssWidth: this._chartModel().timeScale().width(), cssHeight: this.height() } } _canvasRenderParams() { return { pixelRatio: this._canvasBinding.pixelRatio, physicalWidth: this._canvasBinding.canvas.width, physicalHeight: this._canvasBinding.canvas.height, cssWidth: this._chartModel().timeScale().width(), cssHeight: this.height() } } _tryExitTrackingMode(e) { this._exitTrackingModeOnNextTry && (this._startTrackPoint = null, e || this ._clearCursorPosition()) } _tryStartMeasure(e, t, i, s, r) { return !(!Object(g.toolIsMeasure)(g.tool.value()) || t.startMeasurePoint()) && (e .isTouch || this._preventCrossHairMove() || this._setCursorPosition(e .localX, e.localY, i), s = this._chartModel().magnet().align(s, r, this .state()), t.startMeasuring({ price: s, index: r }, this.state()), !0) } _tryFinishMeasure(e, t) { if (t.startMeasurePoint() && !t.endMeasurePoint()) { let i = t.price; const s = t.index; return i = this._chartModel().magnet().align(i, s, this.state()), t .finishMeasure({ price: i, index: s }), e.isTouch ? Object(g.resetToCursor)() : this._needResetMeasureLater = ! 0, this._preventCrossHairMove() && this._clearCursorPosition(), !0 } return !1 } _tryStartZoom(e, t, i, s) { const r = this._chart.model().model().zoomEnabled(); if ("zoom" === g.tool.value() && r) { const r = this._chartUndoModel(), n = r.timeScale().indexToCoordinate(i) - .5 * r.timeScale().barSpacing(); return this._firstZoomPoint = { price: t, index: i, x: n, y: e.localY }, this._preventCrossHairMove() || this._setCursorPosition(e.localX, e .localY, s), this._chartModel().crossHairSource().startSelection(this .state()), !0 } return !1 } _finishZoom(e) { const t = this.state(), i = t.defaultPriceScale(), s = Object(r.ensureNotNull)(t.mainDataSource()).firstValue(), n = i.coordinateToPrice(e.localY, Object(r.ensureNotNull)(s)), o = this._chartUndoModel(), a = Math.round(o.timeScale().coordinateToIndex(e.localX)), l = Object(r.ensureNotNull)(this._firstZoomPoint); a !== l.index && o.zoomToViewport(l.index, a, l.price, n, t), this._chartModel() .crossHairSource().clearSelection(), this._firstZoomPoint = null, Object(g .resetToCursor)(), this._preventCrossHairMove() && this ._clearCursorPosition() } _tryFinishZoom(e) { return null !== this._firstZoomPoint && (this._finishZoom(e), !0) } _tryHandleEraserMouseDown(e, t) { if (e.source && "eraser" === g.tool.value() && !e.isCustom && (!(i = e.source) || !i .customization || !i.customization.disableErasing)) { const i = this._chartUndoModel(); if (null !== e.hittest && (Object(f.isLineTool)(e.source) || Object(_.isStudy)(e .source))) { const s = e.hittest.eraseMarker(); return t.control() && void 0 !== s && e.source.processErase ? e.source .processErase(i, s) : i.removeSource(e.source, !1), !0 } } var i; return !1 } _tryStartChangingLineTool(e, t, i, s) { var n, o; if (e.isTouch && null !== this._startTrackPoint) return !1; const a = t.hittest; if ((!e.isTouch || !this._preventSourceChange) && a && Object(f.isLineTool)(t .source) && a.result() === u.HitTestResult.CHANGEPOINT) { const l = this._chartUndoModel(), c = Object(r.ensure)(null === (n = this.state().mainDataSource()) || void 0 === n ? void 0 : n.firstValue()), h = Object(r.ensureNotNull)(t.source.priceScale()).coordinateToPrice(e .localY, c); l.selectionMacro(e => { e.clearSelection(), e.addSourceToSelection(t.source, a.data()) }); const u = l.model().magnet().align(h, s, this.state()), d = null === (o = a.data()) || void 0 === o ? void 0 : o.pointIndex; return this._startChangeLineToolParams = { source: t.source, startPoint: { index: s, price: u }, screenPoint: { x: e.localX, y: e.localY }, pointIndex: d, envState: i }, !0 } return this._startChangeLineToolParams = null, !1 } _tryStartCloning(e, t, i, s) { if (i.control()) { const t = this._chartUndoModel().selection().dataSources().filter(e => e .cloneable()); if (s && s.cloneable() && t.push(s), t.length > 0) return this ._clonningAtMoveLineTools = t.map(e => e.id()), this ._startCloningPoint = new n.Point(e.localX, e.localY), !0 } return !1 } _tryFinishClonning(e, t, i) { const s = this._chartUndoModel(), o = this._chartModel(); if (t.control() && this._clonningAtMoveLineTools) { const a = new n.Point(e.localX, e.localY), l = Object(r.ensureNotNull)(this._startCloningPoint).subtract(a).length(), c = []; for (const e of this._clonningAtMoveLineTools) { const t = o.dataSourceForId(e); null !== t && c.push(t) } if (0 === c.length) return !1; if (l > 8) { const o = this.cloneLineTools(c, !0).map(e => Object(r.ensureNotNull)(s .model().dataSourceForId(e))); s.selectionMacro(e => { e.clearSelection(); let t = null; o.forEach(s => { null === t && (t = ne(i, s)), e .addSourceToSelection(s, t) }) }); const a = new n.Point(e.localX, e.localY), l = Object(r.ensureNotNull)(o[0].priceScale()), h = Object(r.ensureNotNull)(this.state().mainDataSource()).firstValue(), u = { index: s.timeScale().coordinateToIndex(e.localX), price: l.coordinateToPrice(e.localY, Object(r.ensureNotNull)(h)) }; s.startMovingSources(o, { logical: u, screen: a }, null, t), this._clonningAtMoveLineTools = null, this ._startCloningPoint = null } return !0 } return !1 } _mouseDownEventForLineTool(e, t, i, s) { var o, a; const l = g.tool.value(); if (!this.hasState() || Object(B.isLineToolDrawWithoutPoints)(l)) return; const c = this._chartUndoModel(); let h = !1, u = null; Object(g.hideAllDrawings)().value() && Object(g.hideAllIndicators)().setValue(!1), Object(g.hideAllDrawings)().setValue(!1), Object(g.lockDrawings)().setValue(!1), e.isTouch && (Object(f.isLineToolName)(l) && !Object(B .isLineDrawnWithPressedButton)(l) || c.lineBeingCreated()) && this ._initToolCreationModeParams(e); const d = c.lineBeingCreated(); if (d && !Object(B.isLineDrawnWithPressedButton)(d.toolname)) { const l = Object(r.ensure)(null === (o = d.ownerSource()) || void 0 === o ? void 0 : o.firstValue()); if (e.isTouch) { if (!this._startTouchPoint) { this._startTouchPoint = new n.Point(e.pageX, e.pageY); const t = d.points(), i = t[t.length - 1], s = c.timeScale().indexToCoordinate(i.index), o = Object(r.ensureNotNull)(d.priceScale()).priceToCoordinate(i .price, l); return void(this._initCrossHairPosition = new n.Point(s, o)) } } else { u = d; const n = c.model().paneForSource(d); if (n !== this._state && null !== n) { const i = this._externalPaneXCoord(n, e.localX), s = this._externalPaneYCoord(n, e.localY); h = c.continueCreatingLine({ index: Math.round(c.timeScale().coordinateToIndex(i)), price: Object(r.ensure)(null === (a = d.priceScale()) || void 0 === a ? void 0 : a.coordinateToPrice(s, l)) }, t) } else { const e = c.model().magnet().align(s, i, this.state()); h = c.continueCreatingLine({ index: i, price: e }, t) } } } else if (!e.isTouch || Object(B.isLineDrawnWithPressedButton)(l)) { const e = { index: i, price: c.model().magnet().align(s, i, this.state()) }; u = c.createLineTool(this.state(), e, l), c.lineBeingCreated() || (h = !0) } const p = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)); u && c.selectionMacro(e => { var t; return e.addSourceToSelection(Object(r.ensureNotNull)(u), null === (t = p.hittest) || void 0 === t ? void 0 : t.data()) }), h && u && (this._finishTool(u, p), e.preventDefault()) } _handleSelectionMouseDownAndGetJustDeselectedSource(e, t, i) { const s = this._chartUndoModel(); let r = null; if (null === t.source || t.source.isSelectionEnabled()) { let n = e.isTouch ? Boolean(t.hittest && t.hittest.result() >= u.HitTestResult .MOVEPOINT_BACKGROUND) : Boolean(t.hittest && t.hittest.result() > u .HitTestResult.MOVEPOINT_BACKGROUND); this._preventSourceChange && (n = !1), s.selectionMacro(e => { var s; n && t.source ? (i.control() || e.selection().isSelected(t .source) || e.clearSelection(), i.control() && e .selection() .isSelected(t.source) ? (r = t.source, e .removeSourceFromSelection(t.source)) : e .addSourceToSelection(t.source, null === (s = t.hittest) || void 0 === s ? void 0 : s.data()), e.selection() .allSources().length > 1 && Object(W.trackEvent)("GUI", "Multiselect", "Click Select")) : i.control() || e .clearSelection() }) } return r } _processMouseMoveWhileZoom(e, t) { this._preventCrossHairMove() || this._setCursorPosition(e.localX, e.localY, t) } _updateCommonTooltip(e, t) { let i = null; if (null !== e && null !== e.hittest) { const t = e.hittest.data(); t && (i = t.tooltip || null) } const s = this._lastCommonTooltipData; if (null === s && null === i) return; if (null === i || "" === i.text) return this._lastCommonTooltipData = null, void Object(F.a)(t); if (s && i.text === s.text && i.rect && s.rect && i.rect.x === s.rect.x && i.rect .y === s.rect.y && i.rect.w === s.rect.w && i.rect.h === s.rect.h) return; this._lastCommonTooltipData = i; const r = Object(c.clone)(i); if (void 0 !== r.rect) { const e = this._paneCell.getBoundingClientRect(); r.rect.x += e.left, r.rect.y += e.top } Object(F.b)(r) } _setCursorPositionOnExternalPane(e, t, i, s) { t = this._externalPaneXCoord(e, t), i = this._externalPaneYCoord(e, i); this._chart.paneByState(e)._setCursorPosition(t, i, s) } _setCursorPosition(e, t, i) { this._chartModel().setAndSaveCurrentPosition(this._correctXCoord(e), this ._correctYCoord(t), this.state(), i) } _setCursorClassName(e) { let t = ""; e && (t = "pane--cursor-" + e), this._currentCursorClassName !== t && (this ._currentCursorClassName && this._paneCell.classList.remove(this ._currentCursorClassName), t && this._paneCell.classList.add(t), this ._currentCursorClassName = t, this._paneCell.style.cursor) } _processMouseUpOrTouchEndHandler(e) { var t; null === (t = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)) .hittest) || void 0 === t || t.tryCallMouseUpOrTouchEndHandler(e) } _crossHairShouldBeVisible() { const e = this._chartModel().crossHairSource(); return Object(f.isLineToolName)(g.tool.value()) || Object(g.toolIsMeasure)(g.tool .value()) || e.startMeasurePoint() && !e.endMeasurePoint() || null !== this ._firstZoomPoint || null !== this._chartModel().lineBeingEdited() || null !== this._chartModel().lineBeingCreated() } _clearCursorPosition() { this._chartModel().clearCurrentPosition() } _dataSourceAtPoint(e, t) { let i = null, s = null, r = null; if (!this.hasState()) return null; const o = this.state(), a = o.height(), l = o.width(); let c = !1; if (this._currentChangingLineToolHitTest) return this ._currentChangingLineToolHitTest; const h = (e, t, n, o) => { const a = r ? r.result() : 0; e.result() > a && (r = e, i = t, s = n, c = o) }, u = this._canvasRenderParams(), p = new n.Point(e, t), _ = this._chartUndoModel(); this._hitTestChartSources(u, [_.crossHairSource()], p, h), this._hitTestCustomSources(u, o.customSources(d.CustomSourceLayer.Topmost), p, h); const m = o.sourcesByGroup(); this._hitTestChartSources(u, m.tradingSources(), p, h), this._hitTestCustomSources( u, o.customSources(d.CustomSourceLayer.Foreground), p, h); const f = [...this._chartModel().multiPaneSources(o), ...m.hitTestSources()]; if (this._hitTestChartSources(u, f, p, h), this.containsMainSeries()) { const e = _.barsMarksSources(); for (let t = 0; t < e.length; ++t) { const i = e[t], s = i.paneViews(o) || []; let r, n; for (let e = 0; e < s.length; e++) r = s[e].renderer(a, l), null !== r && ( n = r.hitTest(p, u), n && h(n, i, r, !1)) } const t = _.activeStrategySource().value(); if (null !== t) { const e = t.strategyOrdersPaneView(); if (null !== e) { const i = e.renderer(a, l); if (null !== i) { const e = i.hitTest(p, u); e && h(e, t, i, !1) } } } } return null === i && this._hitTestCustomSources(u, o.customSources(d .CustomSourceLayer.Background), p, h), { source: i, hittest: r, renderer: s, isCustom: c } } _hitTestCustomSources(e, t, i, s) { const n = Object(r.ensureNotNull)(this._state), o = n.height(), a = n.width(); for (let r = t.length - 1; r >= 0; --r) { const l = t[r], c = l.paneViews(n); if (0 !== c.length) for (let t = c.length - 1; t >= 0; --t) { const r = c[t].renderer(o, a); if (null !== r) { const t = r.hitTest(i, e); null !== t && s(t, l, r, !0) } } } } _hitTestChartSources(e, t, i, s) { const n = Object(r.ensureNotNull)(this._state), o = n.height(), a = n.width(); for (let r = t.length; 0 < r--;) { const l = t[r], c = l.paneViews(n); if (null !== c) for (let t = c.length; 0 < t--;) { const r = c[t].renderer(o, a); if (r && r.hitTest) { const t = r.hitTest(i, e); null !== t && s(t, l, r, !1) } } } } _tryStartMovingLineTool(e, t, i, s) { var o, a; if (null === t.source || !t.source.movable() || null !== this._startTrackPoint) return !1; if (!this._preventSourceChange) { const l = this._chartUndoModel(), c = Object(r.ensureNotNull)(Object(r.ensureNotNull)(this._state) .mainDataSource()).firstValue(), h = Object(r.ensureNotNull)(t.source.priceScale()).coordinateToPrice(e .localY, Object(r.ensureNotNull)(c)), u = (t.source.isSelectionEnabled() ? l.selection().allSources() : [t .source ]).filter(K), d = new n.Point(e.localX, e.localY), p = { index: s, price: h }, _ = null === (a = null === (o = t.hittest) || void 0 === o ? void 0 : o .data()) || void 0 === a ? void 0 : a.activeItem; return this._startMoveSourceParams = { source: u, startPoint: { logical: p, screen: d }, itemIndex: void 0 === _ ? null : _, envState: i }, !0 } return this._startMoveSourceParams = null, !1 } _chartModel() { return this._chart.model().model() } _chartUndoModel() { return this._chart.model() } _externalPaneXCoord(e, t) { t += this._div.getBoundingClientRect().left + document.body.scrollLeft; const i = Object(r.ensureNotNull)(this._chart.paneByState(e)), s = i._div.getBoundingClientRect().left + document.body.scrollLeft; return i._correctXCoord(t - s) } _externalPaneYCoord(e, t) { t += this._div.getBoundingClientRect().top + document.body.scrollTop; const i = Object(r.ensureNotNull)(this._chart.paneByState(e)), s = i._div.getBoundingClientRect().top + document.body.scrollTop; return i._correctYCoord(t - s) } _correctXCoord(e) { return Math.max(0, Math.min(e, this._size.w - 1)) } _correctYCoord(e) { return Math.max(0, Math.min(e, this._size.h - 1)) } _processScroll(e) { if (!this._chart.model().model().scrollEnabled()) return; const t = Date.now(); this._startScrollingPos || this._preventScroll() || (this._startScrollingPos = { x: e.clientX, y: e.clientY, timestamp: t, localX: e.localX, localY: e.localY }), null !== this._scrollXAnimation && this._scrollXAnimation.addPosition(e .localX, t), null !== this._scrollYAnimation && this._scrollYAnimation .addPosition(e.localY, t); const i = this._chartUndoModel(); let s = this.state().defaultPriceScale(); if (this._startScrollingPos && !this._isScrolling && (this._startScrollingPos.x !== e.clientX || this._startScrollingPos.y !== e.clientY)) return i .beginUndoMacro("scroll").setCustomFlag("doesnt_affect_save", !0), null === this._scrollXAnimation && this._options.useKineticScroll && (this ._scrollXAnimation = new T(.2, 7, .997, 15), this._scrollXAnimation .addPosition(this._startScrollingPos.localX, this._startScrollingPos .timestamp), this._scrollXAnimation.addPosition(e.localX, t)), this ._scrollYAnimation, i.selection().isEmpty() || (s = i.selection() .allSources()[0].priceScale()), null === s || s.isEmpty() || (this ._scrollPriceScale = s, i.startScrollPrice(this.state(), s, e.localY)), i.startScrollTime(e.localX), this._isScrolling = !0, this .setCursorForTool(), void this._paneWidgetsSharedState.setScrollingPane( this); this._isScrolling && (null !== this._scrollPriceScale && i.scrollPriceTo(this .state(), this._scrollPriceScale, e.localY), i.scrollTimeTo(e.localX)) } _finishScroll() { const e = this._chartUndoModel(); e.endScrollTime(), null !== this._scrollPriceScale && e.endScrollPrice(this.state(), this._scrollPriceScale), e.endUndoMacro(), this._isScrolling = !1, this ._startScrollingPos = null, this._scrollPriceScale = null, this .setCursorForTool(), this._paneWidgetsSharedState.setScrollingPane(null) } _endScroll(e) { if (!this._isScrolling) return !1; const t = this._isScrolling && this._scrollUndoCommandInStack(); if (this._isScrolling) { const i = Date.now(); null !== this._scrollXAnimation && this._scrollXAnimation.start(e.localX, i), null !== this._scrollYAnimation && this._scrollYAnimation.start(e.localY, i); const s = this._chartUndoModel(); if ((null === this._scrollXAnimation || this._scrollXAnimation.finished(i)) && ( null === this._scrollYAnimation || this._scrollYAnimation.finished(i))) return this._finishScroll(), t; const r = s.timeScale(), n = this._scrollXAnimation, o = this._scrollYAnimation, a = () => { if ((null === n || n.terminated()) && (null === o || o.terminated())) return; const e = Date.now(); let t = null === n || n.finished(e); const i = null === o || o.finished(e); if (null !== n && !n.terminated()) { const i = r.rightOffset(); s.scrollTimeTo(n.getPosition(e)), i === r.rightOffset() && (t = !0, this._scrollXAnimation = null) } null === o || o.terminated() || null === this._scrollPriceScale || s .scrollPriceTo(this.state(), this._scrollPriceScale, o.getPosition( e)), t && i ? this._finishScroll() : requestAnimationFrame(a) }; requestAnimationFrame(a) } return t } _terminateActiveAnimations() { const e = Date.now(), t = null === this._scrollXAnimation || this._scrollXAnimation.finished(e), i = null === this._scrollYAnimation || this._scrollYAnimation.finished(e); null === this._scrollXAnimation && null === this._scrollYAnimation || t && i || this ._finishScroll(), null !== this._scrollXAnimation && (this._scrollXAnimation .terminate(), this._scrollXAnimation = null), null !== this._scrollYAnimation && (this._scrollYAnimation.terminate(), this ._scrollYAnimation = null) } _preventScroll() { return this._trackCrosshairOnlyAfterLongTap && this._longTap || this ._contextMenuOpenedOnLastTap || Object(f.isLineToolName)(g.tool.value()) || Boolean(this._chartUndoModel().lineBeingCreated()) || null !== this ._startTrackPoint } _isSelectPointModeEnabled() { return this._chartUndoModel().crossHairSource().selectPointMode().value() } _preventCrossHairMove() { return !!this._trackCrosshairOnlyAfterLongTap && (null === this._chart .trackingModePaneWidget() && (!!this._contextMenuOpenedOnLastTap || !this ._crossHairShouldBeVisible() && null === this._startTrackPoint)) } _finishTool(e, t = null) { const i = this._chartUndoModel(), s = g.tool.value(); if (Object(g.resetToCursor)(), this._preventCrossHairMove() && this ._clearCursorPosition(), i.selectionMacro(i => { i.addSourceToSelection(e, ne(t, e)) }), Object(B.isTextToolName)(s)) { const t = i.createUndoCheckpoint(); this._chart.showChartPropertiesForSource(e, R.TabNames.text, void 0, t) } this._lastFinishedToolId = e.id(), Object(V.c)(e) } _alignSourcesThatBeingMoved(e, t, i, s) { const r = this._chartUndoModel(), o = r.timeScale().coordinateToIndex(t); r.model().sourcesBeingMoved().forEach(e => { const a = e.convertYCoordinateToPriceForMoving(i, this.state() .mainDataSource()); null !== a && (this.setCursorForTool(), r.moveSources({ screen: new n.Point(t, i), logical: { index: o, price: a } }, s)) }) } _resetMeasureIfRequired() { this._needResetMeasureLater && (Object(g.resetToCursor)(), this ._needResetMeasureLater = !1) } _drawBackground(e, t) { const i = Math.ceil(t.pixelRatio * this._size.w), s = Math.ceil(t.pixelRatio * this._size.h), r = this._chartModel(), n = r.backgroundTopColor().value(), o = r.backgroundColor().value(); n === o ? Object(S.clearRect)(e, 0, 0, i + 1, s + 1, o) : Object(y .clearRectWithGradient)(e, 0, 0, i + 1, s + 1, n, o) } _drawWatermark(e, t) { const i = this._chartModel().watermarkSource(); if (null === i) return; const s = this.state(); if (!s.containsMainSeries()) return; const r = i.paneViews(), n = s.height(), o = s.width(); for (const i of r) { e.save(); const s = i.renderer(n, o); s && s.draw(e, t), e.restore() } } _drawCrossHair(e, t) { const i = this._chartUndoModel().crossHairSource(); !i.visible && Object(g.lockTimeAxis)().value() && (i.setLockedPosition(Object(r .ensureNotNull)(this._state)), i.updateAllViews()), this._drawSourceImpl(e, t, te, ee, i) } _drawActiveLineTools(e, t) { const i = this._chartModel(), s = [i.lineBeingCreated(), i.lineBeingEdited(), ...i.sourcesBeingMoved(), i .customSourceBeingMoved() ].filter(e => !!e); for (const r of s) { (i.paneForSource(r) === this.state() || Object(m.a)(r) && r .isMultiPaneEnabled()) && this._drawSourceImpl(e, t, te, ee, r) } } _drawSeriesTopViews(e, t) { this.state().containsMainSeries() && this._drawSourceImpl(e, t, ie, ee, this ._chartUndoModel().mainSeries()) } _drawSources(e, t, i) { const s = this.state(), r = s.model(), n = s.sourcesByGroup(), o = n.tradingSources(), a = [...r.multiPaneSources(s), ...n.generalSources()], l = n.phantomSources(), h = s.customSources(d.CustomSourceLayer.Background).slice(), u = s.customSources(d.CustomSourceLayer.Foreground).slice(), p = s.customSources(d.CustomSourceLayer.Topmost).slice(); { const e = r.panes(); for (let t = e.length - 1; t >= 0; t--) e[t].createDrawingsCaches() } this._drawSourceImpl(e, t, te, ee, r.gridSource()), this._drawWatermark(e, t); for (const i of h) this._drawSourceImpl(e, t, te, Q, i); for (const i of a) this._drawSourceImpl(e, t, te, Q, i); for (const i of u) this._drawSourceImpl(e, t, te, Q, i); for (const i of l) this._drawSourceImpl(e, t, te, Q, i); const _ = new Set; [r.lineBeingCreated(), r.lineBeingEdited(), ...r.sourcesBeingMoved(), r .customSourceBeingMoved() ].filter(c.notNull).forEach(e => _.add(e.id())); let f = r.hoveredSource(); null !== f && ($(f) || _.has(f.id()) || Object(m.a)(f) && !a.includes(f) ? f = null : _.add(f.id())); const g = r.selection().allSources().filter(e => !(Object(m.a)(e) && !a.includes( e)) && (!_.has(e.id()) && !$(e))); g.forEach(e => _.add(e.id())); { for (const i of h) this._drawSourceImpl(e, t, te, ee, i, _); for (const i of a) this._drawSourceImpl(e, t, te, ee, i, _); for (const i of u) this._drawSourceImpl(e, t, te, ee, i, _); const i = r.activeStrategySource().value(); i && this.containsMainSeries() && this._drawSourceImpl(e, t, re, ee, i) } for (const i of o) this._drawSourceImpl(e, t, te, Q, i); for (const i of p) this._drawSourceImpl(e, t, te, Q, i); for (const i of o) this._drawSourceImpl(e, t, te, Q, i); for (const i of p) this._drawSourceImpl(e, t, te, Q, i); for (const i of a) this._drawSourceImpl(e, t, se, ee, i, _); for (const i of u) this._drawSourceImpl(e, t, se, ee, i, _); this._drawBarsMarks(e, t, i); for (const i of o) this._drawSourceImpl(e, t, te, ee, i, _); for (const i of p) this._drawSourceImpl(e, t, te, ee, i, _); for (const i of g) this._drawSourceImpl(e, t, te, ee, i); for (const i of g) this._drawSourceImpl(e, t, se, ee, i); f && (this._drawSourceImpl(e, t, te, ee, f), this._drawSourceImpl(e, t, se, ee, f)); for (const i of l) this._drawSourceImpl(e, t, te, ee, i, _); { const e = r.panes(); for (let t = e.length - 1; t >= 0; t--) e[t].clearDrawingCaches() } } _drawSourceImpl(e, t, i, s, r, n) { if (n && n.has(r.id())) return; const o = this.state(), a = o.height(), l = o.width(), c = i(r, this.state()); if (c) for (const i of c) { const r = i.renderer(a, l); r && (e.save(), s(r, e, t), e.restore()) } } _drawBarsMarks(e, t, i) { if (this.containsMainSeries() && !i) { const i = this._chartUndoModel().barsMarksSources(); for (const s of i) this._drawSourceImpl(e, t, te, ee, s) } } _updateByThemedColors() { null !== this._legendWidget && this._legendWidget.updateThemedColors(this ._themedTopColor), null !== this._paneControls && this._paneControls .updateThemedColors(this._themedTopColor) } _scrollUndoCommandInStack() { const e = this._chartUndoModel().undoHistory().undoStack(); if (e.isEmpty()) return !1; const t = e.head(); if (!(t instanceof b.a)) return !1; if (t.isEmpty()) return !1; const i = t.commands()[0]; return i instanceof A.PriceScaleChangeUndoCommand || i instanceof L.a } _onStateDestroyed() { this.setState(null) } _getHideNotMainSourcesValue() { return le && !this._chart.isActive() && !this._chart.crossHairSyncEnabled() } _onDataSourcesCollectionChanged() { this._startMoveSourceParams = null } _processMouseEnterLeaveMoveHandlers(e, t) { var i, s, r, n; null !== this._prevHoveredHittest && this._prevHoveredHittest.renderer !== e .renderer && (Object(u.tryCallHandler)(t, null === (s = null === (i = this ._prevHoveredHittest.hittest) || void 0 === i ? void 0 : i .data()) || void 0 === s ? void 0 : s.mouseLeaveHandler), this._prevHoveredHittest = null), t.isTouch || (e.hittest && (null === (r = this._prevHoveredHittest) || void 0 === r ? void 0 : r.renderer) !== e .renderer && (e.hittest.tryCallMouseEnterHandler(t), this ._prevHoveredHittest = e), null === (n = e.hittest) || void 0 === n || n .tryCallMouseMoveHandler(t)) } _startChangeOrMoveLineToolIfNeeded() { if (null !== this._startChangeLineToolParams) { const e = this._startChangeLineToolParams; this._chartUndoModel().startChangingLinetool(e.source, e.startPoint, e .pointIndex, e.envState) } if (null !== this._startMoveSourceParams) { const e = this._startMoveSourceParams; this._chartUndoModel().startMovingSources(e.source, e.startPoint, e.itemIndex, e .envState) } this._startMoveSourceParams = null, this._startChangeLineToolParams = null } _trackingModeShouldBeActive() { return !(!this._trackCrosshairOnlyAfterLongTap || this ._contextMenuOpenedOnLastTap || this._crossHairShouldBeVisible()) && this ._longTap } _processOutsideClick(e) { let t = null; const i = this._chartModel(); if (e.source && (t = e.isCustom ? i.customSourceName(e.source) : e.source.id()), null !== this._lastClickedSource && this._lastClickedSource.id !== t) { const e = this._lastClickedSource.id; let t = this._lastClickedSource.isCustom ? i.customSourceForName(e) : i .dataSourceForId(e); null !== t || this._lastClickedSource.isCustom || (t = this._chartUndoModel() .barMarksSourceForId(e)), null !== t && t.onClickOutside && (t .onClickOutside(), this._chartModel().updateSource(t)) } this._lastClickedSource = null !== t ? { id: t, isCustom: e.isCustom } : null } _mouseClickOrTapEvent(e) { var t, i, s; if (!this.hasState()) return; const n = this._dataSourceAtPoint(e.localX, e.localY), o = n && n.source, a = this._chartUndoModel(), c = Boolean(null === (i = null === (t = null == n ? void 0 : n.hittest) || void 0 === t ? void 0 : t.data()) || void 0 === i ? void 0 : i .hideCrosshairLinesOnHover); this._processOutsideClick(Object(r.ensureNotNull)(n)), !this ._isSelectPointModeEnabled() || c || e.isTouch && this.trackingModeEnabled() && !this._exitTrackingModeOnNextTry || a.crossHairSource().trySelectCurrentPoint(), (null === (s = null == n ? void 0 : n.hittest) || void 0 === s ? void 0 : s .tryCallClickOrTapHandler(e)) && a.model().updateSource(Object(r .ensureNotNull)(o)), !e.isTouch || this._isSelectPointModeEnabled() || n && n.source === a.crossHairSource() || this._tryExitTrackingMode(), o instanceof v .BarsMarksContainer && n && n.hittest && n.hittest.data() && o.onClicked(Object( r.ensureNotNull)(n.hittest).data()), o && Object(f.isLineTool)(o) && Object( l.emit)("drawing_event", o.id(), "click"), this._resetMeasureIfRequired() } _mouseDownOrTouchStartEvent(e, t) { var i; if (e.isTouch && (this._longTap = !1, this._exitTrackingModeOnNextTry = null !== this._startTrackPoint, this._paneWidgetsSharedState.clearDraggingSource()), this._contextMenuOpenedOnLastTap = !1, this._lastFinishedToolId = null, this ._terminateActiveAnimations(), e.isTouch && this ._switchTrackingModeFromAnotherPaneIfNeeded(e), document.activeElement !== document.body && document.activeElement !== document.documentElement) document .activeElement && document.activeElement.blur ? document.activeElement.blur() : document.body.focus(); else { const e = document.getSelection(); null !== e && e.removeAllRanges() } Object(l.emit)("mouse_down", { clientX: e.clientX, clientY: e.clientY, pageX: e.pageX, pageY: e.pageY, screenX: e.screenX, screenY: e.screenY }), this._updateCommonTooltip(null); const s = this._chartUndoModel(), o = new p.a(e); s.mainSeries().clearGotoDateResult(), this.hideInplaceEditor(); const c = this.state().defaultPriceScale(); if (c.isEmpty() || s.timeScale().isEmpty()) return; const h = s.crossHairSource(); if (!e.isTouch && !Object(B.isLineDrawnWithPressedButton)(g.tool.value())) { const t = s.lineBeingCreated(), i = null !== t ? s.model().paneForSource(t) : null; null !== i && i !== this._state ? this._setCursorPositionOnExternalPane(i, e .localX, e.localY, o) : this._setCursorPosition(e.localX, e.localY, o) } e.isTouch && Object(f.isLineToolName)(g.tool.value()) && (Object(B .isLineDrawnWithPressedButton)(g.tool.value()) || null !== h.pane ? Object(B.isLineDrawnWithPressedButton)(g.tool.value()) && this ._clearCursorPosition() : this._chart.updateCrossHairPositionIfNeeded()); const d = Object(r.ensureNotNull)(this.state().mainDataSource()).firstValue(); if (null === d) return void(this._chart.readOnly() || (this ._handleSelectionMouseDownAndGetJustDeselectedSource(e, t, o), t .source && t.source instanceof D.PriceDataSource && t.source .isDraggable() && this._paneWidgetsSharedState.trySetDraggingSource( t.source, this))); const _ = c.coordinateToPrice(e.localY, d), m = this._chartModel().timeScale().coordinateToIndex(e.localX); if (h.startMeasurePoint() && h.endMeasurePoint() && h.clearMeasure(), o.shift() && Object(g.toolIsCursor)(g.tool.value()) && s.selection().isEmpty() && g.tool .setValue("measure"), (e.isTouch || !this._tryStartMeasure(e, h, o, _, m)) && (e .isTouch || !this._tryFinishMeasure(e, h)) && !this._tryFinishZoom(e) && ! this._tryStartZoom(e, _, m, o)) { if (e.isTouch && (null !== this._startTrackPoint ? (this ._initCrossHairPosition = h.currentPoint(), this._startTrackPoint = new n.Point(e.localX, e.localY)) : this ._isSelectPointModeEnabled() && null === this._chart .trackingModePaneWidget() && this.startTrackingMode(new n.Point(e .localX, e.localY), new n.Point(e.localX, e.localY), new p.a(e))), e .isTouch && (this._preventSourceChange = null === t.source || !s.selection() .isSelected(t.source)), !this._isSelectPointModeEnabled() && !this ._isScrolling) { if (e.isTouch && (Object(g.toolIsMeasure)(g.tool.value()) || null !== h .measurePane())) return void this._initToolCreationModeParams(e); if (Object(f.isLineToolName)(g.tool.value()) || s.lineBeingCreated()) return o.shift() || s.selectionMacro(e => e.clearSelection()), void this ._mouseDownEventForLineTool(e, o, m, _) } if (null === (i = t.hittest) || void 0 === i || i .tryCallMouseDownOrTouchStartHandler(e), !this._chart.readOnly()) { const i = this._handleSelectionMouseDownAndGetJustDeselectedSource(e, t, o); if (t.hittest && t.source) { const i = t.hittest.data(); if (t.isCustom) { if (t.hittest.hasPressedMoveHandler(e)) return void s.model() .setMovingCustomSource(t.source, i) } else if ((null == i ? void 0 : i.areaName) === u.AreaName .SourceItemMove) { const r = null == i ? void 0 : i.activeItem; if (void 0 !== r) return void s.startCustomMoving(t.source, r, e) } } if (this._tryHandleEraserMouseDown(t, o)) return; const r = t.source && Object(f.isLineTool)(t.source) && t.source.isLocked && t.source.isLocked(); if (!(Object(g.lockDrawings)().value() || r) && !t.isCustom) { if (t.source && !t.source.userEditEnabled()) return; if (this._tryStartChangingLineTool(e, t, o, m)) return void(this ._currentChangingLineToolHitTest = t); if (this._currentChangingLineToolHitTest = null, t.hittest && ((b = t .hittest.result()) === u.HitTestResult.MOVEPOINT || b === u .HitTestResult.MOVEPOINT_BACKGROUND && Object(a .lastEventIsTouch)())) { if (this._tryStartCloning(e, t, o, i)) return; if (this._tryStartMovingLineTool(e, t, o, m)) return } } if (t.source && t.source instanceof D.PriceDataSource && t.source .isDraggable() && this._paneWidgetsSharedState.trySetDraggingSource(t .source, this)) return } var b; t && t.hittest && t.hittest.result() === u.HitTestResult.REGULAR || (this ._processing = !0) } } _mouseUpOrTouchEndEvent(e) { var t, i; if (!this.hasState()) return; const s = e.isTouch && null !== this._startTrackPoint, n = e.isTouch && this._wasPinched; e.isTouch && (this._wasPinched = !1, this._longTap = !1), this ._startMoveSourceParams = null, this._startChangeLineToolParams = null, this ._currentChangingLineToolHitTest = null; const o = this._chartUndoModel(), c = o.model().customSourceMovingHitTestData(); null !== c || o.customMoveBeingProcessed() || this._processMouseUpOrTouchEndHandler( e), this._isSelecting = !1; const h = o.model(), d = h.crossHairSource(), _ = this._dataSourceAtPoint(e.localX, e.localY), m = null == _ ? void 0 : _.hittest; if (d.selection() && null === this._firstZoomPoint) { const e = this.state().lineToolsForArea(d.selection()); o.selectionMacro(t => { let i = null; e.forEach(e => { null === i && (i = ne(_, e)), t.addSourceToSelection(e, i) }) }), d.clearSelection(), Object(W.trackEvent)("GUI", "Multiselect", "Area Select") } Object(l.emit)("mouse_up", { clientX: e.clientX, clientY: e.clientY, pageX: e.pageX, pageY: e.pageY, screenX: e.screenX, screenY: e.screenY }); const b = e.isTouch && this._touchMove; e.isTouch && (this._touchMove = !1); const v = new p.a(e), S = g.tool.value(); if (e.isTouch && !b && (Object(g.toolIsMeasure)(S) || null !== d.measurePane())) { if (null === d.measurePane() && d.pane !== this._state) return void this ._setCursorPosition(e.localX, e.localY); if (this._tryStartMeasure(e, d, v, d.price, d.index)) return; if (this._tryFinishMeasure(e, d)) return } if (e.isTouch && !b && !Object(B.isLineDrawnWithPressedButton)(S) && Object(f .isLineToolName)(S) && !o.lineBeingCreated()) { if (this._chart.justActivated()) return; if (d.pane !== this._state) return void this._setCursorPosition(e.localX, e .localY, v); const i = d.currentPoint(), s = this.state().defaultPriceScale(), n = Object(r.ensure)(null === (t = this.state().mainDataSource()) || void 0 === t ? void 0 : t.firstValue()), a = { index: Math.round(o.timeScale().coordinateToIndex(i.x)), price: s.coordinateToPrice(i.y, n) }, l = Object(r.ensureNotNull)(o.createLineTool(this.state(), a, S)); return o.selectionMacro(e => { e.addSourceToSelection(l) }), o.lineBeingCreated() || (this._finishTool(l, _), e.preventDefault()), void(this._startTouchPoint = null) } const y = o.lineBeingCreated(); if (y && !Object(B.isLineDrawnWithPressedButton)(y.toolname) && e.isTouch && this ._startTouchPoint) { if (this._startTouchPoint = null, !b) { const t = y.points()[y.points().length - 1], i = o.continueCreatingLine({ index: t.index, price: t.price }, new p.a(e)); this._initCrossHairPosition = null, i && (this._finishTool(y, _), e .preventDefault()) } return } if (null !== this._firstZoomPoint && this._firstZoomPoint.draggingMode) return void this._finishZoom(e); if (this._processing = !1, o.customMoveBeingProcessed() && o.endCustomMoving(), null !== c && (c.beingMoved && (Object(u.tryCallHandler)(e, c.mouseUpHandler, c .touchEndHandler), this.setCursorForTool()), h.setMovingCustomSource( null, null)), h.lineBeingEdited()) return o.endChangingLinetool(!1), void( this._preventCrossHairMove() && this._clearCursorPosition()); if (Object(B.isLineDrawnWithPressedButton)(S) && !this ._isSelectPointModeEnabled()) { const t = o.lineBeingCreated(); null !== t && (Object(V.c)(t), t.finish()); const s = this.state().defaultPriceScale(); if (s.isEmpty()) return; if (!t) return; const n = Object(r.ensure)(null === (i = t.ownerSource()) || void 0 === i ? void 0 : i.firstValue()), a = s.coordinateToPrice(e.localY, n), l = { index: Math.round(o.timeScale().coordinateToIndex(e.localX)), price: a }; return void o.continueCreatingLine(l) } if (h.sourcesBeingMoved().length) return o.endMovingSource(!1), h .sourcesBeingMoved().filter(f.isLineTool).forEach(e => { this.setCursorForTool(e) }), void h.invalidate(q.InvalidationMask.cursor()); if (!this._chart.readOnly()) { const t = e.localX >= 0 && e.localX < this._size.w; if ((!_ || _.source !== d) && t) { const t = o.timeScale().coordinateToIndex(e.localX); h.onSyncScrollNeeded(t) } } const w = this._isScrolling, P = this._endScroll(e), C = this._paneWidgetsSharedState.draggingSource(); if (null !== C) { const t = e.target, i = this._chart.paneByCanvas(t); i && i !== this && (P && o.undoHistory().undo(), o.mergeToPane(C, i.state())); if (this._chart.timeAxisByCanvas(t)) if (h.isUnmergeAvailableForSource(C)) P && o.undoHistory().undo(), o .unmergeToNewBottomPane(C); else { const e = h.panes(), t = Object(r.ensureNotNull)(h.paneForSource(C)), i = e.indexOf(t); i !== e.length - 1 && (P && o.undoHistory().undo(), t.isMaximized() && this._chart.toggleMaximizePane(), o.movePane(i, e.length - 1)) } this._paneWidgetsSharedState.clearDraggingSource(); const s = this._chart.getTimeScale(); s && s.restoreDefaultCursor(); const n = this._chart.paneWidgets(); for (let e = 0; e < n.length; e++) { const t = n[e]; t === this && _ && !_.isCustom ? t.setCursorForTool(_.source || void 0) : t .setCursorForTool(), t.leftPriceAxisesContainer() .restoreDefaultCursor(), t.rightPriceAxisesContainer() .restoreDefaultCursor() } } this._chart.readOnly() || s || v.control() || w || n || _ && _.source && (m && m .result() > u.HitTestResult.MOVEPOINT_BACKGROUND || Object(a .lastEventIsTouch)()) && o.selectionMacro(e => { e.clearSelection(); const t = Object(r.ensureNotNull)(_.source); e.addSourceToSelection(t, ne(_, t)) }), e.isTouch && (this._touchMove = !1) } _mouseOrTouchMoveEvent(e) { if (!this.hasState()) return; this._resetMeasureIfRequired(); const t = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)); this._processMouseEnterLeaveMoveHandlers(t, e); const i = this._chartUndoModel(); if (!i) return; const s = e.localX, o = e.localY; this._prevMoveEventPosition = new n.Point(s, o); const a = new p.a(e); if (null === this._firstZoomPoint) { if (this._updateHoveredSource(t, a, e), !e.isTouch && i.lineBeingCreated()) { const e = i.lineBeingCreated(), t = null === e ? null : i.model().paneForSource(e); if (null !== t && t !== this._state) return void this ._setCursorPositionOnExternalPane(t, s, o, a) } e.isTouch || this._setCursorPosition(s, o, a) } else this._processMouseMoveWhileZoom(e, a) } _pressedMouseOrTouchMoveEvent(e) { var t; if (!this.hasState() || this._pinching) return; this._resetMeasureIfRequired(), this._startChangeOrMoveLineToolIfNeeded(), e .isTouch && (this._touchMove = !0, this._preventSourceChange = !1); const i = new p.a(e), s = this._chartUndoModel(), o = s.crossHairSource(), a = e.localX, l = e.localY; if (this._prevMoveEventPosition = new n.Point(a, l), null !== this._firstZoomPoint) return this._processMouseMoveWhileZoom(e), void(this._firstZoomPoint .draggingMode = !0); const c = g.tool.value(); if (e.isTouch && this._startTouchPoint && Object(f.isLineToolName)(c) && !Object(B .isLineDrawnWithPressedButton)(c) && !s.lineBeingCreated() && !this ._isSelectPointModeEnabled()) return void this ._updateCrosshairPositionInToolCreationMode(e, this.state()); const h = o.measurePane(); if (e.isTouch && this._startTouchPoint && (Object(g.toolIsMeasure)(c) || null !== h)) return void this._updateCrosshairPositionInToolCreationMode(e, h || this .state()); const d = s.lineBeingCreated(); if (e.isTouch && d && !Object(B.isLineDrawnWithPressedButton)(d.toolname)) { if (this._startTouchPoint) { const t = Object(r.ensureNotNull)(s.lineBeingCreated()), i = Object(r.ensureNotNull)(s.model().paneForSource(t)); this._updateCrosshairPositionInToolCreationMode(e, i) } return } if (e.isTouch && null !== this._startTrackPoint) { this._exitTrackingModeOnNextTry = !1; const e = Object(r.ensureNotNull)(this._initCrossHairPosition), t = new n.Point(a, l).subtract(this._startTrackPoint), s = e.add(t); this._setCursorPosition(s.x, s.y, i) } else e.isTouch && this._preventCrossHairMove() || this._setCursorPosition(a, l, i); const _ = this._isSelectPointModeEnabled(); if (Object(f.isLineToolName)(c) && !Object(B.isLineDrawnWithPressedButton)(c) && ! _ && !i.control()) return; if (Object(B.isLineDrawnWithPressedButton)(c) && !_) { const i = this.state().defaultPriceScale(); if (i.isEmpty()) return; const o = s.lineBeingCreated(); if (!o) return; const a = new n.Point(e.localX, e.localY), l = Object(r.ensure)(null === (t = o.ownerSource()) || void 0 === t ? void 0 : t.firstValue()); return a.price = i.coordinateToPrice(e.localY, l), a.index = Math.round(s .timeScale().coordinateToIndex(e.localX)), void s.continueCreatingLine( a) } if (null !== this._paneWidgetsSharedState.draggingSource()) { const t = e.target, i = this._chart.paneByCanvas(t); i && (i !== this ? i.setDragToAnotherPaneCursor() : i.setCursorForTool()); const s = this._chart.timeAxisByCanvas(t); s && s.setCursor("grabbing") } if (s.timeScale().isEmpty()) return; const m = this._options.handleScroll; if ((!m.pressedMouseMove || e.isTouch) && (!m.horzTouchDrag && !m.vertTouchDrag || ! e.isTouch)) return; if (s.customMoveBeingProcessed()) return void s.processCustomMove(e); const b = s.model().customSourceMovingHitTestData(); if (null !== b && (this._updateCommonTooltip(null, !0), s.model() .processingCustomSourceMove(), Object(u.tryCallHandler)(e, b .pressedMouseMoveHandler, b.touchMoveHandler), !Object(u .shouldDefaultActionBeExecuted)(e, b, "pressedMouseMoveHandler", "touchMoveHandler"))) return; if (s.model().lineBeingEdited()) return void this._setCursorPosition(a, l, i); if (s.model().sourcesBeingMoved().length) return void this ._alignSourcesThatBeingMoved(s.model().sourcesBeingMoved(), e.localX, e .localY, i); const v = this._dataSourceAtPoint(e.localX, e.localY); if (this._tryFinishClonning(e, new p.a(e), v)) return; const S = Object(g.toolIsMeasure)(c) || o.startMeasurePoint() && o .endMeasurePoint(); this._chart.readOnly() || !i.control() || Object(f.isLineToolName)(c) || S ? (this ._processScroll(e), this._preventScroll() && !this ._preventCrossHairMove() && null === this._startTrackPoint && this ._setCursorPosition(e.localX, e.localY, new p.a(e))) : this._isSelecting || (o.startSelection(this.state()), this._isSelecting = !0) } _mouseOrTouchLeaveEvent(e) { var t, i; if (!this.hasState()) return; const s = this._chartUndoModel(); if (!s) return; const r = s.crossHairSource(); e.isTouch || null !== r.measurePane() && null === r.endMeasurePoint() || this ._clearCursorPosition(), s.model().setHoveredSource(null, null), null !== this ._prevHoveredHittest && (Object(u.tryCallHandler)(e, null === (i = null === (t = this._prevHoveredHittest.hittest) || void 0 === t ? void 0 : t .data()) || void 0 === i ? void 0 : i.mouseLeaveHandler), this ._prevHoveredHittest = null), this._updateCommonTooltip(null), this._chart .unsetActivePaneWidget() } _mouseDoubleClickOrDoubleTapEvent(e) { var t; if (!this.hasState()) return; const i = !this._chart.readOnly() && !Object(f.isLineToolName)(g.tool.value()) && Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)) || null; if (null === i) return; if (i.isCustom) return void(null === (t = i.hittest) || void 0 === t || t .tryCallDblClickOrDblTapHandler(e)); let s = i.hittest && i.source || null; s && i.hittest && i.hittest.result() <= u.HitTestResult.MOVEPOINT_BACKGROUND && !e .isTouch && (s = null), s && !s.isSelectionEnabled() && (s = null), s ? this .processDoubleClickOnSource(s, i.hittest ? i.hittest : void 0) : this._chart .readOnly() || Object(f.isLineToolName)(g.tool.value()) || this ._chartUndoModel().lineBeingCreated() || !this._chartUndoModel().selection() .isEmpty() || this._chart.toggleMaximizePane(this) } _contextMenuEvent(e) { var t; const i = this._chartUndoModel(); if (i.crossHairSource().startMeasurePoint() && !this ._trackCrosshairOnlyAfterLongTap) return i.crossHairSource().clearMeasure(), void Object(g.resetToCursor)(!0); if (this._pinching) return; if (null === this._firstZoomPoint || this._trackCrosshairOnlyAfterLongTap || this .cancelZoom(), this.hideInplaceEditor()) return; if (!Object(g.toolIsCursor)(g.tool.value()) || this._isSelectPointModeEnabled()) { if (e.isTouch) return; return Object(g.resetToCursor)(!0), this.setCursorForTool(), void(i .lineBeingCreated() && i.cancelCreatingLine()) } if (!this._options.contextMenuEnabled) return; const s = this._dataSourceAtPoint(e.localX, e.localY), r = s ? s.source : null; if (e.isTouch && null !== this._startTrackPoint) { if (this._preventSourceChange) return; this._clearCursorPosition() } e.isTouch && (this._contextMenuOpenedOnLastTap = !0, this._startTrackPoint = null), this._contextMenuX = e.localX, this._contextMenuY = e.localY; const n = s && s.hittest ? s.hittest.result() : 0, o = n >= u.HitTestResult.REGULAR || n >= u.HitTestResult.MOVEPOINT_BACKGROUND && e.isTouch; this._chart.updateActions(), i.selectionMacro(t => { null !== r && o ? t.selection().isSelected(r) || (t.clearSelection(), t .addSourceToSelection(r, ne(s, r))) : (this._options.contextMenu .general && this._contextMenu(e).then(t => { null !== t && t.show(e) }), t.clearSelection()) }), s && o && null !== r && (Object(m.a)(r) && r.hasContextMenu() ? r .isSelectionEnabled() ? this.showContextMenuForSelection(e) : this .showContextMenuForSources([r], e) : null === (t = s.hittest) || void 0 === t || t.tryCallContextMenuHandler(e)) } _onMouseEvent() { this._preventSourceChange = !1, this._startTrackPoint = null, this ._trackCrosshairOnlyAfterLongTap = !1 } _onTouchEvent() { this._trackCrosshairOnlyAfterLongTap = !0 } _switchTrackingModeFromAnotherPaneIfNeeded(e) { const t = this._chart.trackingModePaneWidget(); if (null !== t && t !== this) { const i = this._chartModel().crossHairSource().currentPoint(); t._exitTrackingModeOnNextTry = !0, t._tryExitTrackingMode(!0), this .startTrackingMode(new n.Point(e.localX, e.localY), new n.Point(i.x, e .localY), new p.a(e)) } } _contextMenu(e) { const t = e => e instanceof H.Separator, i = this._customActions(); if (N.enabled("disable_no_source_context_menu")) return Promise.resolve(null); const s = this._initActions(e).filter(e => null !== e); i.remove.forEach(e => { for (let t = 0; t < s.length; t++) { const i = s[t]; if (i instanceof H.Action && i.getLabel() === e) { s.splice(t, 1); break } } }); const r = i.top.concat(s).concat(i.bottom); for (let e = r.length - 1; e > 0; e--) t(r[e]) && t(r[e - 1]) && r.splice(e, 1); return r.length && t(r[0]) && r.splice(0, 1), r.length && t(r[r.length - 1]) && r .splice(r.length - 1, 1), k.ContextMenuManager.createMenu(r, { statName: "ChartContextMenu" }) } _initActions(e) { var t; const i = this._chart.actions(), r = []; r.push(i.chartReset), r.push(new H.Separator), N.enabled("datasource_copypaste") && !this.state().isEmpty() && (r.push(new H.Action({ label: Object(s.t)("Paste %s").replace("%s", "").trim(), shortcutHint: Object(G.humanReadableHash)(G.Modifiers.Mod + 86), statName: "Paste", onExecute: () => this._chart.chartWidgetCollection().clipboard .uiRequestPaste(this.state()) })), r.push(new H.Separator)), r[r.length - 1] instanceof H.Separator || r.push( new H.Separator); return window.widgetbar && (!window.widgetbar._customization || window.widgetbar ._customization.watchlist) && i.addToWatchlist && r.push(i.addToWatchlist), N.enabled("text_notes") && r.push(i.addToTextNotes), r[r.length - 1] instanceof H.Separator || r.push(new H.Separator), r.push(this ._createLockTimeAxisAction(e)), r.push(new H.Separator), r.push(Object(E .createLinesAction)(this._chart)), N.enabled("charting_library_base") || r .push(i.applyColorTheme), r[r.length - 1] instanceof H.Separator || r.push(new H .Separator), this._chart.applyIndicatorsToAllChartsAvailable() && (r.push(i .applyStudiesToAllCharts), r.push(new H.Separator)), r.push(i .paneRemoveAllDrawingTools), r.push(i.paneRemoveAllStudies), r.push(new H .Separator), (null === (t = window.pro) || void 0 === t ? void 0 : t .hasPackage("mtp-mtpredictor")) && this.state().containsMainSeries() && r .push(Object(E.createMTPredictorActions)(this._chart, this.state(), this ._contextMenuX, this._contextMenuY), new H.Separator), r.push(i .hideAllMarks), r.push(new H.Separator), N.enabled( "show_chart_property_page") && r.push(i.chartProperties), r[r.length - 1] instanceof H.Separator && r.pop(), r } _loadAndCreateLegendWidget() { Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui")]).then(i.bind( null, "sAH5")).then(e => { if (this._isDestroyed) return; const t = e.LegendWidget, i = Object(h.deepExtend)({}, this._options.legendWidget); i.canShowSourceCode = !this._chart.onWidget() && !o.CheckMobile.any(), i .readOnlyMode = i.readOnlyMode || this._chart.readOnly(), i .statusesWidgets = { sourceStatusesEnabled: this._options .sourceStatusesWidgetEnabled, sourceStatuses: this._options.sourceStatusesWidget || {}, marketStatusEnabled: this._options.marketStatusWidgetEnabled, marketStatus: this._options.marketStatusWidget || {}, dataUpdateModeEnabled: this._options.chartWarningWidgetEnabled, dataUpdateMode: this._options.chartWarningWidget || {}, dataProblemEnabled: this._options.dataProblemWidgetEnabled }; const s = new M.a(this._getHideNotMainSourcesValue()); this._hideNotMainSourcesInLegendSpawn = Object(O.a)(() => ({}), this ._chart.chartWidgetCollection().activeChartWidget, this._chart .chartWidgetCollection().lock.crosshair), this ._hideNotMainSourcesInLegendSpawn.subscribe(() => { s.setValue(this._getHideNotMainSourcesValue()) }), this._hideWholeLegend = new M.a(!1), g.tool.subscribe(this ._recalculateLegendVisibility), this._chartModel() .crossHairSource().measuringEnabled().subscribe(this, this ._recalculateLegendVisibility), this._legendWidget = new t(this ._chartUndoModel(), this, this._chart.backgroundTopTheme(), s, this._hideWholeLegend, i, { showContextMenuForSelection: this .showContextMenuForSelection.bind(this), showContextMenuForSources: this.showContextMenuForSources .bind(this), updateActions: this._chart.updateActions.bind(this._chart), showChartPropertiesForSource: this._chart .showChartPropertiesForSource.bind(this._chart), showGeneralChartProperties: this._chart .showGeneralChartProperties.bind(this._chart), showObjectsTreeDialog: this._chart.showObjectsTreeDialog .bind(this._chart) }), this._div.appendChild(this._legendWidget.getElement()), this ._legendWidget.updateLayout(), this._legendWidget .updateWidgetModeBySize(this._size), this._legendWidget .updateThemedColors(this._themedTopColor); for (const e of Array.from(this._customLegendWidgetsFactoryMap.keys())) this._legendWidget.addCustomWidgetToLegend(e, Object(r .ensureDefined)(this._customLegendWidgetsFactoryMap.get(e))) }) } _loadAndCreatePaneControlsWidget() { Promise.all([Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui")]) .then(i.bind(null, "lvAK")), Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui") ]).then(i.bind(null, "MjAr")) ]).then(([e, t]) => { if (this._isDestroyed) return; const i = e.PaneControlsWidget; this._paneControls = new i(this._chartUndoModel(), this, { backgroundThemeName: this._chart.backgroundTopTheme() }, { toggleMaximizePane: this._chart.toggleMaximizePane.bind(this ._chart) }, this._div), this._paneControls.updateWidgetModeByWidth(this._size .w), this._paneControls.updateThemedColors(this ._themedTopColor), this._paneControlsResizeObserver = new t .default( this._handleRestrictLegendWidth.bind(this)), this ._paneControlsResizeObserver.observe(this._paneControls .getElement()) }) } _handleRestrictLegendWidth(e) { if (null === this._legendWidget || null === this._paneControls) return; const t = e[e.length - 1].contentRect.width, i = 0 === t ? 0 : t + J + Z; this._legendWidget.addMargin(i) } _onMagnetStateChanged() { this._chart.isActive() && this._isToolActionActiveOnPane(!0) && this._chartModel() .crossHairSource().visible && this._updateLineToolUsingMagnetOrShift() } _onShiftKeyStateChanged() { this._chart.isActive() && this._isToolActionActiveOnPane(!1) && this._chartModel() .crossHairSource().visible && this._updateLineToolUsingMagnetOrShift(p.a.create( Object(Y.d)().value())) } _isToolActionActiveOnPane(e) { const t = this._chartModel(), i = t.lineBeingCreated() || t.lineBeingEdited() || t.sourcesBeingMoved() .length > 0 && t.sourcesBeingMoved()[0]; return i ? t.paneForSource(i) === this._state : e && Object(f.isLineToolName)(g.tool .value()) && t.crossHairSource().pane === this._state } _updateLineToolUsingMagnetOrShift(e) { if (null === this._prevMoveEventPosition) return; const { x: t, y: i } = this._prevMoveEventPosition, s = this._chartModel().sourcesBeingMoved(); s.length > 0 ? this._alignSourcesThatBeingMoved(s, t, i, e) : this ._setCursorPosition(t, i, e) } _showEditDialogForSource(e, t) { if (this._options.propertyPagesEnabled && e.userEditEnabled()) if (e === this._chartUndoModel().mainSeries()) this._chart .showGeneralChartProperties(R.TabNames.symbol); else if (Object(f.isLineTool)(e) || Object(_.isStudy)(e)) { let i; const s = null == t ? void 0 : t.data(); if (null != s) { const e = s.areaName; void 0 !== e && (i = ae.get(e)) } this._chart.showChartPropertiesForSource(e, i).then(e => { this._editDialog = e }) } } _initToolCreationModeParams(e) { this._startTouchPoint = new n.Point(e.pageX, e.pageY), this._initCrossHairPosition = this._chartModel().crossHairSource().currentPoint() } _updateCrosshairPositionInToolCreationMode(e, t) { if (t !== this._state) { const i = this._chart.paneByState(t); return i._startTouchPoint = this._startTouchPoint, i._initCrossHairPosition = this._initCrossHairPosition, void i ._updateCrosshairPositionInToolCreationMode(e, t) } const i = this._chartModel().crossHairSource(); this._chart.justActivated() && (this._initCrossHairPosition = i.currentPoint()); const s = e.pageX, o = e.pageY, a = Object(r.ensureNotNull)(this._initCrossHairPosition), l = new n.Point(s, o).subtract(Object(r.ensureNotNull)(this._startTouchPoint)), c = a.add(l); this._setCursorPosition(c.x, c.y, new p.a(e)) } _priceAxisesContainer(e) { return "left" === e ? this._lhsPriceAxisesContainer : this._rhsPriceAxisesContainer } _recalculatePriceScales() { const e = this.state(); for (const t of e.leftPriceScales()) e.recalculatePriceScale(t); for (const t of e.rightPriceScales()) e.recalculatePriceScale(t); for (const t of e.sourcesByGroup().overlayPriceScaleSources()) Object(f.isLineTool)( t) || e.recalculatePriceScale(t.priceScale()) } _createLockTimeAxisAction(e) { const t = Object(g.lockTimeAxis)().value(); return new H.Action({ label: Object(s.t)("Lock Vertical Line On Time Axis"), statName: "LockCursorInTime", checkable: !0, checked: t, onExecute: () => this._toggleLockTimeAxis(e.localX, !t) }) } _toggleLockTimeAxis(e, t) { if (t) { const t = this._chartUndoModel().timeScale(), i = t.coordinateToIndex(e), s = t.points().roughTime(i); null !== s && g.lockTimeAxisTime.setValue(s) } Object(g.lockTimeAxis)().setValue(t) } _preventTouchEventsExceptPinch() { return this._paneWidgetsSharedState.hasTouchesOnOtherPanes(this) || null !== this ._paneWidgetsSharedState.pinchingPane() } _updateHoveredSource(e, t, i) { var s, r, n; const o = this._chartUndoModel(), a = o.model(); let l = !1; const c = e && e.source, h = this._chart.readOnly(); if (h && !Object(f.isLineTool)(e.source) || this._editDialog && this._editDialog .visible().value()) h && (a.setHoveredSource(null, null), this .setCursorForTool()); else { const d = g.tool.value(); let p = null; if (!this._processing && (Object(g.toolIsCursor)(d) || "eraser" === d && !h || t .control() || !o.lineBeingCreated())) { const { hittest: t } = e; l = Boolean(null === (s = null == t ? void 0 : t.data()) || void 0 === s ? void 0 : s.hideCrosshairLinesOnHover) || !!c && Object(f.isLineTool) (c) && -1 !== X.indexOf(c.toolname), t && t.result() > u.HitTestResult .MOVEPOINT_BACKGROUND ? (p = c, !(null == c ? void 0 : c .isHoveredEnabled()) || "eraser" === d && c === o.mainSeries() ? a.setHoveredSource(null, null) : a.setHoveredSource(c, null == t ? void 0 : t.data())) : a.setHoveredSource(null, null) } h ? this.setCursorForTool(p, t, j.PaneCursorType.Default) : this._options .sourceSelectionEnabled && (this._isSelectPointModeEnabled() ? this ._setCursorClassName("pointer") : this.setCursorForTool(p, t, null === ( n = null === (r = null == e ? void 0 : e.hittest) || void 0 === r ? void 0 : r.data()) || void 0 === n ? void 0 : n.cursorType)); const _ = o.model().customSourceBeingMoved(), m = null !== _ ? [_] : o.model().sourcesBeingMoved(), b = e.source; if ((!m.length || null !== b && -1 === m.indexOf(b)) && this ._updateCommonTooltip(e), !h && null !== e.hittest && i && e.hittest .hasPressedMoveHandler(i)) { switch ((e.hittest.data() || {}).cursorType) { case j.PaneCursorType.VerticalResize: this._setCursorClassName("ns-resize"); break; case j.PaneCursorType.HorizontalResize: this._setCursorClassName("we-resize"); break; case j.PaneCursorType.DiagonalNeSwResize: this._setCursorClassName("nesw-resize"); break; case j.PaneCursorType.DiagonalNwSeResize: this._setCursorClassName("nwse-resize") } } } this._preventCrossHairMove() && this._clearCursorPosition(), this._chartModel() .crossHairSource().setLinesShouldBeHidden(l) } } }, UHyS: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StandardPivotPointsPriceAxisView", (function() { return n })); var s = i("KcY8"); const r = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5"]; class n extends s.a { constructor(e, t) { super(), this._source = e, this._data = t; const i = t.name; this._completeName = "P" === i.toUpperCase() ? "P" : `S${i[1]}/R${i[1]}` } _updateRendererData(e, t, i) { e.visible = !1, t.visible = !1; const s = this._source.properties(); if (!s.visible.value()) return; const n = this._completeName, o = s.levelsStyle.visibility; if (!o[n] || !o[n].value()) return; const a = this._source.model().timeScale(), l = this._source.priceScale(); if (a.isEmpty() || null === a.visibleBarsStrictRange() || null !== l && l .isEmpty()) return; const c = this._source.customData(); if (!c || !c.pivots) return; const h = this._source.pricesView().prices()[r.indexOf(this._data.name .toUpperCase())]; if (!h) return; i.background = h.color, i.textColor = this.generateTextColor(h.color), i .coordinate = h.coordinate, i.floatCoordinate = h.floatCoordinate; const u = this._source.model().properties().scalesProperties; u.showStudyLastValue.value() && (e.text = h.formatted, e.visible = !0), u .showStudyPlotLabels.value() && (t.text = this._source.priceLabelText(this ._data.name), t.visible = !0) } } }, USzt: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return c })); var s = i("Eyy1"), r = i("cBZt"), n = i("MSvv"), o = i("jenN"), a = i("wYrq"); const l = Object(r.studyIdString)("VbPFixed", "tv-volumebyprice"); class c extends n.StudyLineDataSource { constructor(e, t, i, s) { const r = i || e.studyMetaInfoRepository().findByIdSync({ type: "java", studyId: l }), n = t || c._createPropertiesFromStudyMetaInfo(r, e.studyVersioning()); super(e, r, "vbpfixed_", n), Object(o.createGraphicsPaneViews)(this, e).then( t => { if (s = e.mainSeries(), r.plots.length > 0) { const i = new a.a(this, s, e, r.plots[0].id); t.push(i) } if (r.plots.length > 1) { const i = new a.a(this, s, e, r.plots[1].id); t.push(i) } if (r.plots.length > 2) { const i = new a.a(this, s, e, r.plots[2].id); t.push(i) } this._setPaneViews(t) }), this.clearData() } pointsCount() { return 2 } boundToSymbol() { return !1 } offset(e) { return 0 } getMinFirstBarIndexForPlot() { return -1 / 0 } calcIsActualSymbol() { this._isActualSymbol = !0, this._isActualCurrency = !0, this._isActualUnit = !0, this.calcIsActualInterval() } cloneable() { return !1 } isSynchronizable() { return !1 } static createProperties(e) { const t = super._createPropertiesFromStudyIdAndState(l, e); return c._configureProperties(t), t } static studyId() { return l } _studyInputs(e) { Object(s.assert)(2 === e.length, "all the line tool points should be defined"); const [t, i] = e, r = Math.max(t.index, i.index), n = this._model.mainSeries() .bars().lastIndex(), o = this._getPointTime(t.index <= i.index ? t : i, !0), a = this._getPointTime(i.index >= t.index ? i : t, !0); return null === o || null === a ? (this ._subscribeApplyInputsOnSeriesCompleted(), null) : { rowsLayout: this.properties().inputs.rowsLayout.value(), rows: this.properties().inputs.rows.value(), volume: this.properties().inputs.volume.value(), vaVolume: this.properties().inputs.vaVolume.value(), first_bar_time: 1e3 * o, last_bar_time: 1e3 * a, subscribeRealtime: n === r } } _isReady() { return !Object(o.isStudyGraphicsEmpty)(this.graphics()) } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(61), i.e(62), i.e( "study-property-pages-with-definitions")]).then(i.bind(null, "cKLu")) .then(e => e.StudyLineDataSourceDefinitionsViewModel) } _updateAnchorsPrice() { let e = null, t = null; this.graphics().hhists().forEach(i => { i.forEach(i => { const s = i.priceLow, r = i.priceHigh; (!e || s < e) && (e = s), (!t || r > t) && (t = r) }) }), null !== e && null !== t && (this._timePoint.length && (this._timePoint[ 0].price = t, this._timePoint[1].price = e), this._points.length && (this._points[0].price = t, this._points[1].price = e)) } } }, UlDV: function(e, t, i) { "use strict"; i.r(t), i.d(t, "RestrictedToolsetBootloader", (function() { return r })); var s = i("cZRT"); class r extends s.a { _startLoading() { return Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e( 13), i.e(14), i.e(22), i.e(24), i.e(28), i.e(29), i.e(41), i.e( 51), i.e(52), i.e(64), i.e(66), i.e(69), i.e(70), i.e(71), i.e( 0), i.e(5), i.e(7), i.e(10), i.e(38), i.e(57), i.e( "restricted-toolset")]).then(i.bind(null, "miV2")).then(e => e .getRestrictedToolSet()) } } }, Ulff: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); const s = { common: i("HGP3").colorsPalette["color-tv-blue-500"], active: "#143EB3" } }, UqOQ: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return l })); var s = i("aIyQ"), r = i.n(s), n = i("e3/o"); function o(e) { return e.properties().visible.value() } function a(e) { return !o(e) } class l { constructor(e, t, i) { this._onChanged = new r.a, this._lineToolsSet = new Set, this._lineTools = [...e], this._lineToolsSet = new Set(this._lineTools), this._name = t, this.id = i || Object(n.randomHashN)(6), this.instanceId = Object(n.randomHashN)(6) } lineTools() { return this._lineTools } name() { return this._name } setName(e) { this._doAndFireOnChange(() => { this._name = e }) } isActualSymbol() { return this._lineTools.length > 0 && this._lineTools[0].isActualSymbol() && this ._lineTools[0].isActualCurrency() && this._lineTools[0].isActualUnit() } symbol() { return this._lineTools[0].symbol() } currencyId() { var e; return null !== (e = this._lineTools[0].properties().childs().currencyId.value()) && void 0 !== e ? e : null } unitId() { var e; return null !== (e = this._lineTools[0].properties().childs().unitId.value()) && void 0 !== e ? e : null } containsLineTool(e) { return this._lineToolsSet.has(e) } addLineTools(e) { this._doAndFireOnChange(t => { e.forEach(i => { this._lineToolsSet.add(i), t.push(...e.map(e => e.id())) }), this._lineTools.push(...e) }) } excludeLineTool(e) { this._doAndFireOnChange(t => { this._lineToolsSet.delete(e); const i = this._lineTools.indexOf(e); this._lineTools.splice(i, 1), t.push(e.id()) }) } excludeLineTools(e) { this._doAndFireOnChange(t => { const i = new Set(e); e.forEach(e => this._lineToolsSet.delete(e)), this._lineTools = this ._lineTools.filter(e => !i.has(e)), t.push(...e.map(e => e.id())) }) } state() { return { id: this.id, name: this._name, tools: this._lineTools.map(e => e.id()) } } visibility() { const e = this._lineTools.some(o), t = this._lineTools.some(a); return e && !t ? "Visible" : t && !e ? "Invisible" : "Partial" } locked() { const e = this._lineTools.some(e => e.properties().frozen.value()), t = this._lineTools.some(e => !e.properties().frozen.value()); return e && !t ? "Locked" : t && !e ? "Unlocked" : "Partial" } isActualInterval() { const e = this._lineTools.some(e => e.isActualInterval()), t = this._lineTools.some(e => !e.isActualInterval()); return e && !t ? "IsActualInterval" : t && !e ? "IsNotActualInterval" : "Partial" } onChanged() { return this._onChanged } static fromState(e, t) { const i = []; for (const s of t.tools) { const t = e.dataSourceForId(s); null !== t && i.push(t) } return i.length > 0 ? new l(i, t.name, t.id) : null } _doAndFireOnChange(e) { const t = [], i = this.visibility(), s = this.locked(), r = this.name(), n = this.isActualInterval(); e(t); const o = { affectedLineTools: t, visibilityChanged: this.visibility() !== i, lockedChanged: s !== this.locked(), titleChanged: r !== this.name(), isActualIntervalChanged: n !== this.isActualInterval() }; this._onChanged.fire(o) } } }, V086: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("GEp6").distanceToLine, n = i("Ss5c").LineDataSource, o = i("Ocx9").DefaultProperty, a = i("j3hX").LineToolColorsProperty; class l extends n { constructor(e, t) { super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views") .then(i.t.bind(null, "obU/", 7)).then(({ EllipsePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } startChanging(e, t) { if (super.startChanging(e, t), 0 === e || 1 === e) { var i = this.pointToScreenPoint(this._points[0])[0], s = this.pointToScreenPoint(this._points[1])[0], n = this.pointToScreenPoint(this._points[2])[0]; this._dist = r(i, s, n).distance || 0 } } _preparePoint(e, t) { var i = this._preparePointInternal(e, t, !1); return t && t.shift() && this._points[0].index === this._points[1].index && this ._fixVerticalDiameterPoints(this._points[1], this._points[0], i), i } _preparePointInternal(e, t, i) { var r = Object.assign({}, e); if (t && t.shift()) { var n = this.points().length; if (!this._fakePointAdded && 3 === n && !i) return r; if (this._fakePointAdded || 2 === n || i) { this._snapPoint45Degree(e, this._points[0]), this._fakePointAdded ? this ._points[1] = e : i || (this._fakePointAdded = !0, super ._addPointIntenal(e)); var o = this.pointToScreenPoint(this._points[0])[0], a = this.pointToScreenPoint(this._points[1])[0], l = a.x - o.x, c = a.y - o.y, h = Math.sqrt(l * l + c * c) / 2, u = a.subtract(o), d = o.add(a).scaled(.5), p = new s(-u.y, u.x); p = p.normalized(); var _ = d.add(p.scaled(h)); r = this.screenPointToPoint(_), (TradingView.isNaN(r.price) || TradingView .isNaN(r.index)) && (r = this.screenPointToPoint(d)) } } else this._fakePointAdded && (this._points.splice(1, 1), this._fakePointAdded = ! 1); return r } _fixVerticalDiameterPoints(e, t, i) { var s = this.pointToScreenPoint(e)[0], r = this.pointToScreenPoint(t)[0], n = this._model.timeScale(), o = n.indexToCoordinate(e.index), a = n.indexToCoordinate(i.index), l = 2 * Math.abs(o - a); l *= t.price > e.price ? 1 : -1, e.price = this.screenPointToPoint({ x: s.x, y: r.y + l }).price } addPoint(e, t, i) { var s = n.prototype.addPoint.call(this, e, t, i); return s && (this._fakePointAdded = !1), s } setPoint(e, t, i) { var n = Object.assign({}, t), o = this.pointToScreenPoint(this._points[0])[0], a = this.pointToScreenPoint(this._points[1])[0], l = this.pointToScreenPoint(this._points[2])[0]; switch (e) { case 0: if (i && i.shift()) { this._snapPoint45Degree(n, this._points[1]), this._points[0] = n, this ._points[2] = this._preparePointInternal(this._points[2], i, !0), this._points[0].index === this._points[1].index && this ._fixVerticalDiameterPoints(this._points[0], this._points[1], this ._points[2]); break } o = this.pointToScreenPoint(n)[0]; var c = a.subtract(o), h = o.add(a).scaled(.5); d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(this._dist)), l = this.screenPointToPoint(l), this._points[0] = n, this._points[2] = l; break; case 1: if (i && i.shift()) { this._snapPoint45Degree(n, this._points[0]), this._points[1] = n, this ._points[2] = this._preparePointInternal(this._points[2], i, !0), this._points[0].index === this._points[1].index && this ._fixVerticalDiameterPoints(this._points[1], this._points[0], this ._points[2]); break } c = (a = this.pointToScreenPoint(n)[0]).subtract(o), h = o.add(a).scaled( .5); d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(this._dist)), l = this.screenPointToPoint(l), this._points[1] = n, this._points[2] = l; break; case 2: n = this.pointToScreenPoint(n)[0]; var u = r(o, a, n).distance; c = a.subtract(o), h = o.add(a).scaled(.5); d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(u)), l = this .screenPointToPoint(l), this._points[2] = l; break; case 3: n = this.pointToScreenPoint(n)[0]; var d; u = r(o, a, n).distance, c = a.subtract(o), h = o.add(a).scaled(.5); d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(u)), l = this .screenPointToPoint(l), this._points[2] = l } this.normalizePoints() } pointsCount() { return 3 } name() { return "Ellipse" } hasEditableCoordinates() { return !1 } migrateVersion(e, t, i) { if (1 === e && 2 === this._points.length) { var s = this._points[0].price, r = .5 * (this._points[0].price + this._points[1].price); this._points[0] = { price: r, index: this._points[0].index }, this._points[1] = { price: r, index: this._points[1].index }, this._points.push({ price: s, index: this._points[0].index }) } if (1 === e && 2 === this._timePoint.length) { s = this._timePoint[0].price, r = .5 * (this._timePoint[0].price + this ._timePoint[1].price); this._timePoint[0].price = r, this._timePoint[1].price = r; var n = { price: s, offset: this._timePoint[0].offset, time_t: this._timePoint[0].time_t }; this._timePoint.push(n) } } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D"))) .GeneralFiguresDefinitionsViewModel } static createProperties(e) { var t = new o("linetoolellipse", e); return l._configureProperties(t), t } static _configureProperties(e) { n._configureProperties(e), e.addChild("linesColors", new a([e.childs().color])) } } l.version = 2, t.LineToolEllipse = l }, V3Oj: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolText", (function() { return h })), i.d(t, "LineToolTextAbsolute", (function() { return u })); var s = i("Eyy1"), r = i("aO4+"), n = i("Ss5c"), o = i("tc+8"), a = i.n(o), l = i("Ocx9"), c = i("j3hX"); class h extends n.LineDataSource { constructor(e, t) { const s = t || h.createProperties(); super(e, s), this._barSpacing = e.timeScale().barSpacing(), this ._recalculatePointsOnCenter = !1, i.e("lt-pane-views").then(i.bind(null, "mr3a")).then(({ TextPaneView: t }) => { const i = this._recalculatePointsOnCenter ? (e, t) => { this._recalculatePointsOnCenter && this ._recalculateCenterPosition(e, t) } : void 0; this._setPaneViews([new t(this, e, void 0, void 0, void 0, void 0, void 0, i)]) }) } centerPosition() { this._recalculatePointsOnCenter = !0 } setPoint(e, t, i) { const s = this.properties().childs(); let r; if (0 === e && s.wordWrapWidth.value()) { const e = this.model().timeScale(); r = this.isFixed() ? this.fixedPoints()[0].x : e.indexToCoordinate(this .points()[0].index); const i = e.indexToCoordinate(t.index) - r - ~~(s.fontsize.value() / 6); if (!isFinite(i)) return; s.wordWrapWidth.setValue(Math.max(100, i)) } } pointsCount() { return 1 } name() { return "Text" } setPriceScale(e) { super.setPriceScale(e), e && e.priceRange() && (this._priceDencity = e .height() / Object(s.ensureNotNull)(e.priceRange()).length(), this ._isPriceDencityLog = e.isLog()) } restoreSize() { const e = Object(s.ensureNotNull)(this.priceScale()); this._barSpacing = this.model().timeScale().barSpacing(), this._priceDencity = e.height() / Object(s.ensureNotNull)(e.priceRange()) .length(), this.redraw() } redraw() { this.updateAllViews(), this._model.updateSource(this) } properties() { return super.properties() } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e } state(e) { const t = super.state(e); return e && (t.state.fixedSize = !1), t } barSpacing() { return this._barSpacing } priceDencity() { return this._priceDencity } isPriceDencityLog() { return this._isPriceDencityLog } hasEditableCoordinates() { return !1 } static createProperties(e) { const t = new l.DefaultProperty("linetooltext", e); return h._configureProperties(t), t } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "QWxu")).then( e => e.TextDefinitionsViewModel) } static _configureProperties(e) { n.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new a.a(window.t("Text"))), e.addExclusion("text"), e.addChild( "linesColors", new c.LineToolColorsProperty([e.childs().borderColor])), e.addChild("textsColors", new c.LineToolColorsProperty([e.childs().color])), e.addExclusion("linesColors"), e.addExclusion("textsColors") } _recalculateCenterPosition(e, t) { const i = (this.isFixed() ? this.fixedPoints() : this.pointToScreenPoint(this ._points[0]))[0], s = new r.Point(i.x - e / 2, i.y - t / 2), n = this.screenPointToPoint(s); this.setPoints([n]), this.normalizePoints(), this.createServerPoints(), this .redraw() } } class u extends h { constructor(e, t) { super(e, t || u.createProperties()) } name() { return "Anchored Text" } hasEditableCoordinates() { return !1 } isFixed() { return !0 } static createProperties(e) { const t = new l.DefaultProperty("linetooltextabsolute", e); return u._configureProperties(t), t } static _configureProperties(e) { h._configureProperties(e) } } }, VNzU: function(e, t, i) { "use strict"; i.r(t); i("Dq3s"); i.d(t, "layouts", (function() { return r })), i.d(t, "isSingleLayout", (function() { return n })), i.d(t, "isMultipleLayout", (function() { return o })); let s; s = {}; const r = { ...{ s: { title: "1 chart", count: 1, sizer: (e, t) => { if (0 !== t) throw new RangeError("invalid index"); return e } } }, ...s }; function n(e) { return "s" === e } function o(e) { return !n(e) } }, VVxS: function(e, t, i) { "use strict"; const { getLogger: s } = i("txPx"), r = s("TVLocalStorage"); var n = 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) {} }; n.prototype._report = function() { if (this.isAvailable) { const e = 10, t = []; for (let e = 0; e < this.localStorage.length; e++) { const i = this.key(e); t.push({ key: i, length: String(this.getItem(i)).length }) } t.sort((e, t) => t.length - e.length); const i = t.slice(0, e); t.sort((e, t) => t.key.length - e.key.length); const s = 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(i)}`), r.logNormal(`Top ${e} longest key names: ${JSON.stringify(s)}`); try { navigator.storage.estimate().then(e => { r.logNormal("Storage estimate: " + JSON.stringify(e)) }) } catch (e) {} } }, n.prototype.length = 0, n.prototype.isAvailable = !1, n.prototype.localStorage = { "tvlocalstorage.available": "false" }, n.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 } }, n.prototype.key = function(e) { return this.isAvailable ? this.localStorage.key(e) : Object.keys(this.localStorage)[e] }, n.prototype.getItem = function(e) { return this.isAvailable ? this.localStorage.getItem(e) : void 0 === this.localStorage[ e] ? null : this.localStorage[e] }, n.prototype.setItem = function(e, t) { this.isAvailable ? this.localStorage.setItem(e, t) : this.localStorage[e] = t, this ._updateLength() }, n.prototype.removeItem = function(e) { this.isAvailable ? this.localStorage.removeItem(e) : delete this.localStorage[e], this ._updateLength() }, n.prototype.clear = function() { this.isAvailable ? this.localStorage.clear() : this.localStorage = {}, this ._updateLength() }; var o = function(e) { this.storage = e }; o.prototype.getItem = function(e) { return Promise.resolve(this.storage.getItem(e)) }, o.prototype.setItem = function(e, t) { return Promise.resolve(this.storage.setItem(e, t)) }, window.TVLocalStorage = new n, window.TVLocalStorageAsync = new o(window.TVLocalStorage), e.exports = { TVLocalStorage: window.TVLocalStorage, TVLocalStorageAsync: window.TVLocalStorageAsync } }, VaSN: function(e, t, i) { "use strict"; i.r(t), i.d(t, "lastEventIsTouch", (function() { return n })), i.d(t, "lastEventIsMouse", (function() { return o })), i.d(t, "setLastEventIsTouch", (function() { return a })); var s = i("qFKp"); let r = Object(s.supportTouch)(); function n() { return r } function o() { return r } function a(e) { r = e } }, VdBB: function(e, t, i) { "use strict"; function s(e, t, i) { if (e.isTouch) { if (void 0 !== i) return !0 } else if (void 0 !== t) return !0; return !1 } function r(e, t, i) { if (e.isTouch) { if (void 0 !== i) return i(e), !0 } else if (void 0 !== t) return t(e), !0; return !1 } function n(e, t, i, s) { return void 0 !== t.executeDefaultAction && (e.isTouch ? Boolean(t.executeDefaultAction[ s]) : Boolean(t.executeDefaultAction[i])) } var o; i.r(t), i.d(t, "hasMouseOrTouchHandler", (function() { return s })), i.d(t, "tryCallHandler", (function() { return r })), i.d(t, "shouldDefaultActionBeExecuted", (function() { return n })), i.d(t, "AreaName", (function() { return o })), i.d(t, "HitTestResult", (function() { return a })), function(e) { e.Style = "Style", e.Text = "Text", e.SourceItemMove = "SourceItemMove" }(o || (o = {})); class a { constructor(e, t, i) { this._result = e, this._data = t || null, this._eraseMarker = i } result() { return this._result } data() { return this._data } hasPressedMoveHandler(e) { return null !== this._data && s(e, this._data.pressedMouseMoveHandler, this._data .touchMoveHandler) } tryCallMouseDownOrTouchStartHandler(e) { return null !== this._data && r(e, this._data.mouseDownHandler, this._data .touchStartHandler) } tryCallMouseUpOrTouchEndHandler(e) { return null !== this._data && r(e, this._data.mouseUpHandler, this._data .touchEndHandler) } tryCallMouseEnterHandler(e) { return null !== this._data && r(e, this._data.mouseEnterHandler) } tryCallMouseLeaveHandler(e) { return null !== this._data && r(e, this._data.mouseLeaveHandler) } tryCallMouseMoveHandler(e) { return null !== this._data && r(e, this._data.mouseMoveHandler) } tryCallClickOrTapHandler(e) { return null !== this._data && r(e, this._data.clickHandler, this._data.tapHandler) } tryCallDblClickOrDblTapHandler(e) { return null !== this._data && r(e, this._data.doubleClickHandler, this._data .doubleTapHandler) } tryCallContextMenuHandler(e) { return null !== this._data && r(e, this._data.contextMenuHandler, this._data .touchContextMenuHandler) } eraseMarker() { return this._eraseMarker } } a.MOVEPOINT_BACKGROUND = 1, a.REGULAR = 2, a.MOVEPOINT = 3, a.CHANGEPOINT = 4, a.CUSTOM = 5 }, Vdly: function(e, t, i) { "use strict"; (function(e) { i("qFKp"); i("wVAQ").fetch; var t = i("dTSQ").regExpEscape, s = i("FBuY").TVXWindowEvents, r = i("VVxS").TVLocalStorage, n = i("aIyQ"), o = i("Kxc7"), a = ["s.tradingview.com", "betacdn.tradingview.com"], l = o.enabled("use_localstorage_for_settings"), c = window.TVSettings = function() { var e = !1, i = null; function h() { return !i && l } try { e = !TradingView.onWidget() && parent && parent !== window && !!parent .IS_DEMO_PAGE } catch (e) {} if (e) { var u = { "widgetbar.layout-settings": { widgets: {}, settings: { minimized: !0 } }, notShowMainWizard: !0 }, d = function(e, t, i) { var s = u[e]; return null == s ? t : s }, p = function() {}; return { loaded: !1, loadedModel: !1, getValue: d, getJSON: d, getBool: d, getFloat: d, getInt: d, setValue: p, setJSON: p, remove: p, keys: function() { return Object.keys(u) }, keysMask: function() { return [] }, sync: p, onSync: { subscribe: function() {} } } } window.environment; var _, m = TradingView.onWidget() ? "tradingview-widget" : "tradingview", f = m + ".", g = {}, b = [/^widgetbar\.widget\.watchlist.+/, /.+quicks$/, /^widgetbar\.layout-settings$/, /^ChartSideToolbarWidget\.visible$/, /^onwidget\.watchlist$/, /^domepanel.visible$/, /^orderpanel.visible$/, /^chart\.favoriteDrawings$/, /^chart\.favoriteDrawingsPosition$/, /^loadChartDialog.favorites$/, /^ChartFavoriteDrawingToolbarWidget\.visible/, /^trading\.chart\.proterty$/, /^trading_floating_toolbar\.position$/, /^trading\.orderWidgetMode\./, /^symbolWatermark$/, /^pinereference\.size$/, /^pinereference\.position$/, /^hint\.+/, /^ChartDrawingToolbarWidget\.visible/ ]; const v = ["current_theme.name"]; function S(e) { return f + e } function y(e) { return e.substring(f.length) } function w(e, t) { var i = g[e]; return null == i ? t : i } function P(e, t, i) { i = i || {}; var s = "" + t; return g[e] !== s && (g[e] = s, x(e)), i.forceFlush && !_ && (_ = setTimeout((function() { _ = void 0, T() }), 10)), c } function C(e, t) { return t = t || {}, null != g[e] && (delete g[e], x(e)), t.forceFlush && T(), c } function x(e) { if (i) null == g[e] ? i.removeValue(e) : i.setValue(e, g[e]); else if (h()) try { null == g[e] ? r.removeItem(S(e)) : r.setItem(S(e), g[e]) } catch (e) {} else 0; s.emit("settings", JSON.stringify({ key: e, value: g[e] })) } function T(e) {} function I() { return Object.keys(g) } function M(e) { for (var t = 0; t < b.length; ++t) if (b[t].exec(e)) return !0; return !1 } function O(e) { return e.substring(0, f.length) === f } function L(e) { g = {}; const t = 0 === Object.keys(e).length; t || function(e) { Object.keys(e).forEach((function(t) { g[t] = e[t] + "" })) }(e), function(e) { for (var t = r.length; t--;) { var i = r.key(t); i && O(i) && ((e || v.includes(y(i))) && P(y(i), r.getItem(i)), r.removeItem(i)) } }(t) } s.on("settings", (function(e) { var t = JSON.parse(e); null == t.value ? delete g[t.key] : g[t.key] = t.value })); var A = new n; return document.addEventListener("visibilitychange", (function() { "hidden" === document.visibilityState || document.hidden })), window.addEventListener("beforeunload", (function() {})), { loaded: !1, loadedModel: !1, getValue: w, getJSON: function(e, t) { var i = w(e, void 0); if (null == i) return t; try { return JSON.parse(i) } catch (i) { return C(e), t } }, getBool: function(e, t) { var i = w(e); return null == i ? t : !(!i || "false" === i || 0 == +i) }, getFloat: function(e, t, i) { var s = w(e, void 0); if (null == s) return t; var r = parseFloat(s); if (!isFinite(r)) throw new TypeError('"' + s + '" is not float (key: "' + e + '")'); return r }, getInt: function(e, t, i) { var s = w(e, void 0); if (null == s) return t; var r = parseInt(s, 10); if (!isFinite(r)) throw new TypeError('"' + s + '" is not int (key: "' + e + '")'); return r }, setValue: P, setJSON: function(e, t, i) { return P(e, JSON.stringify(t), i), c }, remove: C, keys: I, keysMask: function(e, i) { for (var s = I(), r = [], n = (e = new RegExp("^" + t(e) .replace(/\\\*\\\*/gi, ".+").replace(/\\\*/gi, "[^.]+") + "$", "gi"), s.length - 1); n >= 0; n--) e .test(s[n]) && r.push(s[n]), e.lastIndex = 0; return r }, sync: function(e) { null !== e ? (i ? L(i.initialSettings || {}) : h() ? ( function() { if (TradingView.onWidget() && a.includes(window .location.host)) for (var e = r.length; e--;) { var t = r.key(e); if (0 === t.indexOf("tradingview.")) { var i = t.replace("tradingview.", m + "."); r.setItem(i, r.getItem(t)), r .removeItem(t) } } }(), function() { for (const e of v) g[e] && !r.getItem(S(e)) && r .setItem(S(e), g[e]) }(), function() { g = {}; for (var e = !o.enabled( "save_chart_properties_to_local_storage" ), t = r.length; t--;) { var i = r.key(t); if (i && O(i)) { var s = i.substring(f.length); e && !M(s) || (g[s] = r.getItem(i)) } } }()) : L(e || {}), A.fire()) : !0 }, onSync: A, setSettingsAdapter: function(e) { i = e } } }(); e && e.exports && (e.exports = c) }).call(this, i("YuTi")(e)) }, VgjZ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PriceAxisRendererOptionsProvider", (function() { return n })); var s = i("XlJ7"), r = i("zDbI"); class n { constructor(e) { this._rendererOptions = { borderSize: 1, offsetSize: 5, fontSize: NaN, font: "", color: "", paneBackgroundColor: "", paddingBottom: 0, paddingInner: 0, paddingOuter: 0, paddingTop: 0, lineSpacing: 0 }, this._chartModel = e } options() { const e = this._rendererOptions, t = this._chartModel.properties(), i = t.scalesProperties.fontSize.value(); return e.fontSize !== i && (e.fontSize = i, e.font = Object(s.makeFont)(i, r .CHART_FONT_FAMILY, ""), e.paddingTop = 2.5 / 12 * i, e.paddingBottom = e.paddingTop, e.paddingInner = i / 12 * e.offsetSize, e.paddingOuter = i / 12 * e.offsetSize, e.lineSpacing = 2 / 12 * i), e.color = t.scalesProperties .textColor.value(), e.paneBackgroundColor = t.paneProperties.background.value(), this._rendererOptions } } }, ViuT: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("Kxc7"), n = i("jCNj"), o = i("Y7w9"), a = i("OLhd"), l = i("tqok"), c = i("/bs+"); function h(e) { return 60 * e * 60 * 1e3 } function u(e) { return 60 * e * 1e3 } const d = [{ divisor: 1, weight: 18 }, { divisor: (p = 1, 1e3 * p), weight: 19 }, { divisor: u(1), weight: 20 }, { divisor: u(5), weight: 21 }, { divisor: u(30), weight: 22 }, { divisor: h(1), weight: 30 }, { divisor: h(3), weight: 31 }, { divisor: h(6), weight: 32 }, { divisor: h(12), weight: 33 }]; var p; function _(e, t) { if (null !== t) { if (e.getUTCFullYear() !== t.getUTCFullYear()) return 70; if (e.getUTCMonth() !== t.getUTCMonth()) return 60; if (e.getUTCDate() !== t.getUTCDate()) return 50; const i = t.getTime(), s = e.getTime(); for (let e = d.length - 1; e >= 0; --e) if (Math.floor(i / d[e].divisor) !== Math.floor(s / d[e].divisor)) return d[e] .weight } return 18 } function m(e, t, i = 0) { if (0 === e.length) return []; let s = i, r = i; const n = []; for (; s < e.length;) r >= t.length ? (n.push({ old: s, new: l.INVALID_TIME_POINT_INDEX }), s++) : e[s].timeMs === t[r].timeMs ? (s !== r && n.push({ old: s, new: r }), s++, r++) : e[s].timeMs < t[r].timeMs ? (n.push({ old: s, new: l.INVALID_TIME_POINT_INDEX }), s++) : r++; return n.sort((e, t) => { if (e.new === t.new && e.new === l.INVALID_TIME_POINT_INDEX) return e.old - t .old; if (e.new === l.INVALID_TIME_POINT_INDEX) return -1; if (t.new === l.INVALID_TIME_POINT_INDEX) return 1; const i = e.old - e.new, s = t.old - t.new; return i > 0 ? s > 0 ? e.old - t.old : -1 : s < 0 ? t.new - e.new : 1 }) } function f(e, t) { return { span: e.markWeight, time: e.displayTime, index: t } } i.d(t, "SessionTimeScale", (function() { return b })); const g = r.enabled("end_of_period_timescale_marks"); class b { constructor() { this._completed = !0, this._mainSymbolExtrapolator = null, this ._pointDataByTimePoint = new Map, this._seriesIds = new Set, this ._displayTimezone = null, this._minFutureBarsCount = 0, this ._sortedTimePoints = [] } destroy() { this.clearTimeScale() } setCompleted(e) { this._completed = e } isCompleted() { return this._completed } clearTimeScale() { return this._pointDataByTimePoint.clear(), this._seriesIds.clear(), this ._sortedTimePoints = [], { baseIndex: 0, pointsIndex: 0, indexChange: [], marks: [], points: [] } } indexOfTime(e) { if (0 === this._sortedTimePoints.length) return null === this ._mainSymbolExtrapolator ? null : this._mainSymbolExtrapolator.indexOfTime( e); if (e < this._sortedTimePoints[0].timeMs) { if (null === this._mainSymbolExtrapolator) return null; const t = this._mainSymbolExtrapolator.indexOfTime(e), i = this._mainSymbolExtrapolator.indexOfTime(this._sortedTimePoints[0] .timeMs); if (null === t || null === i) return null; let s = t.index - i.index; return i.timeMs !== this._sortedTimePoints[0].timeMs && (s -= 1), { index: s, timeMs: t.timeMs } } if (e > this._sortedTimePoints[this._sortedTimePoints.length - 1].timeMs) { if (null === this._mainSymbolExtrapolator) return null; const t = this._mainSymbolExtrapolator.indexOfTime(e), i = this._mainSymbolExtrapolator.indexOfTime(this._sortedTimePoints[this ._sortedTimePoints.length - 1].timeMs); if (null === t || null === i) return null; const s = t.index - i.index - 1; return { index: this._sortedTimePoints.length + s, timeMs: t.timeMs } } let t = Object(o.lowerbound)(this._sortedTimePoints, e, (e, t) => e.timeMs < t); return this._sortedTimePoints[t].timeMs !== e && (t -= 1), { index: t, timeMs: this._sortedTimePoints[t].timeMs } } setMainSymbolExtrapolator(e) { this._mainSymbolExtrapolator = e, this._updateFutureBars(), this._fillPointsData( this._sortedTimePoints, 0) } setMinFutureBarsCount(e) { this._minFutureBarsCount = e, this._updateFutureBars() } minFutureBarsCount() { return this._minFutureBarsCount } firstFutureBarIndex() { return this._sortedTimePoints.length } firstSessionBarIndex() { return 0 === this._sortedTimePoints.length ? null : 0 } lastSessionBarIndex() { return 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints.length - 1 } tickMarks(e = 0) { const t = this.firstFutureBarIndex(); Object(s.assert)(e <= t, "tickmarks cannot be filtered in the future"); const i = this._futureBars().map((e, t) => ({ timeMs: e, markWeight: 0, displayTime: NaN })); this._fillPointsData(i, 0, 0 !== this._sortedTimePoints.length ? this ._sortedTimePoints[this._sortedTimePoints.length - 1].displayTime : null); const r = []; for (let t = e; t < this._sortedTimePoints.length; ++t) r.push(f(this ._sortedTimePoints[t], t)); const n = i.map((e, i) => f(e, i + t)); return r.concat(n) } setTimezone(e) { this._displayTimezone = "exchange" === e ? null : Object(n.get_timezone)(e), this ._fillPointsData(this._sortedTimePoints, 0) } fillIndexesInRows(e) { if (0 === e.length) return; let t = -1, i = Object(o.lowerbound)(this._sortedTimePoints, Math.round(1e3 * e[0].value[ 0]), (e, t) => e.timeMs < t); for (const r of e) { const e = Math.round(1e3 * r.value[0]); for (; i < this._sortedTimePoints.length && this._sortedTimePoints[i].timeMs < e;) i += 1; i !== this._sortedTimePoints.length && this._sortedTimePoints[i].timeMs === e || (i -= 1), Object(s.assert)(i !== t, "data must have unique times"), t = i, r .index = i } Object(s.assert)(i < this._sortedTimePoints.length, "data must be within a data range") } convertTimesToIndexes(e) { if (0 === e.length) return []; let t = -1, i = Object(o.lowerbound)(this._sortedTimePoints, e[0], (e, t) => e.timeMs < t); return e.map(e => { for (; i < this._sortedTimePoints.length && this._sortedTimePoints[i] .timeMs < e;) i += 1; if (0 === i && e < this._sortedTimePoints[0].timeMs) return l .INVALID_TIME_POINT_INDEX; if (i >= this._sortedTimePoints.length) { const t = this.indexOfTime(e); if (null === t) return l.INVALID_TIME_POINT_INDEX; i = t.timeMs !== e ? t.index + 1 : t.index } return Object(s.assert)(i > t, "data must have unique sorted times"), t = i, i }) } firstSeriesBarTime() { return 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints[0].timeMs } replaceSeriesBarsTimesTail(e, t) { if (0 === t.length) return null; if (!this._seriesIds.has(e)) return this.setSeriesBarsTimes(e, t); const i = [], s = Object(o.lowerbound)(this._sortedTimePoints, t[0], (e, t) => e.timeMs < t); for (let t = s; t < this._sortedTimePoints.length; ++t) { const s = this._sortedTimePoints[t]; s.pointData.series.delete(e) && 0 === s.pointData.series.size && i.push(s) } const r = this._addBarsTimesToSeries(e, t, !0); this._cleanupPointsData(i); const n = r.map(e => ({ timeMs: e.timeMs, pointData: e.pointData, markWeight: 0, displayTime: NaN })); for (let e = s; e < this._sortedTimePoints.length; ++e) { const t = this._sortedTimePoints[e]; 0 !== t.pointData.series.size && n.push(t) } n.sort((e, t) => e.timeMs - t.timeMs); const a = this._updateTimeScalePointsTail(n); return this._applyTimeScaleChanges(a, !1) } setSeriesBarsTimes(e, t) { let i = 0 !== this._pointDataByTimePoint.size; if (this._seriesIds.has(e)) if (1 === this._seriesIds.size) i = !1, this._pointDataByTimePoint.clear(); else for (const t of this._sortedTimePoints) t.pointData.series.delete(e); this._addBarsTimesToSeries(e, t, !1); const s = this._seriesIds.size; 0 === t.length ? this._seriesIds.delete(e) : this._seriesIds.add(e), i && this ._cleanupPointsData(this._sortedTimePoints); const r = s < this._seriesIds.size, n = s > this._seriesIds.size, o = r && 2 === this._seriesIds.size || n && 1 === this._seriesIds.size, a = []; this._pointDataByTimePoint.forEach((e, t) => { a.push({ markWeight: 0, timeMs: t, displayTime: NaN, pointData: e }) }), a.sort((e, t) => e.timeMs - t.timeMs); const l = this._updateTimeScalePoints(a); return this._applyTimeScaleChanges(l, o) } _updateFutureBars() { if (0 === this._minFutureBarsCount || null === this._mainSymbolExtrapolator) return; if (0 !== this._sortedTimePoints.length) { const e = this._sortedTimePoints[this._sortedTimePoints.length - 1].timeMs; this._mainSymbolExtrapolator.ensureExtrapolatedToFutureTime(e) } const e = this._futureBarsFirstPointIndex(); this._mainSymbolExtrapolator.setMinFutureBarsCount(e + this._minFutureBarsCount) } _addBarsTimesToSeries(e, t, i) { const s = i ? [] : null; for (const i of t) { const t = this._pointDataByTimePoint.get(i); if (void 0 === t) { const t = new Set; t.add(e); const r = { index: 0, series: t }; this._pointDataByTimePoint.set(i, r), null !== s && s.push({ timeMs: i, pointData: r }) } else t.series.add(e) } return s } _futureBarsFirstPointIndex() { if (null === this._mainSymbolExtrapolator || 0 === this._sortedTimePoints.length) return 0; const e = this._mainSymbolExtrapolator.futureBars(); return Object(o.upperbound_int)(e, this._sortedTimePoints[this._sortedTimePoints .length - 1].timeMs) } _futureBars() { return null === this._mainSymbolExtrapolator ? [] : this._mainSymbolExtrapolator .futureBars().slice(this._futureBarsFirstPointIndex(), this ._futureBarsFirstPointIndex() + 1e3) } _cleanupPointsData(e) { for (const t of e) 0 === t.pointData.series.size && this._pointDataByTimePoint .delete(t.timeMs) } _updateTimeScalePoints(e) { let t = -1; for (let i = 0; i < this._sortedTimePoints.length && i < e.length; ++i) { const s = this._sortedTimePoints[i], r = e[i]; if (s.timeMs !== r.timeMs) { t = i; break } r.markWeight = s.markWeight, r.displayTime = s.displayTime } if (t = v(t, this._sortedTimePoints.length, e.length), -1 === t) return null; for (let i = t; i < e.length; ++i) { e[i].pointData.index = i } this._fillPointsData(e, t); const i = m(this._sortedTimePoints, e, t); return this._sortedTimePoints = e, this._updateFutureBars(), { pointsIndex: t, indexChange: i } } _updateTimeScalePointsTail(e) { if (0 === e.length) return null; const t = Object(o.lowerbound)(this._sortedTimePoints, e[0].timeMs, (e, t) => e .timeMs < t); let i = -1; for (let s = 0; s < e.length; ++s) { const r = e[s], n = t + s; if (r.pointData.index = n, n >= this._sortedTimePoints.length) continue; this._sortedTimePoints[n].timeMs !== r.timeMs && -1 === i && (i = n) } const s = t + e.length; if (i = v(i, this._sortedTimePoints.length, s), -1 === i) return null; this._fillPointsData(e, 0, 0 === t || 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints[t - 1].displayTime); const r = m(this._sortedTimePoints.slice(t), e).map(e => ({ old: e.old + t, new: e.new === l.INVALID_TIME_POINT_INDEX ? e.new : e.new + t })); { const i = this._sortedTimePoints; let r = 0; for (; t + r < i.length && r < e.length;) i[t + r] = e[r], r += 1; for (; r < e.length; ++r) i.push(e[r]); i.length = s } return this._updateFutureBars(), { pointsIndex: i, indexChange: r } } _getBaseIndex() { return Math.max(0, this._sortedTimePoints.length - 1) } _fillPointsData(e, t, i = null) { this._fillDiplayTimeForPoints(e, t), function(e, t = 0, i = null) { let s = 0 === t || 0 === e.length ? i : e[t - 1].displayTime, r = null !== s ? new Date(1e3 * s) : null, n = 0; for (let i = t; i < e.length; ++i) { const t = e[i], o = new Date(1e3 * t.displayTime); t.markWeight = _(o, r), n += t.displayTime - (s || t.displayTime), r = o, s = t.displayTime } if (0 === t && e.length > 1 && null === i) { const t = Math.ceil(n / (e.length - 1)), i = new Date(1e3 * (e[0].displayTime - t)); e[0].markWeight = _(new Date(1e3 * e[0].displayTime), i) } }(e, t, i) } _applyTimeScaleChanges(e, t) { if (null === e) return t ? (this._fillPointsData(this._sortedTimePoints, 0), { points: [], pointsIndex: 0, baseIndex: this._getBaseIndex(), indexChange: [], marks: this.tickMarks(0) }) : null; let i = e.pointsIndex; if (0 !== i && t && (this._fillPointsData(this._sortedTimePoints, 0), i = 0), 0 === this._sortedTimePoints.length) return { baseIndex: 0, pointsIndex: 0, indexChange: [], marks: [], points: [] }; const s = []; for (let t = e.pointsIndex; t < this._sortedTimePoints.length; ++t) s.push(this ._sortedTimePoints[t].timeMs / 1e3); return { ...e, points: s, baseIndex: this._getBaseIndex(), marks: this.tickMarks(i) } } _fillDiplayTimeForPoints(e, t = 0) { if (null === this._mainSymbolExtrapolator) return; const i = this._mainSymbolExtrapolator.interval(), s = this._mainSymbolExtrapolator.barBuilder(), r = this._mainSymbolExtrapolator.symbolInfo(), o = null === this._displayTimezone ? Object(n.get_timezone)(r.timezone) : this ._displayTimezone, l = 1 === this._seriesIds.size, h = i.isDWM(), u = h ? Object(a.createDwmAligner)(i.value(), { timezone: r.timezone, corrections: l ? r.corrections : void 0, session_holidays: l ? r.session_holidays : void 0, session: l ? r.session : "24x7" }) : null, d = !h; for (let r = t; r < e.length; ++r) { let t = e[r].timeMs / 1e3; g && (t = Object(c.a)(s, t, i)), null !== u && (t = Math.floor(u .timeToExchangeTradingDay(1e3 * t) / 1e3)), d && (t = Math.floor(Object( n.utc_to_cal_ts)(o, 1e3 * t) / 1e3)), e[r].displayTime = t } } } function v(e, t, i) { return -1 === e && t !== i && (e = i < t ? Math.max(0, i - 1) : t), e } }, Vs8b: function(e, t, i) { "use strict"; i.r(t), i.d(t, "isMainSeriesState", (function() { return r })), i.d(t, "isStudyState", (function() { return n })), i.d(t, "isLineToolState", (function() { return o })), i.d(t, "isZOrderedSourceState", (function() { return a })); var s = i("CW80"); function r(e) { return "MainSeries" === e.type } function n(e) { return Boolean(e.type) && e.type.toLowerCase().startsWith("study") } function o(e) { return Boolean(e.type) && Object(s.isLineToolName)(e.type) } function a(e) { return r(e) || n(e) || o(e) } }, "W+6j": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); i("bmVy"); var s = i("ww0J"); window.t("Fundamental studies are no longer available on charts"); class r extends s.a { constructor(e, t) { super(e, t), this._study = e } color() { return this._study.isFailed() || this._study.metaInfo && this._study.metaInfo() .isTVScriptStub ? "#ff0000" : super.color() } sourceStatusText() { this._study.status(); return super.sourceStatusText() } } }, WIS0: function(e, t, i) { "use strict"; i.r(t), i.d(t, "DatafeedRequestsCachedProcessor", (function() { return _ })); var s = i("Eyy1"), r = i("LxhU"), n = i("Y7w9"), o = i("ocLq"), a = i("Kxc7"), l = i("IiTo"), c = i("OLhd"), h = i("5mo2"); i("HbRj"); function u(e, t) { return e.ticker + (e.currency_code ? "_#_" + e.currency_code : "") + (e.unit_id ? "_#_" + e .unit_id : "") + "_#_" + t } function d(e) { return new Date(e).toISOString() } class p { constructor(e, t, i, s, n, o) { this._cache = { bars: [] }, this._nextSubscriptionId = 0, this._pendingSubscribers = [], this ._subscribers = [], this._requesting = !1, this._leftDate = null, this ._nextTime = null, this._realtimeOn = !1, this._endOfData = !1, this ._resetCacheTimeout = null, this._errorMessage = null, this._destroyed = !1, this._emptyResponsesCount = 0, this._datafeed = e, this._symbolInfo = t, this ._interval = r.Interval.parse(i), this._resolution = this._interval.value(), this._dwmAligner = n, this._serverTimeOffsetGetter = s, this ._resetCacheTimePeriod = void 0 === o ? 1e4 : o, this._sessionSpec = new h .SessionSpec(t.timezone, t.session, t.session_holidays, t.corrections), this ._updateDatesFromExpirationDate() } destroy() { 0 !== this._subscribers.length && console.warn("Destroying with not-empty state"), this._clearResetCacheTimeout(), this._unsubscribeRealtime(), this._purgeCache(), delete this._datafeed, this._destroyed = !0 } addSubscription(e, t, i) { const s = this._getNextSubscriptionId(); this._pendingSubscribers.push({ key: s, range: e, onHistoryCallback: t, onErrorCallback: i }), r.Interval.isDWM(this._resolution) && void 0 !== e.to && null !== this ._dwmAligner && e.to % 864e5 && console.warn( `Internal error: invalid date for DWM resolution ${d(e.to)}, expected time without a time part` ), this._clearResetCacheTimeout(); return setTimeout(() => { this._destroyed || this._processPendingSubscribers() }, 0), s } removeSubscription(e) { const t = this._pendingSubscribers.find(t => t.key === e); if (t) return void this._pendingSubscribers.splice(this._pendingSubscribers.indexOf( t), 1); const i = this._subscribers.find(t => t.key === e); if (i) return this._subscribers.splice(this._subscribers.indexOf(i), 1), void(this ._subscribers.length || (this._resetCacheTimeout = setTimeout(() => { this._resetCacheTimeout = null, this._purgeCache(), this ._unsubscribeRealtime() }, this._resetCacheTimePeriod))); console.warn("Unknown subscription symbol={0}, resolution={1}, key={2}".format(this ._symbolInfo.name, this._resolution, e)) } _logMessage(e, t) { if (a.enabled("charting_library_debug_mode") || t) { const t = this._symbolInfo.currency_code, i = this._symbolInfo.unit_id; console.log( `FEED [${this._symbolInfo.name}|${this._resolution}${t ? "|" + t : ""}${i ? "|" + i : ""}]: ${e}` ) } } _clearResetCacheTimeout() { null !== this._resetCacheTimeout && (clearTimeout(this._resetCacheTimeout), this ._resetCacheTimeout = null) } _purgeCache() { this._logMessage("Reset cache"), this._cache = { bars: [] }, this._errorMessage = null, this._leftDate = null, this._endOfData = !1, this ._updateDatesFromExpirationDate() } _updateDatesFromExpirationDate() { void 0 !== this._symbolInfo.expiration_date && (this._nextTime = 1e3 * this ._symbolInfo.expiration_date, this._leftDate = 1e3 * (this._symbolInfo .expiration_date + 1)) } _dealignTime(e) { return null === this._dwmAligner ? e : this._dwmAligner.timeToExchangeTradingDay(e) } _normalizeRange(e) { const t = void 0 !== e.to ? e.to : this._dealignTime(this._now()); if (0 === this._cache.bars.length || void 0 !== e.to && t <= Object(s.ensureNotNull) (this._leftDate)) return { countBack: e.countBack, to: t }; const i = null !== this._dwmAligner ? this._dwmAligner.timeToSessionStart(t) : t, r = Object(n.lowerbound)(this._cache.bars, i, (e, t) => e.time < t); return e.countBack < r ? { countBack: 0, to: 0 !== e.countBack && r <= this._cache.bars.length ? this._dealignTime( this._cache.bars[r - e.countBack].time) : t } : { countBack: e.countBack - r, to: this._dealignTime(this._cache.bars[0].time) } } _processPendingSubscribers() { const e = this._pendingSubscribers; if (!e.length) return; if (this._requesting) return void this._logMessage( "Processing is skipped due active request"); if (this._logMessage("Processing pending subscribers, count=" + e.length), this ._errorMessage) { const t = this._errorMessage; return this._logMessage("Return error: " + t), this._pendingSubscribers = [], void e.forEach(e => { e.onErrorCallback(t) }) } let t = this._normalizeRange(e[0].range); for (const i of e.map(e => this._normalizeRange(e.range)))(i.to < t.to || i.to === t .to && i.countBack > t.countBack) && (t = i); this._logMessage( `Leftmost subscriber requires ${t.countBack} bars prior ${d(t.to)}`); !(null === this._leftDate || t.to < this._leftDate && (null === this._nextTime || t .to < this._nextTime) || 0 !== t.countBack) || this._endOfData ? (this ._pendingSubscribers = [], e.forEach(e => { const t = this._moveSubscriberToRealtime(e); this._returnHistoryDataToSubscriber(e, t) }), this._subscribeRealtimeIfNeeded()) : this._ensureRequestedTo(t) } _moveSubscriberToRealtime(e) { const t = { key: e.key, onHistoryCallback: e.onHistoryCallback, barset: null }; return this._subscribers.push(t), t } _isSymbolExpired() { return this._symbolInfo.expired || void 0 !== this._symbolInfo.expiration_date } _subscribeRealtimeIfNeeded() { !this._subscribers.length || this._realtimeOn || this._isSymbolExpired() || this ._subscribeRealtime() } _subscribeRealtime() { if (this._symbolInfo.expired || this._realtimeOn) return; this._realtimeOn = !0, this._datafeed.subscribeBars(this._symbolInfo, this ._resolution, e => { null !== this._dwmAligner && (e.time = this._dwmAligner .timeToSessionStart(e.time)), this._putToCacheNewBar(e), this ._subscribers.forEach(t => { const i = t.barset; if (null === i) throw new Error( "subscriber.barset is null"); i.add(e), t.onHistoryCallback(i) }) }, u(this._symbolInfo, this._resolution), () => { this._unsubscribeRealtime(); const e = this._leftDate; this._purgeCache(), null !== e && this._ensureRequestedTo({ to: e, countBack: 0 }) }), this._logMessage("Subscribed to realtime") } _unsubscribeRealtime() { !this._isSymbolExpired() && this._realtimeOn && (this._datafeed.unsubscribeBars(u( this._symbolInfo, this._resolution)), this._logMessage( "Unsubscribed from realtime"), this._realtimeOn = !1) } _returnHistoryDataToSubscriber(e, t) { const i = this._normalizeRange(e.range), s = this._createBarsetForRange(i); s.count() > 0 ? this._logMessage( "Bars to return for request {0}: total {1} bars in [{2} ... {3}] ".format(e .key, s.count(), d(s.bars[0].time), d(s.bars[s.count() - 1].time))) : this._logMessage("Request {0}. Nothing to return.".format(e.key)), t.barset = s, this._endOfData && null !== this._leftDate && i.to <= this._leftDate && (s .endOfData = !0), e.onHistoryCallback(s) } _createBarsetForRange(e) { const t = null !== this._dwmAligner ? this._dwmAligner.timeToSessionStart(e.to) : e .to, i = Object(n.lowerbound)(this._cache.bars, t, (e, t) => e.time < t), r = new o.BarSet(this._symbolInfo, this._cache.bars.slice(Math.max(0, i - e .countBack))); return 0 !== r.bars.length ? r.firstLoadedTimeMs = this._dealignTime(r.bars[0] .time) : 0 !== this._cache.bars.length ? r.firstLoadedTimeMs = this ._dealignTime(this._cache.bars[this._cache.bars.length - 1].time) : r .firstLoadedTimeMs = this._dealignTime(Object(s.ensureNotNull)(this._leftDate)), r } _ensureRequestedTo(e) { var t; let i; if (this._requesting && this._logMessage( "Internal error: trying to call getBars while the previous request is active", !0), null !== this._leftDate) i = this._leftDate; else { const e = this._now(); if (null === this._dwmAligner) i = e; else { let t = this._sessionSpec.alignToNearestSessionStart(new Date(e), 1) .getTime(); if (t < e) { const e = this._sessionSpec.alignToNearestSessionEnd(new Date(t), 1) .getTime(); t = this._sessionSpec.alignToNearestSessionStart(new Date(e + 1e3), 1) .getTime() } i = this._dealignTime(t) } } const s = Object(l.alignPeriodsBackForDataRequest)(this._symbolInfo.session, this ._symbolInfo.session_holidays, this._symbolInfo.corrections, this._interval .letter(), this._interval.multiplier(), e.countBack, Math.min(e.to, i, null !== (t = this._nextTime) && void 0 !== t ? t : 1 / 0)); let r = e.countBack; if (e.to < i && (r += Object(l.getPeriodsBetweenDates)(this._symbolInfo.session, this._symbolInfo.session_holidays, this._symbolInfo.corrections, this ._interval.letter(), this._interval.multiplier(), e.to, i)), null !== this ._leftDate && this._leftDate < s) return void this._processPendingSubscribers(); const n = this._isSymbolExpired() ? 0 === this._cache.bars.length : null === this ._leftDate; this._requesting = !0, this._nextTime = null, this._leftDate = s; const o = `[${d(s)} ... ${d(i)}, ${r} bars]`; this._logMessage("Requesting data: " + o); let a = !1; const c = s / 1e3, h = i / 1e3; this._datafeed.getBars(this._symbolInfo, this._resolution, { from: this._interval.isTicks() ? c : Math.floor(c), to: this._interval.isTicks() ? h : Math.floor(h), countBack: r, firstDataRequest: n }, (e, t) => { if (!this._destroyed) if (a) this._logMessage("getBars callback is already called before", !0); else { if (a = !0, e.length > 0) { const t = ` [${d(e[0].time)} ... ${d(e[e.length - 1].time)}]`; this._logMessage( `Receiving bars: total ${e.length} bars in ${t}, requested range: ${o}` ) } else this._logMessage( "Receiving bars: barset is empty, requested range: " + o ); this._requesting = !1, this._processBars(e, t) } }, e => { this._destroyed || (a ? this._logMessage( "getBars callback is already called before", !0) : (a = !0, this._requesting = !1, this._errorMessage = e || null, this ._processPendingSubscribers())) }) } _processBars(e, t) { this._checkBars(e), this._alignBarsTime(e), e.length > 0 ? (this ._emptyResponsesCount = 0, this._processFullBarset(e, t)) : (this ._emptyResponsesCount += 1, this._processEmptyBarset(t)), this ._processPendingSubscribers() } _processEmptyBarset(e) { e && e.nextTime ? (this._logMessage("Next time received: `{0}`".format(d(1e3 * e .nextTime))), this._nextTime = 1e3 * e.nextTime) : e && e.noData ? (this ._logMessage("EOD received"), this._setEndOfData()) : this._logMessage( "nextTime or noData should present in metainfo when empty barset is returned" ), 50 === this._emptyResponsesCount && (this._logMessage( "EOD detected due 50 empty responses in a row"), this._setEndOfData()) } _setEndOfData() { this._endOfData = !0, this._cache.bars.length && (this._leftDate = this._dealignTime(this._cache.bars[ 0].time)) } _processFullBarset(e, t) { this._putToCache(e) ? null !== this._leftDate && 0 !== this._cache.bars.length && ( this._interval.isTicks() ? this._leftDate = this._dealignTime(this._cache .bars[0].time) : this._leftDate = Math.min(this._leftDate, this ._dealignTime(this._cache.bars[0].time))) : this._logMessage( "Incremental update failed. Starting full update. Returned data should be in the requested range.", !0), t && t.nextTime ? console.warn( "nextTime should be set when there is no data in the requested period only" ) : t && t.noData && console.warn( "noData should be set when there is no data in the requested period and earlier only" ) } _getNextSubscriptionId() { return this._nextSubscriptionId++ } _checkBars(e, t = !1) { if (a.enabled("charting_library_debug_mode")) for (let i = 1; i < e.length; i++) { if (e[i].time <= e[i - 1].time) { let s = "Wrong bars time: time {0} of bar {1} should be more than time {2} of bar {3}" .format(e[i].time, i, e[i - 1].time, i - 1); t && null !== this._dwmAligner && (s += "\nCheck that you provide DWM bars without time part, i.e. 00:00 GMT" ), console.error(s) } ["high", "low", "open", "close", "time"].some(t => "number" != typeof e[i] [t] || !isFinite(e[i][t])) && console.error( "Wrong bars values: all OHLC values should be numbers") } } _putToCache(e) { if (0 === e.length) return !0; if (this._cache.bars.length === e.length && this._cache.bars[0].time === e[0] .time && this._cache.bars[this._cache.bars.length - 1].time === e[e.length - 1] .time) return this._logMessage( "Time range of received data is the same as cached one. Skip the update." ), !0; if (0 !== this._cache.bars.length && e[e.length - 1].time === this._cache.bars[0] .time && this._cache.bars.splice(0, 1), 0 !== this._cache.bars.length && e[e .length - 1].time >= this._cache.bars[0].time) { const t = this._cache.bars[this._cache.bars.length - 1].time === e[e.length - 1] .time; if (this._cache.bars = [], !t) return this._leftDate = null, !1; this._logMessage( "Received history up to now instead of incremental update. Return exactly what is requested." ) } return this._cache.bars = [...e, ...this._cache.bars], this._checkBars(this._cache .bars, !0), !0 } _putToCacheNewBar(e) { const t = this._cache.bars.length, i = e.time, s = 0 === t ? NaN : this._cache.bars[t - 1].time; 0 === t || s < i ? this._cache.bars.push(e) : s === i ? (this._interval.isTicks() && this._logMessage("Received update for the last tick bar"), this._cache.bars[ t - 1] = e) : console.error( "putToCacheNewBar: time violation, previous bar time: " + d(s) + " should be less or equal to new time: " + d(i)) } _alignBarsTime(e) { if (this._dwmAligner) for (const t of e) t.time = this._dwmAligner.timeToSessionStart(t.time) } _now() { return Date.now() + 1e3 * this._serverTimeOffsetGetter() + 6e4 } } class _ { constructor(e, t, i) { this._threads = {}, this._datafeed = e, this._serverTimeOffsetGetter = t, this ._resetCacheTimePeriod = i } destroy() { this._forEachThread((e, t) => t.destroy()), this._threads = {}, delete this ._datafeed } purgeCache() { this._forEachThread((e, t) => t.destroy()), this._threads = {} } subscribe(e, t, i, s, r) { const n = u(e, t); this._threads[n] || (this._threads[n] = this._createThread(e, t)); return n + '"' + this._threads[n].addSubscription(i, s, r) } unsubscribe(e) { const t = e.split('"'); if (2 !== t.length) return void console.warn("Wrong guid format"); const i = t[0], s = parseInt(t[1]); this._threads.hasOwnProperty(i) ? this._threads[i].removeSubscription(s) : console .warn("Data thread doesnt exist: " + e) } _createThread(e, t) { return new p(this._datafeed, e, t, this._serverTimeOffsetGetter, Object(c .createDwmAligner)(t, e), this._resetCacheTimePeriod) } _forEachThread(e) { Object.keys(this._threads).forEach(t => e(t, this._threads[t])) } } }, WPQD: function(e, t, i) { "use strict"; (function(e) { var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()), this._trendLinePaneView = null, i.e( "lt-pane-views").then(i.t.bind(null, "ocVb", 7)).then(({ TrendLinePaneView: e }) => { this._trendLinePaneView = new e(this, this._model), this ._setPaneViews([this._trendLinePaneView]) }) } dataAndViewsReady() { return s.prototype.dataAndViewsReady.call(this) && this ._trendLinePaneView && this._trendLinePaneView.iconsReady() } stop() { super.stop() } pointsCount() { return 2 } name() { return "Trend Line" } canHasAlert() { return !0 } _getAlertPlots() { return [this._linePointsToAlertPlot(this._points, null, this.properties() .extendLeft.value(), this.properties().extendRight.value())] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "auWl"))).TrendLineDefinitionsViewModel } template() { var e = s.prototype.template.call(this); return e.text = this.properties().childs().text.value(), e.showLabel = this .properties().childs().showLabel.value(), e } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e .text || ""), this.properties().childs().showLabel.setValue(Boolean( e.showLabel)) } _snapTo45DegreesAvailable() { return !0 } static createProperties(e) { var t = new r("linetooltrendline", e); return n._configureProperties(t), t } static _configureProperties(t) { s._configureProperties(t), t.hasChild("text") || t.addChild("text", new e( "")), t.addExclusion("text"), t.addExclusion("showLabel") } } t.LineToolTrendLine = n }).call(this, i("tc+8")) }, WTyR: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("ocLq"); class r { constructor(e) { this._haveAnyVolume = !1, this._isDisabled = !1, this._seriesGetter = e } update(e, t) { if (this._haveAnyVolume || this._isDisabled) return; const i = this._seriesGetter.volume().get(e); 0 !== i && Number.isFinite(i) && (this._haveAnyVolume = !0), t && (this ._haveAnyVolume || s.Std.error( "The data vendor doesn't provide volume data for this symbol."), this ._isDisabled = !0) } } }, WYmP: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("oamr"), r = i("dhFz"); class n { constructor() { this._items = [], this._owner = null } primitivesData(e) { const t = []; for (const i of this._items) e.isIgnoredObj(i) || t.push(i.primitiveData()); return t } get(e) { return this._items[e] } set(e, t) { return this.dirty(), t.setOwner(this), this._items[e] = t, t } addAtIndex(e, t) { this.dirty(), t.setOwner(this), this._items[e] = t } clear() { this._unsetOwner(this._items), this._items = [], this.dirty() } addAllFromNumber(e, t) { this.setOwner(t), this._items.splice(e, 0, ...t._items); return this._setCachedDataValid(!1), !0 } addAll(e) { this.setOwner(e), this._items.push(...e._items); return this._setCachedDataValid(!1), !0 } remove(e) { const t = this._items[e]; return this._items.splice(e, 1), t.unsetOwner(this), this.dirty(), t } getItems() { return this._items } size() { return this._items.length } add(e) { e.setOwner(this), this._items.push(e); return this._setCachedDataValid(!1), !0 } deleteErasedItems() { this._items = this._items.filter(e => !e.isErased()) } markPostedItems() { for (const e of this._items) e.markAsPosted() } isNaN() { if (0 === this._items.length) return !0; for (const e of this._items) { if (!Object(r.a)(e)) return !1; if (!e.isNaN()) return !1 } return !0 } setOwner(e) { this._owner = e } dirty() { null !== this._owner && this._owner.dirty() } _unsetOwner(e) { for (const t of e) t instanceof s.a && t.unsetOwner(this) } _setCachedDataValid(e) { e || this.dirty() } } }, "Wh/T": function(e, t, i) { "use strict"; var s = i("Kxc7"); window.onload = function() { location.hostname.indexOf(".") >= 0 && ! function() { try { return /^(192|172|10)\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]/ .test(location.hostname) || /^.*((?:\.local)|localhost)$/.test(location .hostname) } catch (e) { return !1 } }() && setTimeout((function() { try { var e = function() { var e = 0; return JSON.parse(urlParams.logo).image && (e = "C", s .enabled("link_to_tradingview") || (e = "D")), e }(); window.ga && (0 !== e && window.ga("send", "event", "s", e), urlParams.utm || window.ga("send", "event", "l")) } catch (e) {} }), 3e4) } }, Wh6B: function(e, t, i) { "use strict"; var s = i("Eyy1").ensureNotNull, r = i("Ss5c").LineDataSource, n = i("Ocx9").DefaultProperty, o = i("08i5"); class a extends r { constructor(e, t) { super(e, t || a.createProperties()), this._predictionPaneView = null, i.e( "lt-pane-views").then(i.t.bind(null, "Ay2m", 7)).then(({ PredictionPaneView: e }) => { this._predictionPaneView = new e(this, this._model), this._setPaneViews( [this._predictionPaneView]) }) } dataAndViewsReady() { return r.prototype.dataAndViewsReady.call(this) && this._predictionPaneView && this ._predictionPaneView.iconsReady() } isSynchronizable() { return !1 } status() { return this._properties.status.value() } setStatus(e) { return this._properties.status.setValue(e) } pointsCount() { return 2 } name() { return "Forecast" } restorePoints(e, t, i) { super.restorePoints(e, t, i), this.checkAlert() } checkAlert() { if (!(this._points.length < 2 || this._model.mainSeries().bars().isEmpty())) { var e = this._points[1]; if (this.status()) e.index > this._model.timeScale().baseIndex() && this .setStatus(o.AlertStatus.Waiting); else { var t = this._model.mainSeries().bars().valueAt(e.index); if (null !== t) { var i = this.direction(); if (i === o.Direction.Up && t[TradingView.HIGH_PLOT] >= e.price) this .setStatus(o.AlertStatus.Success); else if (i === o.Direction.Down && t[TradingView.LOW_PLOT] <= e.price) this.setStatus(o.AlertStatus.Success); else { var r = s(this._model.mainSeries().bars().lastIndex()); e.index !== r && this.setStatus(o.AlertStatus.Failure) } } } } } addPoint(e) { var t = r.prototype.addPoint.call(this, e); return t && this.checkAlert(), t } endChanging() { super.endChanging(), this.setStatus(o.AlertStatus.Waiting), this.checkAlert() } onData(e) { super.onData(e), this.checkAlert() } endMoving() { super.endMoving(), this.setStatus(o.AlertStatus.Waiting), this.checkAlert() } direction() { if (this.points().length < 2) return o.Direction.Up; var e = this.points()[0]; return this.points()[1].price > e.price ? o.Direction.Up : o.Direction.Down } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Pwwq"))) .PredictionDefinitionsViewModel } cloneable() { return !1 } static createProperties(e) { var t = new n("linetoolprediction", e); return a._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e), e.merge({ status: o.AlertStatus.Waiting }) } } t.LineToolPrediction = a }, WkOR: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })), i.d(t, "b", (function() { return a })); var s = i("Kxc7"); const r = s.enabled("uppercase_instrument_names"); function n(e, t) { return void 0 === e ? void 0 === t : void 0 !== t && (r ? e.toUpperCase() === t .toUpperCase() : e === t) } function o(e, t) { return e.some(e => n(t, e)) } function a(e, t, i) { if (n(t, e)) return !0; if (i) { if (n(i.full_name, e) || n(i.pro_name, e)) return !0; if (n(i.ticker, e)) return !0; if (i.aliases && o(i.aliases, e)) return !0; if (i.alternatives && o(i.alternatives, e)) return !0; if (0 === e.indexOf("FRA:") && n(i.pro_name, e.replace("FRA:", "FWB:"))) return !0 } return !1 } }, WkYF: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolDateRange", (function() { return a })); var s = i("Eyy1"), r = i("Ocx9"), n = i("Ss5c"), o = i("585y"); class a extends n.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), this._volumeCalculator = null, i.e( "lt-pane-views").then(i.bind(null, "3xLB")).then(e => { this._setPaneViews([new e.DateRangePaneView(this, this._model)]) }) } destroy() { super.destroy(), null !== this._volumeCalculator && this._volumeCalculator .destroy() } pointsCount() { return 2 } properties() { return super.properties() } name() { return "Date Range" } volume() { if (null === this._volumeCalculator) return NaN; const e = this.points(); return this._volumeCalculator.volume(e[0].index, e[1].index) } setOwnerSource(e) { e === this._model.mainSeries() && (Object(s.assert)(null === this ._volumeCalculator), this._volumeCalculator = new o.a(this._model .mainSeries())), super.setOwnerSource(e) } static createProperties(e) { const t = new r.DefaultProperty("linetooldaterange", e); return a._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76"))) .GeneralDatePriceRangeDefinitionsViewModel } static _configureProperties(e) { n.LineDataSource._configureProperties(e) } } }, WmDe: function(e, t, i) { "use strict"; TradingView.Pro = function() { this.hasPackage = function() { return !1 } }, window.user = { is_pro: !1, settings: {} }, TradingView.Pro.prototype.isPaidPro = function() { return !1 }, TradingView.Pro.prototype.isSupportAvailable = function() { return !1 }, TradingView.Pro.prototype.getStudies = function() { return [] }, TradingView.Pro.prototype.getProduct = function() { return {} }, TradingView.Pro.prototype.getStudiesOrder = function() { return [] } }, Wo0S: function(e, t, i) { e.exports = { "common-tooltip": "common-tooltip-36YLR71G", "common-tooltip--hidden": "common-tooltip--hidden-36YLR71G", "common-tooltip--horizontal": "common-tooltip--horizontal-36YLR71G", "common-tooltip--farther": "common-tooltip--farther-36YLR71G", "common-tooltip--vertical": "common-tooltip--vertical-36YLR71G", "common-tooltip-farther": "common-tooltip-farther-36YLR71G", "common-tooltip--direction_normal": "common-tooltip--direction_normal-36YLR71G", "common-tooltip__body": "common-tooltip__body-36YLR71G", "common-tooltip__button-container": "common-tooltip__button-container-36YLR71G", "common-tooltip__body--no-buttons": "common-tooltip__body--no-buttons-36YLR71G", "common-tooltip__button": "common-tooltip__button-36YLR71G", "common-tooltip--direction_reversed": "common-tooltip--direction_reversed-36YLR71G", "common-tooltip__ear-holder": "common-tooltip__ear-holder-36YLR71G", "common-tooltip__ear-holder--below": "common-tooltip__ear-holder--below-36YLR71G", "common-tooltip__ear-holder--above": "common-tooltip__ear-holder--above-36YLR71G", "common-tooltip__ear-holder--before": "common-tooltip__ear-holder--before-36YLR71G", "common-tooltip__ear-holder--after": "common-tooltip__ear-holder--after-36YLR71G", "common-tooltip__body--with-hotkey": "common-tooltip__body--with-hotkey-36YLR71G", "common-tooltip__body--width_wide": "common-tooltip__body--width_wide-36YLR71G", "common-tooltip__body--width_narrow": "common-tooltip__body--width_narrow-36YLR71G", "common-tooltip__body--no-padding": "common-tooltip__body--no-padding-36YLR71G", "common-tooltip__hotkey-block": "common-tooltip__hotkey-block-36YLR71G", "common-tooltip__hotkey-block--divider": "common-tooltip__hotkey-block--divider-36YLR71G", "common-tooltip__hotkey-text": "common-tooltip__hotkey-text-36YLR71G", "common-tooltip__hotkey-button": "common-tooltip__hotkey-button-36YLR71G", "common-tooltip__plus-sign": "common-tooltip__plus-sign-36YLR71G" } }, Wt0y: function(e, t, i) { "use strict"; function s(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 r() { return "local" === s() } function n() { return "battle" === s() } function o() { return !n() } i.r(t), i.d(t, "environment", (function() { return s })), i.d(t, "isLocal", (function() { return r })), i.d(t, "isProd", (function() { return n })), i.d(t, "isDebug", (function() { return o })) }, X0WL: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor(e) { this._colorProperty = e } size() { return "13px" } bold() { return !1 } color() { return this._colorProperty.value() } } }, XAms: function(e, t, i) { "use strict"; function s(e) { e.preventDefault() } i.d(t, "a", (function() { return s })), i.d(t, "b", (function() { return n })); const r = ["input:not([type])", 'input[type="text"]', 'input[type="email"]', 'input[type="password"]', 'input[type="search"]', 'input[type="number"]', 'input[type="url"]', "textarea", "a[href]", '*[contenteditable="true"]', "[data-allow-context-menu]" ]; function n(e) { const t = e.target; t && !t.closest(r.join(", ")) && e.preventDefault() } }, XFad: function(e, t, i) { "use strict"; var s = i("5rJj"), r = i("aDyP").LineToolPitchfork; class n extends r { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Schiff Pitchfork" } static createProperties(e) { var t = new s("linetoolschiffpitchfork2", e, !1, { range: [0, 8] }); return n._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e) } } t.LineToolSchiffPitchfork2 = n }, XPit: function(e, t, i) { "use strict"; i.r(t), i.d(t, "TimePointIndexSearchMode", (function() { return s })), i.d(t, "seriesPlotFunctionMap", (function() { return l })), i.d(t, "barFunction", (function() { return c })), i.d(t, "SeriesData", (function() { return u })); var s, r = i("Eyy1"), n = i("k9/m"); ! function(e) { e[e.FromLeft = -1] = "FromLeft", e[e.FromRight = 1] = "FromRight" }(s || (s = {})); const o = { open: e => e[1], high: e => e[2], low: e => e[3], close: e => e[4], hl2: e => (e[2] + e[3]) / 2, hlc3: e => (e[2] + e[3] + e[4]) / 3, ohlc4: e => (e[1] + e[2] + e[3] + e[4]) / 4 }, a = ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]; function l() { const e = new Map; return a.forEach((t, i) => { e.set(t, c(t)) }), e } function c(e) { return o[e] } function h(e, t) { return null == e[t] } class u { constructor() { this.m_bars = new n.PlotList(l(), h), this.m_nsBars = new n.PlotList(l(), h) } bars() { return this.m_bars } nsBars() { return this.m_nsBars } size() { return this.m_bars.size() + this.m_nsBars.size() } each(e) { this.m_bars.each(e), this.m_nsBars.each(e) } clear() { this.m_bars.clear(), this.m_nsBars.clear(), this.lastProjectionPrice = void 0 } isEmpty() { return this.m_bars.isEmpty() && this.m_nsBars.isEmpty() } first() { return this.m_bars.isEmpty() ? this.m_nsBars.first() : this.m_bars.first() } last() { return this.m_nsBars.isEmpty() ? this.m_bars.last() : this.m_nsBars.last() } search(e, t) { return this.nsBars().isEmpty() ? this.bars().search(e, t) : this.bars().isEmpty() || Object(r.ensureNotNull)(this.nsBars().firstIndex()) <= e ? this.nsBars().search( e, t) : this.bars().search(e, t) } valueAt(e) { const t = this.search(e); return null !== t ? t.value : null } plotValueToTimePointIndex(e, t, i) { if (i === s.FromRight) { const i = (i, s) => { const r = s[t]; return null != r && e >= r }, s = this.m_bars.findLast(i); if (null !== s) return s.index; const r = this.m_nsBars.findLast(i); return null !== r ? r.index : this.m_bars.firstIndex() } if (i === s.FromLeft) { const i = (i, s) => { const r = s[t]; return null != r && e <= r }, s = this.m_bars.findFirst(i); if (null !== s) return s.index; const r = this.m_nsBars.findFirst(i); return null !== r ? r.index : this.m_bars.lastIndex() } throw new Error("plotValueToTimePointIndex: unsupported search mode") } moveData(e) { this.m_bars.move(e), this.m_nsBars.move(e) } } }, XRI5: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SymbolExtrapolator", (function() { return c })); var s = i("Eyy1"), r = i("Y7w9"), n = i("IiTo"), o = i("IDnv"), a = i("LxhU"); function l(e, t) { return e.length > t } class c { constructor(e, t, i = 2e5) { this._firstRealBarTimeMs = null, this._historyBarsCache = [], this._projectionFirstIndex = 1 / 0, this._barsTimes = [], this ._minFutureBarsCount = 0, this._lastRealBarTimeMs = null, this ._futureBarsCache = [], this._symbolInfo = e, this._interval = a.Interval.parse( t), this._extrapolateLimit = i, this._barBuilder = Object(n.newBarBuilder)( t, new n.SessionInfo(e.timezone, e.session, e.session_holidays, e .corrections), null) } destroy() { this.clear() } interval() { return this._interval } barBuilder() { return this._barBuilder } symbolInfo() { return this._symbolInfo } clear() { this._firstRealBarTimeMs = null, this._historyBarsCache = [], this._barsTimes = [], this._lastRealBarTimeMs = null, this._futureBarsCache = [], this ._minFutureBarsCount = 0, this._projectionFirstIndex = 1 / 0 } firstFutureBarIndex() { return this._barsTimes.length } futureBars() { return this._futureBarsCache } replaceBarsTimesTail(e, t = e.length) { if (0 === e.length) return; if (0 === this._barsTimes.length) return void this.setBarsTimes(e, t); const i = e[0], n = this._barsTimes[this._barsTimes.length - 1], o = i > n ? this._barsTimes.length : Object(r.lowerbound_int)(this._barsTimes, i); 0 !== o ? (this._barsTimes.splice(o, this._barsTimes.length, ...e), this ._projectionFirstIndex = t === e.length ? this._barsTimes.length : this ._barsTimes.indexOf(e[t]), Object(s.assert)(-1 !== this ._projectionFirstIndex, "something went wrong"), n !== e[e.length - 1] && this._setLastRealBarTime(e[e.length - 1])) : this.setBarsTimes(e, t) } setBarsTimes(e, t = e.length) { const i = this._barsTimes; if (this._barsTimes = e.slice(), this._projectionFirstIndex = 0 === this._barsTimes .length ? 1 / 0 : t, 0 === e.length) return this._historyBarsCache = [], this ._futureBarsCache = [], this._firstRealBarTimeMs = null, void(this ._lastRealBarTimeMs = null); 0 !== i.length && i[i.length - 1] === e[e.length - 1] || this._setLastRealBarTime(e[ e.length - 1]), 0 !== i.length && i[0] === e[0] || (this ._historyBarsCache = [], this._firstRealBarTimeMs = e[0]) } extrapolateTimeWithOffsetToTime(e, t) { if (0 === t) return { timeMs: e, exact: !0 }; 0 === this._barsTimes.length && (t < 0 ? null === this._firstRealBarTimeMs ? this ._firstRealBarTimeMs = e : (this._extendHistoryCacheToTimeFromRight(Math .min(e, null !== this._lastRealBarTimeMs ? this._lastRealBarTimeMs : 1 / 0)), this._ensureExtrapolatedToHistoryTime(e)) : null === this ._lastRealBarTimeMs ? this._lastRealBarTimeMs = e : (this ._extendFutureCacheToTimeFromLeft(Math.max(e, null !== this ._firstRealBarTimeMs ? this._firstRealBarTimeMs : 1 / 0)), this ._ensureExtrapolatedToFutureTime(e))); const i = this.indexOfTime(e); if (null === i) return null; const s = this._timeOfBarIndex(i.index + t); return null === s ? null : ((i.index < 0 || this._projectionFirstIndex <= i .index) && (s.exact = !1), s) } indexOfTime(e) { if (null !== this._firstRealBarTimeMs && e < this._firstRealBarTimeMs) { this._ensureExtrapolatedToHistoryTime(e); let t = Object(r.lowerbound_int)(this._historyBarsCache, e); if (0 !== this._historyBarsCache.length && 0 === t && e < this ._historyBarsCache[0]) return null; t !== this._historyBarsCache.length && this._historyBarsCache[t] === e || (t -= 1); return { index: t - this._historyBarsCache.length, timeMs: this._historyBarsCache[t] } } if (null !== this._lastRealBarTimeMs && e > this._lastRealBarTimeMs) { this._ensureExtrapolatedToFutureTime(e); let t = Object(r.lowerbound_int)(this._futureBarsCache, e); if (0 !== this._futureBarsCache.length && t === this._futureBarsCache.length && e > this._futureBarsCache[this._futureBarsCache.length - 1]) return null; this._futureBarsCache[t] !== e && (t -= 1); const i = Math.max(1, this._barsTimes.length) + t; return { index: i, timeMs: i === this._barsTimes.length - 1 ? Object(s.ensureNotNull)(this ._lastRealBarTimeMs) : this._futureBarsCache[t] } } if (0 === this._barsTimes.length) return null !== this._firstRealBarTimeMs && this ._firstRealBarTimeMs <= e || null !== this._lastRealBarTimeMs && e <= this ._lastRealBarTimeMs ? { index: 0, timeMs: Object(s.ensureNotNull)(this._timeOfBarIndex(0)).timeMs } : null; let t = Object(r.lowerbound_int)(this._barsTimes, e); return this._barsTimes[t] !== e && (t -= 1), { index: t, timeMs: this._barsTimes[t] } } setMinFutureBarsCount(e) { this._minFutureBarsCount = e, 0 !== this._barsTimes.length && this ._ensureExtrapolatedToFutureBar(e) } ensureExtrapolatedToFutureTime(e) { this._ensureExtrapolatedToFutureTime(e) } _setLastRealBarTime(e) { const t = this._futureBarsCache.length, i = Object(r.upperbound_int)(this._futureBarsCache, e); 0 === i ? this._extendFutureCacheToTimeFromLeft(e) : (this._lastRealBarTimeMs = e, this._futureBarsCache = this._futureBarsCache.slice(i)), this ._ensureExtrapolatedToFutureBar(Math.max(t, this._minFutureBarsCount)) } _timeOfBarIndex(e) { var t; if (e < 0) { const t = Math.abs(e); this._ensureExtrapolatedToHistoryBar(t); const i = this._historyBarsCache.length - t; return i < 0 ? null : { timeMs: this._historyBarsCache[i], exact: !1 } } if (0 === e && 0 === this._barsTimes.length) return { timeMs: Object(s.ensureNotNull)(null !== (t = this._firstRealBarTimeMs) && void 0 !== t ? t : this._lastRealBarTimeMs), exact: !1 }; if (e >= this._barsTimes.length) { const t = e - Math.max(1, this._barsTimes.length); return this._ensureExtrapolatedToFutureBar(t + 1), t >= this._futureBarsCache .length ? null : { timeMs: this._futureBarsCache[t], exact: !1 } } return { timeMs: this._barsTimes[e], exact: e < this._projectionFirstIndex } } _extendFutureCacheFromRight(e) { const t = 0 !== this._futureBarsCache.length ? this._futureBarsCache[this ._futureBarsCache.length - 1] : this._lastRealBarTimeMs; if (null === t) return !1; const i = e(t, this._futureBarsCache.length); return 0 !== i.length && (this._futureBarsCache = this._futureBarsCache.concat(i), ! 0) } _extendHistoryCacheFromLeft(e) { const t = 0 !== this._historyBarsCache.length ? this._historyBarsCache[0] : this ._firstRealBarTimeMs; if (null === t) return; const i = e(t, this._historyBarsCache.length); this._historyBarsCache = i.concat(this._historyBarsCache) } _extendFutureCacheToTimeFromLeft(e) { if (null !== this._lastRealBarTimeMs && this._lastRealBarTimeMs <= e) return; if (Object(s.assert)(0 === this._barsTimes.length || e === this._barsTimes[this ._barsTimes.length - 1], "invalid argument"), this._lastRealBarTimeMs = e, 0 === this._futureBarsCache.length) return; const t = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, e, this ._futureBarsCache[0] - 1, this._extrapolateLimit, !0).times; this._futureBarsCache = t.concat(this._futureBarsCache) } _extendHistoryCacheToTimeFromRight(e) { if (null !== this._firstRealBarTimeMs && this._firstRealBarTimeMs >= e) return; if (Object(s.assert)(0 === this._barsTimes.length, "bars should be empty"), this ._firstRealBarTimeMs = e, 0 === this._historyBarsCache.length) return; const t = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, this ._historyBarsCache[this._historyBarsCache.length - 1], e - 1, this ._extrapolateLimit, !0).times; this._historyBarsCache = this._historyBarsCache.concat(t) } _ensureExtrapolatedToFutureBar(e) { return !(this._futureBarsCache.length >= e || l(this._futureBarsCache, this ._extrapolateLimit)) && this._extendFutureCacheFromRight((t, i) => Object(o .extrapolateBarsFrontByCount)(this._barBuilder, t, e - i, !0).times) } _ensureExtrapolatedToFutureTime(e) { null !== this._lastRealBarTimeMs && this._lastRealBarTimeMs >= e || l(this ._futureBarsCache, this._extrapolateLimit) || 0 !== this._futureBarsCache .length && this._futureBarsCache[this._futureBarsCache.length - 1] >= e || (this ._extendFutureCacheFromRight((t, i) => Object(o.extrapolateBarsFrontToTime)( this._barBuilder, t, e, this._extrapolateLimit, !0).times), this ._futureBarsCache[this._futureBarsCache.length - 1] < e && this ._ensureExtrapolatedToFutureBar(this._futureBarsCache.length + 1)) } _ensureExtrapolatedToHistoryBar(e) { this._historyBarsCache.length >= e || l(this._historyBarsCache, this ._extrapolateLimit) || this._extendHistoryCacheFromLeft((t, i) => Object(o .extrapolateBarsFrontByCount)(this._barBuilder, t, -(e - i), !0).times .reverse()) } _ensureExtrapolatedToHistoryTime(e) { null !== this._firstRealBarTimeMs && this._firstRealBarTimeMs <= e || l(this ._historyBarsCache, this._extrapolateLimit) || 0 !== this._historyBarsCache .length && this._historyBarsCache[0] <= e || (this._extendHistoryCacheFromLeft(( t, i) => { const s = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, t - 1, e - 1, this._extrapolateLimit, !0).times; return s[s.length - 1] === t ? s.slice(0, -1) : s }), (0 === this._historyBarsCache.length || this._historyBarsCache[0] > e) && this._ensureExtrapolatedToHistoryBar(this._historyBarsCache .length + 1)) } } }, XUCF: function(e, t, i) { "use strict"; var s = i("Hr11").sign, r = i("Ss5c").LineDataSource, n = i("Ocx9").DefaultProperty; class o { constructor(e, t, i) { this._source = e, this._index = t, this._bars = i || [] } setBars(e) { this._bars = e || [] } clone(e) { return new o(e, this._index, TradingView.clone(this._bars)) } createBar() { var e = this._source.properties().averageHL.value(), t = this._source.properties().variance.value() / 100, i = this._source._model.mainSeries().base(), s = Math.random(), r = e * (1 - 2 * s) * t, n = e * (1 + (.5 - (s = Math.random())) * t), o = r - n / 2, a = o + n; return { o: (o + Math.random() * n) / i, h: a / i, l: o / i, c: (o + Math.random() * n) / i } } generate() { this._bars = []; var e = this._source.points(), t = e[this._index], i = e[this._index + 1]; if (t && i && t.index !== i.index) { this._avgHL = this._source.properties().averageHL.value(), this._variance = this ._source.properties().variance.value() / 100; for (var r = this._index ? t.index + 1 : t.index, n = s(i.index - t.index), o = r; o !== i.index; o += n) this._bars.push(this.createBar()) } } bars() { return this._bars } setSize(e) { if (e < this._bars.length) this._bars.splice(e, this._bars.length - e); else for (; this._bars.length < e;) this._bars.push(this.createBar()) } } class a extends r { constructor(e, t, s) { var r = t || a.createProperties(); if (super(e, r), this._segments = [], !s) { var n = Math.round(this.calculateATR(e)); r.averageHL.setValue(n) } r.averageHL.listeners().subscribe(this, a.prototype.regenerate), r.variance .listeners().subscribe(this, a.prototype.regenerate), r.points || r.addProperty( "points"), this._currentAverageHL = this._properties.averageHL.value(), this ._currentVariance = this._properties.variance.value(), this._currentInterval = e .mainSeries().interval(), this.properties().onRestoreFactoryDefaults() .subscribe(this, this._handleRestoringFactoryDefaults), i.e("lt-pane-views") .then(i.t.bind(null, "dMkl", 7)).then(({ GhostFeedPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } isSynchronizable() { return !1 } _handleRestoringFactoryDefaults() { var e = Math.round(this.calculateATR()); this.properties().averageHL.setValue(e) } destroy() { this.properties().onRestoreFactoryDefaults().unsubscribe(this, this ._handleRestoringFactoryDefaults), super.destroy() } regenerate() { this._currentAverageHL = this._properties.averageHL.value(), this._currentVariance = this._properties.variance.value(), this._segments.forEach((function(e) { e.generate() })), this.updateAllViews(), this._model.updateSource(this) } propertiesChanged() { super.propertiesChanged(), this._currentAverageHL === this._properties.averageHL .value() && this._currentVariance === this._properties.variance.value() || this .regenerate() } pointsCount() { return -1 } name() { return "Ghost Feed" } segmentBars(e) { return this._segments[e].bars() } segments() { return this._segments } generateBars(e) { this._segments.length <= e && this._segments.push(new o(this, e)), this._segments[e] .generate() } addPoint(e) { if (this._points.length > 0 && this._points[this._points.length - 1].index === e .index) { this._lastPoint = null, this.normalizePoints(), this.createServerPoints(); for (var t = 0; t < this._points.length; t++) this._createPointProperty(t); return !0 } var i = r.prototype.addPoint.call(this, e); return this._finished && (this._lastPoint = null), this._points.length > 1 && this .generateBars(this._points.length - 2), i || this._finished } finish() { this._finished = !0, this._lastPoint = null, this.normalizePoints(), this .createServerPoints() } setPoint(e, t, i) { if (super.setPoint(e, t, i), e > 0) { var s = this.points()[e - 1], r = t.index - s.index; this._segments[e - 1].setSize(Math.abs(r)) } if (e < this.points().length - 1) { r = this.points()[e + 1].index - t.index; this._segments[e].setSize(Math.abs(r)) } } state(e) { var t = r.prototype.state.call(this, e); return t.segments = this._segments.map((function(e) { return { bars: e.bars() } })), t } restoreData(e) { var t = this; e.segments && (this._segments = e.segments.map((function(e, i) { return new o(t, i, [].concat(e.bars)) }))), this._currentAverageHL = this._properties.averageHL.value(), this ._currentVariance = this._properties.variance.value() } onData(e) { if (super.onData(e), 0 === this.pointsProperty().childs().points._childs.length) for (var t = 0; t < this._points.length; t++) this._createPointProperty(t); this._currentInterval !== this._model.mainSeries().interval() && (this.regenerate(), this._currentInterval = this._model.mainSeries().interval()) } cloneData(e) { var t = this; this._segments = e._segments.map((function(e) { return e.clone(t) })) } calculateATR(e) { var t = (void 0 !== e ? e : this._model).mainSeries(), i = []; t.bars().each((function(e, t) { i.push(t[TradingView.HIGH_PLOT] - t[TradingView.LOW_PLOT]) })); var s = 0 === i.length ? 0 : i.reduce((function(e, t) { return e + t }), 0) / i.length; return s *= t.base() } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "fIc+"))) .GhostFeedDefinitionsViewModel } static createProperties(e) { var t = new n("linetoolghostfeed", e); return a._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e) } } t.LineToolGhostFeed = a }, XXdw: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "StoriesTimeLineItemType", (function() { return s })), function(e) { e[e.Image = 0] = "Image", e[e.Emoji = 1] = "Emoji" }(s || (s = {})) }, XcdR: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); var s = i("txPx"), r = i("RDU5"); const n = Object(s.getLogger)("Chart.ChartUndoModel"); class o extends r.UndoCommand { constructor(e, t, i) { super(i, !1), this._newRightOffsetAndBarSpacing = null, this.setCustomFlag( "doesnt_affect_save", !0), this._model = e, this ._rightOffsetAndBarSpacing = t } undo() { if (null !== this._newRightOffsetAndBarSpacing) return void n.logDebug( "TimeScaleChangeUndoCommand.undo: Command is already undone"); const e = this._model.timeScale(); this._newRightOffsetAndBarSpacing = { barSpacing: e.barSpacing(), rightOffset: e.rightOffset() }, e.setBarSpacing(this._rightOffsetAndBarSpacing.barSpacing), e .setRightOffset(this._rightOffsetAndBarSpacing.rightOffset), this._model .lightUpdate() } redo() { if (null === this._newRightOffsetAndBarSpacing) return void n.logDebug( "TimeScaleChangeUndoCommand.redo: Command is not undone"); const e = this._model.timeScale(); e.setBarSpacing(this._newRightOffsetAndBarSpacing.barSpacing), e.setRightOffset( this._newRightOffsetAndBarSpacing.rightOffset), this._model .lightUpdate(), this._newRightOffsetAndBarSpacing = null } } }, XlJ7: function(e, t, i) { "use strict"; function s(e, t, i, s) { return `${s ? s + " " : ""}${i ? i + " " : ""}${e}px ${t}` } i.r(t), i.d(t, "makeFont", (function() { return s })), i.d(t, "parseFont", (function() { return n })); const r = /(bold )?(italic )?(\d+)(px|pt) (.*)$/; function n(e) { const t = r.exec(e); return null === t ? null : { family: t[5], size: parseInt(t[3]) * ("pt" === t[4] ? .75 : 1), bold: Boolean(t[1]), italic: Boolean(t[2]) } } }, Xyly: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolBezierQuadro", (function() { return n })); var s = i("Ocx9"), r = i("Ss5c"); class n extends r.LineDataSource { constructor(e, t) { const s = t || n.createProperties(); super(e, s), this._controlPoint = null, i.e("lt-pane-views").then(i.bind(null, "4Ptp")).then(t => { this._setPaneViews([new t.BezierQuadroPaneView(this, e)]) }) } pointsCount() { return 2 } properties() { return super.properties() } name() { return "Curve" } setLastPoint(e, t) { super.setLastPoint(e, t), this._controlPoint = this._calculateControlPoint() } addPoint(e, t, i) { const s = super.addPoint(e, t, i); if (s) { const e = this._calculateControlPoint(); this._points.push(e), this._controlPoint = null, i || (this .normalizePoints(), this.createServerPoints()), this ._createPointProperty(2) } return s } restorePoints(e, t, i) { super.restorePoints(e, t, i), this._createPointProperty(2) } controlPoint() { return this._controlPoint } static createProperties(e) { const t = new s.DefaultProperty("linetoolbezierquadro", e); return n._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "b4fl")).then( e => e.GeneralBezierDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e) } _calculateControlPoint() { const e = this.pointToScreenPoint(this.points()[0])[0], t = this.pointToScreenPoint(this.points()[1])[0], i = t.subtract(e).scaled(.5).transposed().scaled(.3), s = e.add(t).scaled(.5).add(i); return this.screenPointToPoint(s) } } }, XzZr: function(e, t, i) { "use strict"; var s = i("ogJP").declareClassAsPureInterface; function r() {} TradingView.WEB_SOCKET_WAS_CONNECTED = !1, r.REBIND_STUDY_STANDALONE_TO_CHILD = 1, r .REBIND_STUDY_CHILD_TO_STANDALONE = 2, r.prototype.defaultWatchlistSymbols = function() {}, r.prototype.defaultResolutions = function() {}, r.prototype.availableCurrencies = function() {}, r.prototype.availableUnits = function() {}, r.prototype .supportedSymbolsTypes = function() {}, r.prototype.supportedExchangesList = function() {}, r.prototype .symbolsGrouping = function() {}, r.prototype.quoteCreateSession = function(e) {}, r .prototype.quoteDeleteSession = function(e) {}, r.prototype.quoteSetFields = function(e, t) {}, r.prototype.quoteAddSymbols = function(e, t) {}, r.prototype.quoteRemoveSymbols = function(e, t) {}, r.prototype.quoteFastSymbols = function(e, t) {}, r.prototype .depthCreateSession = function(e, t, i) {}, r.prototype.depthDeleteSession = function(e) {}, r.prototype.depthSetSymbol = function(e, t) {}, r.prototype.depthClearSymbol = function( e) {}, r.prototype.depthSetScale = function(e, t) {}, r.prototype.chartCreateSession = function(e, t) {}, r.prototype.chartDeleteSession = function(e) {}, r.prototype .createSession = function(e, t) {}, r.prototype.removeSession = function(e) {}, r.prototype .connected = function() {}, r.prototype.connect = function() {}, r.prototype.disconnect = function() {}, r.prototype.switchTimezone = function(e, t) {}, r.prototype.resolveSymbol = function(e, t, i, s, r) {}, r.prototype.createSeries = function(e, t, i, s, r, n, o, a) {}, r.prototype.removeSeries = function(e, t, i) {}, r.prototype.modifySeries = function(e, t, i, s, r, n, o) {}, r.prototype.requestMoreData = function(e, t, i, s) {}, r.prototype .requestMetadata = function(e, t, i) {}, r.prototype.isCanCreateStudy = function(e, t) {}, r .prototype.createStudy = function(e, t, i, s, r, n, o) {}, r.prototype.rebindStudy = function(e, t, i, s, r, n, o, a) {}, r.prototype.removeStudy = function(e, t, i) {}, r .prototype.modifyStudy = function(e, t, i, s, r) {}, r.prototype.createPointset = function( e, t, i, s, r, n, o) {}, r.prototype.modifyPointset = function(e, t, i, s, r) {}, r .prototype.removePointset = function(e, t, i) {}, r.prototype.requestMoreTickmarks = function(e, t, i, s) {}, r.prototype.requestFirstBarTime = function(e, t, i, s) {}, r .prototype._invokeHandler = function(e, t) {}, r.prototype._sendRequest = function(e, t) {}, r.prototype._onMessage = function(e) {}, r.prototype._dispathNotification = function(e) {}, r.prototype._invokeNotificationHandler = function(e, t, i) {}, r.prototype._notifySessions = function(e) {}, r.prototype.unpack = function(e) {}, r.prototype.searchSymbols = function(e, t, i, s, r, n, o, a, l, c) {}, r.prototype .serverTimeOffset = function() {}, r.prototype.getMarks = function(e, t, i, s, r) {}, r .prototype.getTimescaleMarks = function(e, t, i, s, r) {}, s(r, "ChartApiInterface"), e .exports.HandlerInfo = function(e, t) { this.handler = e, this.customId = t }, e.exports.ChartApiInterface = r }, Y5iK: function(e, t, i) { "use strict"; i.r(t), i.d(t, "MainSeriesScaleRatioProperty", (function() { return n })); var s = i("aIyQ"), r = i.n(s); class n { constructor(e) { this._changed = new r.a, this._model = e } getStepChangeValue() { return .1 } getMinValue() { return 1e-7 } getMaxValue() { return 99999999 } value() { return this._model.mainSeriesScaleRatio() } setValue(e, t) { (e !== this.value() || t) && (this._model.setMainSeriesScaleRatio(e), this ._onChanged()) } state() { return null } clone() { return new n(this._model) } listeners() { return this._changed } subscribe(e, t) { this._changed.subscribe(e, t) } unsubscribe(e, t) { this._changed.unsubscribe(e, t) } unsubscribeAll(e) { this._changed.unsubscribeAll(e) } _onChanged() { this._changed.fire(this) } } }, Y7w9: function(e, t, i) { "use strict"; function s(e, t) { return e < t } function r(e, t, i, s = 0, r = e.length) { let n = r - s; for (; 0 < n;) { const r = n >> 1, o = s + r; i(e[o], t) ? (s = o + 1, n -= r + 1) : n = r } return s } function n(e, t, i = 0, n = e.length) { return r(e, t, s, i, n) } function o(e, t, i, s = 0, r = e.length) { let n = r - s; for (; 0 < n;) { const r = n >> 1, o = s + r; i(t, e[o]) ? n = r : (s = o + 1, n -= r + 1) } return s } function a(e, t, i = 0, r = e.length) { return o(e, t, s, i, r) } function l(e, t) { return e.filter(e => !t.includes(e)) } function c(e, t) { const i = e.indexOf(t); return i < 0 ? e.slice() : [t].concat(e.slice(0, i)).concat(e.slice(i + 1)) } function h(e, t, i) { const s = new Set(t), r = [], o = [], a = []; return e.forEach((e, t) => { s.has(e) ? o.push(e) : (r.push(e), a.push(t)) }), i = i < e.length - 1 ? n(a, i + 1) : r.length, r.splice(i, 0, ...o), { newItems: r, movedItemsStartIndex: i } } function u(e, t, i) { const s = new Set(t), r = [], o = [], a = []; return e.forEach((e, t) => { s.has(e) ? o.push(e) : (r.push(e), a.push(t)) }), i = i <= e.length - 1 ? n(a, i) : r.length, r.splice(i, 0, ...o), { newItems: r, movedItemsStartIndex: i } } function d(e, t) { const i = new Set; return e.forEach(e => { t.has(e) && i.add(e) }), i } i.r(t), i.d(t, "lowerbound", (function() { return r })), i.d(t, "lowerbound_int", (function() { return n })), i.d(t, "upperbound", (function() { return o })), i.d(t, "upperbound_int", (function() { return a })), i.d(t, "subtract", (function() { return l })), i.d(t, "moveToHead", (function() { return c })), i.d(t, "moveAfter", (function() { return h })), i.d(t, "moveBefore", (function() { return u })), i.d(t, "intersect", (function() { return d })) }, YCFM: function(e, t, i) {}, YWnQ: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "SymbolErrorPermissionDeniedReason", (function() { return s })), i.d(t, "permissionDenied", (function() { return r })), function(e) { e.Symbol = "symbol", e.GroupPermission = "group" }(s || (s = {})); const r = "permission denied" }, YdVo: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolPath", (function() { return c })); var s = i("Eyy1"), r = i("aO4+"), n = i("Ocx9"), o = i("Zp/P"), a = i("Ss5c"), l = i("j3hX"); class c extends a.LineDataSource { constructor(e, t) { const s = t || c.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "JeuX")).then(t => { this._setPaneViews([new t.PathPaneView(this, e)]) }) } pointsCount() { return -1 } properties() { return super.properties() } name() { return "Path" } hasEditableCoordinates() { return !1 } addPoint(e, t, i) { var n; const a = Object(s.ensureNotNull)(this.priceScale()), l = this._model.timeScale().indexToCoordinate(e.index), c = e.price, h = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ? void 0 : n.firstValue()), u = a.priceToCoordinate(c, h); if (this._points.length > 0) { const e = this._points[this._points.length - 1], t = this._model.timeScale().indexToCoordinate(e.index), i = e.price, s = a.priceToCoordinate(i, h); if (new r.Point(l, u).subtract(new r.Point(t, s)).length() < Object(o .interactionTolerance)().minDistanceBetweenPoints) return this ._lastPoint = null, this.normalizePoints(), this .createServerPoints(), !0 } return super.addPoint(e, t, i) } static createProperties(e) { const t = new n.DefaultProperty("linetoolpath", e); return c._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "WW+G")).then( e => e.PathDefinitionsViewModel) } static _configureProperties(e) { a.LineDataSource._configureProperties(e), e.addChild("linesColors", new l .LineToolColorsProperty([e.childs().lineColor])) } } }, "Ye2/": function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "LineToolBarsPatternMode", (function() { return s })), function(e) { e[e.Bars = 0] = "Bars", e[e.Line = 1] = "Line", e[e.OpenClose = 2] = "OpenClose", e[e .LineOpen = 3] = "LineOpen", e[e.LineHigh = 4] = "LineHigh", e[e.LineLow = 5] = "LineLow", e[e.LineHL2 = 6] = "LineHL2" }(s || (s = {})) }, Yj6H: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("ogJP"), n = i("aIyQ"), o = i.n(n), a = i("Y7w9"), l = i("Qb4w"), c = i("TTFo"), h = i("qJq3"), u = i("7ktv"), d = i("tc+8"), p = i.n(d), _ = i("3ClC"), m = i("/tGj"), f = i("n5al"), g = i("SwuQ"), b = i("s1Gx"), v = i("Hr11"); class S { constructor(e, t) { if (this._base = e, this._integralDividers = t, Object(v.isBaseDecimal)(this._base)) this._fractionalDividers = [2, 2.5, 2]; else { this._fractionalDividers = []; for (let e = this._base; 1 !== e;) { if (e % 2 == 0) this._fractionalDividers.push(2), e /= 2; else { if (e % 5 != 0) throw new Error("unexpected base"); this._fractionalDividers.push(2), this._fractionalDividers.push(2.5), e /= 5 } if (this._fractionalDividers.length > 100) throw new Error( "something wrong with base") } } } tickSpan(e, t, i) { const s = 0 === this._base ? 0 : 1 / this._base; let r = Math.pow(10, Math.max(0, Math.ceil(Object(v.log10)(e - t)))), n = 0, o = this._integralDividers[0]; for (;;) { const e = Object(v.greaterOrEqual)(r, s, 1e-14) && r > s + 1e-14, t = Object(v.greaterOrEqual)(r, i * o, 1e-14), a = Object(v.greaterOrEqual)(r, 1, 1e-14); if (!(e && t && a)) break; r /= o, o = this._integralDividers[++n % this._integralDividers.length] } if (r <= s + 1e-14 && (r = s), r = Math.max(1, r), this._fractionalDividers.length > 0 && Object(v.equal)(r, 1, 1e-14)) for (n = 0, o = this._fractionalDividers[0]; Object(v.greaterOrEqual)(r, i * o, 1e-14) && r > s + 1e-14;) r /= o, o = this._fractionalDividers[++n % this._fractionalDividers.length]; return r } } class y { constructor(e, t, i, s) { this._marks = null, this._priceScale = e, this._base = t, this ._coordinateToLogicalFunc = i, this._logicalToCoordinateFunc = s } base() { return this._base } setBase(e) { if (e < 0) throw new Error("base < 0"); this._base = e } tickSpan(e, t, i = 0) { if (e < t) throw new Error("high < low"); const s = this._priceScale.height(), r = (e - t) * this._tickMarkHeight() / s, n = new S(this._base, [2, 2.5, 2]), o = new S(this._base, [2, 2, 2.5]), a = new S(this._base, [2.5, 2, 2]); let l = 0; const c = n.tickSpan(e, t, r); c > i && (l = c); const h = o.tickSpan(e, t, r); h > i && (l = Math.min(l, h)); const u = a.tickSpan(e, t, r); return u > i && (l = Math.min(l, u)), l > 0 ? l : e - t } rebuildTickMarks() { this._marks = null } marks() { return null === this._marks && (this._marks = this._rebuildTickMarksImpl()), this ._marks } _fontHeight() { return this._priceScale.fontSize() } _tickMarkHeight() { return Math.ceil(2.5 * this._fontHeight()) } _rebuildTickMarksImpl() { const e = this._priceScale, t = [], i = e.mainSource(); if (e.isEmpty() || null === i) return t; let s = i.firstValue(); null === s && (s = 0); const r = e.height(), n = this._coordinateToLogicalFunc(r - 1, s), o = this._coordinateToLogicalFunc(0, s), a = Math.max(n, o), l = Math.min(n, o); if (a === l) return t; let c = this.tickSpan(a, l), h = a % c; h += h < 0 ? c : 0; const u = a >= l ? 1 : -1; let d = null; const p = e.formatter(); let _ = NaN; for (let i = a - h; i > l; i -= c) { i === _ && (c = this.tickSpan(a, l, c)), _ = i; const r = this._logicalToCoordinateFunc(i, s); null !== d && Math.abs(r - d) < this._tickMarkHeight() || (t.push({ coord: r, label: p.format(i) }), d = r, e.isLog() && (c = this.tickSpan(i * u, l))) } return t } } var w = i("CW80"), P = i("mMWL"), C = i("GH0z"), x = i("kcTO"); i.d(t, "PriceScaleBase", (function() { return O })); const T = new C.PercentageFormatter, I = new x.PriceFormatter(100, 1), M = { autoScale: !0, autoScaleDisabled: !1, lockScale: !1, percentage: !1, percentageDisabled: !1, log: !1, logDisabled: !1, alignLabels: !0, isInverted: !1, indexedTo100: !1 }; class O { constructor(e) { this._marksCache = null, this._onMarksChanged = new o.a, this.m_dataSources = [], this._sourcesForAutoscale = null, this._hasSeries = !1, this._studiesCount = 0, this._drawingCount = 0, this._seriesLikeSources = [], this ._seriesLikeSourcesSet = new Set, this._priceDataSources = [], this ._mainSource = null, this._lastSourceRemoved = new o.a, this ._scaleSeriesOnly = !1, this._invalidatedForRange = { isValid: !0, visibleBars: null }, this.m_priceRange = null, this.m_height = 0, this._margins = { top: 0, bottom: 0 }, this._correctedMarginsCache = null, this._topPixelMargin = 0, this ._bottomPixelMargin = 0, this._internalHeightCache = null, this ._internalHeightChanged = new o.a, this._priceRangeSnapshot = null, this ._currencyCache = null, this._unitCache = null, this ._recalculatePriceRangeOnce = !1, this._cachedOrderedSoruces = null, this ._scaleStartPoint = null, this._maxPriceRange = null, this._minPriceRange = null, this._priceRangeChanged = new o.a, this._sourcesToUpdateViews = null, this ._markBuilder = new y(this, 100, this._coordinateToLogical.bind(this), this ._logicalToCoordinate.bind(this)), this._formatter = null, this._id = "", e = Object.assign({}, M, e), this._properties = new p.a(e) } id() { return this._id } setId(e) { this._id = e } isLog() { return this._properties.childs().log.value() } isPercentage() { return this._properties.childs().percentage.value() } isInverted() { return this._properties.childs().isInverted.value() } isIndexedTo100() { return this._properties.childs().indexedTo100.value() } isAutoScale() { return this._properties.childs().autoScale.value() && !this.isLockScale() } isLockScale() { return this._properties.childs().lockScale.value() } isRegular() { return !this.isPercentage() && !this.isLog() && !this.isIndexedTo100() } properties() { return this._properties } height() { return this.m_height } setHeight(e) { this.m_height !== e && (this.m_height = e, this._invalidateInternalHeightCache(), this._marksCache = null) } internalHeight() { if (this._internalHeightCache) return this._internalHeightCache; const e = this.height() - this.topPixelMargin() - this.bottomPixelMargin(); return this._internalHeightCache = e, e } priceRange() { return this._makeSureItIsValid(), this.m_priceRange } setPriceRange(e, t, i) { if (!(e instanceof l.PriceRange)) throw new TypeError("incorrect price range"); const s = this.m_priceRange; if (!t && l.PriceRange.compare(s, e)) return; const r = null !== this._maxPriceRange && this._maxPriceRange.containsStrictly(e), n = null !== this._minPriceRange && e.containsStrictly(this._minPriceRange); this.isLockScale() && !t && (r || n) || (this._marksCache = null, this .m_priceRange = e, i || this._priceRangeChanged.fire(s, e)) } setMinPriceRange(e) { this._minPriceRange = e } setMaxPriceRange(e) { this._maxPriceRange = e } recalculatePriceRangeOnce() { this._recalculatePriceRangeOnce = !0 } priceRangeShouldBeRecalculatedOnce() { if (!this._recalculatePriceRangeOnce || this.isLockScale()) return !1; const e = this.mainSource(); return null !== e && e.priceRangeReady() } priceRangeChanged() { return this._priceRangeChanged } updateAllViews() { const e = this._getSourcesToUpdateViews(); for (const t of e) t.updateAllViews() } state() { var e; const t = this._properties.childs(); return { id: this._id, m_priceRange: (null === (e = this.priceRange()) || void 0 === e ? void 0 : e .serialize()) || null, m_isAutoScale: this.isAutoScale(), m_isPercentage: t.percentage.value(), m_isIndexedTo100: t.indexedTo100.value(), m_isLog: t.log.value(), m_isLockScale: this.isLockScale(), m_isInverted: this.isInverted(), m_height: this.m_height, m_topMargin: this._margins.top, m_bottomMargin: this._margins.bottom, alignLabels: t.alignLabels.value() } } restoreState(e) { let t = e.m_priceRange; if (void 0 === t) throw new TypeError("invalid state"); if (void 0 === e.m_isAutoScale) throw new TypeError("invalid state"); void 0 !== e.id && (this._id = e.id); const i = { autoScale: e.m_isAutoScale }; void 0 !== e.m_isPercentage && (i.percentage = e.m_isPercentage), void 0 !== e .m_isIndexedTo100 && (i.indexedTo100 = e.m_isIndexedTo100), void 0 !== e .m_isLog && (i.log = e.m_isLog), void 0 !== e.m_isLockScale && (i.lockScale = e .m_isLockScale), void 0 !== e.m_isInverted && this._properties.childs() .isInverted.setValue(e.m_isInverted), void 0 !== e.m_height && this.setHeight( Math.max(0, e.m_height)), this.setMode(i), t ? (t instanceof l.PriceRange || (t = new l.PriceRange(t)), this.setPriceRange(t, !0)) : this.m_priceRange = null, void 0 !== e.m_topMargin && (this._margins.top = e.m_topMargin), void 0 !== e.m_bottomMargin && (this._margins.bottom = e.m_bottomMargin), void 0 !== e.alignLabels && this._properties.childs().alignLabels.setValue(e .alignLabels), this._mainSource = null, this._scaleSeriesOnly = !1 } priceToLogical(e) { return this.isLog() && e ? Object(c.toLog)(e) : e } logicalToPrice(e) { return this.isLog() ? Object(c.fromLog)(e) : e } priceToCoordinate(e, t) { const i = this._priceToPercentOrIndexedTo100IfNeeded(e, t); return this._logicalToCoordinate(i) } coordinateToPrice(e, t) { let i = this._coordinateToLogical(e); return this.isPercentage() ? i = Object(c.fromPercent)(i, t) : this .isIndexedTo100() && (i = Object(c.fromIndexedTo100)(i, t)), i } mainSource() { if (null !== this._mainSource) return this._mainSource; let e; for (const t of this.m_dataSources) { if (t instanceof h.Series) { e = t; break }!e && t instanceof u.PriceDataSource && (e = t) } return this._mainSource = e || null, this._correctedMarginsCache = null, this ._mainSource } pricesArrayToCoordinates(e, t, i) { this._makeSureItIsValid(); const r = this.bottomPixelMargin(), n = Object(s.ensureNotNull)(this.priceRange()), o = n.minValue(), a = n.maxValue(), l = this.internalHeight() - 1, h = this.isInverted(), u = l / (a - o); void 0 === i && (i = e.length); const d = this.isPercentage(), p = this.isIndexedTo100(), _ = this.isLog(), m = this.m_height; let f, g; for (let s = 0; s < i; s++) f = e[s], Number.isFinite(f) && (d ? f = Object(c .toPercent)(f, t) : p ? f = Object(c.toIndexedTo100)(f, t) : _ && (f = Object(c.toLog)(f)), g = r + u * (f - o), e[s] = h ? g : m - 1 - g) } pointsArrayToCoordinates(e, t) { this._makeSureItIsValid(); const i = Object(s.ensureNotNull)(this.priceRange()), r = this.bottomPixelMargin(), n = i.minValue(), o = i.maxValue(), a = this.internalHeight() - 1, l = this.isInverted(), h = a / (o - n), u = e; if (this.isPercentage()) for (let e = 0; e < u.length; e++) u[e].y = Object(c.toPercent)(u[e].y, t); if (this.isIndexedTo100()) for (let e = 0; e < u.length; e++) u[e].y = Object(c.toIndexedTo100)(u[e].y, t); if (this.isLog()) for (let e = 0; e < u.length; e++) u[e].y = this.priceToLogical(u[e].y); for (let e = 0; e < u.length; e++) { const t = u[e].y; if (isNaN(t) || null == t) continue; const i = r + h * (t - n), s = l ? i : this.m_height - 1 - i; u[e].y = s } } barPricesToCoordinates(e, t) { this._makeSureItIsValid(); const i = Object(s.ensureNotNull)(this.priceRange()), r = e, n = this.bottomPixelMargin(), o = i.minValue(), a = i.maxValue(), l = this.internalHeight() - 1; let h = null; if (this.isPercentage() ? h = c.toPercent : this.isIndexedTo100() ? h = c .toIndexedTo100 : this.isLog() && (h = (e, t) => e ? Object(c.toLog)(e) : e), null !== h) for (let e = 0; e < r.length; e++) r[e] && (r[e].open = h(r[e].open, t), r[e] .high = h(r[e].high, t), r[e].low = h(r[e].low, t), r[e].close = h(r[e] .close, t), void 0 !== r[e].additionalPrice && (r[e] .additionalPrice = h(r[e].additionalPrice, t))); const u = l / (a - o), d = this.isInverted(); for (let e = 0; e < r.length; e++) { const t = r[e]; if (!t) continue; const i = n + u * (t.open - o), s = d ? i : this.m_height - 1 - i; t.open = s; const a = n + u * (t.high - o), l = d ? a : this.m_height - 1 - a; t.high = l; const c = n + u * (t.low - o), h = d ? c : this.m_height - 1 - c; t.low = h; const p = n + u * (t.close - o), _ = d ? p : this.m_height - 1 - p; if (t.close = _, void 0 !== t.additionalPrice) { const e = n + u * (t.additionalPrice - o); t.additionalPrice = d ? e : this.m_height - 1 - e } } } formatter() { return null === this._formatter && this.updateFormatter(), Object(s.ensureNotNull)( this._formatter) } updateFormatter() { this._marksCache = null; const e = this.mainSource(); let t = 100; e && (t = e.base()), this._formatter = null, this.isPercentage() ? (this ._formatter = T, t = 100) : this.isIndexedTo100() ? (this._formatter = new x .PriceFormatter(100, 1), t = 100) : this._formatter = e ? e.formatter() : I, this._markBuilder = new y(this, t, this._coordinateToLogical.bind(this), this ._logicalToCoordinate.bind(this)), this._markBuilder.rebuildTickMarks() } formatPrice(e, t) { const i = this._priceToPercentOrIndexedTo100IfNeeded(e, t); return this.formatter().format(i) } formatPriceAbsolute(e) { return this._mainSourceFormatter().format(e) } formatPricePercentage(e, t, i) { return e = Object(c.toPercent)(e, t), T.format(e, i) } dataSources() { return this.m_dataSources } seriesLikeSources() { return this._seriesLikeSources } addDataSource(e, t) { if (t || -1 === this.m_dataSources.indexOf(e)) { if (e instanceof u.PriceDataSource && (this._priceDataSources.push(e), e .currencyChanged().subscribe(this, () => this._currencyCache = null), e .unitChanged().subscribe(this, () => this._unitCache = null), Object(m .isSymbolSource)(e) && (this._seriesLikeSources.push(e), this ._seriesLikeSourcesSet.add(e), e.symbolResolved().subscribe(this, () => { this._currencyCache = null, this._unitCache = null }), e instanceof h.Series))) { const t = e.properties(); this._hasSeries || (t.childs().lockScale && (this.setMode({ lockScale: t.childs().lockScale.value() }), t.removeProperty("lockScale")), t.childs().pnfStyle.childs() .lockScale && t.childs().pnfStyle.removeProperty("lockScale")), this ._hasSeries = !0 } e.properties().visible.listeners().subscribe(this, this._dropScaleCache), Object(_.isStudy)(e) && (e.onIsActualIntervalChange().subscribe(this, this ._dropScaleCache), 0 === this._studiesCount && Object(P .hideAllIndicators)().subscribe(this, this._dropScaleCache), this ._studiesCount++), Object(w.isLineTool)(e) && (0 === this ._drawingCount && Object(P.hideAllDrawings)().subscribe(this, this ._dropScaleCache), this._drawingCount++), this.m_dataSources.push( e), this._mainSource = null, this._correctedMarginsCache = null, this ._sourcesToUpdateViews = null, this._dropScaleCache(), this .updateFormatter(), this._initScaleProperties(), this .invalidateSourcesCache() } } removeDataSource(e) { const t = this.m_dataSources.indexOf(e); if (Object(s.assert)(-1 !== t, "Source is not attached to scale"), e.properties() .visible.listeners().unsubscribe(this, this._dropScaleCache), this.m_dataSources .splice(t, 1), e instanceof u.PriceDataSource) { const t = this._priceDataSources.indexOf(e); if (Object(s.assert)(-1 !== t, "Source is not found"), this._priceDataSources .splice(t, 1), Object(m.isSymbolSource)(e)) { const t = this._seriesLikeSources.indexOf(e); Object(s.assert)(-1 !== t, "Source is not found"), this._seriesLikeSources .splice(t, 1), this._seriesLikeSourcesSet.delete(e), e.symbolResolved() .unsubscribeAll(this), e instanceof h.Series && (this._hasSeries = !1) } e.currencyChanged().unsubscribeAll(this), e.unitChanged().unsubscribeAll(this) } this.mainSource() || this.setMode({ autoScale: !0 }), Object(_.isStudy)(e) && (e.onIsActualIntervalChange().unsubscribe(this, this ._dropScaleCache), this._studiesCount--, 0 === this._studiesCount && Object(P.hideAllIndicators)().unsubscribe(this, this._dropScaleCache)), Object(w.isLineTool)(e) && (this._drawingCount--, 0 === this._drawingCount && Object(P.hideAllDrawings)().unsubscribe(this, this._dropScaleCache)), this ._mainSource = null, this._correctedMarginsCache = null, this ._sourcesForAutoscale = null, this._sourcesToUpdateViews = null, this.updateFormatter(), this .invalidateSourcesCache(), 0 === this.m_dataSources.length && this ._lastSourceRemoved.fire(), this._currencyCache = null, this._unitCache = null } currency(e) { if (null !== this._currencyCache && e.size() === this._currencyCache .availableCurrenciesCount) return this._currencyCache.value; let t; const i = new Set, r = new Set, n = new Set, o = new Map; let a, l = 0 === this._seriesLikeSources.length, c = !0, h = 0, u = 0; for (const u of this._seriesLikeSources) { if (!u.isVisible()) continue; const d = u.symbolInfo(); if (null === d) { t = null; break } const p = Object(f.symbolOriginalCurrency)(d); if (null === p) { t = null; break } o.set(p, Object(s.ensureNotNull)(Object(f.symbolOriginalCurrency)(d, !0))); const _ = u.currency(); if (null === _) { t = null; break } o.set(_, Object(s.ensureNotNull)(Object(f.symbolCurrency)(d, !0))); const m = Object(f.symbolBaseCurrency)(d); null !== m && r.add(m), c = c && p === _, n.add(_), i.add(p), void 0 === a ? a = _ : null !== a && a !== _ && (a = null), l || e.convertible(_) && Object(f .symbolCurrencyConvertible)(d) || (l = !0), h += 1 } if (null !== t) for (const i of this._priceDataSources) { if (this._seriesLikeSourcesSet.has(i)) continue; const r = i; if (!r.isCurrencySource() || !r.isVisible()) continue; const c = r.currency(); if (null === c) { t = null; break } n.add(c), u += 1; const d = Object(s.ensureNotNull)(r.symbolSource()), p = d.symbolInfo(); if (null === p) { t = null; break } if (l || e.convertible(c) && Object(f.symbolCurrencyConvertible)(p) || ( l = !0), o.set(c, Object(s.ensureNotNull)(Object(f.symbolCurrency)( p, !0))), !this._seriesLikeSourcesSet.has(d) || !d.isVisible()) { if (h > 0) a = null; else if (void 0 === a) a = c; else if (null !== a && a !== c) { a = null; break } l = !0; break } } return void 0 === t && (t = 0 === h && 0 === u ? null : { readOnly: l, selectedCurrency: a || null, currencies: n, originalCurrencies: i, baseCurrencies: r, symbolSourceCount: h, allCurrenciesAreOriginal: c, displayedValues: o }), this._currencyCache = { value: t, availableCurrenciesCount: e.size() }, t } unit(e) { if (null !== this._unitCache && e.size() === this._unitCache.availableUnitsCount) return this._unitCache.value; let t; const i = new Set, r = new Set, n = new Map, o = new Map; let l, c = 0 === this._seriesLikeSources.length ? new Set : e.allGroups(), h = !0, u = 0, d = 0; for (const s of this._seriesLikeSources) { if (!s.isVisible()) continue; const d = s.symbolInfo(); if (null === d) { t = null; break } const p = Object(f.symbolOriginalUnit)(d); if (null === p) { t = null; break } n.set(p, e.name(p)), o.set(p, e.description(p)); const _ = s.unit(); if (null === _) { t = null; break } if (n.set(_, e.name(_)), o.set(_, e.description(_)), h = h && p === _, r.add(_), i.add(p), void 0 === l ? l = _ : null !== l && l !== _ && (l = null), c .size > 0) { const t = Object(g.unitConvertibleGroups)(d, _, e); c = Object(a.intersect)(c, new Set(t)) } u += 1 } if (null !== t) for (const i of this._priceDataSources) { if (this._seriesLikeSourcesSet.has(i)) continue; const h = i; if (!h.isUnitSource() || !h.isVisible()) continue; const p = h.unit(); if (null === p) { t = null; break } r.add(p), d += 1; const _ = Object(s.ensureNotNull)(h.symbolSource()), m = _.symbolInfo(); if (null === m) { t = null; break } if (c.size > 0) { const t = Object(g.unitConvertibleGroups)(m, p, e); c = Object(a.intersect)(c, new Set(t)) } if (n.set(p, e.name(p)), o.set(p, e.description(p)), !this._seriesLikeSourcesSet.has(_) || !_.isVisible()) { if (u > 0) l = null; else if (void 0 === l) l = p; else if (null !== l && l !== p) { l = null; break } c = new Set; break } } if (void 0 === t) if (0 === u && 0 === d) t = null; else { const e = l || null; t = { availableGroups: c, selectedUnit: e, units: r, originalUnits: i, symbolSourceCount: u, allUnitsAreOriginal: h, names: n, descriptions: o } } return this._unitCache = { value: t, availableUnitsCount: e.size() }, t } setMargins(e) { if (!Object(r.isNumber)(e.top) || !Object(r.isNumber)(e.bottom)) throw new TypeError("invalid margin"); if (e.top < 0 || e.top > 30 || e.bottom < 0 || e.bottom > 30) throw new RangeError( "invalid margin"); this._margins.top === e.top && this._margins.bottom === e.bottom || (this._margins = e, this._correctedMarginsCache = null, this ._invalidateInternalHeightCache(), this._marksCache = null) } topMargin() { return this._correctedMargins().top } bottomMargin() { return this._correctedMargins().bottom } invalidateMargins() { this._correctedMarginsCache = null } topPixelMargin() { return this.isInverted() ? this.bottomMargin() * this.height() + this ._bottomPixelMargin : this.topMargin() * this.height() + this._topPixelMargin } bottomPixelMargin() { return this.isInverted() ? this.topMargin() * this.height() + this._topPixelMargin : this.bottomMargin() * this.height() + this._bottomPixelMargin } marks() { return this._makeSureItIsValid(), null === this._marksCache && (this._markBuilder .rebuildTickMarks(), this._marksCache = this._markBuilder.marks(), this ._onMarksChanged.fire()), this._marksCache } onMarksChanged() { return this._onMarksChanged } priceRangeInPrice() { if (this.isEmpty()) return null; const e = this.mainSource(); if (null === e) return null; const t = Object(s.ensureNotNull)(e.firstValue()), i = this.height(); return { from: this.coordinateToPrice(i - 1, t), to: this.coordinateToPrice(0, t) } } setPriceRangeInPrice(e) { if (this.isPercentage() || this.isIndexedTo100()) return; const t = this.isInverted(), i = t ? this.bottomMargin() : this.topMargin(), s = t ? this.topMargin() : this.bottomMargin(), r = this.isLog(); let n = r ? Object(c.toLog)(e.from) : e.from, o = r ? Object(c.toLog)(e.to) : e.to; const a = o - n; n += s * a, o -= i * a, this.setMode({ autoScale: !1 }), this.setPriceRange(new l.PriceRange(n, o)), this._marksCache = null, this ._onMarksChanged.fire() } hasMainSeries() { return this._hasSeries } getStudies() { return this.dataSources().filter(_.isStudy) } lastSourceRemoved() { return this._lastSourceRemoved } sourcesForAutoscale() { return this._mainSource && this._scaleSeriesOnly !== this._scalesProperties.childs() .scaleSeriesOnly.value() && (this._sourcesForAutoscale = null), this ._sourcesForAutoscale || (this._sourcesForAutoscale = this ._recalculateSourcesForAutoscale()), this._sourcesForAutoscale } recalculatePriceRange(e) { this._invalidatedForRange = { visibleBars: e, isValid: !1 } } internalHeightChanged() { return this._internalHeightChanged } orderedSources() { if (this._cachedOrderedSoruces) return this._cachedOrderedSoruces; let e = this.m_dataSources.slice(); return e = Object(b.sortSources)(e), this._cachedOrderedSoruces = e, this ._cachedOrderedSoruces } invalidateSourcesCache() { this._cachedOrderedSoruces = null, this._sourcesToUpdateViews = null } startScale(e) { if (this.isPercentage() || this.isIndexedTo100()) return; if (null !== this._scaleStartPoint || null !== this._priceRangeSnapshot) return; if (this.isEmpty()) return; this._scaleStartPoint = this.m_height - e; const t = this.priceRange(); this._priceRangeSnapshot = t && t.clone() } scaleTo(e) { if (this.isPercentage() || this.isIndexedTo100()) return; if (null === this._scaleStartPoint) return; this.setMode({ autoScale: !1 }), (e = this.m_height - e) < 0 && (e = 0); let t = (this._scaleStartPoint + .2 * (this.m_height - 1)) / (e + .2 * (this .m_height - 1)); const i = Object(s.ensureNotNull)(this._priceRangeSnapshot).clone(); t = Math.max(t, .1), i.scaleAroundCenter(t), this.setPriceRange(i) } endScale() { this.isPercentage() || this.isIndexedTo100() || null !== this._scaleStartPoint && ( this._scaleStartPoint = null, this._priceRangeSnapshot = null) } _recalculateSourcesForAutoscale() { this._mainSource && (this._scaleSeriesOnly = this._scalesProperties.childs() .scaleSeriesOnly.value()); const e = this._scaleSeriesOnly && this._hasSeries; return this.m_dataSources.filter(t => !!(t.properties().visible.value() || t instanceof h.Series) && (e ? t instanceof h.Series : Object(_.isStudy) (t) ? !t.isSourceHidden() && t.isIncludedInAutoScale() : t .isIncludedInAutoScale())) } _updateAutoScaleDisabledProperty(e) { const t = this._properties.childs(), i = t.indexedTo100.value() || t.percentage.value() || t.lockScale.value(); e ? t.autoScaleDisabled.setValueSilently(i) : t.autoScaleDisabled.setValue(i) } _setAutoScaleValueWithDependentProperties(e) { const t = this._properties.childs(); t.autoScale.setValueSilently(e), e && (t.percentage.setValueSilently(!1), t .indexedTo100.setValueSilently(!1), t.lockScale.setValueSilently(!1), t .logDisabled.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(! 0) } _setLockScaleValueWithDependentProperties(e) { const t = this._properties.childs(); t.lockScale.setValueSilently(e), e && (t.autoScale.setValueSilently(!1), t .percentage.setValueSilently(!1), t.indexedTo100.setValueSilently(!1), t.log .setValueSilently(!1)), t.percentageDisabled.setValueSilently(e), t .logDisabled.setValueSilently(e), this._updateAutoScaleDisabledProperty(!0) } _setPercentageValueWithDependentProperties(e) { const t = this._properties.childs(); t.percentage.setValueSilently(e), e && (t.autoScale.setValueSilently(!0), t.log .setValueSilently(!1), t.lockScale.setValueSilently(!1), t.indexedTo100 .setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!0) } _setIndexedTo100ValueWithDependentProperties(e) { const t = this._properties.childs(); t.indexedTo100.setValueSilently(e), e && (t.autoScale.setValueSilently(!0), t.log .setValueSilently(!1), t.lockScale.setValueSilently(!1), t.percentage .setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!0) } _setLogValueWithDependentProperties(e) { const t = this._properties.childs(); t.log.setValueSilently(e), e && (t.lockScale.setValueSilently(!1), t.percentage .setValueSilently(!1), t.indexedTo100.setValueSilently(!1)), this ._updateAutoScaleDisabledProperty(!0) } _recalculatePriceRangeImpl() { const e = this._invalidatedForRange.visibleBars; if (null === e) return; let t = null; const i = this.sourcesForAutoscale(), s = this.isPercentage(), r = this.isIndexedTo100(); let n = 0, o = 0; for (const a of i) { if (!a.properties().visible.value()) continue; const i = a.firstValue(); if (null === i) continue; const l = e.firstBar(), h = e.lastBar(), u = a.autoScaleInfo(l, h); let d = u.range; d && (s ? d = Object(c.toPercentRange)(d, i) : r && (d = Object(c .toIndexedTo100Range)(d, i)), t = null === t ? d : t.merge(d)), void 0 !== u.topPixelMargin && (n = Math.max(n, u.topPixelMargin)), void 0 !== u.bottomPixelMargin && (o = Math.max(o, u.bottomPixelMargin)) }(Math.abs(n - this._topPixelMargin) > 0 || Math.abs(o - this._bottomPixelMargin) > 0) && (this._bottomPixelMargin = o, this._topPixelMargin = n, this._marksCache = null, this._invalidateInternalHeightCache()), t ? (t.minValue() === t .maxValue() && (t = new l.PriceRange(t.minValue() - .5, t.maxValue() + .5)), this.setPriceRange(t)) : this.m_priceRange || this.setPriceRange(new l .PriceRange(-.5, .5)), this._invalidatedForRange.isValid = !0; const a = this.mainSource(); null !== a && this._recalculatePriceRangeOnce && (this ._recalculatePriceRangeOnce = !a.priceRangeReady()) } _makeSureItIsValid() { this._invalidatedForRange.isValid || (this._invalidatedForRange.isValid = !0, this ._recalculatePriceRangeImpl()) } _invalidateInternalHeightCache() { this._internalHeightCache = null, this._internalHeightChanged.fire() } _coordinateToLogical(e) { if (this._makeSureItIsValid(), this.isEmpty()) return 0; const t = this._invertedCoordinate(e), i = Object(s.ensureNotNull)(this.priceRange()), r = i.minValue() + (i.maxValue() - i.minValue()) * ((t - this .bottomPixelMargin()) / (this.internalHeight() - 1)); return this.logicalToPrice(r) } _logicalToCoordinate(e) { if (this._makeSureItIsValid(), this.isEmpty()) return 0; e = this.priceToLogical(e); const t = Object(s.ensureNotNull)(this.priceRange()), i = this.bottomPixelMargin() + (this.internalHeight() - 1) * (e - t .minValue()) / (t.maxValue() - t.minValue()); return this._invertedCoordinate(i) } _dropScaleCache() { this._sourcesForAutoscale = null, this._currencyCache = null, this._unitCache = null } _invertedCoordinate(e) { return this.isInverted() ? e : this.height() - 1 - e } _initScaleProperties() { const e = this.isLockScale(), t = this.properties().childs(); e && (t.percentage.setValue(!1), t.indexedTo100.setValue(!1), t.log.setValue(!1), t .autoScale.setValue(!1)), t.percentageDisabled.setValue(e), t.logDisabled .setValue(e), this._updateAutoScaleDisabledProperty(!1), t.percentage.value() && (t.log.setValue(!1), t.indexedTo100.setValue(!1)), t.indexedTo100.value() && (t .log.setValue(!1), t.percentage.setValue(!1)) } _correctedMargins() { if (null === this._correctedMarginsCache) { const e = this.mainSource(); this._correctedMarginsCache = null !== e ? e.correctScaleMargins(this ._margins) : this._margins } return this._correctedMarginsCache } _getSourcesToUpdateViews() { return this._sourcesToUpdateViews || (this._sourcesToUpdateViews = this .m_dataSources.filter(e => !Object(w.isLineTool)(e) || e.isActualSymbol() && e.isActualCurrency())), this._sourcesToUpdateViews } _mainSourceFormatter() { const e = this.mainSource(); return (null == e ? void 0 : e.formatter()) || I } _priceToPercentOrIndexedTo100IfNeeded(e, t) { return this.isPercentage() ? Object(c.toPercent)(e, t) : this.isIndexedTo100() ? Object(c.toIndexedTo100)(e, t) : e } } }, Yjuu: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "bcXK", 7)).then(({ FibSpeedResistanceArcsPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 2 } name() { return "Fib Speed Resistance Arcs" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } static createProperties(e) { var t = new r("linetoolfibspeedresistancearcs", e, !1, { range: [1, 11] }); return l._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "pdv6"))) .FibSpeedResistanceArcsDefinitionsViewModel } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline") .child("color") ], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child( "linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.LevelsCount = 11, t.LineToolFibSpeedResistanceArcs = l }, YlKu: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ApplyLineToolTemplateUndoCommand", (function() { return r })); var s = i("RDU5"); class r extends s.UndoCommand { constructor(e, t, i) { super(i), this._source = e, this._newState = t, this._oldState = e.properties() .state() } redo() { this._source.applyTemplate(this._newState) } undo() { this._source.applyTemplate(this._oldState) } } }, YmeR: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ActionBinder", (function() { return s })); class s { constructor(e, t, i, s, r = null) { this._property = t, this._undoModel = i, this._undoText = s, this._action = e, this .setValue(t.value()), t.subscribe(this, this._propertyChanged), null !== r ? e .update({ onExecute: r.bind(this) }) : e.update({ onExecute: this._onActionCallback.bind(this) }) } destroy() { this._property.unsubscribe(this, this._propertyChanged) } value() { return this._action.isChecked() } setValue(e) { this._action.update({ checked: Boolean(e) }) } _onActionCallback() { this._undoModel.setProperty(this._property, this.value(), this._undoText) } _propertyChanged(e) { this.setValue(e.value()) } } }, "Yt+L": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); var s = i("Eyy1"), r = i("RDU5"), n = i("n5al"); class o extends r.UndoCommand { constructor(e, t, i, r) { super(r), this._newSourcesUnits = new Map, this._oldSourcesUnits = new Map, this ._showFade = !1, this._chartWidget = i; const o = i.model().mainSeries(); for (const i of e.seriesLikeSources()) { if (!i.isVisible()) continue; const e = t || Object(n.symbolOriginalUnit)(Object(s.ensureNotNull)(i .symbolInfo())); this._newSourcesUnits.set(i.id(), e), this._oldSourcesUnits.set(i.id(), i .unit()), this._showFade = this._showFade || i === o && i.unit() !== e } } redo() { this._applyUnits(this._newSourcesUnits) } undo() { this._applyUnits(this._oldSourcesUnits) } _applyUnits(e) { this._showFade && this._chartWidget.screen.show(); const t = this._chartWidget.model().model(); e.forEach((e, i) => { Object(s.ensureNotNull)(t.dataSourceForId(i)).setUnit(e) }), this._chartWidget.model().selectionMacro(e => { e.clearSelection() }) } } }, YuHv: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("AWC/"); function r(e = [], t = []) { const i = document.createElement("div"), r = document.createElement("div"); return i.appendChild(r), i.classList.add(s.container), r.classList.add(s.inner), e.forEach( e => { i.classList.add(s[e]) }), t.forEach(e => { i.classList.add(s[e]) }), i } }, YzC7: function(e, t, i) { "use strict"; var s = i("Eyy1"), r = i("GVHu"), n = i("n5al"), o = i("tc+8"), a = i.n(o), l = i("Kxc7"), c = i("oXaB"), h = i("KcY8"); const u = l.enabled("force_exchange_as_title"); class d extends h.a { constructor(e, t) { super(), this._studyCompare = e, this._data = t } _updateRendererData(e, t, i) { e.visible = !1, t.visible = !1; const s = this._studyCompare.priceScale(), r = this._studyCompare.lastValueData(this._data.plotIndex, !1); if (r.noData || null === s || s.isEmpty()) return; i.background = r.color, i.textColor = this.generateTextColor(r.color), i .coordinate = r.coordinate, i.floatCoordinate = r.floatCoordinate; const n = this._studyCompare.model().properties().scalesProperties; if (n.showSeriesLastValue.value()) { const t = s.isPercentage(); e.text = t ? r.formattedPricePercentage : r.formattedPriceAbsolute, n .seriesLastValueMode.value() !== c.PriceAxisLastValueMode .LastPriceAndPercentageValue ? e.secondLine = "" : e.secondLine = t ? r .formattedPriceAbsolute : r.formattedPricePercentage, e.visible = !0 } t.text = "", n.showSymbolLabels.value() && (t.text = this._paneText(), t .visible = t.text.length > 0) } _paneText() { let e = ""; const t = this._studyCompare.symbolInfo(); return u ? e = Object(n.displayedSymbolExchange)(t) : this._studyCompare.model() .properties().scalesProperties.showSymbolLabels.value() && (e = Object(n .displayedSymbolName)(t)), e } } var p = i("it7y"), _ = i("e92V"), m = i("mMWL"), f = i("qFKp"), g = i("ogJP"), b = i("EYFt"); class v extends b.a { constructor(e, t) { super(e, t), this._emptyValues[0].title = e.guiPlotName("") } _hideValues() { return !1 } } const S = f.CheckMobile.any(); class y extends p.StudyDataWindowView { constructor(e, t) { super(e, t), this._studyCompare = e } _hideValues() { return !1 } _createValuesProvider(e, t) { return new v(e, t) } _currentIndex() { const e = this._model.crossHairSource().lockedIndex; let t; return S && (null === this._model.crossHairSource().pane && void 0 === e || Object(_.isLineToolName)(m.tool.value()) || null !== this._model .lineBeingEdited()) ? t = this._study.data().lastIndex() : (t = this ._model.crossHairSource().appliedIndex(), Object(g.isNumber)(t) || (t = this._study.data().lastIndex())), t } } class w extends y { constructor(e, t) { super(e, t), this._additional = null, this._showSeriesOHLC = t.properties() .paneProperties.legendProperties.showSeriesOHLC, this._showSeriesOHLC.subscribe( this, this.update) } isValuesVisible() { return this._showSeriesOHLC.value() } destroy() { this._showSeriesOHLC.unsubscribeAll(this) } additional() { return this._additional } _updateImpl() { super._updateImpl() } } var P = i("2kV1"), C = i("W+6j"); class x extends C.a { getSplitTitle() { return this._source.titleInParts(!0, void 0, !1, !1) } text() { return this._source.isActualInterval() ? this._source.isFailed() ? `${this._source.title(!0, void 0, !1, !1)}: ${this.sourceStatusText()}` : `${this._source.title(!0, void 0, !1, !1)} ${this.sourceStatusText()}` : this._source.title(!0, void 0, !1, !1) } } var T = i("WkOR"); i.d(t, "a", (function() { return E })); const I = l.enabled("study_overlay_compare_legend_option"), M = l.enabled("force_exchange_as_title"), O = l.enabled("uppercase_instrument_names"), L = !l.enabled("hide_study_compare_legend_item"), A = l.enabled("hide_unresolved_symbols_in_legend"); class E extends r.Study { constructor(e, t, i, s) { t.hasChild("currencyId") || t.addChild("currencyId", new a.a(null)), t.hasChild( "unitId") || t.addChild("unitId", new a.a(null)), t.addExclusion( "currencyId"), t.addExclusion("unitId"), super(e, t, i, s), this .properties().childs().minTick.subscribe(null, () => this ._recreatePriceFormattingDependencies()), this.properties().childs() .minTick.subscribe(null, () => this._model.fullUpdate()), this.properties() .childs().currencyId.subscribe(this, this._onCurrencyChanged), this .properties().childs().unitId.subscribe(this, this._onUnitChanged), this .properties().merge({ skipHistogramBaseOnAutoScale: !0 }) } properties() { return super.properties() } createPriceAxisView(e) { return new d(this, { plotIndex: "compare" }) } setSymbolCurrencyUnit(e, t, i) { this._setSymbolCurrencyUnitInternal(e, t, i) } symbol() { return this._properties.inputs.symbol.value() } setSymbol(e) { this.setSymbolCurrencyUnit(e) } symbolInfo() { if (!this._resolvedSymbols) return null; const e = this._properties.inputs.symbol.value(); if (!e) return null; let t; return t = this._resolvedSymbols[this._getSymbolForResolve(e)] || null, t } symbolResolved() { return this.symbolsResolved() } symbolSameAsCurrent(e) { return Object(T.b)(e, this.symbol(), this.symbolInfo()) } currency() { return this._properties.currencyId.value() || null } setCurrency(e) { this.setSymbolCurrencyUnit(void 0, e) } isConvertedToOtherCurrency() { return Object(n.isConvertedToOtherCurrency)(this.symbolInfo()) } unit() { return this._properties.unitId.value() || null } setUnit(e) { this._properties.unitId.setValue(e) } isConvertedToOtherUnit() { return Object(n.isConvertedToOtherUnit)(this.symbolInfo()) } style() { return 2 } symbolSource() { return this } state(e, t) { const i = super.state(e, t); return e && (Object(s.ensureDefined)(i.data).symbols = { ___snapshot: this.symbolInfo() || void 0 }), i } symbolTitle(e, t) { return this.title(!0, {}, !1, e) } titleInParts(e, t, i, s) { const r = this._titleInParts(e, t, i, s).join(", "); return [O ? r.toUpperCase() : r] } tags() { const e = this.symbol(); return e ? [e] : [] } statusView() { return L ? super.statusView() : null } guiPlotName(e) { return this.properties().childs().inputs.childs().symbol.value() } canOverrideMinTick() { return !0 } canBeHiddenByGlobalFlag() { return !1 } valuesProvider() { return new v(this, this.model()) } statusProvider(e) { return new x(this, this._model.properties().scalesProperties.textColor) } _createViews() { this._legendView || (this._legendView = new w(this, this._model)), this ._dataWindowView || (this._dataWindowView = new y(this, this._model)), this ._statusView || (this._statusView = new P.StudyStatusView(this)), super ._createViews() } _showLastValueOnPriceScale() { return this._model.properties().scalesProperties.showSeriesLastValue.value() } _onCurrencyChanged() { this.isStarted() && this._tryChangeInputs(), this._currencyChanged.fire() } _onUnitChanged() { this.isStarted() && this._tryChangeInputs(), this._unitChanged.fire() } _getSymbolObject(e) { const t = super._getSymbolObject(e), i = this.currency(); null !== i && (t["currency-id"] = i); const s = this.unit(); return null !== s && (t["unit-id"] = s), t } _getSymbolForApi(e) { return Object(n.symbolForApi)(this._resolvedSymbolsByInput[e] || null, e) } _onSymbolResolved(e, t, i) { super._onSymbolResolved(e, t, i), this._recreatePriceFormattingDependencies(); const s = t === this.symbol() ? Object(n.extractSymbolNameFromSymbolInfo)(i, this.symbol()) : null, r = Object(n.symbolCurrency)(i), o = Object(n.symbolUnit)(i); this._setSymbolCurrencyUnitInternal(s || void 0, r, o, i), this.model() .realignLineTools() } _changeInputsImpl(e, t) { super._changeInputsImpl(e, t), e.symbol !== t.symbol && this._model .realignLineTools() } _createStudyOnServer() { super._createStudyOnServer(), this._model.realignLineTools() } _tryCreateFormatter() { const e = this.symbolInfo(); return Object(n.createSeriesFormatter)(e, this.properties().childs().minTick .value()) } _titleInParts(e, t, i, s) { const r = this.properties().childs().inputs.childs().symbol.value(), n = this.symbolInfo(), o = n && n.exchange && 0 !== n.exchange.length; let a; if (M && o && n) a = n.exchange; else if (n) { if (a = n.name, I) switch (this._model.mainSeries().properties() .statusViewStyle.symbolTextSource.value()) { case "description": a = n.description; break; case "ticker-and-description": a = `${n.name}, ${n.description}` } else if (o && !s) return [a, [n.exchange]] } else a = A ? "" : r; return [a] } _setSymbolCurrencyUnitInternal(e, t, i, s) { const r = this.properties().childs(), o = r.inputs.childs().symbol.value(), a = r.currencyId.value(), l = r.unitId.value(); if (void 0 !== e && e !== o && r.inputs.childs().symbol.setValueSilently(e), void 0 !== t && t !== a && r.currencyId.setValueSilently(t), void 0 !== i && i !== l && r.unitId.setValueSilently(i), s) this._resolvedSymbolsByInput[ this.symbol()] = s, this._resolvedSymbols[this._getSymbolForResolve(this .symbol())] = s; else { const e = this.symbolInfo(); null !== e && (r.currencyId.setValueSilently(Object(n.symbolCurrency)(e)), r .unitId.setValueSilently(Object(n.symbolUnit)(e))) } r.inputs.childs().symbol.value() !== o && r.inputs.childs().symbol.listeners() .fire(r.inputs.childs().symbol), r.currencyId.value() !== a && r.currencyId .listeners().fire(r.currencyId), r.unitId.value() !== l && r.unitId .listeners().fire(r.unitId) } } }, Z0Sh: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX").LineToolColorsProperty, o = [4.5, 9, 11.25, 18, 22.5, 36, 45], a = function() { for (var e = [], t = o.length - 1, i = 1, s = 0, r = 0; r < 1e10;) r = o[s] * i, e.push( Math.round(r)), e.push(Math.ceil(-r)), s === t - 1 && (i *= 10), s = (s + 1) % t; return e.sort((function(e, t) { return e < t ? -1 : e > t ? 1 : 0 })), e }(); class l extends s { constructor(e, t) { super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "eg8N", 7)).then(({ GannSquarePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } hLevelsCount() { return l.HLevelsCount } vLevelsCount() { return l.VLevelsCount } pointsCount() { return 2 } name() { return "Gann Box" } _alignPriceOnPattern(e, t) { var i = Math.round(1e6 * (e.price - t.price)) / 1e6; if (0 === i) return t.price; for (var s = o[0], r = o[o.length - 1], n = 1, a = Math.abs(i); a < s * n || r * n < a;) a < s * n ? n *= .1 : r * n < a && (n *= 10); for (var l = r * n, c = o.length - 2; c >= 0 && !(o[c] * n < a); --c) l = o[c] * n; return e.price = t.price + (i >= 0 ? l : -l), e } _alignTimeOnPattern(e, t) { var i = e.index - t.index; if (0 === i) return 0; for (var s = a.length - 2; s >= 0 && !(a[s] < i); --s); return s += i > 0 ? 1 : 0, e.index = t.index + a[s], e } _alignPointsFixedIncrement(e, t) { return this._alignTimeOnPattern(e, t), this._alignPriceOnPattern(e, t), e } _preparePoint(e, t) { return t && t.shift() && 0 !== this._points.length && this ._alignPointsFixedIncrement(e, this._points[0]), s.prototype._preparePoint.call( this, e, t) } setPoint(e, t, i) { if (i && i.shift()) { var s = 0 === e ? this._points[1] : this._points[0]; this._alignPointsFixedIncrement(t, s) } super.setPoint(e, t, i) } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "2liL"))) .GannSquareDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolgannsquare", e, !1, { range: [1, 7], prefixes: ["h", "v"], names: ["coeff", "color", "visible"] }); return l._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("color"), e.child("fans").child("color")], i = 1; i <= l .HLevelsCount; i++) t.push(e.child("hlevel" + i).child("color")); for (i = 1; i <= l.VLevelsCount; i++) t.push(e.child("vlevel" + i).child("color")); e.addChild("linesColors", new n(t)), e.addExclusion("linesColors") } } l.HLevelsCount = 7, l.VLevelsCount = 7, t.LineToolGannSquare = l }, Z8aO: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SeriesPriceLinePaneView", (function() { return n })); var s = i("k4w6"), r = i("8Uy/"); class n extends s.a { constructor(e) { super(e), this._lineRendererData.linestyle = r.LINESTYLE_DOTTED } _updateImpl() { if (this._lineRendererData.visible = !1, !this._series.properties() .showPriceLine.value()) return; if (12 === this._series.properties().style.value()) return; const e = this._series.lastValueData(void 0, !0); e.noData || (this._lineRendererData.visible = !0, this._lineRendererData.y = e .coordinate, this._lineRendererData.color = this._series.priceLineColor( e.color), this._lineRendererData.linewidth = this._series .properties().priceLineWidth.value()) } } }, ZAxB: function(e, t, i) { "use strict"; function s(e) { return ["text", "integer", "float", "price", "session", "resolution"].includes(e.type) && e .hasOwnProperty("options") } function r(e, t, i) { for (const s of e) if (t[s.id] !== i[s.id]) return !1; return !0 } i.d(t, "b", (function() { return s })), i.d(t, "a", (function() { return r })) }, ZBiT: function(e, t, i) { e.exports = { "css-value-pane-controls-padding-left": "1px", "css-value-pane-controls-padding-right": "5px" } }, ZJKN: function(e, t, i) { "use strict"; i.r(t), i.d(t, "BarsRange", (function() { return r })); var s = i("Eyy1"); class r { constructor(e, t) { Object(s.assert)(e <= t, "The last bar in the bars range should be greater than or equal to the first bar" ), this._firstBar = e, this._lastBar = t } firstBar() { return this._firstBar } lastBar() { return this._lastBar } count() { return this._lastBar - this._firstBar + 1 } contains(e) { return this._firstBar <= e && e <= this._lastBar } equals(e) { return this._firstBar === e.firstBar() && this._lastBar === e.lastBar() } static compare(e, t) { return null === e || null === t ? e === t : e.equals(t) } } }, ZjKI: function(e, t, i) { "use strict"; i.r(t), i.d(t, "CLOSE_POPUPS_AND_DIALOGS_COMMAND", (function() { return s })); const s = "CLOSE_POPUPS_AND_DIALOGS_COMMAND" }, Zl0W: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolPriceNote", (function() { return l })); var s = i("Eyy1"), r = i("Ocx9"), n = i("tc+8"), o = i.n(n), a = i("Ss5c"); class l extends a.LineDataSource { constructor(e, t) { super(e, t || l.createProperties()), this._labelMovingDelta = null, i.e( "lt-pane-views").then(i.bind(null, "0s1X")).then(t => { this._setPaneViews([new t.PriceNotePaneView(this, e)]) }) } pointsCount() { return 2 } properties() { return super.properties() } name() { return "Price Note" } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e } startMoving(e, t, i) { if (1 === t) { if (this.isSourceHidden()) return; const i = Object(s.ensureDefined)(e.logical), r = this.points()[1]; this._labelMovingDelta = { index: r.index - i.index, price: r.price - i.price }, this.startChanging(t, i) } else this._labelMovingDelta = null, super.startMoving(e, t, i) } move(e, t, i) { if (null !== this._labelMovingDelta) { const t = Object(s.ensureDefined)(e.logical), r = { index: t.index + this._labelMovingDelta.index, price: t.price + this._labelMovingDelta.price }; this.setPoint(1, r, i), this.updateAllViews() } else super.move(e, t, i) } endMoving(e, t) { return null !== this._labelMovingDelta ? (this._labelMovingDelta = null, this .endChanging(!1, e)) : super.endMoving(e) } static createProperties(e) { const t = new r.DefaultProperty("linetoolpricenote", e); return l._configureProperties(t), t } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "ernH")).then( e => e.PriceNoteDefinitionsViewModel) } _snapTo45DegreesAvailable() { return !0 } static _configureProperties(e) { a.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new o.a("")), e.addExclusion("text"), e.hasChild( "backgroundsColors") && e.removeProperty("backgroundsColors"), e .hasChild("textsColors") && e.removeProperty("textsColors") } } }, ZmuQ: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return o })), i.d(t, "a", (function() { return a })); var s = i("jCNj"), r = i("E6p6"), n = i("5mo2"); class o { constructor(e, t, i, s) { this.init(e, t, i, s) } init(e, t, i, r) { this.timezone = s.get_timezone(e), this.spec = new n.SessionSpec(e, t, i, r) } } class a { alignTime(e) { if (isNaN(e)) return NaN; let t = this.indexOfBar(e); return t === r.SessionStage.POST_SESSION && (this.moveTo(e), t = this.indexOfBar( e)), t < 0 ? NaN : this.startOfBar(t) } } }, "Zo2/": function(e, t, i) { "use strict"; (function(t) { i("YCFM"); var s = i("YFKU").t, r = i("Eyy1"), n = r.assert, o = r.ensureDefined, a = i("Y7w9").moveToHead, l = i("iPBr").TimeAxisWidget, c = i("qJq3").Series, h = i("Kxc7"), u = i("YmeR").ActionBinder, d = i("mKT+").resolveAndShowEditObjectDialog, p = i("Vdly"), _ = p.getValue, m = p.setValue, f = i("QloM").TabNames, g = i("cdbK").showGoToDateDialog, b = i("/3z9"), v = i("lxNp"), S = i("7nsU").showConfirmInputsDialog, y = i("ikwP").disableSelection, w = i("GVHu").Study, P = i("8sOK").StudyStub, C = i("3ClC").isStudy, x = i("Ss5c").LineDataSource, T = i("CW80"), I = T.isLineTool, M = T.isStudyLineTool, O = i("fTGZ").BarsMarksContainer, L = i("7KDR"), A = L.Action, E = L.Separator, k = (i("L/Ed").ToolboxType, i("mMWL")), D = i("LxhU").Interval, V = i("n5al"), B = V.getDefaultStyle, R = i("pvsv").showSymbolInfoDialog, N = i("H0vP").InvalidationMask, j = i("H0vP").InvalidationLevel, F = i("PT1i").linking, W = i("JpbW").showChangeIntervalDialogAsync, H = i("wptU"), U = H.activateKeyPressHandler, z = H.showDialog, G = i("Ocx9").DefaultProperty, q = i("+6ja"), Y = q.availableTimezones, K = q.timezoneIsAvailable, J = i("0F0w").ChartSession, Z = i("0YCj"), X = i("c2JX").Spinner, $ = i("JWMC").trackEvent, Q = i("VaSN").lastEventIsTouch, ee = i("vaqD").LoadingScreen, te = i("wZIs"), ie = i("txPx").getLogger("ChartWidget", { color: "#606" }), se = i("2uTr").appendEllipsis, re = i("U0+/").StudyMetaInfoRepository, ne = i("VNzU").isMultipleLayout, oe = i("b1GK").addPerfMark, ae = i("FQhm"), le = i("wjVR").ChartWidgetBase, ce = i("qFKp").CheckMobile.any(), he = i("uDHo").TIMEFRAMETYPE, ue = i("jofe").createDeferredPromise, de = i("GDWD").addPlusButtonProperty, pe = s("On The Left"), _e = s("On The Right"), me = s("Move Scale To Left"), fe = s("Move Scale To Right"); class ge extends le { constructor(e, i, s) { super(e, i, s), this._options.timeScaleWidget && (this._options .timeScaleWidget.pressedMouseMoveScale = this._options.handleScale .axisPressedMouseMove.time); var r = this; this._startSpinner(this._options.container.value()); var n = this._options.content, o = this._options.readOnly; this._removeMaximizeHotkey = null, r._hotkeys = v.createGroup({ desc: "Chart actions", isDisabled: function() { return !r._isActive } }); var a = this._options.containsData, l = this._options.onWidget, c = this._options.onCmeWidget; c && ie.logWarn("[ChartWidget] 'onCmeWidget' option is depricated"); var h = this._options.widgetCustomer, u = this._options.timezone, d = this._options.hideSymbolSearch, p = this._options.defSymbol, _ = D.isValid(this._options.defInterval) ? this._options.defInterval : void 0, m = parseInt(this._options.defStyle), f = V.isValidStyle(m) ? m : void 0, g = this._options.defSessionId, b = void 0 !== this._options.defTimeframe ? { value: this._options.defTimeframe.toUpperCase(), type: he.PeriodBack } : void 0; this._chartWidgetCollection = this._options.chartWidgetCollection, this ._content = n, this._initialLoading = this._options.initialLoading, this ._readOnly = o, this._containsData = a, this._showChartEvents = !a && this._options.chartEventsEnabled, this._defSymbol = p, this ._defInterval = _, this._defTimeframe = b, this._defStyle = f, this ._onWidget = !!l, this._compareSymbols = this._options.compareSymbols, this._onWidget && (c ? this._widgetCustomer = "cme" : h && (this ._widgetCustomer = h)), this._hideSymbolSearch = d, this ._frameTime = 30, this._model = null, this._metaInfo = {}, this._drawRafId = 0, this._compareDialog = this._chartWidgetCollection .getCompareDialogRenderer(); var S = this._contentSeriesProperties(); S && (p = S.symbol, _ = S.interval), void 0 === this._options .useUserChartPreferences && (this._options.useUserChartPreferences = ! 0), this._properties = new G("chartproperties", void 0, void 0, this ._options.useUserChartPreferences); var y = this._options.useUserChartPreferences ? te.defaults( "chartproperties.mainSeriesProperties") : te.factoryDefaults( "chartproperties.mainSeriesProperties"); this._properties.mainSeriesProperties.merge(y), this._properties .mainSeriesProperties.hasChild("esdBreaksStyle") && this._properties .mainSeriesProperties.removeProperty("esdBreaksStyle"), _ = _ || y .interval || "D", V.isValidStyle(f) || (f = V.isValidStyle(y.style) ? y .style : B(D.isRange(_))), this._properties.mainSeriesProperties .merge({ visible: !0, symbol: p || DEFAULT_SYMBOL, shortName: "", timeframe: "", onWidget: this._onWidget, interval: _, currencyId: null, unitId: null, style: f, sessionId: g, lineStyle: { styleType: te.factoryDefaults( "chartproperties.mainSeriesProperties.lineStyle.styleType" ) } }), this._containsData && this._properties.mainSeriesProperties.merge({ showCountdown: !1 }), u && K(u) && this._properties.timezone.setValue(u), this ._tagsChanged = new t, this._disconnected = new t, this ._reconnectBailout = new t, this._connected = new t, this._onScroll = new t, this.chartWidgetInitialized = new t, this._chartSession = new J( ChartApiInstance), this._metaInfoRepository = new re(this ._chartSession), this._timingsMeter = null, this._isActive = this ._options.isActive, this._options.container.subscribe((function(e) { r._setElement(e) }), { callWithLast: !0 }); var w = function() { r.resize() }; this._options.width.subscribe(w), this._options.height.subscribe(w), this ._options.visible.subscribe(this._updateTimingsMeterState.bind(this)), this._aboutToBeDestroyed = new t, this._actions = null, this ._definitionsViewModel = null, this._backgroundTopColorSpawn = null, this._backgroundBottomColorSpawn = null, this._hintDefferedPromise = null, this._activeHint = null } isInitialized() { return Boolean(this._inited) } compareSymbols() { return this._compareSymbols } async _getChartPropertyDefinitionsViewModel() { if (null === this._definitionsViewModel) { const { ChartPropertyDefinitionsViewModel: e } = await Promise.all([i.e(27), i.e(61), i.e("general-property-page")]) .then(i.bind(null, "5lPo")); if (this._isDestroyed) throw new Error( "Chart widget already destroyed"); await new Promise(e => this.withModel(null, e)), null === this ._definitionsViewModel && (this._definitionsViewModel = new e(this .model(), this.properties(), this._options)) } return this._definitionsViewModel } _initMaximizeHotkey(e) { var t = this; function i(e) { e.defaultPrevented || b.modifiersFromEvent(e) === b.Modifiers.Alt && e .stopPropagation() } function s(e) { e.defaultPrevented || b.modifiersFromEvent(e) === b.Modifiers.Alt && (e .preventDefault(), e.stopPropagation(), t.toggleFullscreen()) } return e.addEventListener("mousedown", i, !0), e.addEventListener("click", s, !0), function() { e.removeEventListener("mousedown", i, !0), e.removeEventListener( "click", s, !0) } } toggleFullscreen() { var e = this.getResizerDetacher(); e.fullscreenable.value() && (e.fullscreen.value() ? e.exitFullscreen() : e .requestFullscreen()) } _beginRequestActive() { var e = this._chartWidgetCollection.activeChartWidget.value() !== this; this._chartWidgetCollection.activeChartWidget.setValue(this), e && (Q() && this._isLineToolModeExceptBrush() && this .updateCrossHairPositionIfNeeded(), this._justActivated = !0) } _endRequestActive() { var e = this; this._justActivated && setTimeout((function() { e._justActivated = !1 }), 0) } _requestActive() { this._beginRequestActive(), this._endRequestActive() } justActivated() { return this._justActivated } setTimezone(e) { e && K(e) ? this._properties.timezone.setValue(e) : console.warn( "Incorrect timezone: " + JSON.stringify(e)) } getTimezone() { return this._properties.timezone.value() } refreshMarks() { this.model().barsMarksSources().forEach((function(e) { e.refreshData() })) } clearMarks() { this.model().barsMarksSources().forEach((function(e) { e.clearMarks() })) } metaInfoRepository() { return this._metaInfoRepository } _init() { var e = this; this.hasModel() && this.model().mainSeries().clearData(), this.initColors(), this._makeDefaultGui(); var t = function() { e._checkObsoleteTimezone(), e._chartSession && e._chartSession .connected() && this._model.restart(), this._content && (this .initColors(), this._updateGui(), this.update()), this ._resizeHandler = function() { this.adjustSize(), this.paint() }.bind(this), this._resizeHandler(), this._parent.appendChild( this._mainDiv), this._spinner && (this._spinner.stop(), delete this._spinner), this._keydownEventListener = function(e) { 27 === e.which && e.preventDefault() }, window.addEventListener("keydown:chart_" + this._id, this ._keydownEventListener), this._initBarsMarksSources(), this ._activateSymbolSearchHotkeys(), this.model().timeScale() .onScroll().subscribe(this, (function() { this._onScroll.fire() })), this._inited = !0 }.bind(this), i = this._makeDefaultModel(); void 0 === i ? t() : i.then(t) } _activateSymbolSearchHotkeys() { this.readOnly() || this._hideSymbolSearch || U() } _checkObsoleteTimezone() { var e = this._properties.timezone.value(); K(e) || this._properties.timezone.setValue({ UTC: "Etc/UTC", EST: "America/New_York", CST: "America/Chicago", PST: "America/Los_Angeles" } [e] || "exchange") } _initBarsMarksSources() { var e = this; this.withModel(this, (function() { this.model().barsMarksSources().forEach((function(t) { t.onNeedRepaint.subscribe(e, (function() { e.model().model() .lightUpdate() })) })) })) } initColors() { this._properties.scalesProperties.lineColor.listeners().subscribe(this, ge .prototype.setScaleLineColor), this._properties.scalesProperties .textColor.listeners().subscribe(this, ge.prototype.setScaleTextColor) } _initBackgroundColor() { null === this._backgroundTopColorSpawn && (this._backgroundTopColorSpawn = this._model.model().backgroundTopColor().spawn(), this ._backgroundTopColorSpawn.subscribe(this._onBackgroundColorChanged .bind(this))), null === this._backgroundBottomColorSpawn && ( this._backgroundBottomColorSpawn = this._model.model() .backgroundColor().spawn(), this._backgroundBottomColorSpawn .subscribe(this._onBackgroundColorChanged.bind(this))) } paneWidgets() { return this._paneWidgets } paneByCanvas(e) { for (var t = 0; t < this._paneWidgets.length; t++) if (this._paneWidgets[t].hasCanvas(e)) return this._paneWidgets[t]; return null } paneByState(e) { for (var t = 0; t < this._paneWidgets.length; t++) if (this._paneWidgets[t].state() === e) return this._paneWidgets[t]; return null } timeAxisByCanvas(e) { return this._timeAxisWidget.hasCanvas(e) ? this._timeAxisWidget : null } properties() { return this._properties } emulateCriticalError() { this._chartSession.removeSeries("-1") } readOnly() { return this._readOnly } onDisconnected() { return this._disconnected } onReconnectBailout() { return this._reconnectBailout } onConnected() { return this._connected } onRedraw() { return this._redraw } onScroll() { return this._onScroll } modelCreated() { return this._modelCreated } setResolution(e) { if (this._model) { var t = this._model.mainSeries().properties(), i = s("Change Resolution"); this._model.setResolutionProperty(t.interval, e, this, i) } else this._properties.mainSeriesProperties.merge({ interval: e }) } getResolution() { return this._model ? this._model.mainSeries().properties().interval .value() : this._properties.mainSeriesProperties.interval.value() } addOverlayStudy(e, t, i) { var s = this.model(); return this._options.isSymbolAvailable(e).then((function(r) { if (!r) return null; var n = s.createStudyInserter({ type: "java", studyId: "Overlay@tv-basicstudies" }), o = { allowExtendTimeScale: i }; if (h.enabled("use_overrides_for_overlay")) { var a = te.factoryDefaults( "study_Overlay@tv-basicstudies.style"); o.style = a } return n.setPropertiesState(o), n.setForceOverlay(t), n .insert((function() { return Promise.resolve({ symbol: e }) })) })) } addCompareStudy(e) { var t = this.model(); return this._options.isSymbolAvailable(e).then((function(i) { return i ? t.createStudyInserter({ type: "java", studyId: "Compare@tv-basicstudies" }).insert((function() { return Promise.resolve({ symbol: e }) })) : null })) } updateActions() { for (var e = this.actions(), t = this._model.dataSources(), i = !1, r = !1, n = 0, o = t.length; n < o; n++) { var a = t[n]; TradingView.isInherited(a.constructor, x) && a.isUserDeletable() && ( i = !0), TradingView.isInherited(a.constructor, w) && a .removeByRemoveAllStudies() && (r = !0), TradingView.isInherited(a .constructor, P) && (r = !0) } this._readOnly || (e.paneRemoveAllStudies && e.paneRemoveAllStudies.update({ disabled: !r }), e.paneRemoveAllDrawingTools && e.paneRemoveAllDrawingTools .update({ disabled: !i }), e.paneRemoveAllStudiesDrawingTools && e .paneRemoveAllStudiesDrawingTools.update({ disabled: !r && !i })); var l = this, c = [], h = function(e) { return e.id === l.model().model().properties().timezone.value() }; Y.forEach((function(e) { if (!e.separator) { var t = new A({ label: e.title, checkable: !0, checked: h(e), statName: "SetTimeZone", onExecute: function() { l.model().setProperty(l.model() .model().properties() .timezone, e.id, "Changed Time Zone") } }); c.push(t) } }), this), e.applyTimeZone.update({ subItems: c }), e.addToWatchlist && (e.addToWatchlist.request(), e.addToWatchlist .updateLabel(this.getSymbol(!0))), e.addToTextNotes && e .addToTextNotes.update({ label: s("Add Text Note for {symbol}").format({ symbol: this.getSymbol(!0) }) }) } applyTheme(e) { var t = this; Promise.resolve().then(i.bind(null, "EsvI")).then(i => { e = e || i.getCurrentTheme().name, i.loadTheme(e, !0, !0, t._chartWidgetCollection) }) } actions() { return null === this._actions && this._setActions(), this._actions } _setActions() { this._actions && this._actions.addToWatchlist && (this._actions .addToWatchlist.destroy(), delete this._actions.addToWatchlist); var e, t = this, r = []; if (!this._readOnly) { r = [new A({ label: s("Eraser"), payload: "eraser", statName: "Eraser" }), new E, new A({ label: s("Trend Line"), payload: "LineToolTrendLine", statName: "LineToolTrendLine" }), new A({ label: s("Horizontal Line"), payload: "LineToolHorzLine", statName: "LineToolHorzLine" }), new A({ label: s("Vertical Line"), payload: "LineToolVertLine", statName: "LineToolVertLine" }), new A({ label: s("Arrow"), payload: "LineToolArrow", statName: "LineToolArrow" }), new A({ label: s("Ray"), payload: "LineToolRay", statName: "LineToolRay" }), new A({ label: s("Extended"), payload: "LineToolExtended", statName: "LineToolExtended" }), new A({ label: s("Parallel Channel"), payload: "LineToolParallelChannel", statName: "LineToolParallelChannel" }), new E, new A({ label: s("Pitchfork"), payload: "LineToolPitchfork", statName: "LineToolPitchfork" }), new A({ label: s("Schiff Pitchfork"), payload: "LineToolSchiffPitchfork", statName: "LineToolSchiffPitchfork" }), new A({ label: s("Pitchfan"), payload: "LineToolPitchfan", statName: "LineToolPitchfan" }), new A({ label: s("Gann Square"), payload: "LineToolGannSquare", statName: "LineToolGannSquare" }), new A({ label: s("Gann Fan"), payload: "LineToolGannFan", statName: "LineToolGannFan" }), new A({ label: s("Fib Retracement"), payload: "LineToolFibRetracement", statName: "LineToolFibRetracement" }), new A({ label: s("Trend-Based Fib Extension"), payload: "LineToolTrendBasedFibExtension", statName: "LineToolTrendBasedFibExtension" }), new A({ label: s("Fib Speed Resistance Fan"), payload: "LineToolFibSpeedResistanceFan", statName: "LineToolFibSpeedResistanceFan" }), new A({ label: s("Fib Time Zone"), payload: "LineToolFibTimeZone", statName: "LineToolFibTimeZone" }), new A({ label: s("Circle Lines"), payload: "LineToolCircleLines", statName: "LineToolCircleLines" }), new A({ label: s("Fib Circles"), payload: "LineToolFibCircles", statName: "LineToolFibCircles" }), new A({ label: s("Fib Speed Resistance Arcs"), payload: "LineToolFibSpeedResistanceArcs", statName: "LineToolFibSpeedResistanceArcs" }), new E, new A({ label: s("Rectangle"), payload: "LineToolRectangle", statName: "LineToolRectangle" }), new A({ label: s("Ellipse"), payload: "LineToolEllipse", statName: "LineToolEllipse" }), new A({ label: s("Triangle"), payload: "LineToolTriangle", statName: "LineToolTriangle" }), new A({ label: s("Polyline"), payload: "LineToolPolyline", statName: "LineToolPolyline" }), new A({ label: s("Path"), payload: "LineToolPath", statName: "LineToolPath" }), new A({ label: s("Arc"), payload: "LineToolArc", statName: "LineToolArc" }), new E, new A({ label: s("Text", { context: "tool" }), payload: "LineToolText", statName: "LineToolText" }), new A({ label: s("Anchored Text"), payload: "LineToolTextAbsolute", statName: "LineToolTextAbsolute" }), new A({ label: s("Balloon"), payload: "LineToolBalloon", statName: "LineToolBalloon" }), new A({ label: s("Price Label"), payload: "LineToolPriceLabel", statName: "LineToolPriceLabel" }), new E, new A({ label: s("Elliott Wave Subminuette"), payload: "LineToolElliottSubminuette", statName: "LineToolElliottSubminuette" }), new A({ label: s("Elliott Wave Minor"), payload: "LineToolElliottMinor", statName: "LineToolElliottMinor" }), new A({ label: s("Elliott Wave Circle"), payload: "LineToolElliottCircle", statName: "LineToolElliottCircle" }), new A({ label: s("Elliott Minor Retracement"), payload: "LineToolElliottMinorRetr", statName: "LineToolElliottMinorRetr" }), new A({ label: s("Elliott Major Retracement"), payload: "LineToolElliottMajorRetr", statName: "LineToolElliottMajorRetr" }), new E, new A({ label: s("Brush"), payload: "LineToolBrush", statName: "LineToolBrush" }), new E, new A({ label: s("Forecast"), payload: "LineToolPrediction", statName: "LineToolPrediction" })]; for (var n = function(e) { k.tool.setValue(e.getPayload()) }, o = 0; o < r.length; o++) r[o] instanceof A && r[o].update({ onExecute: n }); e = new A({ label: se(s("Settings")), icon: i("MXV9"), statName: "ScalesProperties", onExecute: function() { t.showGeneralChartProperties(f.scales) } }) } this._hotkeys.add({ desc: "Maximize", hotkey: v.Modifiers.Alt + 13, handler: function() { t.toggleFullscreen() }, isDisabled: function() { return !t._options.fullscreenable.value() } }), this._hotkeys.add({ desc: "Cancel selection", hotkey: 27, handler: function() { t.selectPointMode().value() ? t .cancelRequestSelectPoint() : t._model .selectionMacro((function(e) { t._cancelCreatingLine(), e .clearSelection() })) }, isDisabled: function() { var e = 0 === t._model.selection().allSources().length, i = null === t._model.crossHairSource() .measurePane(), s = !t.selectPointMode().value(), r = e && i && s; return !t._model || r } }), t.withModel(null, (function() { var e = function() { t._hotkeys.promote() }; t._model.onSelectedSourceChanged().subscribe(null, e), t ._model.crossHairSource().measuringEnabled().subscribe( null, t => { t && e() }) })); var a = new A({ label: s("Reset Chart"), icon: i("LdoW"), statName: "ResetChart", onExecute: this.GUIResetScales.bind(this), hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 82 }), l = new A({ label: s("Invert Scale"), statName: "Invert Scale", checkable: !0, onExecute: function() { t._model.invertPriceScale(t._model.mainSeries() .priceScale()) }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 73 }), c = new A({ label: s("Auto (Fits Data To Screen)"), checkable: !0, onExecute: function() { var e = t._model.mainSeries().priceScale(); t._model.togglePriceScaleAutoScaleMode(e), c.update({ checked: e.isAutoScale() }) } }), d = new A({ label: s("Lock Price To Bar Ratio"), checkable: !0, statName: "ToggleLockScale", onExecute: function() { t._model.togglePriceScaleLockScaleMode(t._model .mainSeries().priceScale()) } }), p = new A({ label: s("Regular"), checkable: !0, statName: "ToggleRegularScale", onExecute: function() { var e = t._model.mainSeries().priceScale(); t._model.setPriceScaleRegularScaleMode(e), p.update({ checked: e.isRegular() }) } }), S = new A({ label: s("Percent"), checkable: !0, statName: "TogglePercantage", onExecute: function() { t._model.togglePriceScalePercentageScaleMode(t._model .mainSeries().priceScale()) }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 80 }), y = new A({ label: s("Indexed to 100"), checkable: !0, statName: "ToggleIndexedTo100", onExecute: function() { t._model.togglePriceScaleIndexedTo100ScaleMode(t._model .mainSeries().priceScale()) } }), w = new A({ label: s("Logarithmic"), statName: "ToggleLogScale", checkable: !0, onExecute: function() { t._model.togglePriceScaleLogScaleMode(t._model .mainSeries().priceScale()) }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 76 }), P = new A({ label: s("Undo"), onExecute: function() { $("GUI", "Undo"), t._model.undoHistory().undo() }, disabled: !0, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Mod + 90 }), C = new A({ label: s("Redo"), onExecute: function() { $("GUI", "Redo"), t._model.undoHistory().redo() }, disabled: !0, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Mod + 89 }); t.withModel(null, (function() { t._model.undoHistory().undoStack().onChange().subscribe(t, t .updateUndoRedo), t._model.undoHistory().redoStack() .onChange().subscribe(t, t.updateUndoRedo) })); var x = [new A({ label: s("Loading") })], T = new A({ name: "apply-color-theme", label: s("Color Theme"), icon: i("opke"), subItems: x, statName: "ColorTheme" }), I = new A({ label: s("Time Zone"), statName: "TimeZone" }), M = new A({ label: se(s("Change Symbol")), statName: "ChangeSymbol", onExecute: function() { z({ defaultValue: "" }) } }); m("symboledit.dialog_last_entry", ""); var O = { label: se(s("Change Interval")), statName: "ChangeInterval", onExecute: function() { W({ initVal: F.interval.value(), selectOnInit: !0 }) } }; !h.enabled("show_interval_dialog_on_key_press") || this.readOnly() || this ._hideSymbolSearch || (O.shortcutHint = ",", O.hotkeyGroup = this ._hotkeys, O.hotkeyHash = 188); var L, D, V = new A(O); if (!TradingView.onWidget()) { if (this._options.addToWatchlistEnabled) { const e = { hotkeyGroup: this._hotkeys }; L = new WatchListAction(this, e) } D = new A({ label: s("Add To Text Notes"), statName: "AddToTextNotes", onExecute: function() { window.runOrSignIn((function() { TradingView.bottomWidgetBar && ( TradingView.bottomWidgetBar .toggleWidget("text_notes", !0), TradingView .bottomWidgetBar._widgets .text_notes.addNote(null, t .getSymbol(!0), t .getSymbol())) }), { source: "Add text note in chart context menu" }) }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 78 }) } var B = new A({ label: s("Reset Time Scale"), icon: i("LdoW"), statName: "ResetScale", onExecute: function() { t.model().resetTimeScale() }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Mod + v.Modifiers.Alt + 81 }), j = new A({ label: s("Insert Drawing Tool"), subItems: r, statName: "InsertDravingTool" }), H = new A({ label: s("Remove Indicators"), statName: "RemoveAllIndicators", onExecute: this.removeAllStudies.bind(this) }), U = new A({ label: s("Remove Drawings"), statName: "RemoveAllDrawingTools", onExecute: this.removeAllDrawingTools.bind(this) }), G = new A({ label: s("All Indicators And Drawing Tools"), statName: "RemoveAllIndicatorsAndDrawingTools", onExecute: this.removeAllStudiesDrawingTools.bind(this) }), q = this.chartWidgetCollection(), Y = new A({ label: s("Apply these Indicators to Entire Layout"), statName: "ApplyIndicatorsToAllCharts", onExecute: function() { q.applyIndicatorsToAllCharts(t) } }), K = { label: se(s("Insert Indicator")), statName: "InsertIndicator", onExecute: function() { t.showIndicators() } }; this._options.indicatorsDialogShortcutEnabled && (K.hotkeyGroup = this ._hotkeys, K.hotkeyHash = 191, new A({ label: se(s("Insert Indicator")), statName: "InsertIndicator", onExecute: function() { t.showIndicators() }, hotkeyGroup: this._hotkeys, hotkeyHash: 111 })); var J, Z = new A(K), X = new A({ label: se(s("Compare or Add Symbol")), statName: "CompareOrAddSymbol", onExecute: this.toggleCompareOrAdd.bind(this) }), Q = new A({ label: se(s("Compare")), statName: "Compare", onExecute: this.toggleCompareOrAdd.bind(this) }), ee = new A({ label: se(s("Object Tree")), statName: "ObjectsTree", onExecute: this.showObjectsTreePanelOrDialog.bind(this) }), te = new A({ label: se(s("Settings")), icon: i("MXV9"), statName: "ChartProperties", onExecute: function() { t.showGeneralChartProperties() } }), ie = new A({ label: se(s("Settings")), icon: i("MXV9"), statName: "MainSeriesProperties", onExecute: function() { t.showGeneralChartProperties(f.symbol) } }), re = new A({ label: s("Lock/Unlock"), statName: "ToggleLockSelectedObject", onExecute: this.toggleLockSelectedObject.bind(this) }), ne = new A({ label: s("Hide"), icon: i("dmHa"), statName: "HideSelectedObject", onExecute: this.hideSelectedObject.bind(this) }); h.enabled("property_pages") && (J = new A({ label: se(s("Settings")), icon: i("MXV9"), statName: "EditSelectedObject", onExecute: function() { t.showSelectedSourceProperties() } })), this.withModel(null, (function() { var e = t.model().mainSeries(), i = e.properties(); i.priceAxisProperties.subscribe(t, t._updateScalesActions), e.priceScaleAboutToBeChanged().subscribe(t, ( function() { i.priceAxisProperties.unsubscribeAll(t) })), e.priceScaleChanged().subscribe(t, ( function() { i.priceAxisProperties.subscribe(t, t ._updateScalesActions), t ._updateScalesActions() })) })); var oe = new A({ label: s("Scale Price Chart Only"), checkable: !0, statName: "ScalePriceChartOnly" }); oe.binder = new u(oe, this._properties.scalesProperties.scaleSeriesOnly, this.model(), s("Scale Price Chart Only")); var ae = this.model().model(); this._properties.scalesProperties.scaleSeriesOnly.listeners().subscribe( null, (function() { ae.recalculateAllPanes(), ae.invalidate(N.full()) })); var le = new A({ label: s("Drawings Toolbar"), checkable: !0, statName: "ToggleDrawingToolbar" }), ce = this._options.isDrawingToolbarVisible; ce && (ce.subscribe((function(e) { le.update({ checked: e }) }), { callWithLast: !0 }), le.update({ onExecute: function() { ce.setValue(!ce.value()) } })); var he = new A({ label: s("Stay in Drawing Mode"), checkable: !0, statName: "ToggleStayInDrawingMode" }); he.binder = new u(he, k.properties().stayInDrawingMode, this.model(), s( "Stay In Drawing Mode")); var ue = new A({ label: s("Sync drawings to all charts"), checkable: !0, statName: "ToggleSyncDrawings" }); ue.binder = new u(ue, k.properties().drawOnAllCharts, this.model(), "SyncDrawings"); var ge = new A({ label: s("Lock All Drawing Tools"), checkable: !0, statName: "ToggleLockDrawings" }); ge.binder = new u(ge, k.lockDrawings(), this.model(), s("Lock drawings"), ( function() { k.lockDrawings().setValue(this.value()) })); var be = new A({ label: s("Hide All Drawing Tools"), checkable: !0, statName: "ToggleHideAllDrawingTools", hotkeyHash: v.Modifiers.Mod + v.Modifiers.Alt + 72, hotkeyGroup: this._hotkeys }); be.binder = new u(be, k.hideAllDrawings(), this.model(), s( "Hide All Drawing Tools"), (function() { var e = _("ChartToolsHideMode", "drawings"), t = k.hideAllDrawings(), i = k.hideAllIndicators(); switch (e) { case "drawings": t.setValue(!t.value()); break; case "indicators": i.setValue(!i.value()); break; default: t.setValue(!t.value()), i.setValue(!i.value()) } })); var ve = new A({ label: s("Hide Marks On Bars"), checkable: !0, statName: "ToggleHideMarksOnBars" }); ve.binder = new u(ve, k.hideMarksOnBars(), this.model(), s( "Hide Marks On Bars"), (function() { k.hideMarksOnBars().setValue(this.value()) })); var Se = new A({ label: s("Symbol Last Price Label"), checkable: !0, checked: !1, statName: "ToggleSymbolLastValue" }); Se.binder = new u(Se, this.properties().scalesProperties .showSeriesLastValue, this.model(), s("Show Symbol Last Value")); var ye = new A({ label: s("Symbol Name Label"), checkable: !0, checked: !1, statName: "ToggleSymbolLabels" }); ye.binding = new u(ye, this.properties().scalesProperties.showSymbolLabels, this.model(), "Undo Show Symbol Labels"); var we = new A({ label: s("Indicator Last Value Label"), checkable: !0, checked: !1, statName: "ToggleStudyLastValue" }); we.binder = new u(we, this.properties().scalesProperties.showStudyLastValue, this.model(), s("Show Indicator Last Value")); var Pe = new A({ label: s("Indicator Name Label"), checkable: !0, checked: !1, statName: "ToggleIndicatorsLabels" }); Pe.binding = new u(Pe, this.properties().scalesProperties .showStudyPlotLabels, this.model(), "Undo Show Indicator Labels"); var Ce = this.model().mainSeries().properties().highLowAvgPrice, xe = new A({ label: s("High and low price labels"), checkable: !0, checked: !1, statName: "ToggleHighLowPriceLabels" }); xe.binding = new u(xe, Ce.highLowPriceLabelsVisible, this.model(), s( "Show high and low price labels")); var Te = new A({ label: s("High and low price lines"), checkable: !0, checked: !1, statName: "ToggleHighLowPriceLine" }); Te.binding = new u(Te, Ce.highLowPriceLinesVisible, this.model(), s( "Show high and low price lines")); var Ie = new A({ label: s("Average close price label"), checkable: !0, checked: !1, statName: "ToggleAverageClosePriceLabel" }); Ie.binding = new u(Ie, Ce.averageClosePriceLabelVisible, this.model(), s( "Show average close price label")); var Me = new A({ label: s("Average close price line"), checkable: !0, checked: !1, statName: "ToggleAverageClosePriceLine" }); Me.binding = new u(Me, Ce.averageClosePriceLineVisible, this.model(), s( "Show average close price line")); var Oe = new A({ label: s("Financials Last Value Label"), checkable: !0, checked: !1, statName: "ToggleFundamentalsLastValue" }); Oe.binder = new u(Oe, this.properties().scalesProperties .showFundamentalLastValue, this.model(), "Show Financials Last Value"); var Le = new A({ label: s("Financials Name Label"), checkable: !0, checked: !1, statName: "ToggleFundamentalsLabels" }); Le.binding = new u(Le, this.properties().scalesProperties .showFundamentalNameLabel, this.model(), "Show Financials Name Label"); var Ae = new A({ label: s("Countdown To Bar Close"), checkable: !0, checked: !1, statName: "ToggleCountdown" }); Ae.binder = new u(Ae, this.model().mainSeries().properties().showCountdown, this.model(), Ae.getLabel()); var Ee = new A({ label: s("Currency"), checkable: !0, checked: !0, statName: "ToggleScalesCurrency" }); Ee.binder = new u(Ee, this.properties().scalesProperties.showCurrency, this .model(), "Change Currency Label Visibility"); var ke = new A({ label: s("Unit"), checkable: !0, checked: !0, statName: "ToggleScalesUnit" }); ke.binder = new u(ke, this.properties().scalesProperties.showUnit, this .model(), "Change Unit Label Visibility"); var De = new A({ label: s("Plus Button"), checkable: !0, checked: de.value(), statName: "ToggleAddOrderPlusButton" }); De.binder = new u(De, de, this.model(), De.getLabel()); var Ve = null; this._options.goToDateEnabled && (Ve = new A({ label: se(s("Go to Date")), statName: "GoToDate", onExecute: function() { var e = t._chartWidgetCollection.activeChartWidget .value(); g(e) }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 71 })); var Be = new A({ label: se(s("Symbol Info")), icon: i("1pHB"), checkable: !1, statName: "SymbolInfo", onExecute: function() { var e = t.model().mainSeries().symbol(), i = t.model().mainSeries().symbolInfo(), s = t.model().model().availableUnits(), r = t.model().model().unitConversionEnabled(); R(e, { symbolInfo: i, showUnit: r, unitName: function(e) { return s.name(e) } }) } }), Re = new A({ label: pe, statName: "MergeAllScalesToLeft", onExecute: function() { t.model().mergeAllScales("left") } }), Ne = new A({ label: _e, statName: "MergeAllScalesToRight", onExecute: function() { t.model().mergeAllScales("right") } }), je = new A({ label: me, statName: "MoveScaleToLeft", onExecute: function() { t.model().mergeAllScales("left") } }), Fe = new A({ label: fe, statName: "MoveScaleToRight", onExecute: function() { t.model().mergeAllScales("right") } }); var We = h.enabled("show_object_tree"); if (this._actions = { chartProperties: te, mainSeriesPropertiesAction: ie, timeScaleReset: B, chartReset: a, invertSeriesScale: l, logSeriesScale: w, autoSeriesScale: c, lockSeriesScale: d, regularSeriesScale: p, percentSeriesScale: S, indexedTo100SeriesScale: y, compareOrAdd: X, compare: Q, paneObjectTree: We ? ee : void 0, insertIndicator: Z, insertDrawingTool: j, applyColorTheme: T, symbolSearch: M, showSymbolInfoDialog: Be, changeInterval: V, seriesHide: ne, studyHide: ne, lineToggleLock: re, lineHide: ne, scaleSeriesOnly: oe, drawingToolbarAction: le, stayInDrawingModeAction: he, syncModeAction: ue, lockDrawingsAction: ge, hideAllDrawingsAction: be, hideAllMarks: ve, applyTimeZone: I, showCountdown: Ae, showCurrency: Ee, showUnit: ke, addPlusButton: De, showSeriesLastValue: Se, showHighLowPriceLabels: xe, showHighLowPriceLines: Te, showAverageClosePriceLabel: Ie, showAverageClosePriceLine: Me, showSymbolLabelsAction: ye, showStudyLastValue: we, showStudyPlotNamesAction: Pe, showFundamentalsLastValueAction: Oe, showFundamentalNamesAction: Le, undo: P, redo: C, mergeLeftScalesAction: Re, mergeRightScalesAction: Ne, moveScaleToLeft: je, moveScaleToRight: Fe, moveChartAction: void 0 }, e && (this._actions.scalesProperties = e), L && (this._actions .addToWatchlist = L), h.enabled("show_source_code") && (this ._actions.viewSourceCode = new A({ label: se(s("Source Code")), statName: "OpenSelectedObjectSource", onExecute: this.openSelectedObjectSource.bind(this) })), !TradingView.onWidget() && h.enabled("text_notes") && (this ._actions.addToTextNotes = D), null !== Ve && (this._actions .gotoDate = Ve), this.createSessionBreaksActions(), !this .readOnly()) { var He = new A({ label: s("Remove"), icon: i("aVjL"), statName: "RemoveSelectedObject", onExecute: function() { var e = this._chartWidgetCollection .activeChartWidget.value(); e || (e = this), e.removeSelectedSources() }.bind(this), hotkeyGroup: this._hotkeys, hotkeyHash: b.isMacKeyboard ? 8 : 46 }); this._hotkeys.add({ handler: function() { this.removeSelectedSources() }.bind(this), desc: "Remove selected source", hotkey: b.isMacKeyboard ? 46 : 8 }), this._actions.insertDrawingTool = j, this._actions .paneRemoveAllStudies = H, this._actions.paneRemoveAllDrawingTools = U, this._actions.paneRemoveAllStudiesDrawingTools = G, this._actions .applyStudiesToAllCharts = Y, this._actions.seriesRemove = He, this ._actions.studyRemove = He, this._actions.lineRemove = He, h .enabled("property_pages") && (this._actions.format = J), this ._actions.lockDrawingsAction = ge, this._actions .hideAllDrawingsAction = be, this._actions.hideAllMarks = ve } this._actions.showPriceLine = new A({ label: s("Price Line"), checkable: !0, statName: "TogglePriceLine" }), this._actions.showPriceLine.binding = new u(this._actions .showPriceLine, this.model().mainSeries().properties() .showPriceLine, this.model(), "Undo Toggle Price Line"), this .readOnly() || (this._actions.horzLineRightThere = new A({ label: s("Draw Horizontal Line Here"), onExecute: function() { t.activePaneWidget && t.activePaneWidget .drawRightThere("LineToolHorzLine") }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 72 }), this._actions.vertLineRightThere = new A({ label: s("Draw Vertical Line Here"), onExecute: function() { t.activePaneWidget && t.activePaneWidget .drawRightThere("LineToolVertLine") }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 86 }), this._actions.crossLineRightThere = new A({ label: s("Draw Cross Line Here"), onExecute: function() { t.activePaneWidget && t.activePaneWidget .drawRightThere("LineToolCrossLine") }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 67 }), this._actions.trendLine = new A({ label: s("Draw Trend Line"), onExecute: function() { t.activePaneWidget && k.tool.setValue( "LineToolTrendLine") }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 84 }), this._actions.FibRetracement = new A({ label: s("Draw Fib Retracement"), onExecute: function() { t.activePaneWidget && k.tool.setValue( "LineToolFibRetracement") }, hotkeyGroup: this._hotkeys, hotkeyHash: v.Modifiers.Alt + 70 })), this._updateScalesActions() } options() { return this._options } executeActionById(e) { if ("takeScreenshot" === e) return console.warn( 'Action "takeScreenshot" is deprecated. Use method "takeScreenshot" instead' ), void this._chartWidgetCollection.takeScreenshot(); "lockDrawingsAction" === e && console.warn( 'Action "lockDrawingsAction" is deprecated. Use method "lockAllDrawingTools" instead' ), "hideAllDrawingsAction" === e && console.warn( 'Action "hideAllDrawingsAction" is deprecated. Use method "hideAllDrawingTools" instead' ), e in this._actions ? this._actions[e] instanceof A && this ._actions[e].execute() : console.warn("Unknown action id: " + e) } getCheckableActionState(e) { if ("lockDrawingsAction" === e) return console.warn( 'Action "lockDrawingsAction" is deprecated. Use method "lockAllDrawingTools" instead' ), null; if ("hideAllDrawingsAction" === e) return console.warn( 'Action "hideAllDrawingsAction" is deprecated. Use method "hideAllDrawingTools" instead' ), null; if (e in this._actions) { var t = this._actions[e]; if (t instanceof A && t.isCheckable()) return t.isChecked(); console.warn("Action " + e + " has no state") } else console.warn("Unknown action id: " + e); return null } _updateScalesActions() { if (null !== this._actions) { var e = this.model().mainSeries(), t = e.priceScale(), i = e.properties(), s = t.isLockScale(), r = i.style.value() === c.STYLE_PNF; this._actions.percentSeriesScale.update({ disabled: s || r, checked: t.isPercentage() }), this._actions.logSeriesScale.update({ disabled: s || r, checked: t.isLog() }), this._actions.regularSeriesScale.update({ disabled: s || r, checked: t.isRegular() }), this._actions.indexedTo100SeriesScale.update({ disabled: s || r, checked: t.isIndexedTo100() }), this._actions.invertSeriesScale.update({ checked: t.isInverted() }), this._actions.lockSeriesScale.update({ checked: t.isLockScale() }), this._actions.autoSeriesScale.update({ checked: t.isAutoScale(), disabled: t.properties().autoScaleDisabled.value() }) } } removeAllStudies() { this._model.removeAllStudies() } removeAllDrawingTools() { this._model.removeAllDrawingTools() } removeAllStudiesDrawingTools() { this._model.removeAllStudiesAndDrawingTools() } defaultSymbol() { return this._defSymbol } connect() { this._handler = function(e) { this._onData(e) }.bind(this), this._boundOnChartSessionIsConnectedChanged = this ._onChartSessionIsConnectedChanged.bind(this), this._chartSession .isConnected().subscribe(this._boundOnChartSessionIsConnectedChanged), this._chartSession.criticalError().subscribe(this, this ._onChartSessionCriticalError), this._chartSession.connect(this ._handler) } finishInitWithoutConnect() { this._chartSession.disable(), this._init(), this.chartWidgetInitialized .fire() } reconnect() { this._chartSession.disconnect(), this._chartSession.connect() } update() { if (this._model) { for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e] .update(); this._timeAxisWidget && this._timeAxisWidget.update() } } _makeDefaultGui() { this._makeLoadingScreen(), this._model && (this._makeTimeAxisWidget(), this ._makePaneWidgetsAndSeparators()), this.adjustSize(), this ._updateScalesActions(), y(this._elMainTable), this.update(), this .paint() } widget() { return this._mainDiv } _onBackgroundColorChanged() { for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e] .setCursorForTool(); this.update(), this.model().model().fullUpdate() } setScaleLineColor(e) { this.scaleLineColor = e.value(), this._paneSeparators.forEach((function(e) { e.update() })), this.update(), this.paint() } setScaleTextColor(e) { this.scaleTextColor = e.value(), this.update(), this.paint() } setTimingsMeter(e) { this._timingsMeter = e, this._updateTimingsMeterState() } ownerDocument() { return this._parent.ownerDocument } _updateTimingsMeterState() { var e = this._options.visible.value(); null !== this._timingsMeter && (e ? this._timingsMeter.startCollect() : this ._timingsMeter.stopCollect()) } _update(e) { var t = e ? e.fullInvalidation() : j.Full, i = !!e && e.isVisibleTimeRangeLockedOnResize(); if (null !== this._timingsMeter && this._timingsMeter.startDraw(t), t === j.Full && (this._model ? this._updateGui(i) : this.adjustSize(i)), e.invalidateForTimeScale() > j.Cursor && this._timeAxisWidget.update(), this.paint(e), this._dataWindowWidget) { var s = e.maxPaneInvalidation(); s === j.Full ? this._dataWindowWidget.fullUpdate() : s > j.None && this ._dataWindowWidget.update() } for (var r = 0; r < this._paneWidgets.length; r++) this._paneWidgets[r] .updateStatusWidget(e.invalidateForPane(r).fullInvalidation()); null !== this._timingsMeter && this._timingsMeter.stopDraw(), e && e .panesOrderInvalidated() && ae.emit("panes_order_changed") } _createVolumeIfNeeded() { var e = h.enabled("create_volume_indicator_by_default") && this._options .addVolume, t = !this._content, i = h.enabled("charting_library_base"), s = h.enabled("create_volume_indicator_by_default_once"), r = this._content && !this._content.loading; e && (t || i && r && !s) && this._model.mainSeries().dataEvents() .symbolResolved().subscribe(this, (function() { var e = this; setTimeout((function() { var t = e._model.model().mainSeries() .symbolInfo(); if (t) { var i = !t.has_no_volume; if (!e.containsVolume() && i) { var s = te.factoryDefaults( "chartproperties.volumePaneSize" ), r = e._model.model() .createStudyInserter({ type: "java", studyId: "Volume@tv-basicstudies" }); r.setForceOverlay(h.enabled( "volume_force_overlay")), r .setPaneSize(s), h.enabled( "hide_volume_ma") && r .setPropertiesState({ styles: { vol_ma: { visible: !1 } } }), r.insert() } else if (!i && e.containsVolume()) { var n = e.model().dataSources() .filter((function(e) { return e instanceof w && "Volume" === e .metaInfo() .shortId }))[0]; e._model.model().removeSource(n) } } }), 0) }), s) } _createSessions(e) { var t = this.showGeneralChartProperties.bind(this, f.timezoneSessions); e.createSessions(t) } _createPrePostMarket(e) {} _createChartEventsSource() { throw new Error("Not implemented") } _onChartStyleChanged() { $("Chart", "Chart Style " + this._model.mainSeries().getStyleShortName() .toUpperCase()) } _updateGui(e) { this._model && (this._makeTimeAxisWidget(), this ._makePaneWidgetsAndSeparators(), this._elMainTable.style .userSelect = "none", this.adjustSize(e)) } setVisibleTimeRange(e, t, i, s) { { const r = this._model.mainSeries().seriesSource(); this._chartSession.setVisibleTimeRange(r.instanceId(), r.turnaround(), e, t, i || {}, s) } } _makeLoadingScreen() { if (h.enabled("lean_chart_load")) { if (this.screen) return; this.screen = new ee(this, this._parent) } else this.screen = new ee(this, this._mainDiv) } _makeAvailableOnTVPopup() { throw new Error("Not implemented") } _setSymbol(e, t) { if (this._model) { var i = this._model.mainSeries(); if (!t && i.symbolSameAsCurrent(e)) return; this._model.selectionMacro((function(e) { e.clearSelection() })), this._model.setSymbol(this._model.mainSeries(), e) } else this._properties.mainSeriesProperties.merge({ symbol: e }) } setSymbol(e, t) { return this._setSymbol.apply(this, arguments) } loadRange(e) { this._model && (this.screen.show(), this._model.loadRange(e)) } getSymbol(e) { var t; return (t = this._model ? this._model.mainSeries().properties() : this ._properties.mainSeriesProperties) ? e && t.shortName && t.shortName .value() ? t.shortName.value() : t.symbol.value() : "" } toggleMaximizePane(e) { if (!(this._paneWidgets.length < 2)) { this._maximizedPaneWidget ? (this._maximizedPaneWidget.state() .setMaximized(!1), this._maximizedPaneWidget = null, this ._paneSeparators.forEach((function(e) { e.show() }))) : (this._maximizedPaneWidget = e, this._maximizedPaneWidget .state().setMaximized(!0), this._paneSeparators.forEach(( function(e) { e.hide() }))); for (var t = this._paneWidgets.length; t--;) this._paneWidgets[t] .updateControls(), this._paneWidgets[t].updatePriceAxisWidgets(); this._timeAxisWidget.updatePriceAxisStubs(), this.adjustSize(), this .updateCrossHairPositionIfNeeded() } } _titlesProvider(e, t) { var i = this.model(), s = this._maximizedPaneWidget ? this._maximizedPaneWidget.state() : i .paneForSource(i.mainSeries()), r = "right" === e ? s.rightPriceScales() : s.leftPriceScales(); if (r.length < t + 1) return []; var n = r[t].orderedSources().filter((function(e) { return e === i.mainSeries() || e instanceof w })); return n.reverse(), (n = a(n, i.mainSeries())).map((function(e) { return e.title(!0, void 0, !1) })) } _menuItemsProvider(e, t) { var i = this.model(), s = this._maximizedPaneWidget ? this._maximizedPaneWidget.state() : i .paneForSource(i.mainSeries()), r = "right" === e ? s.visibleRightPriceScales() : s .visibleLeftPriceScales(); if (r.length < t + 1) return []; var n = r[t], o = i.panes().indexOf(s), a = this._paneWidgets[o]; return ("right" === e ? a.rightPriceAxisesContainer() : a .leftPriceAxisesContainer()).findAxisWidgetForScale(n) .getContextMenuActions() } _makeTimeAxisWidget() { if (this._timeAxisWidget) this._timeAxisWidget.updatePriceAxisStubs(); else { var e = this.model(); this._timeAxisWidget = new l(this, this._options.timeScaleWidget, this ._titlesProvider.bind(this), this._menuItemsProvider.bind(this), this._backgroundBasedTheme), this._elMainTable.appendChild(this ._timeAxisWidget.getElement()), this._timeAxisWidget .updatePriceAxisStubs(), this._timeAxisWidget.onLabelHovered() .subscribe(this, (function(t, i) { var s = this._maximizedPaneWidget ? this ._maximizedPaneWidget.state() : e.paneForSource(e .mainSeries()), r = this.paneByState(s).highlightedPriceAxis(), n = r.value(); (i || n.owner === t.owner) && (r.setValue({ owner: t.owner, axis: i ? t.axis : null }), this.model().model().lightUpdate()) })) } } insertStudy(e, t, i, s) { var r = this; return new Promise((function(n) { t ? window.runOrSignIn((function() { n(r._insertStudy(e, t, i, s)) }), { source: "study on study" }) : n(r._insertStudy(e, t, i, s)) })).catch((function() {})) } _insertStudy(e, t, i, s) { var r = this._model.createStudyInserter(e, t, i); r.setForceOverlay("java" === e.type && "Volume@tv-basicstudies" === e .studyId && h.enabled("volume_force_overlay")); var n = this, o = r.insert((function(e, t, i) { return new Promise((function(r, o) { n.selectPointMode().value() && n .cancelRequestSelectPoint(), s ? r(s(e, t, i)) : n.isSymbolicStudy(i) ? ($( "GUI", "Confirmation dialogs", "Symbol confirmation dialog"), S(n, i, r, o, "symbol")) : n .hasConfirmInputs(t) ? ($("GUI", "Confirmation dialogs", "Inputs confirmation dialog"), S(n, i, r, o)) : r({}) })) })); return o.catch((function(e) {})), o } hasConfirmInputs(e) { if (void 0 === e) return !1; for (var t = 0; t < e.length; ++t) { var i = e[t]; if (void 0 !== i.confirm && i.confirm) return !0 } return !1 } isSymbolicStudy(e) { switch (e.id) { case "Overlay@tv-basicstudies": case "CorrelationCoefficient@tv-basicstudies": case "Correlation Coeff@tv-basicstudies": case "Spread@tv-basicstudies": case "Ratio@tv-basicstudies": return !0; default: return !1 } } _onChartSessionIsConnectedChanged(e) { e ? this._onConnection() : this._onDisconnect() } _onChartSessionCriticalError(e, t) { this._disconnected.fire(!0) } _onData(e) { switch (e.method) { case "reconnect_bailout": this._reconnectBailout.fire(); break; default: this._model.onData(e) } } _onConnection() { this._online = !0, this._model ? (this._model.restart(), this._updateGui(), this.update(), this.paint(), this._connected.fire()) : this .requestMetadata() } _onDisconnect() { this._model && this._model.disconnect(), this._online = !1, this.update(), this.paint(), this._disconnected.fire() } _applyStudiesOverrides() { Z.overrideDefaults(this._metaInfoRepository.getInternalMetaInfoArray()) } requestMetadata() { this._addPerfMark("RequestMetadataStart"), this._metaInfoRepository .requestMetaInfo().then(function() { this._addPerfMark("RequestMetadataEnd"), this._inited ? this .model().model().setStudiesMetaData(this._metaInfoRepository .getInternalMetaInfoArray(), this._metaInfoRepository .getMigrations()) : (this._init(), this .chartWidgetInitialized.fire(), h.enabled( "charting_library_base") || ie.logDebug( "initialized")) }.bind(this)) } studiesMetaData() { return this._model.studiesMetaData() } getTimeScale() { return this._timeAxisWidget } chartWidgetCollection() { return this._chartWidgetCollection } setSeriesStyle(e, t) { this._model.setProperty(e.properties().style, t) } showObjectsTreePanelOrDialog() { var e = !1, t = window.widgetbar; t && t.isVisible() && (e = "object_tree" === t.setPage("object_tree").name); e || this.showObjectsTreeDialog() } _showChartProperties(e, t, i, s) { t && (m("properties_dialog.active_tab.chart", t), i.tabName = t); var r = this; return new Promise((function(t) { d(e, r._model, i, r._chartWidgetCollection, s).then(( function(e) { t(null !== e && e.isVisible() ? e : null) })) })) } showGeneralChartProperties(e) { if (!h.enabled("show_chart_property_page")) return Promise.resolve(null); var t = this; return this._showChartProperties(this._model.mainSeries(), e, { doNotCloseOnBgClick: !0, onResetToDefault: function() { t._model.restorePreferences(t._model), t.applyTheme(t) } }).then((function(e) { if (null === e) return null; var i = function() { e.hide(), t._chartWidgetCollection.activeChartWidget .unsubscribe(i) }; return t._chartWidgetCollection.activeChartWidget.subscribe( i), e })) } showChartPropertiesForSource(e, t, i, s) { return h.enabled("property_pages") ? e === this._model.model() .mainSeries() ? this.showGeneralChartProperties(t) : ((i = i || {}) .onResetToDefault = this._model.restorePropertiesForSource.bind(this ._model, e), this._showChartProperties(e, t, i, s)) : Promise .resolve(null) } generalPropertiesDefinitions() { return this._getChartPropertyDefinitionsViewModel().then((function(e) { return e.propertyPages() })) } propertiesDefinitionsForSource(e) { return I(e) || C(e) || M(e) ? e.getPropertyDefinitionsViewModel().then(( function(e) { return null === e ? null : e.propertyPages() })).catch((function(e) { return ie.logWarn(e), null })) : Promise.resolve(null) } toggleCompareOrAdd() { this._compareDialog.visible().value() ? this._compareDialog.hide() : this ._compareDialog.show() } showIndicators(e) { if (window.studyMarket) return window.studyMarket.visible().value() ? void window.studyMarket.hide() : (window.studyMarket.show(e), window .studyMarket) } showFundamentals(e) { if (window.fundamentalsDialog) { if (!window.fundamentalsDialog.visible().value()) { var t, i = void 0 !== e ? e.title(!0) : void 0; if (void 0 !== e) { var s = e.symbolInfo(); t = null === s ? e.symbol() : s.ticker || s.full_name } return window.fundamentalsDialog.show(t, i), window .fundamentalsDialog } window.fundamentalsDialog.hide() } } removeSelectedSources() { this.removeDataSources(this._model.selection().dataSources()) } removeDataSources(e) { var t = e.filter(function(e) { return e !== this._model.mainSeries() && e !== this._model .lineBeingCreated() && !(e instanceof O) }.bind(this)); if (0 !== t.length) { var i = null; C(t[0]) && (n(1 === t.length, "Cannot remove several studies (no multi select for studies)" ), i = t[0]); t.find((function(e) { return e.hasAlert.value() && e.isUserDeletable() })); i && i.hasChildren() ? showDeleteStudyTreeConfirm(this._model .removeSelectedSources.bind(this._model)) : this._model .removeSelectedSources() } } unlinkSelectedLine() { var e = this._model, t = e.selection().lineDataSources(); e.unlinkLines(t) } copyLineToOtherCharts() { var e = this._model, t = e.selection().lineDataSources().filter((function(e) { return e.isSynchronizable() })); e.copyToOtherCharts(t) } hideSelectedObject() { this.hideDataSources(this._model.selection().dataSources()) } hideDataSources(e) { if (e.length) { var t = e.map((function(e) { return e.properties().visible })), i = e.map((function() { return !1 })); this._model.setProperties(t, i, "Hide " + e[0].title()) } } toggleLockSelectedObject() { var e = this._model; e.selection().lineDataSources().forEach((function(t) { var i = t.properties().frozen.value(); e.setProperty(t.properties().frozen, !i, s(i ? "Unlock" : "Lock") + " " + t.title()) })) } showSelectedSourceProperties() { var e = this._model.selection().dataSources()[0]; e && this.showSourceProperties(e) } showSourceProperties(e) { var t = null; e === this._model.mainSeries() && (t = f.symbol), this .showChartPropertiesForSource(e, t) } openSelectedObjectSource(e) {} tags() { return this._model ? this._model.calculateDefaultTags() : [] } state(e, t, i, s) { if (this._model) { const r = this._model.state(e, t, i, s); return r.chartId = this.id(), r } return this._content ? this._content : {} } asyncState() { return this._model.asyncState() } metaInfo() { var e = this._metaInfo; return this._model && (e.systemTags = this._model.calculateDefaultTags()), e } onTagsChanged() { return this._tagsChanged } onModelTagsChanged() { this._tagsChanged.fire() } onAboutToBeDestroyed() { return this._aboutToBeDestroyed } destroy() { this._aboutToBeDestroyed.fire(), null !== this._removeMaximizeHotkey && ( this._removeMaximizeHotkey(), this._removeMaximizeHotkey = null), 0 !== this._drawRafId && this._parent.ownerDocument.defaultView .cancelAnimationFrame(this._drawRafId), null !== this ._backgroundTopColorSpawn && this._backgroundTopColorSpawn.destroy(), null !== this._backgroundBottomColorSpawn && this ._backgroundBottomColorSpawn.destroy(), null !== this._timingsMeter && ( this._timingsMeter.stopCollect(), this._timingsMeter = null); for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e] .destroy(); this._paneWidgets.length = 0; for (e = 0; e < this._paneSeparators.length; e++) this._paneSeparators[e] .destroy(); for (var t in this._paneSeparators.length = 0, this._hotkeysListener && this ._hotkeysListener.destroy(), this._barsButton && this._barsButton .destroy(), this._controlBarNavigation && (this ._controlBarNavigation.destroy(), this._controlBarNavigation = void 0), this._mainDiv && this._mainDiv.remove(), this ._actions) { var i = this._actions[t]; i instanceof A && (i.destroy(), i.binder && i.binder.destroy()) } null !== this._timeAxisWidget && (this._timeAxisWidget.destroy(), this ._timeAxisWidget = null), null !== this._definitionsViewModel && this._definitionsViewModel.destroy(), this._hotkeys && (this._hotkeys .destroy(), this._hotkeys = null), this._mainDiv .removeEventListener("wheel", this._onWheelBound), window .removeEventListener("keydown:chart_" + this._id, this ._keydownEventListener), super.destroy(), this._chartSession .criticalError().unsubscribe(this, this._onChartSessionCriticalError), this._chartSession.isConnected().unsubscribe(this ._boundOnChartSessionIsConnectedChanged), this._chartSession .destroy() } title() { return s("Chart Properties") } symbolProperty() { return this._model.mainSeries().properties().shortName ? this._model .mainSeries().properties().shortName : this._model.mainSeries() .properties().symbol } loadContent(e, t) { this.screen.show(); this.isMaximizedPane() && this.toggleMaximizePane(); for (var i, s = this._model.model().dataSources(), r = 0; r < s .length; r++) { var n = s[r]; n !== this._model.mainSeries() && this._model.model().removeSource(n, ! 0) } this._model.disconnect(), this.activePaneWidget = null, this._model .mainSeries().purgeSymbolInfo(), e.loading = !0, this._content = e, this ._initialLoading = Boolean(t); for (r = 0; r < e.panes.length; ++r) for (var o = 0; o < e.panes[r].sources.length; ++o) if (e.panes[r].sources[o].state.symbol) { i = e.panes[r].sources[o].state; break } if (!i) throw Error( "An error occured while determining main series ion the chart"); this._properties.mainSeriesProperties.mergeAndFire({ visible: !0, symbol: i.symbol, timeframe: "", onWidget: this._onWidget, interval: i.interval || "D", style: i.style }), this._init(), this._model.undoHistory().clearStack() } _contentSeriesProperties() { if (this._content) for (var e = this._content.panes.length; e-- > 0;) for (var t = this._content.panes[e].sources, i = t.length; i-- > 0;) if ("MainSeries" === t[i].type) return t[i].state } updateUndoRedo() { this._model && (this.actions().undo.update({ disabled: this._model.undoHistory().undoStack().isEmpty() }), this.actions().redo.update({ disabled: this._model.undoHistory().redoStack().isEmpty() })) } createSessionBreaksActions(e) { var t = new A({ label: s("Session Breaks"), checkable: !0, statName: "ToggleSessionBreaks" }); t.binder = new u(t, this._model.chartModel().sessions().properties() .graphics.vertlines.sessBreaks.visible, this.model(), "Session Breaks"), this._actions.sessionBreaks = t } updateActionForIntradayOnly(e) { e && e instanceof A && e.update({ disabled: this.model().mainSeries().isDWM() }) } containsVolume() { return this.model().dataSources().some((function(e) { return e instanceof w && "Volume" === e.metaInfo().shortId })) } containsStudyByPredicate(e) { return !!this._model && this._model.dataSources().some((function(t) { if (!(t instanceof w)) return !1; var i = t.metaInfo(); return e(i) })) } containsStudy(e) { return this.containsStudyByPredicate((function(t) { return t.id === e || t.fullId === e })) } isSmall() { return this._width() < 550 || this._height() < 300 } onWidget() { return this._onWidget } onCmeWidget() { return "cme" === this.widgetCustomer() } widgetCustomer() { return this._widgetCustomer } resize() { var e = this._height() + "px", t = this._width() + "px"; this._mainDiv.style.height = e, this._mainDiv.style.width = t, this ._elMainTable.style.height = e, this._elMainTable.style.width = t, this ._resizeHandler && this._mainDiv && this._resizeHandler() } chartSession() { return this._chartSession } onLineCancelled() { k.resetToCursor() } _startSpinner(e) { this._spinner || e && (this._spinner = (new X).spin(e)) } isJustClonedChart() { return !!(this._options || {}).justCloned } applyOverrides(e) { var t = {}; for (var i in e) i.startsWith("mainSeriesProperties.priceAxisProperties") || (t[i] = e[i]); if (applyPropertiesOverrides(this.properties(), null, !1, t, null), this ._model) { applyPropertiesOverrides(this._model.model().properties(), null, !1, t), applyPropertiesOverrides(this._model.mainSeries().properties(), null, !1, t, "mainSeriesProperties"), this._model.model() .sessions().applyOverrides(t); const e = this._model.chartModel().watermarkSource(); null !== e && e.applyOverrides(t) } } applyStudiesOverrides(e) { Z.mergeDefaultsOverrides(e), this._applyStudiesOverrides() } setActive(e) { this._isActive = e, Q() && (e && this.selectPointMode().value() ? this .startTrackingMode() : this.exitTrackingMode()), this._paneWidgets .forEach((function(e) { e.update() })), e || this.model().selectionMacro((function(e) { e.clearSelection() })) } isActive() { return this._isActive } trackTime() { return this._chartWidgetCollection.lock.trackTime } crossHairSyncEnabled() { return this._chartWidgetCollection.lock.crosshair.value() } isMultipleLayout() { return ne(this._chartWidgetCollection.layout.value()) } selectPointMode() { return this._model.model().selectPointMode() } cancelRequestSelectPoint() { this._model.model().cancelRequestSelectPoint() } requestSelectPoint(e, t, i) { var s = this; return new Promise((function(r, n) { if (l()) { k.resetToCursor(!0), s._model.lineBeingCreated() && s ._model.cancelCreatingLine(); var o = !1, a = {}; s._model.model().onPointSelected().subscribe(a, ( function(e, t) { o = !0, s._isVisible.unsubscribe(l), s ._hideHint(), r({ point: e, pane: t }) }), !0), s._model.model().requestSelectPoint(e, i), s.startTrackingMode(), void 0 !== t && s ._showHint(t), s._isVisible.subscribe(l), s .selectPointMode().subscribe((function() { setTimeout((function() { o || (s.selectPointMode() .value() || s ._hideHint(), s ._model.model() .onPointSelected() .unsubscribeAll( a), s ._isVisible .unsubscribe(l), n("cancelled")) })) }), { once: !0 }) } function l() { return !!s.isVisible() || (n( "Chartwidget must be visible"), s .cancelRequestSelectPoint(), !1) } })) } showReplayOrderConfirmationDialog() { if (!this.model().isInReplay()) return Promise.resolve() } _addPerfMark(e) { oe("ChartWidget." + this._id + "." + e) } requestFullscreen() { this._options.requestFullscreen() } getResizerDetacher() { return this._options } _createHint() { if (null === this._hintDefferedPromise) { var e = ue(); this._hintDefferedPromise = e; var t = this; Promise.all([i.e("react"), i.e(89), i.e("chart-event-hint")]).then(i .bind(null, "PN5r")).then((function(i) { e.resolve(new i.ChartEventHintRenderer(t ._chartWidgetCollection.getContainer())) })) } return this._hintDefferedPromise ? o(this._hintDefferedPromise).promise : null } _showHint(e) { if (h.enabled("popup_hints")) if (null !== this._activeHint) this._activeHint.show(e); else { var t = this, i = this._createHint(); null !== i && i.then((function(i) { if (null !== i) { if (t._activeHint = i, void 0 === e) return; t._activeHint.show(e) } })) } } _hideHint() { null !== this._activeHint && this._activeHint.hide() } } e.exports.ChartWidget = ge, e.exports.trackingModeIsAvailable = ce }).call(this, i("aIyQ")) }, "Zp/P": function(e, t, i) { "use strict"; i.r(t), i.d(t, "extendAndClipLineSegment", (function() { return h })), i.d(t, "getArrowPoints", (function() { return u })), i.d(t, "optimalBarWidth", (function() { return d })), i.d(t, "optimalCandlestickWidth", (function() { return p })), i.d(t, "optimalHiLoWidth", (function() { return _ })), i.d(t, "interactionTolerance", (function() { return m })), i.d(t, "coordinateIsValid", (function() { return f })), i.d(t, "setValidLineStyle", (function() { return g })), i.d(t, "fillScaledRadius", (function() { return b })), i.d(t, "strokeScaledRadius", (function() { return v })); var s = i("aO4+"), r = i("hBTJ"), n = i("VaSN"), o = i("ogJP"), a = i("jFln"); const l = { line: 13, minDistanceBetweenPoints: 10, series: 14, curve: 10, anchor: 13, esd: 4 }, c = { line: 3, minDistanceBetweenPoints: 5, series: 2, curve: 3, anchor: 2, esd: 0 }; function h(e, t, i, n, o, a) { if (Object(s.equalPoints)(e, t)) return null; const l = new s.Point(0, 0), c = new s.Point(i, n); if (o) { if (a) { const i = Object(r.intersectLineAndBox)(Object(s.lineThroughPoints)(e, t), Object(s .box)(l, c)); return Array.isArray(i) ? i : null } { const i = Object(r.intersectRayAndBox)(t, e, Object(s.box)(l, c)); return null === i || Object(s.equalPoints)(t, i) ? null : Object(s.lineSegment)(t, i) } } if (a) { const i = Object(r.intersectRayAndBox)(e, t, Object(s.box)(l, c)); return null === i || Object(s.equalPoints)(e, i) ? null : Object(s.lineSegment)(e, i) } { const i = Object(r.intersectLineSegmentAndBox)(Object(s.lineSegment)(e, t), Object(s .box)(l, c)); return Array.isArray(i) ? i : null } } function u(e, t, i, s) { const r = .5 * i, n = Math.sqrt(2), o = t.subtract(e), a = o.normalized(); let l = 5 * i; s && (l = Math.min(l, .35 * o.length())); const c = 1 * r; if (l * n * .2 <= c) return []; const h = a.scaled(l), u = t.subtract(h), d = a.transposed(), p = 1 * l, _ = d.scaled(p), m = u.add(_), f = u.subtract(_), g = m.subtract(t).normalized().scaled(c), b = f.subtract(t).normalized().scaled(c), v = t.add(g), S = t.add(b), y = r * (n - 1), w = d.scaled(y), P = Math.min(l - 1 * r / n, r * n * 1), C = a.scaled(P), x = t.subtract(w), T = t.add(w), I = t.subtract(C); return [ [m, v], [f, S], [x, I.subtract(w)], [T, I.add(w)] ] } function d(e, t) { return t = t || 1, Math.floor(.3 * e * t) } function p(e, t) { if (e >= 2.5 && e <= 4) return Math.floor(3 * t); const i = 1 - .2 * Math.atan(Math.max(4, e) - 4) / (.5 * Math.PI), s = Math.floor(e * i * t), r = Math.floor(e * t), n = Math.min(s, r); return Math.max(Math.floor(t), n) } function _(e) { return .4 * e } function m() { return Object(n.lastEventIsTouch)() ? l : c } function f(e) { return null != e && !Object(o.isNaN)(e) } function g(e, t) { void 0 !== t && Object(a.setLineStyle)(e, t) } function b(e, t) { const i = Math.max(1, Math.floor(t)) % 2 ? .5 : 0; return Math.round(e * t) + i } function v(e, t, i) { const s = Math.max(1, Math.floor(t)) % 2 ? .5 : 0; return Math.round(e * t) + (s !== i % 2 ? .5 : 0) } }, Zp8I: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StepLineDecoration", (function() { return s })), i.d(t, "PaneRendererStepLine", (function() { return f })); var s, r = i("GEp6"), n = i("VdBB"), o = i("aO4+"), a = i("jFln"), l = i("Y7w9"), c = i("Zp/P"), h = i("gAom"), u = i("Tmoa"); ! function(e) { e[e.None = 0] = "None", e[e.Diamonds = 1] = "Diamonds" }(s || (s = {})); class d { initialize(e, t, i, s) { var r, n, o, l; const c = e.lineStyle; t.lineCap = "butt", t.lineJoin = "round"; const h = Math.max(Math.floor(null !== (n = null === (r = s.style) || void 0 === r ? void 0 : r.width) && void 0 !== n ? n : e.lineWidth * i.pixelRatio)); void 0 !== c && Object(a.setLineStyle)(t, c); const u = h % 2 ? .5 : 0; t.moveTo(Math.round(s.x * i.pixelRatio) + u, Math.round(s.y * i.pixelRatio) + u), t .strokeStyle = null !== (l = null === (o = s.style) || void 0 === o ? void 0 : o .color) && void 0 !== l ? l : e.lineColor, t.lineWidth = h } finishFragment(e) { e.stroke() } hitTest(e, t, i, s, n) { var a, l; const h = Math.round((i.x + s.x) / 2), u = new o.Point(h, i.y), d = new o.Point(h, s.y), p = null !== (l = null === (a = i.style) || void 0 === a ? void 0 : a.width) && void 0 !== l ? l : e.lineWidth, _ = Object(c.interactionTolerance)().series + p / 2; return Math.min(Object(r.distanceToSegment)(i, u, n).distance, Object(r .distanceToSegment)(u, d, n).distance, Object(r.distanceToSegment)(d, s, n).distance) <= _ } applyColor(e, t) { e.strokeStyle = t } applyLineWidth(e, t) { e.lineWidth = t } drawItem(e, t, i, s) { e.lineTo(i.x, i.y), void 0 !== s && (e.lineTo(s.x, i.y), e.lineTo(s.x, s.y)) } } class p { constructor() { this._lineWidth = 1 } initialize(e, t, i, s) { var r, n, o, a; this.applyColor(t, null !== (n = null === (r = s.style) || void 0 === r ? void 0 : r .color) && void 0 !== n ? n : e.lineColor), this._lineWidth = Math.max(Math .floor(null !== (a = null === (o = s.style) || void 0 === o ? void 0 : o .width) && void 0 !== a ? a : e.lineWidth * i.pixelRatio)) } finishFragment(e) { e.fill() } drawItem(e, t, i, s, r) { if (r && void 0 !== s && !Number.isNaN(s.y)) { e.save(), e.translate(s.x, s.y), e.rotate(Math.PI / 4); const i = this._scaleByLineWidth(this._lineWidth); e.scale(i, i), this._drawItemRotatedAndTranslated(e, t), e.restore() } } applyLineWidth(e, t) { this._lineWidth = t } hitTest(e, t, i, s, r) { var n, a; if (!s.valIsNotSameAsPrev) return !1; const l = Math.round((i.x + s.x) / 2), c = new o.Point(l, s.y), h = r.subtract(c), u = Math.max(Math.floor(null !== (a = null === (n = i.style) || void 0 === n ? void 0 : n.width) && void 0 !== a ? a : e.lineWidth * t.pixelRatio)); return this._hitTestTranslated(h, u) } _scaleByLineWidth(e) { return Math.sqrt(e) } } class _ extends p { applyColor(e, t) { e.fillStyle = t } _hitTestTranslated(e, t) { return Math.abs(e.x) + Math.abs(e.y) < 8 * this._scaleByLineWidth(t) / 2 } _drawItemRotatedAndTranslated(e, t) { Object(h.drawRoundRect)(e, -4, -4, 8, 8, 2, !0) } } class m extends p { applyColor(e, t) { e.fillStyle = Object(u.applyTransparency)(t, 90) } _hitTestTranslated(e, t) { return Math.abs(e.x) + Math.abs(e.y) < 21 * this._scaleByLineWidth(t) / 2 } _drawItemRotatedAndTranslated(e, t) { Object(h.drawRoundRect)(e, -10.5, -10.5, 21, 21, 5, !0) } } class f { constructor() { this._data = null } setData(e) { this._data = e } hitTest(e, t) { var i; const r = this._data; if (null === r || 0 === r.items.length) return null; const o = r.items, a = Object(l.lowerbound)(o, e, (e, t) => e.x <= t.x), c = Math.max(0, a - 1), h = Math.min(o.length - 1, a + 1), u = function(e) { switch (e) { case s.Diamonds: return [new d, new m]; default: return [new d] } }(null === (i = this._data) || void 0 === i ? void 0 : i.decoration); for (let i = c; i < h; i++) { const s = o[i], a = o[i + 1]; if (a && u.some(i => i.hitTest(r, t, s, a, e))) return new n.HitTestResult(n .HitTestResult.REGULAR) } return null } draw(e, t) { if (null === this._data || 0 === this._data.items.length) return; e.save(); (function(e) { switch (e) { case s.Diamonds: return [new d, new _, new m]; default: return [new d] } })(this._data.decoration).forEach(i => this._drawImpl(e, t, i)), e.restore() } _drawImpl(e, t, i) { var s, r, n, a, l, c, h, u, d, p; if (null === this._data || 0 === this._data.items.length) return; const { lineWidth: _, lineColor: m, items: f } = this._data, g = f.length, b = t.pixelRatio; let v = Math.max(Math.floor(null !== (r = null === (s = f[0].style) || void 0 === s ? void 0 : s.width) && void 0 !== r ? r : _ * b)), S = v % 2 ? .5 : 0; i.initialize(this._data, e, t, f[0]), e.beginPath(); for (let s = 0; s < g; s++) { const r = f[s], g = f[s + 1], y = Math.round(r.x * b) + S, w = Math.round(r.y * b) + S; if (!g) { i.drawItem(e, t, Object(o.point)(y, w)); continue } const P = Math.round((r.x + g.x) / 2 * b) + S, C = Math.round(g.y * b) + S; i.drawItem(e, t, Object(o.point)(y, w), Object(o.point)(P, C), g .valIsNotSameAsPrev); const x = null !== (a = null === (n = r.style) || void 0 === n ? void 0 : n .color) && void 0 !== a ? a : m, T = null !== (c = null === (l = r.style) || void 0 === l ? void 0 : l .width) && void 0 !== c ? c : _, I = null !== (u = null === (h = g.style) || void 0 === h ? void 0 : h .color) && void 0 !== u ? u : m, M = null !== (p = null === (d = g.style) || void 0 === d ? void 0 : d .width) && void 0 !== p ? p : _, O = x !== I, L = T !== M; (O || L) && (i.finishFragment(e), O && i.applyColor(e, I), L && (v = Math.max(1, Math.floor(M * b)), S = v % 2 ? .5 : 0, i.applyLineWidth(e, v)), e .beginPath(), e.moveTo(P, C)) } i.finishFragment(e) } } }, ZsYR: function(e, t, i) { "use strict"; i.r(t), i.d(t, "OverlayStatusProvider", (function() { return r })); var s = i("W+6j"); class r extends s.a { getSplitTitle() { return this._source.titleInParts(!0, void 0, !1, !1) } text() { return this._source.isActualInterval() ? this._source.isFailed() ? `${this._source.title(!0, void 0, !1, !1)}: ${this.sourceStatusText()}` : `${this._source.title(!0, void 0, !1, !1)} ${this.sourceStatusText()}` : this._source.title(!0, void 0, !1, !1) } } }, ZtA1: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views") .then(i.t.bind(null, "6sSH", 7)).then(({ TrendBasedFibExtensionPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 3 } name() { return "Trend-Based Fib Extension" } migrateVersion(e, t, i) { 1 === e && this.properties().extendLines.setValue(!0) } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } static createProperties(e) { var t = new r("linetooltrendbasedfibextension", e, !1, { range: [0, 8] }); return l._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "17v9"))) .FibDrawingsWith24LevelsDefinitionsViewModel } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("trendline").child("linewidth"), e.child("levelsStyle").child( "linewidth")], i = [e.child("trendline").child("color")], r = 1; r <= l .LevelsCount; r++) i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } fibLevelsBasedOnLogScale() { return this.properties().fibLevelsBasedOnLogScale.value() && this.priceScale() .isLog() } } l.version = 2, l.LevelsCount = 24, t.LineToolTrendBasedFibExtension = l }, "Zy3/": function(e, t, i) { "use strict"; i.r(t), i.d(t, "CompositeRenderer", (function() { return s })); class s { constructor() { this._renderers = [], this._globalAlpha = 1 } setGlobalAlpha(e) { this._globalAlpha = e } append(e) { this._renderers.push(e) } insert(e, t) { this._renderers.splice(t, 0, e) } clear() { this._renderers.length = 0 } draw(e, t) { for (let i = 0; i < this._renderers.length; i++) e.save(), e.globalAlpha = this ._globalAlpha, this._renderers[i].draw(e, t), e.restore() } drawBackground(e, t) { e.save(), e.globalAlpha = this._globalAlpha; for (let i = 0; i < this._renderers.length; i++) { const s = this._renderers[i]; s.drawBackground && s.drawBackground(e, t) } e.restore() } hitTest(e, t) { let i = null; for (let s = this._renderers.length - 1; s >= 0; s--) { const r = this._renderers[s].hitTest(e, t); null !== r && (null === i || r.result() > i.result()) && (i = r) } return i } doesIntersectWithBox(e) { return this._renderers.some(t => !!t.doesIntersectWithBox && t.doesIntersectWithBox( e)) } } }, a7Ha: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "LineEnd", (function() { return s })), function(e) { e[e.Normal = 0] = "Normal", e[e.Arrow = 1] = "Arrow", e[e.Circle = 2] = "Circle" }(s || (s = {})) }, aDyP: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("7KDR").Action, o = i("rCHB").LineToolPitchforkStyle, a = null, l = i("j3hX"), c = l.LineToolWidthsProperty, h = l.LineToolColorsProperty; class u extends s { constructor(e, t) { super(e, t || u.createProperties()), this._properties.style.listeners().subscribe( this, u.prototype._recreatePaneView), this._recreatePaneView() } levelsCount() { return u.LevelsCount } additionalActions(e) { for (var t = [], i = ["Original", "Modified Schiff", "Inside", "Schiff"], s = 0; s < 4; s++) { var r = new n({ checked: this.properties().style.value() === s, checkable: !0, label: window.t(i[s]), payload: { target: this, value: s }, onExecute: function(t) { var i = t.getPayload(), s = i.target; e.setProperty(s.properties().style, i.value, `Change ${s.name()} Style`), s.updateAllViews(), s ._model.updateSource(s) } }); t.push(r) } return [t[0], t[3], t[1], t[2]] } _recreatePaneView() { if (null !== a) { var e = []; this._properties.style.value() === o.Original ? e = [new a .PitchforkLinePaneView(this, this._model) ] : this._properties.style.value() === o.Schiff ? e = [new a .SchiffPitchforkLinePaneView(this, this._model) ] : this._properties.style.value() === o.Schiff2 ? e = [new a .SchiffPitchfork2LinePaneView(this, this._model) ] : this._properties.style.value() === o.Inside && (e = [new a .InsidePitchforkLinePaneView(this, this._model) ]), this._setPaneViews(e) } else i.e("lt-pane-views").then(i.t.bind(null, "cT+B", 7)).then(e => { null === a && (a = e), this._recreatePaneView() }) } pointsCount() { return 3 } name() { return "Pitchfork" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } static createProperties(e) { var t = new r("linetoolpitchfork", e, !1, { range: [0, 8] }); return u._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "HCdA"))) .PitchForkDefinitionsViewModel } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("median").child("linewidth")], i = [e.child("median").child( "color")], r = 0; r <= u.LevelsCount; r++) t.push(e.child("level" + r) .child("linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new h(i)), e.addChild("linesWidths", new c(t)) } } u.LevelsCount = 8, t.LineToolPitchfork = u }, aILO: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolHeadAndShoulders", (function() { return o })); var s = i("Ocx9"), r = i("Ss5c"), n = i("j3hX"); class o extends r.LineDataSource { constructor(e, t) { const s = t || o.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "Fx2Q")).then(t => { this._setPaneViews([new t.LineToolHeadAndShouldersPaneView(this, e)]) }) } pointsCount() { return 7 } name() { return "Head and Shoulders" } properties() { return super.properties() } static createProperties(e) { const t = new s.DefaultProperty("linetoolheadandshoulders", e); return o._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then( e => e.PatternWithBackgroundDefinitionViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n .LineToolColorsProperty([e.childs().color])), e.addChild("textsColors", new n.LineToolColorsProperty([e.childs().textcolor])) } } }, aIha: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolFlagMark", (function() { return a })); var s = i("aO4+"), r = i("Ss5c"), n = i("Ocx9"), o = i("j3hX"); class a extends r.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), i.e("lt-pane-views").then(i.bind(null, "y/56")).then(({ FlagMarkPaneView: e }) => { const t = new e(this, this.model()); t.setAnchors(new s.Point(0, 0)), this._setPaneViews([t]) }) } pointsCount() { return 1 } name() { return "Flag Mark" } properties() { return super.properties() } static createProperties(e) { e && void 0 === e.flagColor && (e.flagColor = "#318757"); const t = new n.DefaultProperty("linetoolflagmark", e); return a._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "w/mY")).then( e => e.FlagMarkDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e), e.addChild("backgroundsColors", new o .LineToolColorsProperty([e.childs().flagColor])), e.addExclusion( "backgroundsColors") } } a.version = 2 }, aIyQ: function(e, t, i) { "use strict"; (function(e) { const t = i("txPx").getLogger("Common.Delegate"); function s() { this._listeners = [] } function r(e) { return !e.singleshot } s.prototype.subscribe = function(e, t, i) { const s = { object: e, member: t, singleshot: !!i, skip: !1 }; this._listeners.push(s) }, s.prototype.unsubscribe = function(e, t) { for (let i = 0; i < this._listeners.length; ++i) { const s = this._listeners[i]; if (s.object === e && s.member === t) { s.skip = !0, this._listeners.splice(i, 1); break } } }, s.prototype.unsubscribeAll = function(e) { for (let t = this._listeners.length - 1; t >= 0; --t) { const i = this._listeners[t]; i.object === e && (i.skip = !0, this._listeners.splice(t, 1)) } }, s.prototype.destroy = function() { delete this._listeners }, s.prototype.fire = function() { const e = this._listeners; this._listeners = this._listeners.filter(r); const i = e.length; for (let s = 0; s < i; ++s) { const i = e[s]; if (!i.skip) try { i.member.apply(i.object || null, arguments) } catch (e) { t.logError(e.stack || e.message) } } }, "undefined" != typeof window && (window.Delegate = s), e && e.exports && (e .exports = s) }).call(this, i("YuTi")(e)) }, "aO4+": function(e, t, i) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.equalBoxes = t.box = t.halfplaneThroughPoint = t.halfplane = t.lineSegment = t .lineThroughPoints = t.line = t.equalPoints = t.point = t.Point = void 0; var s = function() { function e(e, t) { this.x = e, this.y = t } return e.prototype.add = function(t) { return new e(this.x + t.x, this.y + t.y) }, e.prototype.addScaled = function(t, i) { return new e(this.x + i * t.x, this.y + i * t.y) }, e.prototype.subtract = function(t) { return new e(this.x - t.x, this.y - t.y) }, e.prototype.dotProduct = function(e) { return this.x * e.x + this.y * e.y }, e.prototype.crossProduct = function(e) { return this.x * e.y - this.y * e.x }, e.prototype.signedAngle = function(e) { return Math.atan2(this.crossProduct(e), this.dotProduct(e)) }, e.prototype.angle = function(e) { return Math.acos(this.dotProduct(e) / (this.length() * e.length())) }, e.prototype.length = function() { return Math.sqrt(this.x * this.x + this.y * this.y) }, e.prototype.scaled = function(t) { return new e(this.x * t, this.y * t) }, e.prototype.normalized = function() { return this.scaled(1 / this.length()) }, e.prototype.transposed = function() { return new e(-this.y, this.x) }, e.prototype.clone = function() { return new e(this.x, this.y) }, e }(); function r(e, t) { return new s(e, t) } function n(e, t) { return e.x === t.x && e.y === t.y } function o(e, t, i) { if (0 === e && 0 === t) throw new Error("A and B can not be both equal to zero."); return { A: e, B: t, C: i } } function a(e, t) { return { edge: e, isPositive: t } } t.Point = s, t.point = r, t.equalPoints = n, t.line = o, t.lineThroughPoints = function(e, t) { if (n(e, t)) throw new Error("Points should be distinct"); return o(e.y - t.y, t.x - e.x, e.x * t.y - t.x * e.y) }, t.lineSegment = function(e, t) { if (n(e, t)) throw new Error("Points of a segment should be distinct"); return [e, t] }, t.halfplane = a, t.halfplaneThroughPoint = function(e, t) { return a(e, e.A * t.x + e.B * t.y + e.C > 0) }, t.box = function(e, t) { return { min: r(Math.min(e.x, t.x), Math.min(e.y, t.y)), max: r(Math.max(e.x, t.x), Math.max(e.y, t.y)) } }, t.equalBoxes = function(e, t) { return n(e.min, t.min) && n(e.max, t.max) } }, aR4w: function(e, t, i) { "use strict"; var s = i("Eyy1"), r = i("Hr11"), n = i("LxhU"), o = i("ocLq"), a = i("oamr"); class l extends a.a { constructor(e, t, i, r, n, o) { super(e), Object(s.assert)(t < i), this._priceLow = this._mixinJSONObject.createDoubleField(t, "priceLow"), this._priceHigh = this._mixinJSONObject.createDoubleField(i, "priceHigh"), this._rate = this._mixinJSONObject.createDoubleArrayField(r, "rate"), this ._firstBarTime = this._mixinJSONObject.createTimeField(n, "firstBarTime"), this._lastBarTime = this._mixinJSONObject.createTimeField(o, "lastBarTime") } isNaN() { return super.isNaN() || Number.isNaN(this._priceLow.get()) || Number.isNaN(this ._priceHigh.get()) || 0 === this._rate.get().length } jsonName() { return "hhists" } primitiveData() { return { id: this.id(), priceHigh: this._priceHigh.get(), priceLow: this._priceLow.get(), rate: this._rate.get().slice(), firstBarTime: this._firstBarTime.get(), lastBarTime: this._lastBarTime.get() } } setPriceLow(e) { this._priceLow.set(e) && this._processObjUpdate() } priceLow() { return this._priceLow.get() } priceHigh() { return this._priceHigh.get() } setPriceHigh(e) { this._priceHigh.set(e) && this._processObjUpdate() } rate() { return this._rate.get().slice() } setRate(e) { this._rate.set(e) && this._processObjUpdate() } rateAt(e) { return this._rate.get()[e] } ratesSum() { let e = 0; for (const t of this._rate.get()) !Number.isNaN(t) && Number.isFinite(t) && ( e += t); return e } firstBarTime() { return this._firstBarTime.get() } setFirstBarTime(e) { this._firstBarTime.set(e) && this._processObjUpdate() } lastBarTime() { return this._lastBarTime.get() } setLastBarTime(e) { this._lastBarTime.set(e) && this._processObjUpdate() } } var c = i("WYmP"); class h { constructor(e, t, i) { this.index = e, this.offset = i, this.level = t } isNaN() { return Number.isNaN(this.level) } equals(e) { return e instanceof h && (!this.isNaN() && (!e.isNaN() && (this.index === e.index && this.offset === e.offset && o.Std.equal(this.level, e.level)))) } getLevel() { return this.level } getIndex() { return this.index } } class u extends a.a { constructor(e, t) { super(e), this._points = [], t && (this._points = t) } addPoint(e) { this._processObjUpdate(), this._points.push(e) } addPoints(e) { this._processObjUpdate(), this._points.push(...e) } setPoint(e, t) { const i = this._points[e]; t.equals(i) || (this._processObjUpdate(), this._points[e] = t) } point(e) { const t = this._points[e]; return new h(t.index, t.level, t.offset) } points() { return this._points } pointsCount() { return this._points.length } setPoints(e) { if (e.length === this._points.length) { let t = !0; for (let i = 0; i < e.length; ++i) if (!e[i].equals(this._points[i])) { t = !1; break } if (t) return } this._processObjUpdate(), this._points = [], this._points.push(...e) } clearPoints() { this._processObjUpdate(), this._points = [] } isNaN() { return super.isNaN() || this._points.length < 3 } jsonName() { return "polygons" } primitiveData() { return { id: this.id(), points: this._points.map(e => ({ index: e.index, offset: e.offset, level: e.level })) } } } class d extends a.a { constructor(e, t, i, s, r = !1, n = !1) { super(e), this._endIndex = this._mixinJSONObject.createTimeField(i, "endIndex"), this._extendLeft = this._mixinJSONObject.createField(r, "extendLeft"), this ._extendRight = this._mixinJSONObject.createField(n, "extendRight"), this ._level = this._mixinJSONObject.createDoubleField(s, "level"), this ._startIndex = this._mixinJSONObject.createTimeField(t, "startIndex") } isNaN() { return super.isNaN() || Number.isNaN(this._level.get()) || this._startIndex .get() < 0 || this._endIndex.get() < 0 || this._startIndex.get() === this ._endIndex.get() && !this._extendLeft.get() && !this._extendRight.get() } jsonName() { return "horizlines" } primitiveData() { return { id: this.id(), startIndex: this._startIndex.get(), endIndex: this._endIndex.get(), extendLeft: this._extendLeft.get(), extendRight: this._extendRight.get(), level: this._level.get() } } startIndex() { return this._startIndex.get() } setStartIndex(e) { this._startIndex.set(e) && this._processObjUpdate() } endIndex() { return this._endIndex.get() } setEndIndex(e) { this._endIndex.set(e) && this._processObjUpdate() } level() { return this._level.get() } setLevel(e) { this._level.set(e) && this._processObjUpdate() } isExtendLeft() { return this._extendLeft.get() } setExtendLeft(e) { this._extendLeft.set(e) && this._processObjUpdate() } extendLeft() { return this.isExtendLeft() } isExtendRight() { return this._extendRight.get() } setExtendRight(e) { this._extendRight.set(e) && this._processObjUpdate() } extendRight() { return this.isExtendRight() } } i.d(t, "a", (function() { return _ })); class p { constructor() { this._map = new Map } get(e) { const t = this._innerMap(e.start); return t && t.get(e.end) } set(e, t) { this._innerMap(e.start, !0).set(e.end, t) } clear() { this._map.clear() } size() { let e = 0; return this._map.forEach(t => e += t.size), e } _innerMap(e, t) { let i = this._map.get(e); return void 0 === i && t && (i = new Map, this._map.set(e, i)), i } } class _ { constructor(e, t, i, r, n, o, a, l, h, u, d, _, m, f) { this._freezedBoxes = new c.a, this._freezedHists = new c.a, this._freezedPocs = new c.a, this._freezedVAHists = new c.a, this._currentHistsGr = new c.a, this ._currentVAHistsGr = new c.a, this._currentHists = [], this._currentHistsMap = new p, this._currentBox = null, this._currentPoc = null, this ._historyBarSet = [], this._prevRtBar = null, this._minPrice = Number .POSITIVE_INFINITY, this._maxPrice = Number.NEGATIVE_INFINITY, this ._leftBoxTime = null, this._rightBoxTime = null, this._needRecalc = !1, this ._largestHistItem = null, this._rowsLayout = null, this._currentVAStart = 0, this._currentVAEnd = 0, this._previousVAStart = 0, this._previousVAEnd = 0, this ._idsGenerator = null, Object(s.assert)(1 === e || 2 === e), this ._numOfSubHists = e, this._outHists = r, this._outBoxLines = n, this ._outPocLines = o, this._extendPocLeftRight = a, this._outVAHists = l, this ._vaVolumePercent = h, this._rowsLayoutSupplier = u, this._outHists.addStable( this._freezedHists), this._outVAHists.addStable(this._freezedVAHists), this ._maxHHistItems = d, this._layoutIsAutoselected = f, this._leftBoxTimeMutable = _, this._rightBoxTimeMutable = m, this._ctx = t, this._seriesGetter = i } update(e) { this._supplyRowsLayout(this._ctx), null === this._currentBox && this ._initCurrentBox(), null === this._currentPoc && this._initCurrentPoc(); const t = this._timeScale().get(e); this._leftBoxTime = this._leftBoxTimeMutable, this._rightBoxTime = this ._rightBoxTimeMutable, this._ctx.symbol.isLastBar && !Number.isNaN(this ._rightBoxTime) && (this._rightBoxTime = Math.min(t + n.Interval.parse(this ._ctx.symbol.interval + this._ctx.symbol.resolution).inMilliseconds( t) - 1, this._rightBoxTime)); const i = o.Std.greaterOrEqual(this._seriesClose().get(e), this._seriesOpen().get( e)), s = { high: this._seriesHigh().get(e), low: this._seriesLow().get(e), volume: this._seriesVol().get(e), isUp: i, time: t }; this._updateCurrentHistogram(s), this._currentHists.length > 0 && (this ._largestHistItem = this._getLargestHistItem(), this._updateCurrentPoc(), this._seriesGetter.developingPoc().set(this._currentPoc.level()), this ._updateValueArea(), this._vaVolumePercent > 0 && (this._seriesGetter .developingVAHigh().set(this._currentHists[this._currentVAEnd] .priceHigh()), this._seriesGetter.developingVALow().set(this ._currentHists[this._currentVAStart].priceLow()))), this ._updateCurrentBox(), this._rebuildOutData() } setIdsGeneratorProxy(e) { this._idsGenerator = e } nextGraphicsObjId() { return Object(s.ensureNotNull)(this._idsGenerator).nextGraphicsObjId() } pushEraseObjCmd(e, t) { Object(s.ensureNotNull)(this._idsGenerator).pushEraseObjCmd(e, t) } popEraseCmds() { return Object(s.ensureNotNull)(this._idsGenerator).popEraseCmds() } _timeScale() { return this._seriesGetter.time() } _seriesLow() { return this._seriesGetter.low() } _seriesHigh() { return this._seriesGetter.high() } _seriesVol() { return this._seriesGetter.volume() } _seriesOpen() { return this._seriesGetter.open() } _seriesClose() { return this._seriesGetter.close() } _freezeCurrentHistogramAndCleanup() { null !== this._currentBox && this._freezedBoxes.add(this._currentBox), o.Std .greater(this._getVolume(this._currentHists), 0) && (this._freezedHists.addAll( this._currentHistsGr), this._freezedVAHists.addAll(this ._currentVAHistsGr), null !== this._currentPoc && this._freezedPocs.add( this._currentPoc)), this._currentHists = [], this._currentHistsGr.clear(), this._currentHistsMap.clear(), this._initCurrentBox(), this._initCurrentPoc(), this._currentVAHistsGr.clear(), this._historyBarSet = [], this._minPrice = Number.POSITIVE_INFINITY, this._maxPrice = Number.NEGATIVE_INFINITY, this ._prevRtBar = null, this._leftBoxTime = null, this._rightBoxTime = null } _supplyRowsLayout(e) { null === this._rowsLayout && e.symbol.isFirstBar && e.symbol.isNewBar && (this ._rowsLayout = this._rowsLayoutSupplier()) } _updateCurrentHistogram(e) { if (this._needRecalc = !1, o.Std.greater(this._minPrice, e.low) && (this._minPrice = e.low, this._needRecalc = !0), o.Std.less(this._maxPrice, e.high) && (this ._maxPrice = e.high, this._needRecalc = !0), this._ctx.symbol.isBarClosed && this._historyBarSet.length > 0) { const t = this._historyBarSet[this._historyBarSet.length - 1]; t.time === e.time && (this._prevRtBar = t, this._historyBarSet.pop()) } this._needRecalc && 0 === Object(s.ensureNotNull)(this._rowsLayout).type() ? (this ._recalculateCurrentResultsOnHistoryBarSet(), this ._applyUpdateToCurrentResults(e, !1)) : this._applyUpdateToCurrentResults(e, !0), this._ctx.symbol.isBarClosed ? (Object(s.assert)(null === this ._prevRtBar || e.time === this._prevRtBar.time), this._historyBarSet .push(e), this._prevRtBar = null) : this._prevRtBar = e } _getMidLevel(e) { return (e.priceHigh() + e.priceLow()) / 2 } _getMidLevelFromList(e) { return e.length % 2 == 0 ? e[e.length / 2].priceLow() : this._getMidLevel(e[Math .floor(e.length / 2)]) } _getLargestHistItem() { let e = [], t = this._currentHists[0]; for (const i of this._currentHists) o.Std.greater(i.ratesSum(), t.ratesSum()) ? (t = i, e = [t]) : o.Std.equal(i.ratesSum(), t.ratesSum()) && e.push(i); if (e.length > 1) { const i = this._getMidLevelFromList(this._currentHists); t = e[e.length - 1]; for (let s = e.length - 2; s >= 0; s--) { const r = e[s]; o.Std.lessOrEqual(Math.abs(this._getMidLevel(r) - i), Math.abs(this ._getMidLevel(t) - i)) && (t = r) } } return t } _initCurrentPoc() { this._currentPoc = new d(this, 0, 0, 0) } _updateCurrentPoc() { const e = Object(s.ensureNotNull)(this._currentPoc); e.setStartIndex(Object(s.ensureNotNull)(this._leftBoxTime)), e.setEndIndex(Object(s .ensureNotNull)(this._rightBoxTime)), e.setExtendLeft(this ._extendPocLeftRight), e.setExtendRight(this._extendPocLeftRight); const t = this._getMidLevel(Object(s.ensureNotNull)(this._largestHistItem)); e.setLevel(t) } _getVolume(e) { let t = 0; for (const i of e) t += i.ratesSum(); return t } _getPocHistItemIndex() { for (let e = 0; e < this._currentHists.length; e++) if (this._currentHists[e] === this._largestHistItem) return e; return -1 } _calculateValueArea() { const e = this._getPocHistItemIndex(); Object(s.assert)(e >= 0, "ERROR - PocHistItemIndex == " + e), this._currentVAStart = e - 1, this._currentVAEnd = e + 1; const t = this._getVolume(this._currentHists) * this._vaVolumePercent * .01; let i = this._currentHists[e].ratesSum(), r = 0, n = null; for (; o.Std.lessOrEqual(i + r, t) && (i += r, 0 === n ? --this._currentVAStart : 1 === n && ++this._currentVAEnd, -1 !== this._currentVAStart || this ._currentVAEnd !== this._currentHists.length);) { let t, i; if (this._currentVAStart > -1) if (t = this._currentHists[this._currentVAStart].ratesSum(), this ._currentVAEnd < this._currentHists.length) if (i = this._currentHists[this._currentVAEnd].ratesSum(), o.Std .greater(t, i)) r = t, n = 0; else if (o.Std.greater(i, t)) r = i, n = 1; else { const s = Math.abs(e - this._currentVAStart), o = Math.abs(e - this._currentVAEnd); s < o ? (r = t, n = 0) : o <= s && (r = i, n = 1) } else r = t, n = 0; else r = this._currentHists[this._currentVAEnd].ratesSum(), n = 1 } this._currentVAStart++, this._currentVAEnd-- } _isVA(e) { return e.priceHigh() > this._getMidLevel(this._currentHists[this ._currentVAStart]) && e.priceLow() < this._getMidLevel(this._currentHists[ this ._currentVAEnd]) } _updateValueArea() { if (this._calculateValueArea(), this._needRecalc || this._previousVAStart !== this ._currentVAStart || this._previousVAEnd !== this._currentVAEnd) { let e = 0, t = 0; for (; e < this._currentHistsGr.size() && t < this._currentVAHistsGr.size();) { for (; e < this._currentHistsGr.size() && !this._isVA(this._currentHistsGr .get(e));) e++; for (; t < this._currentVAHistsGr.size() && this._isVA(this ._currentVAHistsGr.get(t));) t++; if (e < this._currentHistsGr.size() && t < this._currentVAHistsGr.size()) { const i = this._currentHistsGr.get(e); this._currentHistsGr.set(e, this._currentVAHistsGr.get(t)), this ._currentVAHistsGr.set(t, i) } } for (; e < this._currentHistsGr.size(); e++) { const t = this._currentHistsGr.get(e); this._isVA(t) && (this._currentHistsGr.remove(e), e--, this ._currentVAHistsGr.add(t)) } for (; t < this._currentVAHistsGr.size(); t++) { const e = this._currentVAHistsGr.get(t); this._isVA(e) || (this._currentVAHistsGr.remove(t), t--, this ._currentHistsGr.add(e)) } } this._previousVAStart = this._currentVAStart, this._previousVAEnd = this ._currentVAEnd } _initCurrentBox() { this._currentBox = new u(this) } _updateCurrentBox() { let e = this._minPrice, t = this._maxPrice; this._currentHists.length > 0 && (e = this._currentHists[0].priceLow(), t = this ._currentHists[this._currentHists.length - 1].priceHigh()); const i = [], r = Object(s.ensureNotNull)(this._leftBoxTime), n = Object(s.ensureNotNull)(this._rightBoxTime); i.push(new h(r, e)), i.push(new h(r, t)), i.push(new h(n, t)), i.push(new h(n, e)), Object(s.ensureNotNull)(this._currentBox).setPoints(i) } _recalculateCurrentResultsOnHistoryBarSet() { for (let e = 0; e < this._currentHists.length; ++e) this._currentHists[e].erase(); this._currentHists = [], this._currentHistsGr.clear(), this._currentVAHistsGr .clear(), this._currentHistsMap.clear(); for (let e = 0; e < this._historyBarSet.length; e++) this._addHistoryBarToHistogram( this._historyBarSet[e], e, this._currentHists, this._currentHistsMap, 1); this._currentHists.length > 0 && (this._largestHistItem = this ._getLargestHistItem(), this._updateCurrentPoc()), this._updateCurrentBox() } _applyUpdateToCurrentResults(e, t) { t && null !== this._prevRtBar && this._addHistoryBarToHistogram(this._prevRtBar, this._historyBarSet.length - 1, this._currentHists, this._currentHistsMap, - 1), this._addHistoryBarToHistogram(e, this._historyBarSet.length - 1, this ._currentHists, this._currentHistsMap, 1), this ._updateLastBarTimeInHistogram(this._currentHists) } _addHistoryBarToHistogram(e, t, i, r, n) { Object(s.assert)(-1 === n || 1 === n, "Please set sign argument either +1 or -1"); const a = e.low, l = e.high, c = isNaN(e.volume) ? 0 : e.volume, h = e.isUp, u = Object(s.ensureNotNull)(this._rowsLayout); u.init(this._ctx.symbol.minTick, this._minPrice, this._maxPrice, a, l); const d = u.rowWidth(); if (!o.Std.greater(d, 0)) return; u.calculate(); const p = u.getIndexLowVbP(), _ = u.getIndexHighVbP(), m = u.getStartPrice(); if (p === _) { const e = p * d + m, t = (p + 1) * d + m; this._updateResult({ start: e, end: t }, n * c, h, i, r) } else { let e = 0; for (let t = p; t <= _; t++) { const s = t * d + m, o = (t + 1) * d + m, u = this._rowCoeff(s, o, a, l), p = u * c; e += u, this._updateResult({ start: s, end: o }, n * p, h, i, r) } Object(s.assert)(o.Std.equal(e, 1, .05), "totalCoeff not equal 1! totalConf = " + e) } } _updateResult(e, t, i, r, n) { const a = this._createRates(i, t); Object(s.assert)(null !== this._leftBoxTime, "leftBoxTime is not set (equals null)"), Object(s.assert)(null !== this ._rightBoxTime, "rightBoxTime is not set (equals null)"); const c = Object(s.ensureNotNull)(this._leftBoxTime), h = Object(s.ensureNotNull)(this._rightBoxTime); let u = n.get(e); if (void 0 === u) u = new l(this, e.start, e.end, a, c, h), n.set(e, u), this ._verifyHistogramSizeIsNotTooLarge(n.size()), this._currentHistsGr.add(u), _ ._addInOrder(u, r, 0, r.length, (e, t) => { let i = o.Std.compare(e.firstBarTime(), t.firstBarTime()); return 0 !== i ? i : (i = o.Std.compare(e.priceLow(), t.priceLow()), 0 !== i ? i : o.Std.compare(e.priceHigh(), t.priceHigh())) }); else { const e = []; for (let t = 0; t < a.length; t++) e[t] = u.rateAt(t) + a[t]; u.setRate(e) } } _rebuildOutData() { const e = this._currentHistsMap.size(), t = this._currentHists.length, i = this._currentHistsGr.size(), r = this._currentVAHistsGr.size(); Object(s.assert)(e === t && t === i + r, `Collections of HHistItems are out of sync ${e} ${t} ${i} ${r}`), this ._outPocLines.clear(), this._outPocLines.addAll(this._freezedPocs), o.Std.greater(this._getVolume(this._currentHists), 0) ? (this._outHists .setVariable(this._currentHistsGr), this._outPocLines.add(Object(s .ensureNotNull)(this._currentPoc)), this._outVAHists.setVariable(this ._currentVAHistsGr)) : (this._outHists.setVariable(null), this ._outVAHists.setVariable(null)), this._outBoxLines.clear(), this ._outBoxLines.addAll(this._freezedBoxes), this._outBoxLines.add(Object(s .ensureNotNull)(this._currentBox)) } _verifyHistogramSizeIsNotTooLarge(e) { if (this._layoutIsAutoselected) return; if (e <= this._maxHHistItems) return; const t = Object(s.ensureNotNull)(this._rowsLayout); 0 === t.type() ? o.Std.error( 'Histogram is too large, please reduce "Row Size" input.') : (Object(s .assert)(1 === t.type(), "Unexpected rowsLayout type " + t.type()), o .Std.error('Histogram is too large, please increase "Row Size" input.')) } _createRates(e, t) { if (1 === this._numOfSubHists) return [t]; if (2 === this._numOfSubHists) { const i = [0, 0]; return i[e ? 0 : 1] = t, i } return Object(s.assert)(!1, "Incorrect value of numOfSubHists = " + this ._numOfSubHists), [] } _updateLastBarTimeInHistogram(e) { const t = Object(s.ensureNotNull)(this._rightBoxTime); for (const i of e) i.setLastBarTime(t) } _rowCoeff(e, t, i, s) { const r = s - i; return (t - e - Math.max(t - s, 0) - Math.max(0, i - e)) / r } static _addInOrder(e, t, i, s, n) { if (i === s) return void t.splice(i, 0, e); const o = Object(r.toInt)((i + s) / 2), a = t[o]; n(e, a) < 0 ? _._addInOrder(e, t, i, o, n) : n(e, a) > 0 ? _._addInOrder(e, t, o + 1, s, n) : t.splice(o, 0, e) } } }, aVjL: function(e, t) { e.exports = '' }, b1GK: function(e, t, i) { "use strict"; i.r(t), i.d(t, "addPerfMark", (function() { return c })), i.d(t, "startPerfMeasure", (function() { return h })), i.d(t, "endPerfMeasure", (function() { return u })), i.d(t, "perfMeasureOperation", (function() { return d })); var s = i("e3/o"); function r() {} const n = console.timeStamp ? console.timeStamp.bind(console) : r, o = window.performance && performance.mark ? performance.mark.bind(performance) : r, a = window.performance && performance.measure ? performance.measure.bind(performance) : r, l = window.performance && performance.clearMarks ? performance.clearMarks.bind( performance) : r; function c(e) { n(e), o(e) } function h(e) { o(e) } function u(e) { a(e, e), l(e) } async function d(e, t) { const i = `measure-${e}-${Object(s.randomHash)()}`; o(i); try { return await t() } finally { a(e, i), l(i) } } }, bJYc: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SetPropertyUndoCommand", (function() { return n })); var s = i("RDU5"), r = i("Ocx9"); class n extends s.UndoCommand { constructor(e, t, i, s, r) { super(i), this._targetObj = e, this._newValue = t, this._oldValue = this ._targetObj.value(), this._model = s, r && this.setCustomFlag( "doesnt_affect_save", !0) } redo() { Object(r.saveDefaultProperties)(!0), this._targetObj.setValue(this._newValue), Object(r.saveDefaultProperties)(!1), this._model.recalculateAllPanes(), this ._model.lightUpdate() } undo() { Object(r.saveDefaultProperties)(!0), this._targetObj.setValue(this._oldValue), Object(r.saveDefaultProperties)(!1), this._model.recalculateAllPanes(), this ._model.lightUpdate() } } }, bKFv: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "StatsPosition", (function() { return s })), function(e) { e[e.Left = 0] = "Left", e[e.Center = 1] = "Center", e[e.Right = 2] = "Right" }(s || (s = {})) }, bOGh: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("RDU5"); class r extends s.UndoCommand { constructor(e) { super(e, !1), this._subcommands = [] } addCommand(e) { this._subcommands.push(e) } isEmpty() { return 0 === this._subcommands.length } redo() { for (let e = 0; e < this._subcommands.length; e++) this._subcommands[e].redo() } undo() { for (let e = this._subcommands.length - 1; e >= 0; e--) this._subcommands[e] .undo() } commands() { return this._subcommands } } }, bSeV: function(e, t, i) {}, bTqm: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolCypherPattern", (function() { return n })); var s = i("NJRZ"), r = i("Ocx9"); class n extends s.LineTool5PointsPattern { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Cypher Pattern" } static createProperties(e) { const t = new r.DefaultProperty("linetoolcypherpattern", e); return n._configureProperties(t), t } _loadPaneViews(e) { i.e("lt-pane-views").then(i.bind(null, "mjK7")).then(t => { this._setPaneViews([new t.CypherPaneView(this, e)]) }) } static _configureProperties(e) { s.LineTool5PointsPattern._configureProperties(e) } } }, bc0y: function(e, t, i) {}, biIa: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SeriesWaterlinePaneView", (function() { return a })); var s = i("k4w6"), r = i("//lt"), n = i("VdBB"), o = i("8Uy/"); class a extends s.a { constructor(e) { super(e); const t = { cursorType: r.PaneCursorType.VerticalResize, activeItem: 0, areaName: n.AreaName.SourceItemMove }; this._lineRenderer.setHitTest(new n.HitTestResult(n.HitTestResult.MOVEPOINT, t)), this._lineRendererData.visible = !0, this._lineRendererData .linestyle = o.LINESTYLE_SPARSE_DOTTED } _updateImpl() { const e = this._series.properties().baselineStyle, t = Math.abs(100 - e.baseLevelPercentage.value()); this._lineRendererData.y = Math.round(this._series.priceScale().height() * (t / 100)), this._lineRendererData.color = e.baselineColor.value() } } }, bmVy: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyStatusType", (function() { return r })), i.d(t, "convertStudyStatusToString", (function() { return n })); const s = window.t("loading..."); var r; function n(e, t) { if (e.type === r.Loading) return t ? s : "loading..."; if (e.type === r.Error) { const i = e.errorDescription, s = t ? window.t(i.error) : i.error; if (i.ctx) { const e = {}; return Object.entries(i.ctx).forEach(([t, i]) => { e[t] = i.toString() }), s.format(e) } return s } return "" }! function(e) { e[e.Undefined = 0] = "Undefined", e[e.Loading = 1] = "Loading", e[e.Completed = 2] = "Completed", e[e.Error = 3] = "Error" }(r || (r = {})) }, "bv/X": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolSineLine", (function() { return n })); var s = i("Ocx9"), r = i("Ss5c"); class n extends r.LineDataSource { constructor(e, t) { super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.bind(null, "piZW")).then(e => { this._setPaneViews([new e.SineLinePaneView(this, this._model)]) }) } pointsCount() { return 2 } name() { return "Sine Line" } static createProperties(e) { const t = new s.DefaultProperty("linetoolsineline", e); return n._configureProperties(t), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "LX4V"))) .CyclicAndSineLinesPatternDefinitionsViewModel } static _configureProperties(e) { r.LineDataSource._configureProperties(e) } } }, c2JX: function(e, t, i) { "use strict"; i.r(t), i.d(t, "renderSpinnerTemplate", (function() { return n })), i.d(t, "Spinner", (function() { return a })); i("SzKR"); var s = i("gWrr"), r = i("Owlf"); function n(e = "") { return '\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\x3c!--\n\t\t\t\t--\x3e
\n\t\t\t
\n\t\t
\n\t' } const o = Object(s.b)( '\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\x3c!--\n\t\t\t\t--\x3e
\n\t\t\t
\n\t\t
\n\t' ); class a { constructor(e) { this._shown = !1, this._el = o.cloneNode(!0), this.setSize(e || r.a) } spin(e) { return this._el.classList.add("tv-spinner--shown"), void 0 === this._container && ( this._container = e, void 0 !== e && e.appendChild(this._el)), this ._shown = !0, this } stop(e) { return e && void 0 !== this._container && this._container.removeChild(this._el), this._el.classList.remove("tv-spinner--shown"), this._shown = !1, this } setStyle(e) { return Object.keys(e).forEach(t => { const i = e[t]; void 0 !== i && this._el.style.setProperty(t, i) }), this } setSize(e) { const t = void 0 !== e ? "tv-spinner--size_" + e : ""; return this._el.className = `tv-spinner ${t} ${this._shown ? "tv-spinner--shown" : ""}`, this } getEl() { return this._el } destroy() { this.stop(), delete this._el, delete this._container } } }, c44N: function(e, t, i) { "use strict"; function s(e, t) { return e.pixelRatio === t.pixelRatio } i.r(t), i.d(t, "areEqualPaneRenderParams", (function() { return s })) }, c7G1: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return s })), i.d(t, "a", (function() { return r })), i.d(t, "c", (function() { return n })); class s { constructor(e, t) { this.id = e, this.type = t } primitiveData() { return { action: "one", id: this.id, type: this.type } } } class r { primitiveData() { return { action: "all" } } } class n { constructor() { this.erase = [], this.create = null, this._modified = !1 } primitiveData(e) { if (this.isNaN()) return null; const t = {}, i = this.create && this.create.primitiveData(e); return null !== i && (t.create = i), null !== this.erase && this.erase.length > 0 && (t.erase = this.erase.map(e => e.primitiveData())), void 0 === t.create && void 0 === t.erase ? null : t } setCreate(e) { this.create = e, this.create.forEachList(e => e.setOwner(this)) } isNaN() { return (null === this.erase || 0 === this.erase.length) && null === this.create } isModified() { return this._modified } setModified(e) { this._modified = e } dirty() { this._modified = !0 } setOwner(e) { throw new Error("Unsupported") } } }, cBZt: function(e, t, i) { "use strict"; function s(e, t) { return `${e}@${t}` } function r(e) { return e.replace(/(@[^-]+-[^-]+).*$/, "$1") } i.r(t), i.d(t, "studyIdString", (function() { return s })), i.d(t, "extractStudyId", (function() { return r })) }, cKqi: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("qJq3").Series, n = i("GVHu").Study, o = i("FBsw").OverlayPriceAxisView, a = i("KtbP").PanePriceAxisView, l = i("x0JF"), c = l.SeriesAreaPaneView, h = l.SeriesLinePaneView, u = l.SeriesHollowCandlesPaneView, d = l.SeriesCandlesPaneView, p = l.SeriesBarsPaneView, _ = l.SeriesBaselinePaneView, m = i("biIa").SeriesWaterlinePaneView, f = i("2kV1").StudyStatusView, g = i("JjUe").OverlayDataWindowView, b = i("z8/4").OverlayLegendView, v = i("qXYw").OverlayLegendValuesProvider, S = i("ZsYR").OverlayStatusProvider, y = i("38az").SeriesBarColorer, w = i("l4sv").HorizontalLineRenderer, P = i("Kxc7"), C = i("6sst").OverlayStudyPriceLineAxisView, x = i("n5al").createSeriesFormatter, T = i("y/Xm").StudyOverlayBase, I = i("qFKp").CheckMobile.any() && !1, M = !P.enabled("hide_study_overlay_legend_item"); class O { constructor(e, t) { this._source = e, this._model = t, this._points = [new s(0, 0)], this ._lineRenderer = new w } update() { if (this._visible = !1, this._source.properties().showPriceLine.value()) { var e = this._source.lastValueData(void 0, !0); e.noData || (this._visible = !0, this._points = [new s(0, e.coordinate)], this ._color = e.color) } } renderer() { var e = {}; return e.width = this._model.timeScale().width(), e.height = this._source .priceScale().height(), e.y = this._points[0].y, e.color = this._color, e .linewidth = 1, e.linestyle = CanvasEx.LINESTYLE_DOTTED, e.visible = this ._visible, this._lineRenderer.setData(e), this._lineRenderer } } t.study_Overlay = class extends T { constructor(e, t, i, s) { super(e, t, i, s), this._formatter = null, this._paneView = null; var r = this; this.properties().minTick.listeners().subscribe(null, (function() { r._recreatePriceFormattingDependencies(), r.updateAllViews(), r ._model.fullUpdate() })) } _showLastValueOnPriceScale() { return this._model.properties().scalesProperties.showSeriesLastValue.value() } _createViews() { this._priceAxisViews = []; var e = new o(this); this._priceAxisViewsBase = [e]; var t = new C(this); this._priceLinesAxisViews = [t], this._paneViews = [], this ._labelPaneViews = []; var i = null, s = null; switch (this._properties.style.value()) { case r.STYLE_BARS: s = new p(this, this._model); break; case r.STYLE_CANDLES: s = new d(this, this._model); break; case r.STYLE_HOLLOW_CANDLES: s = new u(this, this._model); break; case r.STYLE_LINE: s = new h(this, this._model); break; case r.STYLE_AREA: s = new c(this, this._model); break; case r.STYLE_BASELINE: s = new _(this, this._model), i = new m(this) } s && this._paneViews.push(s), null !== i && this._paneViews.push(i), this._paneViews.push(new O(this, this._model)), this._dataWindowView || ( this._dataWindowView = new g(this, this._model)), this._legendView || ( this._legendView = new b(this, this._model)), this._statusView || (this ._statusView = new f(this)), this._priceAxisViews = [].concat(this ._priceAxisViewsBase, this._hlinesPriceAsisViews, this ._horizlinesPriceAsisViews), this._labelPaneViews.push(new a(e, this, this._model)) } barColorer() { return new y(this) } start(e) { this._formatter = null, n.prototype.start.apply(this, arguments), this .priceScale() && this.priceScale().updateFormatter(), I && this ._setQuotesSymbol(this.symbol()) } _tryCreateFormatter() { return x(this.symbolInfo(), this.properties().minTick.value()) } formatter() { return this._formatter || this._recreateFormatter(), this._formatter } _tryChangeInputs() { n.prototype._tryChangeInputs.call(this), this.m_formatter = null, this .priceScale().updateFormatter() } stop(e) { n.prototype.stop.call(this, e), this._quotesProvider.setQuotesSessionSymbol( null) } _onQuotesUpdate(e, t) { !this._legendView || void 0 === t.values.change && void 0 === t.values .change_percent || (this._legendView.update(), this._model.updateSource( this)) } destroy() { this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._quotesProvider .destroy(), super.destroy() } tags() { var e = [], t = this.symbolInfo(); return t ? e.push(t.name) : this._properties.inputs.symbol.value() && e.push( this._properties.inputs.symbol.value()), e } statusView() { return M ? n.prototype.statusView.call(this) : null } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(61), i.e(62), i.e( "study-property-pages-with-definitions")]).then(i.bind(null, "WUYT"))).StudyOverlayDefinitionsViewModel } defaultPlotIdForAlert() { return "" } changeStyles() { this.data().each((function(e, t) { t[TradingView.STYLE_PLOT] = null })), n.prototype.changeStyles.call(this) } valuesProvider() { return new v(this, this.model()) } statusProvider(e) { return new S(this, this.model()) } canBeHiddenByGlobalFlag() { return !1 } } }, cPgM: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ScaledPaneRenderer", (function() { return s })), i.d(t, "ScaledPaneRendererWrapper", (function() { return r })); class s { draw(e, t) { e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._drawImpl( e, { ...t, pixelRatio: 1 }), e.restore() } drawBackground(e, t) { e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this ._drawBackgroundImpl(e, { ...t, pixelRatio: 1 }), e.restore() } _drawBackgroundImpl(e, t) {} } class r { constructor(e) { this._base = e } hitTest(e, t) { return this._base.hitTest(e, t) } draw(e, t) { e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._base.draw( e, { ...t, pixelRatio: 1 }), e.restore() } drawBackground(e, t) { e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._base .drawBackground && this._base.drawBackground(e, { ...t, pixelRatio: 1 }), e.restore() } } }, cWHH: function(e, t, i) { "use strict"; (function(t, s) { var r = i("Eyy1").ensureNotNull, n = i("Vdly"), o = i("gP14").ChartModelBase, a = i("CW80"), l = a.isLineTool, c = a.isStudyLineTool, h = i("2+aH").Crosshair, u = i("rY0k").Watermark, d = i("hY3j").Grid, p = i("22xp").TimeScale, _ = i("qFKp").CheckMobile, m = i("H0vP").InvalidationMask, f = i("H0vP").InvalidationLevel, g = i("GVHu"), b = g.Study, v = i("Qq0B").NonSeriesStudy, S = i("3ClC"), y = S.createStudy, w = S.isStudy, P = S.isFundamentalStudy, C = g.prepareStudyProperties, x = i("K4L1"), T = i("qJq3").Series, I = i("mMWL"), M = i("wZIs").defaults, O = i("Ocx9").DefaultProperty, L = i("Qtjj").TimeSynchronizer, A = i("txPx").getLogger("Chart.ChartModel"), E = i("Y5iK").MainSeriesScaleRatioProperty, k = i("FaJS").scaleRatio, D = i("MROS").ModelSelection, V = i("Y7w9").subtract, B = i("VgjZ").PriceAxisRendererOptionsProvider, R = i("/YGI").StudyInserter, N = i("3t3b").dateFormatProperty, j = i("/tGj").isSymbolSource, F = i("gaBL").sourceNewCurrencyOnPinningToPriceScale, W = i("SwuQ").sourceNewUnitOnPinningToPriceScale, H = i("FQhm"), U = i("i126").StudyColorRotatorFactory, z = i("Kxc7"), G = i("jeZR").AppliedTimeFrame, q = z.enabled("auto_enable_symbol_labels"); z.enabled("fix_left_edge"); function Y() { this._selection.clear() } function K(e) { this._selection.remove(e) } function J(e, t) { var i = this._selection.isSelected(e); i && this._lastSelectedHittestData === t || e && !e.isSelectionEnabled() || (this ._lastSelectedHittestData = t || null, i || this._selection.add(e)) } class Z extends o { constructor(e, i, r, n, o, a, l, c) { super(e, i, r, n, o, a, l, c), this._modelIntervals = [], this ._rendererOptionsProvider = new B(this), this.setStudiesMetaData(this ._studiesMetaInfoRepository.getInternalMetaInfoArray(), this ._studiesMetaInfoRepository.getMigrations()), I.init(); var _ = this; this._panes = [], this.m_gridSource = new d; var m = this._readOnly ? new t(M( "chartproperties.paneProperties.crossHairProperties")) : this ._properties.paneProperties.crossHairProperties; this.m_crossHairSource = new h(this, m, this._options.crossHair), this .m_crossHairSource.selectPointMode().subscribe((function(e) { if (e && _.lineBeingCreated()) { var t = I.tool.value(); _.cancelCreatingLine(), I.tool.setValue(t) } })), this._tagsChanged = new s; var f = new O("chartproperties.mainSeriesProperties"); f.addExclusion("minTick"), f.addExclusion("priceAxisProperties.lockScale"), f.addExclusion("priceAxisProperties.percentage"), f.addExclusion( "priceAxisProperties.indexedTo100"), f.addExclusion( "priceAxisProperties.isInverted"), f.addExclusion( "priceAxisProperties.log"), f.addExclusion( "priceAxisProperties.logDisabled"), f.addExclusion( "priceAxisProperties.percentageDisabled"), f.addExclusion( "priceAxisProperties.autoScaleDisabled"), f.merge(r .mainSeriesProperties.state()), this._timeScale = new p(this, this ._options.timeScale); var g = { countdownEnabled: this._options.countdownEnabled, lastPriceAnimationEnabled: this._options.lastPriceAnimationEnabled }; this.m_mainSeries = new T(this, f, g, n), this.m_mainSeries.onStyleChanged() .subscribe(this._timeScale, this._timeScale.invalidateVisibleBars), this .m_mainSeries.properties().showCountdown.subscribe(this, (function() { this.m_mainSeries.updateAllViews(), this.fullUpdate() })), this._timeScale.visibleBarsStrictRangeChanged().subscribe(this .m_mainSeries, this.m_mainSeries.clearHighLowAvgPriceCache), this .createPane(void 0, { axisProperties: f.priceAxisProperties.state(["autoScale"]) }); var b = this._panes[0]; b.setStretchFactor(2 * b.stretchFactor()), this._selection = new D, this ._selectedSourceChanged = new s, this._properties.listeners().subscribe( this, Z.prototype.propertyChangeHandler), this._properties.timezone .listeners().subscribe(null, (function() { _._chartApi && _._chartApi.connected() && _._chartApi .switchTimezone(_.timezone()) })), this._timeScale.defaultRightOffsetProperty().listeners().subscribe( null, (function() { _.recalculateAllPanes() })), b.addDataSource(this.m_mainSeries, this._panes[0] .findSuitableScale(this.m_mainSeries)), this ._mainSeriesScaleRatioProperty = new E(this), this.m_mainSeries .dataEvents().completed().subscribe(this, function() { this._scrollingState && this.gotoTime() }.bind(this)), this.m_mainSeries.onIntervalChanged().subscribe(this, ( function() { this._recalcVRStudiesParams.oldStartVisibleIndex = NaN, this ._recalcVRStudiesParams.oldEndVisibleIndex = NaN })), this._readOnly || (f.addChild("priceAxisProperties", this .m_mainSeries.m_priceScale.properties()), this._properties .paneProperties.legendProperties.showStudyTitles.listeners() .subscribe(this, (function(e) { e.value() || _._properties.paneProperties .legendProperties.showStudyArguments.setValue(!1) }))), this._barsMarksSources = l(this); for (var v = 0; v < this._barsMarksSources.length; v++) this ._barsMarksSources[v].setOwnerSource(this.m_mainSeries); this._syncPointCache = {}, this._watermarkSource = this._options .watermarkEnabled ? new u(this, this.m_mainSeries) : null, I .hideAllDrawings().subscribe(this, this._onDrawingsVisibilityChanged), I .hideAllIndicators().subscribe(this, this ._onIndicatorsVisibilityChanged), this._properties.scalesProperties .listeners().subscribe(this, Z.prototype.fullUpdate), this ._studyInserted = new s, this._studyShiftColorStartOffset = void 0, this ._linePointBeingEdited = null, this._lineBeingEdited = null, N .subscribe(this, this._updateDateTimeFormatter), this.mainSeries() .properties().interval.subscribe(this, this._updateDateTimeFormatter), this._updateDateTimeFormatter(), this._studyColorRotatorFactory = new U( this), this._dataSourceCollectionChanged.subscribe(this, this ._updateShowLegendProperty.bind(this)), this._properties .paneProperties.legendProperties.showLegend.subscribe(this, this ._updateShowLegendProperty), this._appliedTimeFrame = new G(this), this.mainSeries().onTimeFrameApplied().subscribe(this, (function(e) { var t = null !== e ? { res: this.mainSeries().interval(), val: e } : null; this.appliedTimeFrame().setValue(t) })) } applyPreferences(e) { for (var t in e) void 0 !== this._properties[t] && "m_mainSeries" !== this ._properties[t] && this._properties[t].mergeAndFire(e[t]); void 0 !== e.timeScale && this._timeScale.defaultRightOffsetProperty() .setValue(e.timeScale.defaultRightOffset), this._properties .saveDefaults(), this.m_mainSeries.applyPreferences(e.mainSeries), this .sessions().applyPreferences(e.sessions), this.recalculateAllPanes(), this.fullUpdate() } setStudiesMetaData(e, t) { this._studiesMetaData = e, this._studyVersioning = new x(this._studiesMetaData, t) } isSnapshot() { return this._isSnapshot } timezone() { return this._properties.timezone.value() } initConnection() { this._chartApi.switchTimezone(this.timezone()) } updatePane(e) { var t = this._paneInvalidationMask(e); this.invalidate(t) } fullUpdate() { this.invalidate(m.full()) } lightUpdate() { this.invalidate(m.light()) } studiesMetaData() { return this._studiesMetaData } studyVersioning() { return this._studyVersioning } disconnect() { this.sessions().stop(); for (var e, t = this.dataSources(), i = 0; i < t.length; i++)(e = t[i]) .disconnect && e.disconnect(); this._timeScale.disconnect() } restart() { this.initConnection(), this._timeScale.reset(), this.m_mainSeries.restart(); for (var e, t = this.dataSources(), i = 0; i < t.length; i++)(e = t[i]) .restart && e !== this.m_mainSeries && e.restart(); this.sessions().restart() } startNotStartedStudies() { if (!this.m_mainSeries.isStarted()) throw new Error( "Cannot start studies: main series is not started"); for (var e = this.dataSources(), t = 0; t < e.length; t++) w(e[t]) && !e[t] .isStarted() && e[t].restart && e[t] !== this.m_mainSeries && e[t] .restart() } readOnly() { return this._readOnly } properties() { return this._properties } chartApi() { return this._chartApi } propertyChangeHandler() { this.lightUpdate() } _onDrawingsVisibilityChanged(e) { for (var t = !1 === e.value(), i = this.dataSources(), s = 0; s < i .length; s++) { var r = i[s], n = l(r) && r.properties().visible.value(); t && n ? H.emit("drawing_event", r.id(), "show") : !t && n && H.emit( "drawing_event", r.id(), "hide") } this.selectionMacro((function(e) { e.clearSelection() })) } _onIndicatorsVisibilityChanged() { var e = this.allStudies().filter((function(e) { return e.properties().visible.value() && e .canBeHiddenByGlobalFlag() })); if (0 !== e.length) { for (var t = !1, i = 0; i < e.length; i++) if (this.selection().isSelected(e[i])) { t = !0; break } t ? this.selectionMacro((function(e) { e.clearSelection() })) : this.lightUpdate() } } updateAllPaneViews() { for (var e = 0; e < this._panes.length; e++) { this._panes[e].updateAllViews() } } mainSeries() { return this.m_mainSeries } timeScale() { return this._timeScale } gridSource() { return this.m_gridSource } watermarkSource() { return this._watermarkSource } crossHairSource() { return this.m_crossHairSource } publishedChartsTimelineSource() { return null } barsMarksSources() { return this._barsMarksSources } barMarksSourceForId(e) { for (var t = 0; t < this._barsMarksSources.length; t++) if (this._barsMarksSources[t].id() === e) return this._barsMarksSources[ t]; return null } priceScaleSlotsCount() { var e = 0, t = 0; this._panes.forEach((function(i) { e = Math.max(i.leftPriceScales().length, e), t = Math.max(i .rightPriceScales().length, t) })); var i = e + t; if (_.any()) { var s = this.paneForSource(this.mainSeries()), r = s.priceScalePosition(this.mainSeries().priceScale()), n = "right" === r; return "overlay" === r && (n = s.rightPriceScales().length > 0), n ? { left: 0, right: 1, totallySlots: i } : { left: 1, right: 0, totallySlots: i } } return { left: e, right: t, totallySlots: e + t } } startScrollPrice(e, t, i) { e.startScrollPrice(t, i) } scrollPriceTo(e, t, i) { e.scrollPriceTo(t, i), this.invalidate(this._paneInvalidationMask(e, f .Light)) } endScrollPrice(e, t) { e.endScrollPrice(t), this.invalidate(this._paneInvalidationMask(e, f.Light)) } setPriceAutoScale(e, t, i) { e.setPriceAutoScale(t, i), this.invalidate(this._paneInvalidationMask(e, f .Light)) } updateScales(e, t) { this._undoModel._chartWidget._updateScalesActions() } mainSeriesScaleRatioProperty() { return this._mainSeriesScaleRatioProperty } mainSeriesScaleRatioPropertyOnChanged() { this._mainSeriesScaleRatioProperty.listeners().fire(this ._mainSeriesScaleRatioProperty) } mainSeriesScaleRatio() { return k(this._timeScale, this.m_mainSeries.priceScale()) } setMainSeriesScaleRatio(e) { this.paneForSource(this.m_mainSeries).applyPriceScaleRatio(this.m_mainSeries .priceScale(), e) } startScrollTime(e) { this._timeScale.startScroll(e), this._isTimeScrolling = !0 } scrollTimeTo(e) { this._timeScale.scrollTo(e), this.recalculateAllPanes(), this.lightUpdate(), this._setScalesResetAvailable(!0) } endScrollTime() { this._timeScale.endScroll(), this.lightUpdate(), this .recalcVisibleRangeStudies(), this._isTimeScrolling = !1 } recalcStudyBasedLineTools() { this.dataSources().forEach((function(e) { c(e) && e.recalcStudyIfNeeded && e.recalcStudyIfNeeded() })) } restoreTimeScaleState(e) { this._timeScale.restoreState(e), this.recalculateAllPanes(), this .lightUpdate(), this._setScalesResetAvailable(!0) } restoreFactoryDefaults(e) { e.restoreFactoryDefaults(), this.recalcVisibleRangeStudies(!0) } selectionMacro(e) { var t = this.selection().allSources(); e({ removeSourceFromSelection: K.bind(this), addSourceToSelection: J.bind(this), clearSelection: Y.bind(this), selection: this.selection.bind(this) }); var i = V(t, this.selection().allSources()), s = V(this.selection().allSources(), t); s.concat(t).forEach((function(e) { e.updateAllViews() })), i.forEach((function(e) { var t = e.hasAlert && e.hasAlert.value() && e .getAlertSync(); t && t.set("selected", !1) })), s.forEach((function(e) { var t = e.hasAlert && e.hasAlert.value() && e .getAlertSync(); t && t.set("selected", !0) })), this.lightUpdate(), (i.length > 0 || s.length > 0) && this ._selectedSourceChanged.fire() } checkLineToolSelection() { this._selection.checkLineToolSelection() } onSelectedSourceChanged() { return this._selectedSourceChanged } selection() { return this._selection } orderedDataSources(e) { var t = []; t.push(this.m_crossHairSource); for (var i = 0; i < this._panes.length; i++) { var s = this._panes[i].sourcesByGroup().all().slice(); e && s.reverse(), t = t.concat(s) } return t } dataSourceForId(e) { for (var t, i = 0; i < this._panes.length; ++i) if (t = this._panes[i].dataSourceForId(e)) return t; return null } children(e, t) { return this.dataSources().filter((function(i) { return (!0 !== t || !w(i) || !i.isChildStudy()) && i .ownerSource() === e })) } onSyncScrollNeeded(e) { var t = this._undoModel._chartWidget; if (t._chartWidgetCollection) { var i = this.mainSeries().syncModel(); if (i) { var s = 1e3 * this._timeScale.points().roughTime(e, i.projectTime .bind(i)); t._chartWidgetCollection.syncScroll(s, this) } } } createSyncPoint(e, t) { var i = this._syncPointCache[e.uniqueId()]; if (i) { var s = i[t.uniqueId()]; if (s) return s } else this._syncPointCache[e.uniqueId()] = {}; var r = new L(e, t); return this._syncPointCache[e.uniqueId()][t.uniqueId()] = r, r } updateTimeScale(e, t, i, s, r, n, o) { if (o) { this._timeScale.reset(); for (var a = this.dataSources(), l = 0; l < a.length; l++) a[l] .clearData && a[l].clearData() } if (s.length > 0) for (a = this.dataSources(), l = 0; l < a.length; l++) a[l].moveData && a[l].moveData(s); var c = this._timeScale.indexToTimePoint(this._timeScale.baseIndex()); this._timeScale.update(e, t, i, n); var h = "ChartModel.prototype.updateTimeScale(" + e + "," + t + "," + i .length + "," + s.length + "," + n.length + "," + o + ")"; if (h += "TimeScale: {first:" + this._timeScale.points().firstIndex() + ",last:" + this._timeScale.points().lastIndex() + "}", void 0 !== r) { var u = this._timeScale.indexToTimePoint(r), d = null !== c && null !== u && u > c; this._updateBaseIndex(r, d) } A.logDebug(h), this.recalculateAllPanes(), this.lightUpdate() } updateTimeScaleBaseIndex(e) { var t = this.mainSeries().bars(); t.isEmpty() || this._updateBaseIndex(r(t.lastIndex()), e && e.index > 0) } _updateBaseIndex(e, t) { var i = this.timeScale(), s = i.baseIndex(), r = i.visibleBarsStrictRange(), n = i.logicalRange(); if (null !== n && t) { var o = n.contains(s), a = e - s, l = o ? null : i.rightOffset() - a; if (!this._options.shiftVisibleRangeOnNewBar && o) { var c = i.indexToCoordinate(s) + i.barSpacing() / 2 + 1, h = s - n.left() + a, u = c / h; if (u >= i.minBarSpacing()) i.setBarSpacing(u), l = i.width() / u - h; else r.lastBar() !== s && (l = i.rightOffset() - a) } null !== l && i.setRightOffset(l) } i.setBaseIndex(e) } recalculatePane(e) { e && e.recalculate() } recalculateAllPanes() { for (var e = 0; e < this._panes.length; ++e) this._panes[e].recalculate(); this.updateAllPaneViews(), this.crossHairSource().updateAllViews() } _invalidateBarColorerCaches() { for (var e = this.dataSources(), t = 0; t < e.length; ++t) { var i = e[t]; i instanceof T && i.invalidateBarColorerCache() } } createStudyInserter(e) { return new R(e, this._studiesMetaInfoRepository, { createStudy: this.insertStudyWithParams.bind(this) }) } insertStudyWithParams(e, t, i, s, r, o, a, l, c, h, u) { null == o && (o = this.mainSeries()); var d = null; if (!r && void 0 !== e.groupingKey) { var p = this.findNonOverlayStudyWithGroupingKey(e.groupingKey); null !== p && (d = p.pane) } null === d && (r || e.is_price_study ? d = this.paneForSource(o) : (d = this .createPane(), void 0 !== h && d.setPaneSize(h))), "Compare@tv-basicstudies" === e.id && this.m_mainSeries.priceScale() .setMode({ log: !1, percentage: !0 }); var _ = Object.assign({}, s, { inputs: t }), m = C(e, _, d, this.studyVersioning(), o), f = y(this, m, o, e, u); this._recalcVisibleRangeStudiesImpl({ studies: [f], oldEndVisibleIndex: -1, oldStartVisibleIndex: -1, force: !0, timerId: null }); var g = d.findSuitableScale(f, o, a); if (g === this.mainSeries().priceScale() && j(f)) { var b = l ? F(f, g, this, !0) : null, v = c ? W(f, g, this, !0) : null; null === b && null === v || f.setSymbolCurrencyUnit(void 0, b || void 0, v || void 0) } return j(f) && d.hasDataSource(this.mainSeries()) && q && !n.getBool( "enable_symbol_labels_on_inserting_compare_once", !1) && (this .properties().scalesProperties.showSymbolLabels.setValue(!0), n .setValue("enable_symbol_labels_on_inserting_compare_once", !0)), f .start(), null !== i && d.id() === i.paneId ? d.insertDataSource(f, g, i .zorder) : d.addDataSource(f, g), f.properties().linkedToSeries && f .properties().linkedToSeries.value() && f.setOwnerSource(this .mainSeries()), this.recalculatePane(d), this.fullUpdate(), this ._invalidateBarColorerCaches(), this._recalcVisibleRangeStudiesImpl({ studies: [f], force: !0 }), this._recalcColorStudiesImpl({ studies: [f], force: !0 }), this._studyInserted.fire(f), f } studyInserted() { return this._studyInserted } detachSource(e, t) { var i = this.paneForSource(e); if (i) return i.removeDataSource(e), i.isEmpty() ? (this ._lineBeingCreated && i === this._paneBeingCreatedLineOn && this .cancelCreatingLine(), this.removePane(i, t), !0) : (this .fullUpdate(), !1) } removeSource(e, t) { this.selectionMacro((function(t) { t.removeSourceFromSelection(e) })), this._sourcesBeingMoved.includes(e) && (this._sourcesBeingMoved = this._sourcesBeingMoved.filter((function(t) { return t !== e })), this._sourcesBeingMoved.length || (this._lineItemBeingMoved = null)), e === this._lineBeingEdited && (this._lineBeingEdited = null, I.isToolEditingNow.setValue(!1)), e === this ._lineBeingCreated && (this._lineBeingCreated = null, I .isToolCreatingNow.setValue(!1)), e.stop && e.stop(); var i = this.detachSource(e, t); const s = this.mainSeries().priceScale(); return w(e) && j(e) && e.priceScale() === s && s.isPercentage() && 1 === s .seriesLikeSources().length && s.setMode({ percentage: !1 }), this.fullUpdate(), this._invalidateBarColorerCaches(), w(e) && (H .emit("study_event", e.id(), "remove"), e.isChildStudy() && e .source().unsetChild(e)), e.destroy && e.destroy(), l(e) && H.emit( "drawing_event", e.id(), "remove"), i } _unmergeAvailable(e) { return e === this.m_mainSeries || TradingView.isInherited(e.constructor, b) && !e.isLinkedToSeries() && !TradingView.isInherited(e .constructor, v) && e.showInObjectTree() } isMergeUpAvailableForSource(e) { return !!this._unmergeAvailable(e) && this.paneForSource(e) !== this .panes()[0] } isMergeDownAvailableForSource(e) { if (!this._unmergeAvailable(e)) return !1; var t = this.paneForSource(e), i = this.panes(); return t !== i[i.length - 1] } isUnmergeAvailableForSource(e) { return !!this._unmergeAvailable(e) && this.paneForSource(e).dataSources() .filter(this._unmergeAvailable, this).length > 1 } lineBeingEdited() { return this._lineBeingEdited } linePointBeingEdited() { return this._linePointBeingEdited } calculateDefaultTags() { for (var e = [], t = this.dataSources(), i = 0; i < t.length; i++) { var s = t[i]; s.tags && (e = e.concat(s.tags())) } return e } _sendTo(e, t) { var i = {}, s = this; for (var r in e.forEach((function(e) { var t = s.paneForSource(e), r = s._panes.indexOf(t); i[r] || (i[r] = []), i[r].push(e) })), i) { t(s._panes[r], i[r]) } this.fullUpdate() } sendToBack(e) { this._sendTo(e, (function(e, t) { e.sendToBack(t) })) } bringToFront(e) { this._sendTo(e, (function(e, t) { e.bringToFront(t) })) } clearAllStudies() { for (var e = this.dataSources(), t = 0; t < e.length; t++) e[t].clearData && e[t].clearData() } allLineTools() { return this._getAllSources(l) } getStudyById(e) { var t = this.dataSourceForId(e); return null !== t && w(t) ? t : null } getLineToolById(e) { var t = this.dataSourceForId(e); return null !== t && l(t) ? t : null } getStudyById(e) { var t = this.dataSourceForId(e); return t instanceof b ? t : null } _initAlertsList() { throw new Error("Not implemented") } _addAlertLabelToChart(e) { throw new Error("Not implemented") } _removeAlertLabelFromChart(e) { throw new Error("Not implemented") } _removeAllAlertLabelsFromChart() { throw new Error("Not implemented") } getAlertsList() { return Promise.resolve(null) } resetAlertList() {} setInterval(e, t) { var i = setInterval(e, t); return this._modelIntervals.push(i), i } clearInterval(e) { clearInterval(e); var t = this._modelIntervals.indexOf(e); t > -1 && this._modelIntervals.splice(t, 1) } clearIntervals() { for (var e = 0; e < this._modelIntervals.length; e++) clearInterval(this ._modelIntervals[e]); this._modelIntervals = [] } destroy() { this.mainSeries().properties().childs().showCountdown.unsubscribeAll(this), this.mainSeries().onTimeFrameApplied().unsubscribeAll(this), this ._appliedTimeFrame.destroy(); for (var e = 0; e < this._barsMarksSources.length; e++) this ._barsMarksSources[e].destroy(); this.clearIntervals(), I.hideAllDrawings().unsubscribe(this, this ._onDrawingsVisibilityChanged), I.hideAllIndicators().unsubscribe( this, this._onIndicatorsVisibilityChanged), this .resetDeferredStudies(); for (e = 0; e < this._barsMarksSources.length; e++) this._barsMarksSources[ e].destroy(); for (e = 0; e < this._panes.length; e++) this._panes[e].destroy(); this._panes.length = 0, this._sessions = null, this.m_mainSeries .onStyleChanged().unsubscribe(this._timeScale, this._timeScale .invalidateVisibleBars), this._timeScale .visibleBarsStrictRangeChanged().unsubscribe(this.m_mainSeries, this .m_mainSeries.clearHighLowAvgPriceCache), this._timeScale.destroy(), N.unsubscribe(this, this._updateDateTimeFormatter), this.mainSeries() .properties().interval.unsubscribe(this, this._updateDateTimeFormatter), this._trendLineStatsCache && this._trendLineStatsCache.destroy(), this ._fibRetracementLabelsCache && this._fibRetracementLabelsCache .destroy(), this._properties.paneProperties.legendProperties.showLegend .unsubscribeAll(this), this._dataSourceCollectionChanged.unsubscribeAll( this), this.m_crossHairSource.destroy(), super.destroy() } countUserStudies(e) { var t = 0; e = e || {}; for (var i = 0; i < this._panes.length; i++) for (var s = this._panes[i].dataSources(), r = 0; r < s.length; r++) { var n = s[r]; if (w(n) && !P(n) && n.showInObjectTree()) { var o = n.metaInfo && n.metaInfo(); if (o) { var a = o.id; if (e.dontCountVolume && "Volume@tv-basicstudies" === a) continue; if (e.dontCountCompare && "Compare@tv-basicstudies" === a) continue; if (e.dontCountOverlay && "Overlay@tv-basicstudies" === a) continue } t++ } } return t } isJustClonedChart() { return this._undoModel.isJustClonedChart() } restoreSource(e, t, i, s, r) { var n, o; n = e ? this.createPane(t) : this.panes()[t]; var a = s.type.toLowerCase().startsWith("study"); if (!(o = a ? n.restoreStudy(s) : n.restoreLineTool(s))) return null; var l = null; s.ownerSource && (l = n.dataSourceForId(s.ownerSource)), o.setOwnerSource( l); var c = null; if (r ? c = n.getPriceScaleById(r.id) : o.ownerSource() && (c = o .ownerSource().priceScale()), c) o.setPriceScale(c), c .addDataSource(o); else { c = n.createPriceScaleAtPosition(r.position, r.priceScaleIndex); r && r.id && c.setId(r.id), o.setPriceScale(c), c.addDataSource(o) } if (!e && i && i.overlayPriceScales) { var h = this.dataSources().filter((function(e) { return void 0 !== i.overlayPriceScales[e.id()] })); h.forEach(n.removeSourceFromPriceScale.bind(n)); var u = new Map; h.forEach((function(e) { var t, s = i.overlayPriceScales[e.id()]; u.has(s.id) ? t = u.get(s.id) : ((t = n .createPriceScaleAtPosition("overlay")) .restoreState(s), u.set(s.id, t)), t .addDataSource(e), e.setPriceScale(t) })) } return o.start(), o.restore && o.restore(), e && n.restoreState(i, !1, this .version()), a && (this.recalculateAllPanes(), this.mainSeries() .invalidateBarColorerCache(), this.fullUpdate()), o } selectPointMode() { return this.m_crossHairSource.selectPointMode() } cancelRequestSelectPoint() { this.m_crossHairSource.cancelRequestSelectPoint() } requestSelectPoint(e, t) { return this.m_crossHairSource.requestSelectPoint(e, t) } onPointSelected() { return this.m_crossHairSource.onPointSelected() } isSeriesStyleSupported(e) { return this.m_mainSeries.isStyleSupported(e) } getStudyShiftColorStartOffset() { return this._studyShiftColorStartOffset } setStudyShiftColorStartOffset(e) { this._studyShiftColorStartOffset = e } isInReplay() { return this.m_mainSeries.isInReplay() } onInReplayStateChanged() { return new s } switchToReplay(e, t) { 0 } switchToRealtime() { 0 } rendererOptionsProvider() { return this._rendererOptionsProvider } priceAxisRendererOptions() { return this._rendererOptionsProvider.options() } magnet() { return this._magnet } isPriceScaleVisible(e) { var t = this.paneForSource(e.mainSource()), i = t.priceScalePosition(e); if ("overlay" === i) return !0; var s = this.priceScaleSlotsCount(); return t.priceScaleIndex(e, i) < s[i] } studyMetaInfoRepository() { return this._studiesMetaInfoRepository } studiesColorRotatorFactory() { return this._studyColorRotatorFactory } } e.exports = Z }).call(this, i("tc+8"), i("aIyQ")) }, cZRT: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor() { this._retries = 5, this._cache = null, this._tryLoad = e => { this._retries = this._retries - 1; this._startLoading().then(e, 0 !== this._retries ? () => setTimeout(() => this._tryLoad(e), 3e3) : void 0) } } load() { return this._cache || (this._cache = new Promise(this._tryLoad)), this._cache } } }, cdbK: function(e, t, i) { "use strict"; function s(e) { return Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i .e(16), i.e(17), i.e(23), i.e(34), i.e(42), i.e(43), i.e(49), i.e(50), i.e(76), i.e(0), i.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(32), i.e(40), i.e(46), i .e("go-to-date-dialog-impl") ]).then(i.bind(null, "uUY/")).then(t => t.showGoToDateDialog(e)) } i.r(t), i.d(t, "showGoToDateDialog", (function() { return s })) }, cgFQ: function(e, t, i) { "use strict"; var s = i("Tmoa"), r = i("ikwP"); const n = /[1-9]/g; class o { constructor() { this._data = null } setData(e) { this._data = e } draw(e, t, i) { if (null === this._data || !this._data.visible || 0 === this._data.text.length) return; const s = this._data; e.font = t.font; const o = Math.round(t.widthCache.measureText(e, s.text, n)); if (o <= 0) return; e.save(); const a = t.paddingHorizontal, l = o + 2 * a, c = l / 2; let h = s.coordinate, u = Math.floor(h - c) + .5; if (s.alwaysInViewPort) { const e = s.width; u < 0 ? (h += Math.abs(0 - u), u = Math.floor(h - c) + .5) : u + l > e && (h -= Math.abs(e - (u + l)), u = Math.floor(h - c) + .5) } const d = u + l, p = Math.ceil(0 + t.borderSize + t.offsetSize + t.paddingTop + t.fontSize + t .paddingBottom); e.fillStyle = s.background; const _ = Math.round(u * i), m = Math.round(0 * i), f = Math.round(d * i), g = Math.round(p * i), b = Math.round(2 * i); e.beginPath(), e.moveTo(_, m), e.lineTo(_, g - b), e.arcTo(_, g, _ + b, g, b), e .lineTo(f - b, g), e.arcTo(f, g, f, g - b, b), e.lineTo(f, m), e.fill(); const v = 0 + t.borderSize + t.offsetSize + t.paddingTop + t.fontSize / 2; e.textAlign = "left", e.textBaseline = "middle", e.fillStyle = s.color; const S = t.widthCache.yMidCorrection(e, "Apr0"); e.translate((u + a) * i, (v + S) * i), Object(r.drawScaled)(e, i, () => e.fillText(s .text, 0, 0)), e.restore() } } i.d(t, "a", (function() { return a })); class a { constructor(e) { this._renderer = new o, this._rendererData = { background: "", color: "", coordinate: 0, text: "", visible: !1, width: 0, alwaysInViewPort: !0 }, this._invalidated = !0, this._model = e, this._renderer.setData(this ._rendererData) } update() { this._invalidated = !0 } renderer() { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._renderer } coordinate() { return this._rendererData.coordinate } _getAlwaysInViewPort() { return !0 } _updateImpl() { const e = this._rendererData; if (e.visible = !1, this._model.timeScale().isEmpty()) return; const t = this._getIndex(); if (null === t) return; e.visible = !0, e.width = this._model.timeScale().width(), e.background = this ._getBgColor(), e.color = Object(s.colorFromBackground)(e.background), e .coordinate = this._model.timeScale().indexToCoordinate(t), e.alwaysInViewPort = this._getAlwaysInViewPort(); const i = this._model.timeScale().indexToUserTime(t); e.text = null !== i ? this._model.dateTimeFormatter().format(i) : "", this ._invalidated = !1 } } }, d700: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return r })), i.d(t, "a", (function() { return n })); var s = i("/3z9"); 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 n(e, t) { if (!t) return !1; const i = 255 & e; if (27 === i || i >>> 4 == 7) return !1; switch (e ^ i) { case s.Modifiers.Alt: return (38 === i || 40 === i) && "SELECT" === t.tagName || r(t); case s.Modifiers.Alt + s.Modifiers.Shift: return r(t); case s.Modifiers.Mod: if (67 === i || !s.isMacKeyboard && 45 === i) { const e = t.ownerDocument && t.ownerDocument.getSelection(); if (e && !e.isCollapsed) return !0 } return r(t); case s.Modifiers.Mod + s.Modifiers.Shift: return i >= 33 && i <= 40 && r(t); case s.Modifiers.Shift: case 0: return !!(9 !== i || t.ownerDocument && t !== t.ownerDocument.body && t !== t .ownerDocument.documentElement) && ((13 === i || 32 === i || ! 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)) && ("form" in t || t.isContentEditable)) } return !1 } }, dDSx: function(e, t, i) { "use strict"; (function(e) { var s = i("Ss5c").LineDataSource, r = i("//lZ").doAnimate, n = i("onDC").ChartUndoModelBase, o = (i("Ocx9").saveDefaultProperties, i("GVHu").Study), a = i("8sOK").StudyStub, l = i("vwKG").showTooManyStudiesNotice, c = (i("RDU5").UndoCommand, i("YlKu").ApplyLineToolTemplateUndoCommand), h = i("s9sR").SetResolutionUndoCommand, u = i("FKaq").SetPriceScaleSelectionStrategyCommand, d = i("CsKN").SetScaleRatioPropertiesCommand, p = i("/YGI").StudyInserter, _ = i("JWMC").trackEvent, m = i("txPx").getLogger("Chart.ChartUndoModel"), f = i("QTwd").RestoreDefaultsPreferencesUndoCommand, g = i("bJYc").SetPropertyUndoCommand, b = i("pOzK").SetPriceScaleModeCommand, v = i("7MWe").PriceScaleChangeUndoCommand, S = i("LxhU").Interval, y = i("ri5u").ChartLoadThemeUndoCommand; t.ChartUndoModel = class extends n { constructor(t, i, s, r, n, o, a, l, c) { super(t, i, s, r, n, o, a, l, c), this._onSimpleZoomIn = new e, this ._onSimpleZoomOut = new e, this.beginUndoMacro = a.beginUndoMacro .bind(a), this.endUndoMacro = a.endUndoMacro.bind(a), this .createUndoCheckpoint = a.createUndoCheckpoint.bind(a), this .undoToCheckpoint = a.undoToCheckpoint.bind(a) } version() { return this.m_model.version() } onData(e) { switch (e.method) { case "timescale_update": var t = e.params; this.m_model.updateTimeScale(t.index, t.zoffset, t.changes, t .index_diff, t.baseIndex, t.marks, t.clear); break; case "timescale_completed": var i = e.params[0]; this.m_model.timeScale().onTimeScaleCompleted(i) } } paneForSource(e) { return this.m_model.paneForSource(e) } createPane(e) { return this.m_model.createPane(e) } readOnly() { return this.m_model.readOnly() } restart() { this.m_model.restart() } disconnect() { this.m_model.disconnect() } studiesMetaData() { return this.m_model.studiesMetaData() } studyVersioning() { return this.m_model.studyVersioning() } chartModel() { return this._model() } _model() { return this.m_model } pushUndoCommand(e) { this._pushUndoCommand(e) } _pushUndoCommand(e) { this._undoHistory.pushUndoCommand(e) } startScrollPrice(e, t, i) { t.isAutoScale() || (this._initialPriceScrollState = t.state(), this ._initialPriceScrollPos = i, this.chartModel().startScrollPrice( e, t, i)) } scrollPriceTo(e, t, i) { t.isAutoScale() || (this._initialPriceScrollPos && Math.abs(this ._initialPriceScrollPos - i) > 20 && (this.pushUndoCommand( new v(this.m_model, e, t, this._initialPriceScrollState) ), delete this._initialPriceScrollState, delete this ._initialPriceScrollPos), this.chartModel().scrollPriceTo(e, t, i)) } endScrollPrice(e, t) { t.isAutoScale() || (delete this._initialPriceScrollState, delete this ._initialPriceScrollPos, this.chartModel().endScrollPrice(e, t)) } setPriceAutoScale(e, t, i) { this.pushUndoCommand(new v(this.m_model, e, t, t.state())), this .chartModel().setPriceAutoScale(e, t, i) } setWidth(e) { this.m_model.setWidth(e) } setPaneHeight(e, t) { this.m_model.setPaneHeight(e, t) } gridSource() { return this.m_model.gridSource() } watermarkSource() { return this.m_model.watermarkSource() } addAlertsSource(e) { return this.m_model.addAlertsSource(e) } alertsSources() { return this.m_model.alertsSources() } publishedChartsTimelineSource() { return this.m_model.publishedChartsTimelineSource() } barsMarksSources() { return this.m_model.barsMarksSources() } barMarksSourceForId(e) { return this.m_model.barMarksSourceForId(e) } crossHairSource() { return this.m_model.crossHairSource() } model() { return this.m_model } chartWidget() { return this._chartWidget } mainSeries() { return this.m_model.m_mainSeries } mainSeriesScaleRatioProperty() { return this.m_model.mainSeriesScaleRatioProperty() } panes() { return this.m_model.panes() } timeScale() { return this.m_model.timeScale() } selectionMacro(e) { return this.m_model.selectionMacro(e) } setHoveredSource(e, t) { this.m_model.setHoveredSource(e, t) } selection() { return this.m_model.selection() } onSelectedSourceChanged() { return this.m_model.onSelectedSourceChanged() } hoveredSource() { return this.m_model.hoveredSource() } activeStrategySource() { return this.m_model.activeStrategySource() } invalidate(e) { this.m_model.invalidate(e) } setCurrentPosition(e, t, i, s) { this.m_model.setCurrentPosition(e, t, i, s) } setAndSaveCurrentPosition(e, t, i, s) { this.m_model.setAndSaveCurrentPosition(e, t, i, s) } canCreateStudy(e) { return this.model().chartApi().chartApi().isCanCreateStudy(e) } _isCountedStudy(e) { throw new Error("Not implemented") } checkIfFeatureAvailable(e, t) { var i = this.canCreateStudy(), s = t && t instanceof o; return !this.readOnly() && s && (i = this.canCreateStudy(!0)), !!i || ( s || l(), !1) } createStudyInserter(e, t, i) { var s = this, r = null, n = { createStudy: function(e, t, i, n, o, a, l, c, h, u, d) { return s.checkIfFeatureAvailable(e, a) ? (_("studies", "Study_" + e.id), "Compare@tv-basicstudies" === e.id && _( "compare", "symbol:" + t.symbol), s ._insertStudy(e, t, n, o, a, l, c, h, u, r, d) ) : (m.logNormal("Cannot insert study " + e.id), null) } }; void 0 !== i && (n.createStub = function() { var e = s.m_model.insertStudyStub(i); return r = { targetPaneId: s.m_model.paneForSource(e).id(), targetZOrder: e.zorder() }, e.id() }, n.removeStub = function(e) { return s.m_model.removeStudyStub(e) }); var o = new p(e, this.m_model._studiesMetaInfoRepository, n); return o.setParentSource(t), o } setProperty(e, t, i, s) { if (e && e.value() !== t) { var r = new g(e, t, i, this.m_model, s); this.pushUndoCommand(r), this.emitEvent("setProperty") } } setProperties(e, t, i) { var s = this; this.beginUndoMacro(i), this.m_model.selectionMacro((function() { for (var r = 0; r < e.length; r++) s.setProperty(e[r], t[r], i) })), this.endUndoMacro() } setPriceScaleMode(e, t, i) { for (var s = Object.keys(e), r = t.mode(), n = !1, o = 0; o < s .length; o++) if (r[s[o]] !== e[s[o]]) { n = !0; break } if (n) { var a = new b(e, t, i, this.m_model); this.pushUndoCommand(a) } } setPriceScaleSelectionStrategy(e) { if (this.m_model.properties().priceScaleSelectionStrategyName .value() !== e) { _("Chart", "Change PriceScale Selection Strategy"); var t = "Set Price Scale Selection Stretegy to " + e; this.beginUndoMacro(t), this.setProperty(this.m_model.properties() .priceScaleSelectionStrategyName, e, t); var i = new u(this.m_model, e, t); this.pushUndoCommand(i), this.endUndoMacro() } } setScaleRatioProperty(e, t, i) { if (e.value() !== t) { var s = new d(e, t, i, this.m_model); this.pushUndoCommand(s) } } setResolutionProperty(e, t, i, s) { if (!S.isEqual(e.value(), t)) { var r = new h(e, t, i, s); this.pushUndoCommand(r) } } lineBeingCreated() { return this.m_model.lineBeingCreated() } paneBeingCreatedLineOn() { return this.m_model.paneBeingCreatedLineOn() } cancelCreatingLine() { this.m_model.cancelCreatingLine() } lineCancelled() { return this.m_model.lineCancelled() } lineBeingEdited() { return this.m_model.lineBeingEdited() } sourcesBeingMoved() { return this.m_model.sourcesBeingMoved() } dataSources() { return this.m_model.dataSources() } orderedDataSources(e) { return this.m_model.orderedDataSources(e) } dataSourceForId(e) { return this.m_model.dataSourceForId(e) } state(e, t, i, s) { return this.m_model.state(e, t, i, s) } asyncState() { return this.m_model.asyncState() } calculateDefaultTags() { return this.m_model.calculateDefaultTags() } onTagsChanged() { return this.m_model.onTagsChanged() } _removeAllStudiesImpl() { for (var e = this.m_model.dataSources(), t = 0; t < e.length; t++) { var i = e[t]; (TradingView.isInherited(i.constructor, o) && !i.isChildStudy() && i .removeByRemoveAllStudies() || TradingView.isInherited(i .constructor, a)) && this.removeSource(i) } } removeAllStudies() { this.beginUndoMacro(window.t("Remove all studies")), this ._removeAllStudiesImpl(), this.endUndoMacro() } _removeAllDrawingToolsImpl(e) { var t = this; this.selectionMacro((function() { t.lineBeingCreated() && t.cancelCreatingLine(); for (var i = t.dataSources(), r = 0; r < i .length; r++) { var n = i[r]; TradingView.isInherited(n.constructor, s) && n .isActualSymbol() && n.isUserDeletable() && ( e && e !== n.toolname || t.removeSource(n)) } })) } removeAllDrawingTools(e) { this.beginUndoMacro(window.t("Remove Drawings")), this ._removeAllDrawingToolsImpl(), this.endUndoMacro() } removeAllStudiesAndDrawingTools() { this.beginUndoMacro(window.t("Remove all studies and drawing tools")), this._removeAllDrawingToolsImpl(), this._removeAllStudiesImpl(), this.endUndoMacro() } moveLeft() { try { this.beginUndoMacro("Move Left") } catch (e) { return } var e = this.m_model.timeScale().width(), t = this; r({ to: e / 5, onStep: function(e) { t.startScrollTime(e), t.scrollTimeTo(0), t .endScrollTime() }, onComplete: function() { t.endUndoMacro() } }) } moveRight() { try { this.beginUndoMacro("Move Right") } catch (e) { return } var e = this.m_model.timeScale().width(), t = this; r({ to: e / 5, onStep: function(e) { t.startScrollTime(0), t.scrollTimeTo(e), t .endScrollTime() }, onComplete: function() { t.endUndoMacro() } }) } scrollChart(e) { this.m_model.scrollEnabled() && (this.startScrollTime(0), this .scrollTimeTo(e), this.endScrollTime()) } scrollChartByBar(e) { if (this.m_model.scrollEnabled()) { var t = e * this.m_model.timeScale().barSpacing(); this.startScrollTime(0), this.scrollTimeTo(t), this.endScrollTime() } } restorePreferences() { var e = new f(this.model()); this.pushUndoCommand(e) } applyPreferences(e) { throw new Error("Not implemented") } chartLoadTheme(e, t, i, s) { var r = new y(e, t, i); s ? r.redo() : this.pushUndoCommand(r) } applyLineToolTemplate(e, t, i) { this.beginUndoMacro(i), this.saveLineToolState(e, i); var s = new c(e, t, i); this.pushUndoCommand(s), this.saveLineToolState(e, i), this .endUndoMacro(), this.model().updateSource(e) } onSimpleZoomIn() { return this._onSimpleZoomIn } onSimpleZoomOut() { return this._onSimpleZoomOut } getAlertsList() { return this.m_model.getAlertsList() } isJustClonedChart() { return this._chartWidget.isJustClonedChart() } trackTime() { return this._chartWidget.trackTime() } isInReplay() { return this.m_model.isInReplay() } switchToReplay(e, t) {} switchToRealtime() {} togglePriceScaleAutoScaleMode(e) { var t = { autoScale: !e.isAutoScale() }; this.setPriceScaleMode(t, e, "Auto Scale") } togglePriceScaleLockScaleMode(e) { var t = { lockScale: !e.isLockScale() }; this.setPriceScaleMode(t, e, "Lock Scale") } setPriceScaleRegularScaleMode(e) { this.setPriceScaleMode({ log: !1, percentage: !1, indexedTo100: !1 }, e, "Regular") } togglePriceScaleIndexedTo100ScaleMode(e) { var t = { indexedTo100: !e.isIndexedTo100() }; this.setPriceScaleMode(t, e, "Indexed to 100") } togglePriceScalePercentageScaleMode(e) { var t = { percentage: !e.isPercentage() }; this.setPriceScaleMode(t, e, "Percent") } togglePriceScaleLogScaleMode(e) { var t = { log: !e.isLog() }; this.setPriceScaleMode(t, e, "Logarithmic") } invertPriceScale(e) { var t = e.properties().isInverted; this.setProperty(t, !t.value(), "Invert Scale") } removePane(e) { var t = this.m_model.panes()[e].dataSources().slice(); this.removeSources(t, !1, "Remove pane") } destroy() { this.model().destroy() } } }).call(this, i("aIyQ")) }, dOnf: function(e, t, i) { "use strict"; function s(e) { let t; if ("object" != typeof e || null == e || "number" == typeof e.nodeType) t = e; else if (e instanceof Date) t = new Date(e.valueOf()); else if (Array.isArray(e)) { t = []; let i = 0; const r = e.length; for (; i < r; i++) Object.prototype.hasOwnProperty.call(e, i) && (t[i] = s(e[i])) } else { t = {}; for (const i in e) Object.prototype.hasOwnProperty.call(e, i) && (t[i] = s(e[i])) } return t } i.r(t), i.d(t, "deepCopy", (function() { return s })) }, dTSQ: function(e, t, i) { "use strict"; function s(e) { return e.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&") } i.r(t), i.d(t, "regExpEscape", (function() { return s })) }, "dUJ+": function(e, t, i) { "use strict"; i.r(t), i.d(t, "replaceGraphicsTimesWithTimePointIndexIndex", (function() { return n })); const s = new Map([ ["horizlines", e => [e.startIndex, e.endIndex]], ["hhists", e => [e.firstBarTime, e.firstBarTime]], ["vertlines", e => [e.index]], ["polygons", e => e.points.map(e => e.index)] ]), r = new Map([ ["horizlines", (e, t) => { const i = e; i.startIndex = t.get(i.startIndex), i.endIndex = t.get(i.endIndex) }], ["hhists", (e, t) => { const i = e; i.firstBarTime = t.get(i.firstBarTime), i.lastBarTime = t.get(i.lastBarTime) }], ["vertlines", (e, t) => { const i = e; i.index = t.get(i.index) }], ["polygons", (e, t) => { const i = e; for (const e of i.points) e.index = t.get(e.index) }] ]); function n(e) { const t = e.data && e.data.graphicsCmds && e.data.graphicsCmds.create; if (!t) return []; const i = new Map, n = new Set; s.forEach((e, s) => { const r = t[s]; if (r) for (const t of r) for (const s of t.data) { const t = e(s); for (const e of t) i.set(e, -1), n.add(e) } }); const o = Array.from(n).sort((e, t) => e - t); return o.forEach((e, t) => i.set(e, t)), r.forEach((e, s) => { const r = t[s]; if (r) for (const t of r) for (const s of t.data) e(s, i) }), o } }, dfhE: function(e, t, i) { "use strict"; i.r(t), i.d(t, "STATUS_OFFLINE", (function() { return s })), i.d(t, "STATUS_RESOLVING", (function() { return r })), i.d(t, "STATUS_LOADING", (function() { return n })), i.d(t, "STATUS_READY", (function() { return o })), i.d(t, "STATUS_INVALID_SYMBOL", (function() { return a })), i.d(t, "STATUS_SNAPSHOT", (function() { return l })), i.d(t, "STATUS_EOD", (function() { return c })), i.d(t, "STATUS_PULSE", (function() { return h })), i.d(t, "STATUS_DELAYED", (function() { return u })), i.d(t, "STATUS_DELAYED_STREAMING", (function() { return d })), i.d(t, "STATUS_NO_BARS", (function() { return p })), i.d(t, "STATUS_REPLAY", (function() { return _ })), i.d(t, "STATUS_ERROR", (function() { return m })), i.d(t, "SERIES_STATUS_TEXT", (function() { return f })), i.d(t, "STYLE_LINE_TYPE_MARKERS", (function() { return g })), i.d(t, "STYLE_LINE_TYPE_STEP", (function() { return b })), i.d(t, "STYLE_LINE_TYPE_SIMPLE", (function() { return v })), i.d(t, "STYLE_BARS", (function() { return S })), i.d(t, "STYLE_CANDLES", (function() { return y })), i.d(t, "STYLE_LINE", (function() { return w })), i.d(t, "STYLE_AREA", (function() { return P })), i.d(t, "STYLE_RENKO", (function() { return C })), i.d(t, "STYLE_KAGI", (function() { return x })), i.d(t, "STYLE_PNF", (function() { return T })), i.d(t, "STYLE_PB", (function() { return I })), i.d(t, "STYLE_HEIKEN_ASHI", (function() { return M })), i.d(t, "STYLE_HOLLOW_CANDLES", (function() { return O })), i.d(t, "STYLE_BASELINE", (function() { return L })), i.d(t, "STYLE_RANGE", (function() { return A })), i.d(t, "STYLE_HILO", (function() { return E })), i.d(t, "STYLE_SHORT_NAMES", (function() { return k })), i.d(t, "SYMBOL_STRING_DATA", (function() { return D })); const s = 0, r = 1, n = 2, o = 3, a = 4, l = 5, c = 6, h = 7, u = 8, d = 9, p = 10, _ = 11, m = 12, f = { [s]: "connecting", [r]: "loading", [n]: "loading", [o]: "realtime", [a]: "invalid", [l]: "snapshot", [c]: "endofday", [h]: "endofday", [u]: "delayed", [d]: "delayed_streaming", [p]: "forbidden", [_]: "replay", [m]: "error" }, g = 0, b = 1, v = 2, S = 0, y = 1, w = 2, P = 3, C = 4, x = 5, T = 6, I = 7, M = 8, O = 9, L = 10, A = 11, E = 12, k = { 0: "bar", 1: "candle", 9: "hollowCandle", 2: "line", 3: "area", 4: "renko", 7: "pb", 5: "kagi", 6: "pnf", 8: "ha", 10: "baseline", 11: "range", 12: "hilo" }, D = { 4: { type: "BarSetRenko@tv-prostudies", basicStudyVersion: 40 }, 7: { type: "BarSetPriceBreak@tv-prostudies", basicStudyVersion: 34 }, 5: { type: "BarSetKagi@tv-prostudies", basicStudyVersion: 34 }, 6: { type: "BarSetPnF@tv-prostudies", basicStudyVersion: 34 }, 8: { type: "BarSetHeikenAshi@tv-basicstudies", basicStudyVersion: 60 }, 11: { type: "BarSetRange@tv-basicstudies", basicStudyVersion: 72 } } }, dhFz: function(e, t, i) { "use strict"; function s(e) { return Boolean(e.isNaN) } i.d(t, "a", (function() { return s })) }, di4O: function(e, t, i) { "use strict"; i.r(t), i.d(t, "watermarkProperty", (function() { return h })), i.d(t, "restoreWatermarkPropertyDefaults", (function() { return u })); var s = i("eJTA"), r = i("Vdly"), n = i("tc+8"), o = i.n(n); const a = { visibility: !1, color: "rgba(80, 83, 94, 0.25)" }; function l() { const e = r.getJSON("symbolWatermark"); let t = Object.assign({}, a, e); if (void 0 === e) { if (void 0 !== r.getJSON("chartproperties")) { const e = r.getJSON("chartproperties").symbolWatermarkProperties; if (void 0 !== e) { const i = Object(s.tryParseRgba)(e.color); t = Object.assign(t, e), null !== i && (0 !== i[3] ? t.visibility = !0 : (i[3] = .25, t.color = Object(s.rgbaToString)(i))) } } delete t.transparency } return t } let c = null; function h() { return null === c && (c = new o.a(l()), r.onSync.subscribe(null, () => { null !== c && c.mergeAndFire(l()) }), c.listeners().subscribe(null, () => { null !== c && r.setJSON("symbolWatermark", c.state()) })), c } function u() { null !== c && c.mergeAndFire(a) } }, dmHa: function(e, t) { e.exports = '' }, e1Hy: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("EYFt"); class r extends s.a { constructor(e, t) { super(e, t), this._showStudyValues = t.properties().paneProperties .legendProperties.showStudyValues } getValues(e) { const t = super.getValues(e), i = this._showStudyValues.value(); for (const e of t) e.visible = e.visible && i; return t } } }, e1ZQ: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return p })), i.d(t, "a", (function() { return _ })), i.d(t, "c", (function() { return m })); var s = i("YFKU"), r = i("kcTO"); const n = { 1: () => Object(s.t)("Jan"), 2: () => Object(s.t)("Feb"), 3: () => Object(s.t)("Mar"), 4: () => Object(s.t)("Apr"), 5: () => Object(s.t)("May", { context: "short" }), 6: () => Object(s.t)("Jun"), 7: () => Object(s.t)("Jul"), 8: () => Object(s.t)("Aug"), 9: () => Object(s.t)("Sep"), 10: () => Object(s.t)("Oct"), 11: () => Object(s.t)("Nov"), 12: () => Object(s.t)("Dec") }, o = (e, t) => (t ? e.getMonth() : e.getUTCMonth()) + 1, a = (e, t) => t ? e.getFullYear() : e.getUTCFullYear(), l = (e, t) => Object(r.numberToStringWithLeadingZero)(((e, t) => t ? e.getDate() : e .getUTCDate())(e, t), 2), c = (e, t) => n[o(e, t)](), h = (e, t) => Object(r.numberToStringWithLeadingZero)(o(e, t), 2), u = (e, t) => Object(r.numberToStringWithLeadingZero)(a(e, t) % 100, 2), d = (e, t) => Object(r.numberToStringWithLeadingZero)(a(e, t), 4), p = { "dd MMM 'yy": (e, t) => `${l(e, t)} ${c(e, t)} '${u(e, t)}`, "MMM dd, yyyy": (e, t) => `${c(e, t)} ${l(e, t)}, ${d(e, t)}`, "MMM dd": (e, t) => `${c(e, t)} ${l(e, t)}`, "yyyy-MM-dd": (e, t) => `${d(e, t)}-${h(e, t)}-${l(e, t)}`, "yy-MM-dd": (e, t) => `${u(e, t)}-${h(e, t)}-${l(e, t)}`, "yy/MM/dd": (e, t) => `${u(e, t)}/${h(e, t)}/${l(e, t)}`, "yyyy/MM/dd": (e, t) => `${d(e, t)}/${h(e, t)}/${l(e, t)}`, "dd-MM-yyyy": (e, t) => `${l(e, t)}-${h(e, t)}-${d(e, t)}`, "dd-MM-yy": (e, t) => `${l(e, t)}-${h(e, t)}-${u(e, t)}`, "dd/MM/yy": (e, t) => `${l(e, t)}/${h(e, t)}/${u(e, t)}`, "dd/MM/yyyy": (e, t) => `${l(e, t)}/${h(e, t)}/${d(e, t)}`, "MM/dd/yy": (e, t) => `${h(e, t)}/${l(e, t)}/${u(e, t)}`, "MM/dd/yyyy": (e, t) => `${h(e, t)}/${l(e, t)}/${d(e, t)}` }, _ = Object.keys(p), m = () => -1 !== ["ja", "ko", "zh", "zh_TW"].indexOf(window.language || "") ? "yyyy-MM-dd" : "dd MMM 'yy" }, "e3/o": function(e, t, i) { "use strict"; i.r(t), i.d(t, "guid", (function() { return r })), i.d(t, "randomHash", (function() { return n })), i.d(t, "randomHashN", (function() { return o })); const s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; function r() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, e => { const t = 16 * Math.random() | 0; return ("x" === e ? t : 3 & t | 8).toString(16) }) } function n() { return o(12) } function o(e) { let t = ""; for (let i = 0; i < e; ++i) { const e = Math.floor(Math.random() * s.length); t += s[e] } return t } }, e92V: function(e, t, i) { "use strict"; i.r(t), i.d(t, "isMtpPredictorToolName", (function() { return n })), i.d(t, "isStudyLineToolName", (function() { return o })), i.d(t, "isLineToolName", (function() { return a })), i.d(t, "isLineDrawnWithPressedButton", (function() { return l })), i.d(t, "isLineToolDrawWithoutPoints", (function() { return c })), i.d(t, "isImageToolName", (function() { return h })), i.d(t, "isTextToolName", (function() { return u })); var s = i("OH2X"); const r = new Set([]); function n(e) { return r.has(e) } function o(e) { return "LineToolRegressionTrend" === e || "LineToolVbPFixed" === e || "LineToolFixedRangeVolumeProfile" === e } function a(e) { return e in s || o(e) } function l(e) { return "LineToolBrush" === e || "LineToolHighlighter" === e } function c(e) { return "LineToolTweet" === e } function h(e) { return "LineToolImage" === e } function u(e) { switch (e) { case "LineToolBalloon": case "LineToolText": case "LineToolTextAbsolute": case "LineToolCallout": case "LineToolNote": case "LineToolNoteAbsolute": case "LineToolSignpost": return !0 } return !1 } }, eCE5: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return n })), i.d(t, "a", (function() { return a })); var s = i("Eyy1"), r = i("LxhU"); function n(e, t) { let i = t.multiplier(); if (t.isTicks() && (e.ticks = !0), t.isSeconds() && (i < 60 ? (e.seconds = !0, e .secondsFrom = Math.min(e.secondsFrom, i), e.secondsTo = Math.max(e.secondsTo, i)) : (i /= 60, t = new r.Interval(r.ResolutionKind.Minutes, i))), t .isMinutes()) if (i < 60) e.minutes = !0, e.minutesFrom = Math.min(e.minutesFrom, i), e.minutesTo = Math.max(e.minutesTo, i); else { const t = Math.floor(i / 60); e.hours = !0, e.hoursFrom = Math.min(e.hoursFrom, t), e.hoursTo = Math.max(e .hoursTo, t) } t.isDays() && (e.days = !0, e.daysFrom = Math.min(e.daysFrom, i), e.daysTo = Math.max( e.daysTo, i)), t.isWeeks() && (e.weeks = !0, e.weeksFrom = Math.min(e.weeksFrom, i), e.weeksTo = Math.max(e.weeksTo, i)), t.isMonths() && (e.months = !0, e.monthsFrom = Math.min(e.monthsFrom, i), e.monthsTo = Math.max(e.monthsTo, i)), t.isRange() && (e .ranges = !0) } function o(e, t, i, s) { return e && s >= t && s <= i } function a(e, t) { const i = t.childs(); switch (e.kind()) { case r.ResolutionKind.Ticks: return i.ticks.value(); case r.ResolutionKind.Seconds: if (e.multiplier() < 60) return o(i.seconds.value(), i.secondsFrom.value(), i .secondsTo.value(), e.multiplier()); { const t = Math.floor(e.multiplier() / 60); return o(i.minutes.value(), i.minutesFrom.value(), i.minutesTo.value(), t) } case r.ResolutionKind.Minutes: if (e.multiplier() < 60) return o(i.minutes.value(), i.minutesFrom.value(), i .minutesTo.value(), e.multiplier()); { const t = Math.floor(e.multiplier() / 60); return o(i.hours.value(), i.hoursFrom.value(), i.hoursTo.value(), t) } case r.ResolutionKind.Days: return o(i.days.value(), i.daysFrom.value(), i.daysTo.value(), e .multiplier()); case r.ResolutionKind.Weeks: return o(i.weeks.value(), i.weeksFrom.value(), i.weeksTo.value(), e .multiplier()); case r.ResolutionKind.Months: return o(i.months.value(), i.monthsFrom.value(), i.monthsTo.value(), e .multiplier()); case r.ResolutionKind.Range: return i.ranges.value() } return Object(s.assert)(!1, "Unsupported resolution: " + e.value()), !1 } }, eJTA: function(e, t, i) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }); var s = i("ivNn"); function r(e, t, i) { return s.isNaN(t) || t < e ? e : t > i ? i : Math.round(t) } function n(e, t, i) { return s.isNaN(t) || t < e ? e : t > i ? i : Math.round(1e4 * t) / 1e4 } function o(e) { return r(0, e, 255) } function a(e) { return r(0, e, 255) } function l(e) { return r(0, e, 255) } function c(e) { return n(0, e, 1) } function h(e) { return n(0, e, 1) } function u(e) { return n(0, e, 1) } function d(e) { return n(0, e, 1) } function p(e) { return n(0, e, 1) } function _(e) { return n(0, e, 1) } function m(e) { var t = e[0] / 255, i = e[1] / 255, s = e[2] / 255, r = Math.min(t, i, s), n = Math.max(t, i, s), o = 0, a = 0, l = (r + n) / 2; if (r === n) o = 0, a = 0; else { var c = n - r; switch (a = l > .5 ? c / (2 - n - r) : c / (n + r), n) { case t: o = ((i - s) / c + (i < s ? 6 : 0)) / 6; break; case i: o = ((s - t) / c + 2) / 6; break; case s: o = ((t - i) / c + 4) / 6 } } return [o, a, l] } function f(e, t, i) { return i < 0 && (i += 1), i > 1 && (i -= 1), i < 1 / 6 ? e + 6 * (t - e) * i : i < .5 ? t : i < 2 / 3 ? e + (t - e) * (2 / 3 - i) * 6 : e } function g(e) { var t, i, s, r = e[0], n = e[1], c = e[2]; if (0 === n) t = i = s = c; else { var h = c < .5 ? c * (1 + n) : c + n - c * n, u = 2 * c - h; t = f(u, h, r + 1 / 3), i = f(u, h, r), s = f(u, h, r - 1 / 3) } return [o(255 * t), a(255 * i), l(255 * s)] } t.normalizeRedComponent = o, t.normalizeGreenComponent = a, t.normalizeBlueComponent = l, t .normalizeAlphaComponent = c, t.rgb = function(e, t, i) { return [o(e), a(t), l(i)] }, t.areEqualRgb = function(e, t) { return e[0] === t[0] && e[1] === t[1] && e[2] === t[2] }, t.rgba = function(e, t, i, s) { if (Array.isArray(e)) { var r = e; return s = t, [r[0], r[1], r[2], c(s)] } var n = t; return i = i || 0, s = s || 0, [o(e), a(n), l(i), c(s)] }, t.areEqualRgba = function(e, t) { return e[0] === t[0] && e[1] === t[1] && e[2] === t[2] && e[3] === t[3] }, t.normalizeHue = h, t.normalizeHslSaturation = u, t.normalizeHsvSaturation = d, t .normalizeLightness = p, t.normalizeValue = _, t.hsl = function(e, t, i) { return [h(e), u(t), p(i)] }, t.areEqualHsl = function(e, t) { return e[0] === t[0] && e[1] === t[1] && e[2] === t[2] }, t.hsv = function(e, t, i) { return [h(e), d(t), _(i)] }, t.areEqualHsv = function(e, t) { return e[0] === t[0] && e[1] === t[1] && e[2] === t[2] }, t.rgbToHsl = m, t.hslToRgb = g, t.rgbToHsv = function(e) { var t = e[0], i = e[1], s = e[2], r = t / 255, n = i / 255, o = s / 255, a = Math.min(r, n, o), l = Math.max(r, n, o), c = l - a, h = 0, u = 0 === l ? 0 : c / l, d = l; if (l === a) h = 0; else switch (l) { case t: h = ((n - o) / c + (n < o ? 6 : 0)) / 6; break; case i: h = ((o - r) / c + 2) / 6; break; case s: h = ((r - n) / c + 4) / 6 } return [h, u, d] }, t.hsvToRgb = function(e) { var t = e[0], i = e[1], s = e[2], r = Math.floor(6 * t), n = 6 * t - r, c = s * (1 - i), h = s * (1 - n * i), u = s * (1 - (1 - n) * i), d = 0, p = 0, _ = 0; switch (r % 6) { case 0: d = s, p = u, _ = c; break; case 1: d = h, p = s, _ = c; break; case 2: d = c, p = s, _ = u; break; case 3: d = c, p = h, _ = s; break; case 4: d = u, p = c, _ = s; break; case 5: d = s, p = c, _ = h } return [o(255 * d), a(255 * p), l(255 * _)] }; var b = [.199, .687, .114]; function v(e) { return b[0] * e[0] + b[1] * e[1] + b[2] * e[2] } function S(e, t, i) { void 0 === i && (i = .05); var s = m(e), r = s[0] + t * i; return s[0] = h(r - Math.floor(r)), g(s) } function y(e, t, i) { void 0 === i && (i = .05); var s = e[0], r = e[1], n = e[2], o = e[3], a = S([s, r, n], t, i); return [a[0], a[1], a[2], o] } t.rgbToGrayscale = v, t.distanceRgb = function(e, t) { var i = e[0], s = e[1], r = e[2], n = t[0] - i, o = t[1] - s, a = t[2] - r; return Math.sqrt(n * n + o * o + a * a) }, t.invertRgb = function(e) { return [255 - e[0], 255 - e[1], 255 - e[2]] }, t.darkenRgb = function(e, t) { var i = m(e); return g([i[0], i[1], p(i[2] - t / 100)]) }, t.blendRgba = function(e, t) { var i = e[0], s = e[1], r = e[2], n = e[3], h = t[0], u = t[1], d = t[2], p = t[3], _ = c(1 - (1 - p) * (1 - n)); return [o(h * p / _ + i * n * (1 - p) / _), a(u * p / _ + s * n * (1 - p) / _), l(d * p / _ + r * n * (1 - p) / _), _] }, t.shiftRgb = S, t.shiftRgba = y, t.shiftColor = function(e, t, i) { return void 0 === i && (i = .05), E(y(V(e), t, i)) }; var w, P, C, x, T = { aliceblue: "#f0f8ff", antiquewhite: "#faebd7", aqua: "#00ffff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000000", blanchedalmond: "#ffebcd", blue: "#0000ff", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#00ffff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", feldspar: "#d19275", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#ff00ff", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgreen: "#90ee90", lightgrey: "#d3d3d3", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslateblue: "#8470ff", lightslategray: "#778899", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#00ff00", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#ff00ff", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370d8", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#d87093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#ff0000", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", violetred: "#d02090", wheat: "#f5deb3", white: "#ffffff", whitesmoke: "#f5f5f5", yellow: "#ffff00", yellowgreen: "#9acd32" }; function I(e, t) { return t in e } function M(e) { var t = w.re.exec(e); return null !== t ? w.parse(t) : null } function O(e) { var t = P.re.exec(e); return null !== t ? P.parse(t) : null } function L(e) { var t = C.re.exec(e); return null !== t ? C.parse(t) : null } function A(e) { var t = x.re.exec(e); return null !== t ? x.parse(t) : null } function E(e) { return "rgba(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ")" } function k(e) { if (e = e.toLowerCase(), I(T, e)) { var t = O(T[e]); if (null !== t) return t; throw new Error("Invalid named color definition") } var i = M(e); if (null !== i) return i; var s = O(e); if (null !== s) return s; var r = L(e); if (null !== r) return r; var n = A(e); return null !== n ? [n[0], n[1], n[2]] : null } function D(e) { if (e = e.toLowerCase(), I(T, e)) { var t = O(T[e]); if (null !== t) return [t[0], t[1], t[2], 1]; throw new Error("Invalid named color definition") } var i = M(e); if (null !== i) return [i[0], i[1], i[2], 1]; var s = O(e); if (null !== s) return [s[0], s[1], s[2], 1]; var r = L(e); if (null !== r) return [r[0], r[1], r[2], 1]; var n = A(e); return null !== n ? n : null } function V(e) { var t = D(e); if (null !== t) return t; throw new Error("Passed color string does not match any of the known color representations") }! function(e) { e.re = /^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/, e.parse = function(e) { return [o(parseInt(e[1], 10)), a(parseInt(e[2], 10)), l(parseInt(e[3], 10))] } }(w || (w = {})), t.rgbToString = function(e) { return "rgb(" + e[0] + ", " + e[1] + ", " + e[2] + ")" }, function(e) { e.re = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, e.parse = function(e) { return [o(parseInt(e[1], 16)), a(parseInt(e[2], 16)), l(parseInt(e[3], 16))] } }(P || (P = {})), t.rgbToHexString = function(e) { var t = e[0], i = e[1], s = e[2], r = t.toString(16), n = i.toString(16), o = s.toString(16); return "#" + (1 === r.length ? "0" : "") + r + (1 === n.length ? "0" : "") + n + (1 === o.length ? "0" : "") + o }, function(e) { e.re = /^#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$/, e.parse = function(e) { return [o(parseInt(e[1] + e[1], 16)), a(parseInt(e[2] + e[2], 16)), l(parseInt( e[3] + e[3], 16))] } }(C || (C = {})), function(e) { e.re = /^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/, e.parse = function(e) { return [o(parseInt(e[1], 10)), a(parseInt(e[2], 10)), l(parseInt(e[3], 10)), c( parseFloat(e[4]))] } }(x || (x = {})), t.rgbaToString = E, t.rgbToBlackWhiteString = function(e, t) { if (t < 0 || t > 255) throw new Error( "invalid threshold value, valid values are [0, 255]"); return v(e) >= t ? "white" : "black" }, t.tryParseRgb = k, t.parseRgb = function(e) { var t = k(e); if (null !== t) return t; throw new Error( "Passed color string does not match any of the known color representations") }, t.tryParseRgba = D, t.parseRgba = V }, eqEH: function(e, t, i) { "use strict"; i.r(t), i.d(t, "registerService", (function() { return o })), i.d(t, "unregisterService", (function() { return a })), i.d(t, "hasService", (function() { return l })), i.d(t, "service", (function() { return c })), i.d(t, "waitServiceRegistered", (function() { return h })); var s = i("jofe"); const r = {}, n = new Map; function o(e, t) { if (l(e)) throw new Error("Service already registered"); r[e.id] = t; const i = n.get(e.id); void 0 !== i && (n.delete(e.id), i.resolve(t)) } function a(e) { if (!l(e)) throw new Error("Service not found"); r[e.id] = void 0 } function l(e) { return void 0 !== r[e.id] } function c(e) { const t = r[e.id]; if (void 0 === t) throw new Error("ServiceLocator: Service " + e.id + " not found"); return t } function h(e) { if (l(e)) return Promise.resolve(c(e)); let t = n.get(e.id); return void 0 === t && (t = Object(s.createDeferredPromise)(), n.set(e.id, t)), t.promise } }, f6yo: function(e, t, i) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.pointInCircle = t.pointInPolygon = t.pointInBox = t.pointInTriangle = t .pointInHalfplane = void 0; var s = i("hBTJ"); t.pointInHalfplane = function(e, t) { var i = t.edge; return i.A * e.x + i.B * e.y + i.C > 0 === t.isPositive }, t.pointInTriangle = function(e, t, i, r) { var n = t.add(i).scaled(.5).add(r).scaled(.5), o = s.intersectLineSegments(t, i, n, e); return null === o && (null === (o = s.intersectLineSegments(i, r, n, e)) && null === ( o = s.intersectLineSegments(r, t, n, e))) }, t.pointInBox = function(e, t) { return e.x >= t.min.x && e.x <= t.max.x && e.y >= t.min.y && e.y <= t.max.y }, t.pointInPolygon = function(e, t) { for (var i = t.length - 1, s = !1, r = e.x, n = e.y, o = 0; o < t.length; o++) { var a = t[o], l = t[i]; (a.y < n && l.y >= n || l.y < n && a.y >= n) && a.x + (n - a.y) / (l.y - a.y) * (l .x - a.x) < r && (s = !s), i = o } return s }, t.pointInCircle = function(e, t, i) { return (e.x - t.x) * (e.x - t.x) + (e.y - t.y) * (e.y - t.y) <= i * i } }, fFKx: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return o })), i.d(t, "a", (function() { return a })); var s = i("Eyy1"), r = i("tqok"), n = i("hsV8"); function o(e, t) { if (e.startIndex >= t.length || e.endIndex >= t.length) return null; const i = t[e.startIndex], n = t[e.endIndex]; return i === r.INVALID_TIME_POINT_INDEX || n === r.INVALID_TIME_POINT_INDEX ? null : ( Object(s.assert)(i <= n, "startIndex should not exceed endIndex"), { startIndex: i, endIndex: n, level: e.level, extendLeft: e.extendLeft, extendRight: e.extendRight }) } function a(e, t, i) { const s = Object(n.ensureTimePointIndexIndex)(i.indexOf(e.startIndex)), r = Object(n.ensureTimePointIndexIndex)(i.indexOf(e.endIndex)); return { id: t, ...e, startIndex: s, endIndex: r } } }, fJhV: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineDataSourceTimeAxisView", (function() { return n })); var s = i("cgFQ"), r = i("Ulff"); class n extends s.a { constructor(e, t) { super(e.model()), this._active = !1, this._source = e, this._pointIndex = t } setActive(e) { this._active = e } _getBgColor() { return this._active ? r.a.active : r.a.common } _getIndex() { if (!this._model.selection().isSelected(this._source)) return null; const e = this._source.timeAxisPoints(); return e.length <= this._pointIndex ? null : e[this._pointIndex].index } } }, fPdn: function(e, t, i) { "use strict"; window.TradingView = window.TradingView || {}, window.requireAll = function(e) { return e.keys().map(e) }, i("6jKD"), i("bZMm"), i("YFKU"), i("8+VR").setClasses(), i("jjqu"), i("w9cH").install(), i("qFKp"), i("ogJP"), i("jFln"), i("HbRj"), i("VVxS"), i("CLNU"), i("mZrn"), i("Vdly"), i( "+GxX") }, fRER: function(e, t, i) { "use strict"; i.r(t), i.d(t, "DropdownApi", (function() { return s })); class s { constructor(e, t) { this._headerToolbar = e, this._dropdownId = t } applyOptions(e) { this._headerToolbar.updateDropdown(this._dropdownId, e) } remove() { this._headerToolbar.removeDropdown(this._dropdownId) } } }, fTGZ: function(e, t, i) { "use strict"; (function(e, s, r) { var n = i("Eyy1").ensureNotNull, o = i("Ss5c").LineDataSource, a = i("ogJP").isNumber, l = i("BOPY").BarsMarksContainerPaneView, c = i("BOPY").BarsMarksContainerRenderer, h = i("Bt3k").TooltipRenderer, u = i("LxhU").Interval, d = i("n5al").isPriceSourceStyle, p = i("txPx").getLogger("Chart.BarsMarksContainer"); class _ extends o { constructor(t, i) { var a = t._undoModel._chartWidget, l = a.onWidget(), c = !1; c = l ? a._options && !a._options.hideIdeas : !!e.enabled("bars_marks") && TVSettings.getBool("BarsMarksContainer.visibile", !1), i ? i.merge({ visible: c, frozen: !1 }) : i = new s({ visible: c, frozen: !1 }), i.visible.listeners().subscribe(null, (function(t) { l || a._containsData || !e.enabled("bars_marks") || TVSettings.setValue("BarsMarksContainer.visibile", !!t .value()), u._tooltip && u._tooltip.removeAll() })), o._configureProperties(i), super(t, i); var u = this; this.onNeedRepaint = new r, this._requests = [], this._marks = {}, this ._loadedRange = null, this._getDataTimeout = null, this ._collectedRange = null, this._model.mainSeries() .onSymbolIntervalChanged().subscribe(this, this.clearMarks), this._model .mainSeries().dataEvents().symbolResolved().subscribe(this, this .clearMarks), this._model.mainSeries().dataEvents().completed() .subscribe(this, (function() { var e = this._model.mainSeries().data(); if (0 !== e.size()) { var t = n(e.first()).index, i = n(e.last()).index, s = this.timeScale(); this.getData({ start: s.indexToTimePoint(t), end: s.indexToTimePoint(i) }) } })), this._initialize(), this.pinnedTooltips = {}, this._tooltip = new h(this._createTooltip.bind(this), this) } _initialize(e) { throw new Error("Child class must override this member") } onClicked() { throw new Error("Child class must override this member") } _getData(e) { throw new Error("Child class must override this member") } _createTooltip() { throw new Error("Child class must override this member") } updateDotData(e, t) { return t } updatePlateData(e, t) {} isAvailableInFloatingWidget() { return !1 } _plateViewData(e) { return {} } pinTooltip(e, t) { this.pinnedTooltips[e] = t } timeScale() { return this._model.timeScale() } getIntervalInTicks() { var e = this._model.mainSeries().properties().interval.value(), t = u.parse(e); if (!t.isValid()) throw new TypeError("Unexpected interval"); return t.isRange() ? 60 : t.inMilliseconds() / 1e3 } getVisibleTickMarksRange() { if (this.timeScale().isEmpty()) return { start: 0, end: 0 }; var e, t = this.timeScale().visibleBarsStrictRange(); return t.lastBar() > this.timeScale().points().firstIndex() && t .firstBar() < this.timeScale().points().lastIndex() ? (e = t.lastBar() < this.timeScale().points().lastIndex() ? this.timeScale() .indexToTimePoint(t.lastBar()) : this._maxDate, { start: (t = { start: this.timeScale().indexToTimePoint(Math.max(t .firstBar(), this.timeScale().points() .firstIndex())), end: e }).start ? t.start : void 0, end: t.end ? t.end : void 0 }) : { start: 0, end: 0 } } getVisibleRangePlates() { var e = [], t = this.getVisibleTickMarksRange(), i = this.getIntervalInTicks(); return Object.keys(this._marks).forEach((function(s) { var r = this._marks[s], n = r.tickmark; n >= t.start && n <= t.end + i && e.push(r) }), this), e } getPublishedPlates() { var e = {}, t = this; return is_authenticated ? (this.getVisibleRangePlates().forEach((function( i) { i.is_public && (t.pinnedTooltips[i.id] || i.user__id === user.id) && (e[i.id] = i) })), e) : e } filterDisplayedPlates(e) { return e = e.reduce(function(e, t) { var i = this._getIndex(t.tickmark); return e[i] = e[i] || [], e[i].push(t), e }.bind(this), {}), e = Object.keys(e).reduce(function(t, i) { var s = e[i]; return s = (s = s.sort((function(e, t) { return t.views_count - e.views_count }))).slice(0, this._maxPlatesPerBar), t.concat(s) }.bind(this), []) } _layout(e) { switch (e) { default: case 0: return "up"; case 1: return "down"; case 2: return "up"; case 3: case 4: case 5: case 6: return "up" } } _theme(e) { switch (e) { default: case 0: return "neutral"; case 1: return "green"; case 2: return "red"; case 3: return "yellow"; case 4: return "blue"; case 5: return "green"; case 6: return "red" } } _offset(e, t, i) { var s; switch (e) { default: case "up": s = null === i ? t[TradingView.HIGH_PLOT] : i(t); break; case "down": s = null === i ? t[TradingView.LOW_PLOT] : i(t) } return this.priceScale().priceToCoordinate(s, this.ownerSource() .firstValue()) } _getIndex(e) { return this.timeScale().timePointToIndex(e) } getViewData() { return { barWidth: this.barWidth(), plates: this.getPlatesViewData(), tooltip: this._tooltip } } barWidth() { return this.timeScale().barSpacing() } getPlatesViewData() { var e = this._model.mainSeries(); if (e.data().isEmpty()) return []; for (var t = d(e.style()) ? e.barFunction() : null, i = this .filterDisplayedPlates(this.getVisibleRangePlates()), s = this, r = {}, n = this._model.lastHittestData(), o = (i = (i = i.map( function(e) { var i = this._getIndex(e.tickmark), o = this._getBar(i); if (null === o) return !1; var a, l = this._layout(e.direction), c = this._theme(e.direction), h = null !== n && n.id === e.id, u = this.timeScale().indexToCoordinate(i), d = this._offset(l, o, t), p = this.priceScale().isInverted(); return i in r || (r[i] = { up: 0, down: 0 }), a = r[i][l]++, TradingView.merge({ id: e.id, x: u, y: d, yInverted: p, order: a, direction: l, theme: c, hovered: h, pinned: !0 === s.pinnedTooltips[e.id], user__id: e.user__id, label: e.label, labelFontColor: e.labelFontColor || "#444", minSize: e.minSize || 5 }, this._plateViewData(e)) }.bind(this))).filter((function(e) { return !!e }))).filter((function(e) { return !0 === e.hovered })), a = 0; a < i.length; a++) null != o[0] && i[a].user__id === o[ 0].user__id && (i[a].highlightByAuthor = !0); return i.sort((function(e, t) { return e.hovered && !t.hovered ? 1 : 0 })), i } _getBar(e) { return this._model.mainSeries().data().valueAt(e) } paneViews() { var e = this; return this._properties.visible.value() ? [new l(this, (function(t) { return new c(t.getViewData(), e) }))] : [] } dataWindowView() { return null } priceAxisViews() { return null } statusView() { return null } updateAllViews() {} pointsCount() { return 0 } properties() { return this._properties } _rangeDifference(e) { return e = Object.assign({}, e), this._loadedRange && (e.start < this ._loadedRange.start ? e.end = this._loadedRange.start : e.end > this ._loadedRange.end && (e.start = this._loadedRange.end)), e } _rangeUnion(e, t) { return e = Object.assign({}, e), t && (e.start = Math.min(t.start, e.start), e.end = Math.max(t.end, e.end)), e } _pushGetDataStack(e) { a(e.start) && a(e.end) ? (this._getDataTimeout && clearTimeout(this ._getDataTimeout), this._collectedRange = this._rangeUnion(e, this._collectedRange), this._getDataTimeout = setTimeout( function() { this._getData(this._collectedRange), this._getDataTimeout = this._collectedRange = null }.bind(this), 300)) : p.logError("Wrong tickmark range") } roundRange(e) { return { start: Math.round(e.start), end: Math.round(e.end) } } refreshData() { this.getData(this._lastRange) } getData(e) { a(e.start) && a(e.end) ? (this._lastRange = e, (e = Object.assign({}, e)) .end = this._maxDate, this._pushGetDataStack(e)) : p.logError( "Wrong range") } _abortAllRequests() { this._requests.forEach((function(e) { e.abort() })), this._requests = [], this._getDataTimeout && clearTimeout(this ._getDataTimeout), this._getDataTimeout = this._collectedRange = null } clearMarks() { this._abortAllRequests(), this._marks = {}, this._loadedRange = null } } _.prototype._maxDate = Math.round(new Date(2037, 0, 1).getTime() / 1e3), _.prototype ._maxPlatesPerBar = 10, t.BarsMarksContainer = _ }).call(this, i("Kxc7"), i("tc+8"), i("aIyQ")) }, fZEr: function(e, t, i) { "use strict"; async function s(e, t) { const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i .e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog") ]).then(i.bind(null, "EcUf")); return s.showSimpleDialog(e, s.renameModule, t) } async function r(e, t) { const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i .e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog") ]).then(i.bind(null, "EcUf")); return s.showSimpleDialog(e, s.confirmModule, t) } async function n(e, t) { const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i .e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog") ]).then(i.bind(null, "EcUf")); return s.showSimpleDialog(e, s.warningModule, t) } i.r(t), i.d(t, "showRename", (function() { return s })), i.d(t, "showConfirm", (function() { return r })), i.d(t, "showWarning", (function() { return n })) }, fgLi: function(e, t, i) { "use strict"; i.r(t), i.d(t, "DataSource", (function() { return l })); var s = i("hY0g"), r = i.n(s), n = i("e3/o"), o = i("aIyQ"), a = i.n(o); class l { constructor() { this.hasAlert = new r.a(!1), this._zorder = 0, this.m_priceScale = null, this._id = Object(n.randomHashN)(6), this._ownerSource = null, this._userEditEnabled = !0, this._onPriceScaleChanged = new a.a, this._isSelectionEnabled = !0, this ._ownerSourceChanged = new a.a, this._zOrderChanged = new a.a } id() { return this._id } preferNoScale() { return !1 } idForAlert() { return this._id } setId(e) { this._id = e } zorder() { return this._zorder } setZorder(e) { "number" == typeof e && this._zorder !== e && (this._zorder = e, this._zOrderChanged .fire(e)) } isSpeciallyZOrderedSource() { return !1 } title() { throw new Error("Implement this fun in a subclass") } priceScale() { return this.m_priceScale } setPriceScale(e) { this.m_priceScale = e, this._onPriceScaleChanged.fire() } ownerSource() { return this._ownerSource } setOwnerSource(e) { this._ownerSource = e, this._ownerSourceChanged.fire() } ownerSourceChanged() { return this._ownerSourceChanged } zOrderChanged() { return this._zOrderChanged } isSavedInChart(e) { return !0 } isSavedInStudyTemplates() { return !0 } isRemovedByStudyTemplates() { return !0 } hasContextMenu() { return !0 } showInObjectTree() { return !0 } setUserEditEnabled(e) { this._userEditEnabled = e } userEditEnabled() { return this._userEditEnabled } canBeHidden() { return this.userEditEnabled() } isUserDeletable() { return this.userEditEnabled() } canHasAlert() { return !1 } properties() { throw new Error("Implement this fun in a subclass") } isVisible() { return this.properties().visible.value() } statusView() { return null } dataWindowView() { return null } legendView() { return null } marketStatusModel() { return null } dataUpdatedModeModel() { return null } dataProblemModel() { return null } priceAxisViews(e, t) { return null } timeAxisViews() { return null } updateAllViews() {} paneViews() { return null } labelPaneViews() { return null } isFailed() { return !1 } isLoading() { return !1 } isPhantom() { return !1 } isChildStudy() { return !1 } hasChildren() { return !1 } canHaveChildren() { return !1 } onClickOutside() {} getSourceIcon() { return null } state(e) { throw new Error("Implement this fun in a subclass") } onPriceScaleChanged() { return this._onPriceScaleChanged } doesMovingAffectsUndo() { return !0 } isMultiPaneAvailable() { return !1 } isMultiPaneEnabled() { return !1 } copiable() { return !1 } cloneable() { return !1 } movable() { return !1 } isIncludedInAutoScale() { return !1 } isHoveredEnabled() { return this.isSelectionEnabled() } isSelectionEnabled() { return this._isSelectionEnabled } setSelectionEnabled(e) { this._isSelectionEnabled = e } firstValue() { return null } priceRange(e, t) { return null } autoScaleInfo(e, t) { return { range: this.priceRange(e, t) } } } }, fs3R: function(e, t) { e.exports = '' }, g5Qf: function(e, t, i) { "use strict"; i.r(t), i.d(t, "getFavoriteDrawingToolbarPromise", (function() { return o })), i.d(t, "createFavoriteDrawingToolbar", (function() { return a })); i("YFKU"); var s = i("yMne"); let r = null, n = null; function o() { return n } function a() { null === n && (n = Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e( 13), i.e(14), i.e(17), i.e(21), i.e(22), i.e(24), i.e(28), i.e(33), i.e( 41), i.e(48), i.e(51), i.e(52), i.e(60), i.e(67), i.e(75), i.e(0), i.e( 5), i.e(30), i.e(38), i.e("line-tools-icons"), i.e(53), i.e(54), i.e( "floating-toolbars")]).then(i.bind(null, "gmn6")).then(({ FavoriteDrawingToolbar: e }) => (r = null !== r ? r : new e({ left: window.innerWidth / 2, top: s.b + 61 }), r))) } }, gASG: function(e, t, i) { "use strict"; i.r(t); var s = i("Ocx9"), r = i("Ss5c"), n = i("tc+8"), o = i.n(n), a = i("+FzY"), l = i("aIyQ"), c = i.n(l); class h { constructor(e) { this._image = null, this._currentImageURL = null, this._imageReady = !1, this ._ready = new c.a, this._source = e, this.updateImage() } updateImage() { const e = this.imageURL(); this._currentImageURL !== e && (this._currentImageURL = e, this._image = null, this ._imageReady = !1, null !== this._currentImageURL && (this._image = new Image, this._image.onload = () => { this._imageReady = !0, this._ready.fire() }, this._image.crossOrigin = "anonymous", this._image.src = this ._currentImageURL)) } itemIndex() { return 1 } labelIndex() { return 0 } image() { return this._imageReady && this.showPlate() ? this._image : null } showPlate() { return this._props().childs().showImage.value() } backgroundPlateColor(e) { return this._props().childs().plateColor.value() } ready() { return this._ready } type() { return this._props().childs().itemType.value() } category() { return 1 } index() { const e = this._source.points(); return 0 === e.length ? null : e[0].index } imageURL() { const e = this._props().childs().emoji.value(); return Object(a.a)(e, "png") || null } sourceImage() { return null } additionalImageURL() { return null } additionalImageSource() { return null } name() { return "" } headline() { return this._props().childs().text.value() } text() { return "" } fullTextAst() { return null } position() { return this._props().childs().position.value() } fontSize() { return this._props().childs().fontSize.value() } fontBold() { return this._props().childs().bold.value() } fontItalic() { return this._props().childs().italic.value() } sourceLabel() { return null } _props() { return this._source.properties() } } class u extends o.a { constructor(e) { super(), this._source = e, e.pointAdded().subscribe(this, () => this.listeners() .fire(this)), e.pointChanged().subscribe(this, () => this.listeners() .fire(this)) } value() { const e = this._source.properties().childs().position.value(); return parseFloat(e.toFixed(2)) } setValue(e) { this._source.properties().childs().position.setValue(e), this._source.model() .updateSource(this._source), this.listeners().fire(this), this._source .syncMultichartState({ pricesChanged: !1, indexesChanged: !1 }) } } var d = i("j8de"); class p extends d.a { constructor(e, t) { super(e, t), this._source = e } _setPointImpl(e) { this._source.setPointAndChangeIndex(this._pointIndex, e) } } var _ = i("j3hX"), m = i("Eyy1"), f = i("jvrd"), g = i("mMWL"); class b extends r.LineDataSource { constructor() { super(...arguments), this._startMovingAnchorY = NaN } priceSource() { return this.ownerSource() } addPoint(e, t, i) { return super.addPoint(this._updatePositionAndCorrectPoint(e), t, i) } setPoint(e, t, i) { super.setPoint(e, this._updatePositionAndCorrectPoint(t, !this.isPhantom() && ! this._allowChangeAnchorHorizontally()), i), this._syncPosition() } setPointAndChangeIndex(e, t, i) { super.setPoint(e, this._updatePositionAndCorrectPoint(t, !1), i), this ._syncPosition() } startMoving(e, t, i, s) { s || (this._startMovingAnchorY = Object(m.ensureNotNull)(this ._anchorYCoordinate())), super.startMoving(e, t, i) } move(e, t, i, s) { var r; const n = Object(m.ensureDefined)(Object(m.ensureNotNull)(this .startMovingPoint()).logical), o = Object(m.ensureDefined)(e.logical); if (!s && 0 === t) { const e = this._points[0], t = o.index - n.index, i = Object(m.ensureNotNull)(this.priceScale()), s = Object(m.ensure)(null === (r = this.ownerSource()) || void 0 === r ? void 0 : r.firstValue()), a = i.priceToCoordinate(o.price, s) - i.priceToCoordinate(n.price, s), l = this._startMovingAnchorY + a, c = i.coordinateToPrice(l, s); this._updatePositionAndCorrectPoint({ index: e.index + t, price: c }) } super.move(e, t, i), s || this._syncPosition() } _allowChangeAnchorHorizontally() { return !1 } _updatePositionAndCorrectPoint(e, t) { t && (e.index = this._points[0].index); const i = this.priceSource(); if (null === i) return e; const s = i.priceScale(), r = i.firstValue(); if (null === s || s.isEmpty() || null === r) return e; const n = s.height(); let o = n / 2, a = e.price >= s.coordinateToPrice(o, r) ? 1 : -1; const l = this._model.mainSeries(); if (i === l) { const t = l.data().search(this._baseSeriesIndexForPoint(e)); if (null !== t) { const i = Object(f.g)(l, t, -1), n = Object(f.g)(l, t, 1); a = e.price >= i ? 1 : -1, o = s.priceToCoordinate(1 === a ? n : i, r), e.price = 1 === a ? Math.max(n, e.price) : e.price } } const c = 1 === (-1 === a !== s.isInverted() ? -1 : 1) ? o : n - o, h = s.priceToCoordinate(e.price, r), u = Math.min(n, Math.abs(h - o)), d = Math.max(0, Math.min(100, 100 * u / c)) * a; return this.properties().childs().position.setValue(d), e } _baseSeriesIndexForPoint(e) { return e.index } _syncPosition() { const e = this.linkKey().value(); if (null !== e) { const t = { position: this.properties().childs().position.value() }; Object(g.changeLineStyle)({ linkKey: e, state: t, model: this._model }) } } _anchorYCoordinate() { const e = this.priceSource(); if (null === e) return null; const t = e.priceScale(), i = e.firstValue(); if (null === t || t.isEmpty() || null === i) return null; const s = this._model.mainSeries(), r = this.customEvent(); if (null === r) return null; let n = null; if (e === s && (n = Object(f.f)(s, r)), null === n && (n = Object(f.c)(r, t, i)), null === n) return null; const o = r.position(), a = t.priceToCoordinate(n.price, i); return Object(f.d)(o, t.height(), a, Object(f.e)(o, t.isInverted())) } } i.d(t, "LineToolSignpost", (function() { return v })); class v extends b { constructor(e, t) { const s = t || v.createProperties(); super(e, s), this._item = new h(this), this.properties().childs().emoji.subscribe( this, () => this._item.updateImage()), this._item.ready().subscribe(this, () => this._model.updateSource(this)), i.e("lt-pane-views").then(i.bind( null, "KFbh")).then(t => { this._setPaneViews([new t.SignpostPaneView(this, e)]) }) } isItemHovered(e) { return !1 } isItemSelected(e) { return !1 } isHidden(e) { return !1 } items() { return [this.customEvent()] } priceSource() { return this.ownerSource() } pointsCount() { return 1 } properties() { return super.properties() } name() { return "Signpost" } customEvent() { return this._item } showInObjectTree() { return !this.isPhantom() && super.showInObjectTree() } isPhantom() { return this._model.isPhantomLine(this) } clonePositionOffset() { return { barOffset: 1, xCoordOffset: 0, yCoordOffset: 0 } } template() { const e = super.template(), t = this.properties().childs(); return e.text = t.text.value(), e.position = t.position.value(), e } static createProperties(e) { const t = new s.DefaultProperty("linetoolsignpost", e); return v._configureProperties(t), t.hasChild("text") || t.addChild("text", new o.a( window.t("Text"))), t.hasChild("position") || t.addChild("position", new o .a(50)), t.addExclusion("text"), t.addExclusion("position"), t.addChild( "backgroundsColors", new _.LineToolColorsProperty([t.childs().plateColor])), t } _createPointProperty(e) { super._createPointProperty(e); const t = this._pointsProperty.childs().points[e]; t.removeProperty("price"), t.removeProperty("bar"), t.addChild("price", new u( this)), t.addChild("bar", new p(this, 0)) } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text), this.properties().childs().position.setValue(e.position) } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e("lt-property-pages-with-definitions")]) .then(i.bind(null, "zb1A")).then(e => e.SignpostDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e) } } v.supportPhantomMode = !0 }, gAom: function(e, t, i) { "use strict"; i.r(t), i.d(t, "clearRectWithGradient", (function() { return o })), i.d(t, "fillRectInnerBorder", (function() { return a })), i.d(t, "drawHorizontalLine", (function() { return l })), i.d(t, "drawVerticalLine", (function() { return c })), i.d(t, "drawRoundRect", (function() { return u })), i.d(t, "drawRoundRectWithInnerBorder", (function() { return d })), i.d(t, "fillRectWithBorder", (function() { return p })), i.d(t, "createCircle", (function() { return _ })); var s = i("aO4+"), r = i("jFln"), n = i("972a"); function o(e, t, i, s, r, n, o) { e.save(), e.globalCompositeOperation = "copy"; const a = e.createLinearGradient(0, 0, 0, r); a.addColorStop(0, n), a.addColorStop(1, o), e.fillStyle = a, e.fillRect(t, i, s, r), e .restore() } function a(e, t, i, s, r, n) { e.fillRect(t + n, i, s - 2 * n, n), e.fillRect(t + n, i + r - n, s - 2 * n, n), e.fillRect( t, i, n, r), e.fillRect(t + s - n, i, n, r) } function l(e, t, i, s) { e.beginPath(); const r = e.lineWidth % 2 ? .5 : 0; e.moveTo(i, t + r), e.lineTo(s, t + r), e.stroke() } function c(e, t, i, s) { e.beginPath(); const r = e.lineWidth % 2 ? .5 : 0; e.moveTo(t + r, i), e.lineTo(t + r, s), e.stroke() } function h(e, t) { return Array.isArray(e) ? e.map(e => 0 === e ? e : e + t) : e + t } function u(e, t, i, s, r, n, o) { let a, l, c, h; if (Array.isArray(n)) if (2 === n.length) { const e = Math.max(0, n[0]), t = Math.max(0, n[1]); a = e, l = e, c = t, h = t } else { if (4 !== n.length) throw new Error( "Wrong border radius - it should be like css border radius"); a = Math.max(0, n[0]), l = Math.max(0, n[1]), c = Math.max(0, n[2]), h = Math.max(0, n[3]) } else { const e = Math.max(0, n); a = e, l = e, c = e, h = e } o || e.beginPath(), e.moveTo(t + a, i), e.lineTo(t + s - l, i), 0 !== l && e.arcTo(t + s, i, t + s, i + l, l), e.lineTo(t + s, i + r - c), 0 !== c && e.arcTo(t + s, i + r, t + s - c, i + r, c), e.lineTo(t + h, i + r), 0 !== h && e.arcTo(t, i + r, t, i + r - h, h), e.lineTo(t, i + a), 0 !== a && e.arcTo(t, i, t + a, i, a) } function d(e, t, i, s, o, a, l = 0, c = 0, d = "", p = n.b.Solid) { if (e.save(), !c || !d || d === a) return u(e, t, i, s, o, l), e.fillStyle = a, e.fill(), void e.restore(); const _ = c / 2; if ("transparent" !== a) { const r = "transparent" !== d && p !== n.b.Solid; u(e, r ? t : t + c, r ? i : i + c, r ? s : s - 2 * c, r ? o : o - 2 * c, r ? l : h(l, - c)), e.fillStyle = a, e.fill() } if ("transparent" !== d) { u(e, t + _, i + _, s - c, o - c, h(l, -_)), e.lineWidth = c, e.strokeStyle = d, Object(r .setLineStyle)(e, p), e.closePath(), e.stroke() } e.restore() } function p(e, t, i, n, o, a, l, c, h, u, d, p, _, m, f) { const g = u ? 0 : t, b = d ? _ : n; if (void 0 !== a && (e.fillStyle = a, e.fillRect(g, i, b - g + m, o - i)), void 0 !== l && c > 0) { if (e.beginPath(), Object(r.setLineStyle)(e, h), void 0 !== f) { const t = f.map(e => e * c); Object(r.setLineDash)(e, t) } let a = Object(s.point)(0, 0), u = Object(s.point)(0, 0), d = Object(s.point)(0, 0), _ = Object(s.point)(0, 0); switch (p) { case "outer": { const e = .5 * c; d = Object(s.point)(0, e), _ = Object(s.point)(0, e), a = Object(s.point)(e, - c), u = Object(s.point)(e, -c); break } case "center": { const e = c % 2 ? .5 : 0, t = c % 2 ? .5 : m; d = Object(s.point)(.5 * c - e, -e), _ = Object(s.point)(t + .5 * c, -e), a = Object(s.point)(-e, e + .5 * c), u = Object(s.point)(t, e + .5 * c); break } case "inner": { const e = .5 * c; d = Object(s.point)(0, -e), _ = Object(s.point)(1, -e), a = Object(s.point)(-e, c), u = Object(s.point)(1 - e, c); break } } e.lineWidth = c, e.strokeStyle = l, e.moveTo(g - d.x, i - d.y), e.lineTo(b + _.x, i - _ .y), e.moveTo(n + u.x, i + u.y), e.lineTo(n + u.x, o - u.y), e.moveTo(g - d.x, o + d.y), e.lineTo(b + _.x, o + _.y), e.moveTo(t - a.x, i + a.y), e.lineTo(t - a .x, o - a.y), e.stroke() } } function _(e, t, i, s) { e.beginPath(), e.arc(t, i, s, 0, 2 * Math.PI, !1), e.closePath() } }, gLxC: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("tc+8"), n = i("Ocx9").DefaultProperty; class o extends s { constructor(e, t) { super(e, t || o.createProperties()), this.version = o.version, i.e("lt-pane-views") .then(i.bind(null, "Dz+H")).then(({ NotePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 1 } name() { return "Note" } getTooltipWidth() { return o.TOOLTIP_WIDTH } getTooltipPadding() { return o.TOOLTIP_PADDING } getTooltipLineSpacing() { return o.TOOLTIP_LINESPACING } template() { var e = s.prototype.template.call(this); return e.text = this.properties().childs().text.value(), e } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } static createProperties(e) { void 0 !== e && void 0 !== e.markerColor && void 0 === e.borderColor && (e .borderColor = e.markerColor); var t = new n("linetoolnote", e); return o._configureProperties(t), t } state(e) { var t = s.prototype.state.call(this, e); return e && (t.state.fixedSize = !1), t } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "74nv"))) .NoteDefinitionsViewModel } static _configureProperties(e) { s._configureProperties(e), e.hasChild("text") || e.addChild("text", new r(window.t( "Text"))), e.addExclusion("text") } } o.TOOLTIP_WIDTH = 300, o.TOOLTIP_PADDING = 10, o.TOOLTIP_LINESPACING = 5, o.version = 1; class a extends o { constructor(e, t) { super(e, t || a.createProperties()) } title() { return window.t("Anchored Note") } name() { return "Anchored Note" } isFixed() { return !0 } hasEditableCoordinates() { return !1 } static createProperties(e) { var t = new n("linetoolnoteabsolute", e); return a._configureProperties(t), t } static _configureProperties(e) { o._configureProperties(e) } } t.LineToolNote = o, t.LineToolNoteAbsolute = a }, gMtF: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolRiskRewardPriceAxisView", (function() { return r })); var s = i("KcY8"); class r extends s.a { constructor(e, t) { super(), this._source = e, this._data = t } _updateRendererData(e, t, i) { if (e.visible = !1, !this._showAxisLabel()) return; const s = this._source.priceScale(); if (0 === this._source.points().length || null === s || s.isEmpty()) return; const r = this._source.ownerSource(), n = null !== r ? r.firstValue() : null; if (null === n) return; const o = this._data.priceProperty.value(), a = this._data.colorProperty.value(); i.background = a, i.textColor = this.generateTextColor(a), i.coordinate = s .priceToCoordinate(o, n), e.text = s.formatPrice(o, n), e.visible = !0 } _showAxisLabel() { return this._source.properties().childs().showPriceLabels.value() } } }, gP14: function(e, t, i) { "use strict"; i.r(t); var s = i("hbEN"), r = i("Eyy1"), n = i("aO4+"), o = i("eJTA"), a = i("HGP3"), l = i("oiZD"), c = i("JWMC"), h = i("jofe"), u = i("vTIA"), d = i("GxN8"), p = i("8sOK"), _ = i("LxhU"), m = i("tc+8"), f = i.n(m), g = i("gvrv"), b = i("jenN"), v = i("kcTO"), S = i("Ocx9"), y = i("wZIs"), w = i("oV8k"), P = i("Kxc7"), C = i("n5al"), x = i("sDZI"); const T = new v.PriceFormatter; class I extends w.a { constructor(e, t, i) { super(e, t), this._studySource = null, this._paneViews = [], this._metaInfo = null, this._destroyed = !1, this._isStarted = !1, this._loadedGraphics = null, this._doubleClickHandler = i; const s = t.mainSeries(); this._properties = new S.DefaultProperty("sessions"), Object(y .applyDefaultsOverrides)(this._properties.childs().graphics, void 0, !1, "sessions"), this._removeDuplicateProperties(), this._properties .subscribe(this, this._onPropertiesChanged), t.studyMetaInfoRepository() .findById({ type: "java", studyId: "Sessions@tv-basicstudies" }).then(e => { this._destroyed || null === this._loadedGraphics && (this ._setMetaInfo(e), null !== this._metaInfo && (this ._studySource = new g.a(t.chartApi(), s.seriesSource(), "sessions_", this._metaInfo), this ._createPaneViews(), this._studySource.dataCleared() .subscribe(this, this.updateAllViews), this._studySource .dataUpdated().subscribe(this, this.updateAllViews), this._studySource.setInputs({}), this ._processHibernate())) }), t.timeScale().onReset().subscribe(this, this._clearData), t.timeScale() .logicalRangeChanged().subscribe(this, this.updateAllViews), t.mainSeries() .sessionIdProxyProperty().subscribe(this, this ._updateVisibleOfPreAndPostMarketBackground), t.mainSeries() .properties().interval.subscribe(this, this._processHibernate), this ._updateVisibleOfPreAndPostMarketBackground(t.mainSeries().properties() .sessionId) } applyOverrides(e) { Object(y.applyPropertiesOverrides)(this._properties.childs().graphics, void 0, ! 1, e, "sessions"), this._model.updateSource(this) } start() { this._isStarted = !0, this._processHibernate() } restart() { this._clearData(), P.enabled("stop_study_on_restart") && this.stop(), this .start() } isStarted() { return this._isStarted } stop() { this._isStarted = !1, null !== this._studySource && this._studySource.stop() } isHoveredEnabled() { return !1 } paneViews(e) { return this._paneViews } updateAllViews() { this._paneViews.forEach(e => e.update()) } updateViewsForPane(e) { this.updateAllViews() } destroy() { this._destroyed = !0, null !== this._studySource && (this._studySource .dataCleared().unsubscribeAll(this), this._studySource.dataUpdated() .unsubscribeAll(this), this._studySource.destroy(), this._studySource = null), this._model.timeScale().logicalRangeChanged().unsubscribeAll( this), this._model.timeScale().onReset().unsubscribeAll(this), this ._model.mainSeries().sessionIdProxyProperty().unsubscribeAll(this), this ._model.mainSeries().properties().interval.unsubscribeAll(this), this ._properties.unsubscribeAll(this) } series() { return this._model.mainSeries() } priceScale() { return this.series().priceScale() } graphics() { return this._loadedGraphics || Object(r.ensureNotNull)(this._studySource) .graphics() } properties() { return this._properties } graphicsInfo() { return Object(r.ensureNotNull)(this._metaInfo).graphics } firstValue(e) { return this._model.mainSeries().firstValue() } formatter() { return T } state(e) { const t = { properties: this._properties.state() }; return e && null !== this._metaInfo && (t.data = { graphics: Object(b.saveStudyGraphics)(this.graphics()), metaInfo: this._metaInfo }), t } restoreState(e, t) { const i = e.properties; this._migrateOutOfSessionProperty(i), this._properties.mergeAndFire(i), this ._removeDuplicateProperties(), this ._updateVisibleOfPreAndPostMarketBackground(this._model.mainSeries() .properties().sessionId), void 0 !== e.data && t && (this ._loadStudyGraphics(e.data.graphics), this._setMetaInfo(e.data .metaInfo), this._createPaneViews()) } restoreOldState(e, t) { const i = { properties: { graphics: e.state.graphics } }; void 0 !== e.data && void 0 !== e.metaInfo && t && (i.data = { metaInfo: e.metaInfo, graphics: e.data.graphics }), this.restoreState(i, t) } applyPreferences(e) { this._properties.mergePreferences(e) } metaInfo() { return Object(r.ensureNotNull)(this._metaInfo) } _loadStudyGraphics(e) { const t = e.backgrounds; if (void 0 !== t) { const e = t.findIndex(e => "inSession" === e.styleId); - 1 !== e && t .splice(e, 1) } this._loadedGraphics = Object(b.loadStudyGraphics)(e) } _setMetaInfo(e) { const t = e.graphics.backgrounds; void 0 !== t && void 0 !== t.inSession && delete t.inSession, this._metaInfo = e } _updateVisibleOfPreAndPostMarketBackground(e) { const t = !Object(C.isRegularSessionId)(e.value()); this._outOfSessionVisibilityProperty().setValue(t), this ._preMarketVisibilityProperty().setValue(t), this ._postMarketVisibilityProperty().setValue(t) } _clearData() { null !== this._studySource && this._studySource.clearData() } _createPaneViews() { const e = { doubleClickHandler: this._doubleClickHandler }; Object(b.createGraphicsPaneViews)(this, this._model, e).then(e => { this._paneViews = e, this._model.lightUpdate() }) } _onPropertiesChanged() { this._processHibernate(), this.updateAllViews() } _processHibernate() { if (null !== this._studySource) { const e = this._canBeHibernated(), t = this._isHibernated(), i = this._studySource.isStarted(); !t && e && i ? this._studySource.stop() : !t || e || i || this._studySource .start() } } _canBeHibernated() { const e = this._model.mainSeries(), t = this._preMarketVisibilityProperty().value() && this ._postMarketVisibilityProperty().value() && this ._outOfSessionVisibilityProperty().value(); return e.isDWM() || !t && !this._vertLinesVisibleProperty().value() } _isHibernated() { return this._isStarted && (null === this._studySource || !this._studySource .isStarted()) } _outOfSessionVisibilityProperty() { return this._properties.childs().graphics.childs().backgrounds.childs() .outOfSession.childs().visible } _preMarketVisibilityProperty() { return this._properties.childs().graphics.childs().backgrounds.childs() .preMarket.childs().visible } _postMarketVisibilityProperty() { return this._properties.childs().graphics.childs().backgrounds.childs() .postMarket.childs().visible } _vertLinesVisibleProperty() { return this._properties.childs().graphics.childs().vertlines.childs().sessBreaks .childs().visible } _removeDuplicateProperties() { this._properties.hasChild("properties") && (this._properties.removeProperty( "properties"), Object(S.saveDefaultProperties)(!0), this._properties .childChanged("", null), Object(S.saveDefaultProperties)(!1)) } _migrateOutOfSessionProperty(e) { const t = e.graphics.backgrounds; if (void 0 !== t) { const i = t.outOfSession; i.color === Object(r.ensureDefined)(x.sessionsPreferencesDefault.graphics .backgrounds).outOfSession.color || "postMarket" in t || (e.graphics .backgrounds = { ...t, postMarket: { color: i.color, transparency: i.transparency, visible: i.visible }, preMarket: { color: i.color, transparency: i.transparency, visible: i.visible } }) } } } var M = i("3ClC"), O = i("aIyQ"), L = i.n(O), A = i("hY0g"), E = i.n(A), k = i("H0vP"), D = i("iDOr"), V = i("MbIA"), B = i("gQ5K"), R = i("3t3b"), N = i("4kQX"), j = i("mPvX"), F = i("mMWL"), W = i("txPx"), H = i("CW80"), U = i("e3/o"), z = i("ogJP"), G = i("Tmoa"), q = i("fTGZ"), Y = i("4vW/"); function K(e, t) { return e.code < t.code ? -1 : e.code > t.code ? 1 : 0 } class J { constructor(e) { this._convertibleItems = e, this._idsToItems = new Map; for (const t of e) this._idsToItems.set(t.id, t) } convertible(e) { return void 0 !== this._idsToItems.get(e) } size() { return this._convertibleItems.length } filterConvertible(e, t) { const i = this._convertibleItems.filter(function(e, t) { return i => !e.has(i.id) && t(i.id) }(e, t)); return i.sort(K), i } } class Z { constructor(e) { this._allGroups = new Set, this._idToName = new Map, this._idToDescription = new Map, this._groupedUnitIds = new Map, this._groupedUnits = new Map, this ._groupById = new Map, this._size = 0, this._units = e; for (const t in e) if (e.hasOwnProperty(t)) { this._allGroups.add(t), this._groupedUnitIds.set(t, new Set(e[t].map(e => e .id))), this._groupedUnits.set(t, e[t]); for (const i of e[t]) this._size++, this._idToName.set(i.id, i.name), this ._idToDescription.set(i.id, i.description), this._groupById.set(i.id, t) } } unitsChanged(e) { return this._units !== e } size() { return this._size } name(e) { return this._idToName.get(e) || e } description(e) { return this._idToDescription.get(e) || e } unitGroupById(e) { return this._groupById.get(e) || null } allGroups() { return new Set(this._allGroups) } unitsByGroups(e) { const t = []; return e.forEach(e => { const i = this._groupedUnits.get(e); void 0 !== i && t.push({ name: e, units: i }) }), t } convertible(e, t) { for (const i of t) { const t = this._groupedUnitIds.get(i); if (void 0 !== t && t.has(e)) return !0 } return !1 } } var X = i("ivNn"); class $ { constructor(e) { this._source = null, this._sourcePane = null, this ._currentToolSupportsPhantomMode = !1, this._model = e } destroy() { this._source = null, this._sourcePane = null } source() { return this._source } onToolChanged() { this._removeSource(); const e = this._model.currentTool(); this._currentToolSupportsPhantomMode = Object(H.isLineToolName)(e) && Object(H .supportsPhantomMode)(e) } onCursorPositionUpdated() { if (!this._currentToolSupportsPhantomMode) return; const e = this._model.crossHairSource(); if (this._sourcePane !== e.pane && this._removeSource(), null === e.pane || !Object( X.isNumber)(e.index) || !Object(X.isNumber)(e.price)) return void this ._removeSource(); const t = { index: e.index, price: e.price }; null !== this._source ? this._source.setPoint(0, t) : (this._source = this._model .createLineTool(e.pane, t, this._model.currentTool(), void 0, null), this ._sourcePane = e.pane) } _removeSource() { null !== this._source && (this._model.removeSource(this._source), this._source = null, this._sourcePane = null) } } var Q = i("k9/m"), ee = i("4o++"), te = i("zL3Q"); class ie { align(e, t, i) { let s = e; if (!Object(te.a)().value()) return s; const n = i.mainDataSource(); if (null === n) return s; const o = n.model().mainSeries(); if (n !== o) return s; const a = o.priceScale(), l = o.bars(); if (a.isEmpty() || !l.contains(t)) return s; const c = l.valueAt(t); if (null === c) return s; const h = []; null !== o.priceSource() ? h.push(o.barFunction()(c)) : h.push(c[1], c[2], c[3], c[ 4]); const u = Object(r.ensure)(o.firstValue()), d = h.map(e => ({ y: a.priceToCoordinate(e, u), price: e })), p = a.priceToCoordinate(e, u); d.sort((e, t) => Math.abs(e.y - p) - Math.abs(t.y - p)); const _ = d[0]; return (Object(te.b)().value() === ee.MagnetMode.StrongMagnet || Math.abs(_.y - p) < 50) && (s = _.price), s } } var se = i("Qb4w"), re = i("jCNj"), ne = i("OLhd"); i.d(t, "ChartModelBase", (function() { return ce })); const oe = Object(W.getLogger)("Chart.ChartModel"); function ae(e, t) { const i = e.indexOf(t); return -1 !== i && (e.splice(i, 1), !0) } const le = { isSnapshot: !1, readOnly: !1, watermarkEnabled: !0, shiftVisibleRangeOnNewBar: !0, currencyConversionEnabled: !1, unitConversionEnabled: !1, countdownEnabled: !0, lastPriceAnimationEnabled: !0 }; class ce { constructor(e, t, i, r, n, o, a, c) { this._onRearrangePanes = new L.a, this._lineToolsGroupModel = new j .LineToolsGroupModel, this._sourcesBeingMoved = [], this._lineItemBeingMoved = null, this._lineBeingEdited = null, this._linePointBeingEdited = null, this ._linePointBeingChanged = null, this._customSourceBeingMovedHitTestData = null, this._customSourceBeingMoved = null, this._dataSourceCollectionChanged = new L .a, this._sourceProperitesChanged = new L.a, this._sourceZOrderChanged = new L .a, this._dataSourceSymbolResolved = new L.a, this._sessions = null, this ._currentTool = "", this._lineBeingCreated = null, this ._paneBeingCreatedLineOn = null, this._lineCancelled = new L.a, this ._phantomSourceContainer = new $(this), this._destroyed = !1, this ._isSettingsExternalPosition = !1, this._isTimeScrolling = !1, this._magnet = new ie, this._scrollingState = null, this._panes = [], this._tagsChanged = new L .a, this._strategySources = [], this._strategySourcesChange = new L.a, this ._activeStrategySource = new E.a(null), this._panesCollectionChanged = new L.a, this._scrollEnabled = P.enabled("chart_scroll"), this._zoomEnabled = P.enabled( "chart_zoom"), this._isScalesResetAvailableChanged = new L.a, this ._isScalesResetAvailable = !1, this._esdWatcher = null, this._alertsWatcher = null, this._hoveredSource = null, this._hoveredSourceChanged = new L.a, this ._lastHoveredHittestData = null, this._lastSelectedHittestData = null, this ._topmostCustomSources = [], this._fgCustomSources = [], this ._bgCustomSources = [], this._allCustomSources = [], this._customSourcesMap = new Map, this._multiPaneSources = [], this._showLegendProperty = new f.a, this ._id = Object(U.guid)(), this._chartSaveTime = null, this ._availableCurrenciesList = null, this._availableCurrencies = new J([]), this ._availableUnitsObject = null, this._availableUnits = new Z({}), this ._shouldBeSavedEvenIfHidden = !1, this._watchedThemeSpawn = l.watchedTheme .spawn(), this._gradientColorsCache = null, this._recalcVRStudiesParams = {}, this._recalcColorStudiesParams = {}, this._recalcVisibleRangeStudiesImplDebounced = Object(s.default)(this ._recalcVisibleRangeStudiesImpl.bind(this, this._recalcVRStudiesParams), 500 ), this._recalcColorStudiesImplDebounced = Object(s.default)(this ._recalcColorStudiesImpl.bind(this, this._recalcColorStudiesParams), 250), this._width = 0, this._resetScales = new L.a, this._chartThemeLoaded = new L.a, this._chartApi = e, this._invalidateHandler = t, this._undoModel = o, this ._properties = i, this._options = Object(z.merge)(Object(z.clone)(le), c), this ._studiesMetaInfoRepository = n, this._readOnly = this._options.readOnly, this ._isSnapshot = this._options.isSnapshot, this._chartSaveTime = (new Date) .valueOf(), this._backgroundColor = new E.a(this._getBackgroundColor()), this ._backgroundTopColor = new E.a(this._getBackgroundColor(!0)), this._properties .childs().paneProperties.childs().background.subscribe(this, this ._updateBackgroundColor), this._properties.childs().paneProperties.childs() .backgroundType.subscribe(this, this._updateBackgroundColor), this._properties .childs().paneProperties.childs().backgroundGradientStartColor.subscribe(this, this._updateBackgroundColor), this._properties.childs().paneProperties .childs().backgroundGradientEndColor.subscribe(this, this ._updateBackgroundColor), this._backgroundColor.subscribe(this .recalcColorStudies.bind(this, !1)), this._watchedThemeSpawn.subscribe(this ._updateBackgroundColor.bind(this)) } version() { return 3 } chartSaveTime() { return this._chartSaveTime } setChartSaveTime(e) { this._chartSaveTime = e } destroy() { this._phantomSourceContainer.destroy(), this._hoveredSourceChanged.destroy(), null !== this._watermarkSource && (this._watermarkSource.destroy(), this ._watermarkSource = null), Array.from(this._customSourcesMap.keys()) .forEach(this._removeCustomSource, this), Object(r.assert)(0 === this ._topmostCustomSources.length), Object(r.assert)(0 === this._fgCustomSources .length), Object(r.assert)(0 === this._bgCustomSources.length), Object(r .assert)(0 === this._allCustomSources.length), Object(r.assert)(0 === this ._customSourcesMap.size), null !== this._esdWatcher && (this._esdWatcher .destroy(), this._esdWatcher = null), null !== this._alertsWatcher && (this ._alertsWatcher.destroy(), this._alertsWatcher = null), this._properties .childs().paneProperties.childs().background.unsubscribeAll(this), this ._properties.childs().paneProperties.childs().backgroundType.unsubscribeAll( this), this._properties.childs().paneProperties.childs() .backgroundGradientEndColor.unsubscribeAll(this), this._properties.childs() .paneProperties.childs().backgroundGradientStartColor.unsubscribeAll(this), this ._watchedThemeSpawn.destroy(), this._destroyed = !0 } undoModel() { return this._undoModel } addStrategySource(e) { -1 === this._strategySources.indexOf(e) && (this._strategySources.push(e), this ._strategySourcesChange.fire(), this.setActiveStrategySource(e)) } removeStrategySource(e) { const t = this._strategySources.indexOf(e); if (-1 !== t) { if (this._strategySources.splice(t, 1)[0] === this._activeStrategySource .value() && this.unsetActiveStrategySource(), this._strategySources.length > 0 ) { const e = this._strategySources[this._strategySources.length - 1]; this.setActiveStrategySource(e) } this._strategySourcesChange.fire() } } setActiveStrategySource(e) { -1 !== this._strategySources.indexOf(e) && this._activeStrategySource.setValue(e) } unsetActiveStrategySource() { this._activeStrategySource.setValue(null) } activeStrategySource() { return this._activeStrategySource } strategySources() { return this._strategySources } strategySourcesChange() { return this._strategySourcesChange } setScrollEnabled(e) { this._scrollEnabled = e } scrollEnabled() { return this._scrollEnabled } setZoomEnabled(e) { this._zoomEnabled = e } zoomEnabled() { return this._zoomEnabled } zoomToViewport(e, t, i, s, r) { this.setTimeViewport(e, t); let n = Math.min(i, s), o = Math.max(i, s); const a = r.defaultPriceScale(); a.isPercentage() || a.setMode({ autoScale: !1 }), a.isLog() && (n = a.priceToLogical(n), o = a.priceToLogical(o)), a .setPriceRange(new se.PriceRange(n, o)), this.recalculateAllPanes(), this .invalidate(this._paneInvalidationMask(r, k.InvalidationLevel.Light)), this ._setScalesResetAvailable(!0) } setTimeViewport(e, t) { this.timeScale().zoomToBarsRange(e, t), this.recalculateAllPanes(), this .recalcVisibleRangeStudies(), this.lightUpdate() } onTagsChanged() { return this._tagsChanged } canZoomIn() { return this._timeScale.canZoomIn() && this._zoomEnabled } canZoomOut() { return this._timeScale.canZoomOut() && this._zoomEnabled } onPaneTagsChanged() { this._tagsChanged.fire() } panesCollectionChanged() { return this._panesCollectionChanged } dataSourceCollectionChanged() { return this._dataSourceCollectionChanged } symbolSourceResolved() { return this._dataSourceSymbolResolved } sourceProperitesChanged() { return this._sourceProperitesChanged } sourceZOrderChanged() { return this._sourceZOrderChanged } updateCrosshairPositionByOriginCoords() { const e = this.crossHairSource(), t = e.pane; let i = e.originX(), s = e.originY(); if (Number.isFinite(i) || (i = e.x, s = e.y), null !== t && Number.isFinite(i) && Number.isFinite(s)) { const e = this._timeScale.coordinateToVisibleIndex(i); let n = NaN; const o = t.defaultPriceScale(); if (!o.isEmpty()) { const e = Object(r.ensureNotNull)(t.mainDataSource()).firstValue(); null !== e && (n = o.coordinateToPrice(s, Object(r.ensureNotNull)(e))) } this.crossHairSource().setPosition(e, n, t) && this._undoModel.chartWidget() .isActive() && this._syncCrosshair() } } zoomTime(e, t, i) { if (!this._zoomEnabled) return; const s = this.timeScale(); if (s.isEmpty() || 0 === t) return; const r = s.width(); e = Math.max(1, Math.min(e, r - 2)), s.zoom(e, t, i), this.recalculateAllPanes(), this.lightUpdate(), this.recalcVisibleRangeStudies(), this ._setScalesResetAvailable(!0) } linePointBeingEdited() { return this._linePointBeingEdited } linePointBeingChanged() { return this._linePointBeingChanged } dataSources() { const e = [this.crossHairSource()]; for (const t of this._panes) for (const i of t.dataSources()) e.push(i); return e } priceDataSources() { const e = []; for (const t of this._panes) for (const i of t.priceDataSources()) e.push(i); return e } lineToolsGroupModel() { return this._lineToolsGroupModel } restoreLineToolsGroups(e) { this._lineToolsGroupModel = j.LineToolsGroupModel.fromState(this, e) } realignLineTools() { for (const e of this._panes) e.realignLineTools() && this ._dataSourceCollectionChanged.fire(e) } updateSource(e) { const t = this._invalidationMaskForSource(e); null !== t && this.invalidate(t) } updateSourcePriceScale(e) { const t = this._invalidationMaskForSourcePriceScale(e); null !== t && this.invalidate(t) } replaceStudyStub(e, t) { const i = this.paneForSource(e); if (null === i) return !1; const s = e.priceScale(), r = e.zorder(), n = e.ownerSource(); return this.paneForSource(e) === i ? i.replaceSource(e, t, s) : (i.insertDataSource( t, s, r), this.removeSource(e)), t.setOwnerSource(n), this.dataSources() .forEach(i => { i.ownerSource() === e && i.setOwnerSource(t) }), t.start(), this.recalculatePane(i), this.fullUpdate(), !0 } insertStudyStub(e) { const t = this.mainSeries(), i = Object(r.ensureNotNull)(this.paneForSource(t)), s = new p.StudyStub(this, null, e), n = i.createPriceScaleAtPosition("overlay"); return i.addDataSource(s, n, !1), this.recalculatePane(i), this.fullUpdate(), s } removeStudyStub(e) { const t = this.dataSourceForId(e); return null === t ? (oe.logNormal("StudyStub id=" + e + " is not found in chart model"), !1) : (this.removeSource(t), !0) } setHoveredSource(e, t = null) { const i = this._hoveredSource !== e; if (!i && this._lastHoveredHittestData === t) return; this._lastHoveredHittestData = t; let s = null; if (this._hoveredSource) { this._hoveredSource.updateAllViews(), s = new k.InvalidationMask(k .InvalidationLevel.Cursor); const e = this._invalidationMaskForSource(this._hoveredSource, k .InvalidationLevel.Light); null !== e && s.merge(e) } if (this._hoveredSource = e, e) { e.updateAllViews(), s || (s = new k.InvalidationMask(k.InvalidationLevel .Cursor)); const t = this._invalidationMaskForSource(e, k.InvalidationLevel.Light); null !== t && s.merge(t) } s && this.invalidate(s), i && this._hoveredSourceChanged.fire(e) } hoveredSource() { return this._hoveredSource } hoveredSourceChanged() { return this._hoveredSourceChanged } lastHittestData() { return this._lastHoveredHittestData || this.lastSelectedHittestData() } lastSelectedHittestData() { var e; return this._lastSelectedHittestData || ((null === (e = this ._customSourceBeingMovedHitTestData) || void 0 === e ? void 0 : e .beingMoved) ? this._customSourceBeingMovedHitTestData : null) } syncTimeWithModel(e, t) { const i = this.mainSeries().syncModel(); if (null === i) return; const s = 1e3 * this.createSyncPoint(Object(r.ensureNotNull)(e.mainSeries() .syncModel()), i).sourceTimeToTargetTime(t / 1e3), n = Object(re.get_timezone)(this.timezone()); let o = Object(re.utc_to_cal)(n, s); this.mainSeries().isDWM() && (o = i.getSession().spec.correctTradingDay(o), Object( re.set_hms)(o, 0, 0, 0, 0, Object(re.get_timezone)("Etc/UTC"))), this ._gotoTimeImpl(o.getTime(), { centerIfVisible: !1 }) } gotoTime(e) { return this._gotoTimeImpl(e, { centerIfVisible: !0 }) } paneForSource(e) { if (!Object(d.a)(e)) return Array.from(this._customSourcesMap.values()).includes( e) ? this.paneForSource(this.mainSeries()) : null; for (let t = this._panes.length - 1; t >= 0; t--) if (this._panes[t].hasDataSource(e)) return this._panes[t]; return e instanceof q.BarsMarksContainer ? this.paneForSource(this.mainSeries()) : null } allStudies(e) { const t = e ? e => Object(M.isStudy)(e) && !Object(M.isESDStudy)(e) : M.isStudy; return this._getAllSources(t) } findNonOverlayStudyWithGroupingKey(e, t) { const i = void 0 !== t ? [t] : this._panes; for (const t of i) { const i = t.dataSources().find(i => Object(M.isStudy)(i) && i.metaInfo() .groupingKey === e && !t.isOverlay(i)); if (void 0 !== i) return { pane: t, study: i } } return null } movePaneUp(e) { this.movePane(e, e - 1) } movePaneDown(e) { this.movePane(e, e + 1) } movePane(e, t) { const i = this._panes[e]; this._panes.splice(e, 1), this._panes.splice(t, 0, i), this._panesCollectionChanged .fire(this._panes), this._onRearrangePanes.fire(), this.invalidate(k .InvalidationMask.panesOrder()) } backgroundColor() { return this._backgroundColor } backgroundTopColor() { return this._backgroundTopColor } backgroundColorAtYPercentFromTop(e) { const t = this.backgroundColor().value(), i = this.backgroundTopColor().value(); if (t === i) return t; if (e = Math.max(0, Math.min(100, Math.round(100 * e))), null === this ._gradientColorsCache || this._gradientColorsCache.topColor !== i || this ._gradientColorsCache.bottomColor !== t) this._gradientColorsCache = { topColor: i, bottomColor: t, colors: new Map }; else { const t = this._gradientColorsCache.colors.get(e); if (void 0 !== t) return t } const s = Object(G.gradientColorAtPercent)(i, t, e / 100); return this._gradientColorsCache.colors.set(e, s), s } backgroundCounterColor() { const e = this.backgroundColor().value(); if (void 0 === this._lastBackgroundColor || void 0 === this._lastOriginalColor || e !== this._lastBackgroundColor) { const t = Object(o.rgbToBlackWhiteString)(Object(o.parseRgb)(e), 150); this._lastBackgroundColor = e, this._lastOriginalColor = "black" === t ? "white" : "black" } return this._lastOriginalColor } isDark() { return "white" === this.backgroundCounterColor() } defaultResolutions() { return this.chartApi().defaultResolutions() } availableCurrencies() { const e = this._getAvailableCurrencies(); return e.length !== this._availableCurrencies.size() && (this._availableCurrencies = new J(e)), this._availableCurrencies } currencyConversionEnabled() { return this._options.currencyConversionEnabled } availableUnits() { const e = this._getAvailableUnits(); return this._availableUnits.unitsChanged(e) && (this._availableUnits = new Z(e)), this._availableUnits } unitConversionEnabled() { return this._options.unitConversionEnabled } studyTemplate(e, t, i) { const s = { panes: [], version: this.version() }; for (const e of this.panes()) s.panes.push(e.state(!0, !1, !0)); const r = this.mainSeries(); return e && (s.symbol = r.symbol(), i && (s.currency = r.currency()), i && (s.unit = r.unit())), t && (s.interval = r.interval()), s } restoreLineToolState(e, t) { e.restorePoints(t.points, t.indexes || []), e.properties().merge(t.state), e .restoreData && e.restoreData(t), e.linkKey().setValue(t.linkKey || null), e .createServerPoints(), this.fullUpdate(); const i = e.linkKey().value(); null !== i && Object(F.restoreLineToolState)({ model: this, linkKey: i, state: t }) } updateLineTools() { for (const e of this.dataSources()) Object(H.isLineTool)(e) && (e .tryCreateServerPoints(), e.checkAlert && e.checkAlert()) } onResetScales() { return this._resetScales } startMovingSources(e, t, i, s, n, o) { if (this._sourcesBeingMoved = e, this._lineItemBeingMoved = i, this ._sourcesBeingMoved.forEach(e => { const a = Object(r.ensureNotNull)(this.paneForSource(e)), l = Object(H.isLineTool)(e), c = l && e.linkKey().value(); if (!1 !== c && null !== c && s.has(c) && l && e.isFixed()) { const t = Object(r.ensureDefined)(s.get(c)), l = { screen: this._percentPositionToPoint(t, a) }; e.startMoving(l, i, n, o) } else e.startMoving(t, i, n, o); const h = this._paneInvalidationMask(a, k.InvalidationLevel.Light); this.invalidate(h) }), !o) { const s = e.filter(H.isLineTool).filter(e => e.linkKey().value() && e .isSynchronizable()).map(e => e.linkKey().value()); if (s.length && t.logical) { const o = this.externalTimeStamp(t.logical.index), a = { linkKeys: s, model: this, symbol: this.mainSeries().symbol(), point: { price: t.logical.price, timeStamp: o }, itemIndex: null !== i ? i : void 0, envState: n, pointPositionPercents: new Map }; e.forEach(e => { if (Object(H.isLineTool)(e)) { const i = e.linkKey().value(); if (i && e.isSynchronizable() && e.isFixed()) { const s = Object(r.ensureNotNull)(this.paneForSource( e)); a.pointPositionPercents.set(i, this ._pointToPercentPosition(Object(r.ensureDefined) (t.screen), s)) } } }), Object(F.startMovingLineTool)(a) } } F.isToolMovingNow.setValue(!0) } moveSources(e, t, i, s) { if (this._sourcesBeingMoved.filter(e => !e.isLocked || !e.isLocked()).forEach(n => { const o = Object(H.isLineTool)(n) ? n.linkKey().value() : null; if (null !== o && t.has(o)) { const e = Object(r.ensureNotNull)(this.paneForSource(n)), a = Object(r.ensureDefined)(t.get(o)), l = { screen: this._percentPositionToPoint(a, e) }; n.move(l, this._lineItemBeingMoved, i, s) } else n.move(e, this._lineItemBeingMoved, i, s) }), this.lightUpdate(), !s && e.logical) { const t = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e .isSynchronizable() && !!e.linkKey().value()).map(e => e.linkKey() .value()), s = this.externalTimeStamp(e.logical.index), n = { linkKeys: t, model: this, point: { price: e.logical.price, timeStamp: s }, envState: i, pointPositionPercents: new Map }; this._sourcesBeingMoved.filter(H.isLineTool).forEach(t => { if (t.linkKey().value() && t.isSynchronizable() && t.isFixed()) { const i = Object(r.ensureNotNull)(this.paneForSource(t)); n.pointPositionPercents.set(t.linkKey().value(), this ._pointToPercentPosition(Object(r.ensureDefined)(e .screen), i)) } }), Object(F.moveLineTool)(n) } } endMovingSources(e, t) { const i = this._sourcesBeingMoved.map(i => { const s = Object(r.ensureNotNull)(this.paneForSource(i)), n = i.endMoving(e, t), o = this._paneInvalidationMask(s, k.InvalidationLevel.Light); return o.invalidateAll(k.InvalidationLevel.Light), this.invalidate(o), n }), s = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e .isSynchronizable() && !!e.linkKey().value()).map(e => e.linkKey().value()), n = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e .isSynchronizable() && !!e.linkKey).map(e => { const t = { points: e.normalizedPoints(), interval: this.mainSeries().interval() }; return e.isFixed() && (t.pointPositionPercents = e .calcPositionPercents()), t }); s.length && Object(F.finishMovingLineTool)({ linkKeys: s, model: this, finalStates: n, changes: i }), this._sourcesBeingMoved = [], this._lineItemBeingMoved = null, F .isToolMovingNow.setValue(!1) } sourcesBeingMoved() { return this._sourcesBeingMoved } setMovingCustomSource(e, t) { this._customSourceBeingMoved = e, this._customSourceBeingMovedHitTestData = null !== t ? { beingMoved: !1, ...t } : null } processingCustomSourceMove() { null !== this._customSourceBeingMovedHitTestData && (this ._customSourceBeingMovedHitTestData.beingMoved = !0) } customSourceMovingHitTestData() { return this._customSourceBeingMovedHitTestData } customSourceBeingMoved() { return null !== this._customSourceBeingMovedHitTestData && this ._customSourceBeingMovedHitTestData.beingMoved ? this._customSourceBeingMoved : null } width() { return this._width } setWidth(e, t) { this._width = e, this._timeScale.setWidth(e, t); for (const t of this._panes) t.setWidth(e); this.recalculateAllPanes(), this.recalcVisibleRangeStudies() } setPaneHeight(e, t) { e.setHeight(t), this.recalculateAllPanes(), this.lightUpdate() } isScalesResetAvailableChanged() { return this._isScalesResetAvailableChanged } isScalesResetAvailable() { return this._isScalesResetAvailable } panes() { return this._panes } paneForId(e) { return this._panes.find(t => t.id() === e) || null } createPane(e, t, i) { const s = this._undoModel.chartWidget(); s.isMaximizedPane() && s.toggleMaximizePane(); const r = this._properties.childs().paneProperties; t && r.merge(t); const n = new D.Pane(this._timeScale, r, this, i); return void 0 !== e ? this._panes.splice(e, 0, n) : this._panes.push(n), n .onTagsChanged().subscribe(this, ce.prototype.onPaneTagsChanged), n .dataSourcesCollectionChanged().subscribe(this, () => this ._dataSourceCollectionChanged.fire(n)), n.sourcePropertiesChanged() .subscribe(this, e => this._sourceProperitesChanged.fire(n, e)), n .sourceZOrderChanged().subscribe(this, e => this._sourceZOrderChanged.fire(n, e)), n.symbolSourceResolved().subscribe(this, e => this ._dataSourceSymbolResolved.fire(n, e)), this._panesCollectionChanged.fire( this._panes), this.invalidate(k.InvalidationMask.panesOrder()), n } removePane(e) { const t = this._undoModel.chartWidget(); t.isMaximizedPane() && t.toggleMaximizePane(); const i = e; i.destroy(); const s = this._panes.indexOf(i); - 1 !== s && (this._panes.splice(s, 1), e .dataSourcesCollectionChanged().unsubscribeAll(this), e .sourcePropertiesChanged().unsubscribeAll(this), e.onTagsChanged() .unsubscribeAll(this), e.symbolSourceResolved().unsubscribeAll(this)); this.crossHairSource().pane === e && this.clearCurrentPosition(), this ._panesCollectionChanged.fire(this._panes), this.invalidate(k.InvalidationMask .panesOrder()) } changePanesHeight(e, t) { if (this._panes.length < 2) return; Object(r.assert)(e >= 0 && e < this._panes.length, "Invalid pane index"); const i = this._panes[e], s = this._panes.reduce((e, t) => e + t.stretchFactor(), 0), n = this._panes.reduce((e, t) => e + t.height(), 0), o = n - 30 * (this._panes.length - 1); t = Math.min(o, Math.max(30, t)); const a = s / n, l = i.height(); i.setStretchFactor(t * a); let c = t - l, h = this._panes.length - 1; for (const e of this._panes) if (e !== i) { const t = Math.min(o, Math.max(30, e.height() - c / h)); c -= e.height() - t, h -= 1; const i = t * a; e.setStretchFactor(i) } this.fullUpdate() } clearCurrentPosition() { const e = this.crossHairSource(); e.clearPosition(), Object(r.ensureNotNull)(e.dataWindowView()).update(); const t = this._panes; for (let e = t.length; e--;) { const i = t[e].dataSources(); for (let e = i.length; e--;) { const t = i[e].dataWindowView(); t && t.update(); const s = i[e].legendView(); s && s.update() } } this.invalidate(k.InvalidationMask.cursor()); const i = this._undoModel.chartWidget(); i.chartWidgetCollection().syncCrosshair(null, i), this._phantomSourceContainer .onCursorPositionUpdated() } setAndSaveCurrentPosition(e, t, i, s) { this.crossHairSource().saveOriginCoords(e, t), this.setCurrentPosition(e, t, i, s) } setCurrentPosition(e, t, i, s) { let n = NaN; const o = this._timeScale.coordinateToVisibleIndex(e), a = i.defaultPriceScale(); let l = null; a.isEmpty() || (l = Object(r.ensureNotNull)(i.mainDataSource()).firstValue(), null !== l && (n = a.coordinateToPrice(t, l))); const c = this.crossHairSource(), h = c.selectPointMode().value(), u = this.currentTool(), d = this.mainSeries(); if (!this._isSettingsExternalPosition && (this._lineBeingCreated || this ._lineBeingEdited || Object(H.isLineToolName)(u) || Object(F.toolIsMeasure)( u)) && (n = this._magnet.align(n, o, i), null !== l && c .saveOriginCoords(c.originX(), a.priceToCoordinate(n, l))), this ._isTimeScrolling) { if (!this._isSettingsExternalPosition && h) { const e = d.bars().firstIndex(), t = d.bars().lastIndex(); if (null !== e && null !== t) { const s = Math.min(Math.max(o, e), t); s !== o && this._setCorrectedPositionToCrosshair(s, n, l, i) } } else c.setPosition(c.index, n, i); return } c.setOnHoveredChartWidget(!0), c.setPosition(o, n, i), Object(r.ensureNotNull)(c .dataWindowView()).update(); const p = this._panes; for (let e = p.length; e--;) { const t = p[e].dataSources(); for (let e = t.length; e--;) { const i = t[e].dataWindowView(); i && i.update(); const s = t[e].legendView(); s && s.update() } } const _ = d.syncModel(); if (this.crossHairSource().startMeasurePoint() || this._lineBeingCreated ? this .lightUpdate() : this.invalidate(k.InvalidationMask.cursor()), this ._lineBeingCreated) { const e = this._lineBeingCreated.linkKey().value(); if (!this._isSettingsExternalPosition) { this._lineBeingCreated.setLastPoint({ index: o, price: n }, s), this._lineBeingCreated.updateAllViews(); const t = Object(r.ensureNotNull)(this._lineBeingCreated.lastPoint()); if (t.price === n && t.index === o || this._setCorrectedPositionToCrosshair( t.index, t.price, l, i), _ && e) { const i = this._timeScale.points().roughTime(t.index, _.projectTime .bind(_)); Object(F.setLineToolLastPoint)({ model: this, linkKey: e, point: { timeStamp: Object(r.ensureNotNull)(i), price: t.price } }) } } } if (!this._isSettingsExternalPosition && null !== this._lineBeingEdited && null !== this._linePointBeingEdited) { this.changeLinePoint({ index: o, price: n }, s); const e = this._lineBeingEdited.getPoint(this._linePointBeingEdited); null !== e && this._setCorrectedPositionToCrosshair(e.index, e.price, l, i) } if (!this._isSettingsExternalPosition && h) { const e = d.bars().firstIndex(), t = d.bars().lastIndex(); if (null !== e && null !== t) { const s = Math.min(Math.max(o, e), t); s !== o && this._setCorrectedPositionToCrosshair(s, n, l, i) } } this._syncCrosshair(s) } setExternalPosition(e, t) { let i; const s = this.crossHairSource(); if (s.setOnHoveredChartWidget(!1), null !== e && Object(z.isNumber)(e.timeStamp)) { const t = this.mainSeries().syncModel(); if (t) { const s = this.createSyncPoint(e.syncModel, t).sourceTimeToTargetTime(e .timeStamp); i = this._timeScale.points().roughIndex(s, t.distance.bind(t)) } } if (null !== e && null != i && Number.isFinite(i) && void 0 !== e.price && Number .isFinite(e.price)) { this._isSettingsExternalPosition = !0; const n = Object(r.ensureNotNull)(this.paneForSource(this.mainSeries())), o = this._timeScale.indexToCoordinate(i), a = Object(r.ensureNotNull)(n.mainDataSource()).firstValue(); if (null !== a) { const i = this.mainSeries().priceScale().priceToCoordinate(e.price, a); s.clearOriginCoords(), this.setCurrentPosition(o, i, n, t) } return s.setOnHoveredChartWidget(!1), void(this._isSettingsExternalPosition = ! 1) } null != i && Number.isFinite(i) ? (s.clearOriginCoords(), s.setPosition(i, NaN, null)) : (s.clearPosition(), Object(r.ensureNotNull)(s.dataWindowView()) .update()); const n = this.dataSources(); for (let e = n.length; e--;) { const t = n[e].dataWindowView(); t && t.update(); const i = n[e].legendView(); i && i.update() } this.invalidate(k.InvalidationMask.cursor()) } startScaleTime(e) { this._timeScale.startScale(e) } scaleTimeTo(e) { this._timeScale.scaleTo(e), this.recalculateAllPanes(), this.lightUpdate(), this ._setScalesResetAvailable(!0) } endScaleTime() { this._timeScale.endScale(), this.lightUpdate(), this.recalcVisibleRangeStudies() } resetTimeScale() { this._timeScale.restoreDefault(), this.recalculateAllPanes(), this .recalcVisibleRangeStudies(), this.lightUpdate(), this._resetScales.fire(), this ._setScalesResetAvailable(!1) } startScalePrice(e, t, i) { e.startScalePrice(t, i) } scalePriceTo(e, t, i) { e.scalePriceTo(t, i), this.mainSeries().priceScale().isLockScale() ? this .lightUpdate() : this.invalidate(this._paneInvalidationMask(e, k .InvalidationLevel.Light)), this._setScalesResetAvailable(!0) } endScalePrice(e, t) { e.endScalePrice(t), this.invalidate(this._paneInvalidationMask(e, k .InvalidationLevel.Light)) } resetPriceScale(e, t) { this._setScalesResetAvailable(!1), e.resetPriceScale(t), this.invalidate(this ._paneInvalidationMask(e, k.InvalidationLevel.Light)) } restorePriceScaleState(e, t, i) { e.restorePriceScaleState(t, i), this.invalidate(this._paneInvalidationMask(e, k .InvalidationLevel.Light)) } currentTool() { return this._currentTool } setCurrentTool(e) { this._currentTool !== e && (Object(H.isLineToolName)(e) && this.selectionMacro( e => { e.clearSelection() }), this._currentTool = e, this._phantomSourceContainer.onToolChanged()) } onRearrangePanes() { return this._onRearrangePanes } finishLineTool(e) { const t = e.linkKey().value(); Object(F.drawOnAllCharts)().value() && null !== t && e.isSynchronizable() && Object( F.finishLineTool)({ linkKey: t, model: this }) } startChangingLinetool(e, t, i, s, n) { this._lineBeingEdited = e, this._linePointBeingChanged = t || null, this ._linePointBeingEdited = void 0 === i ? null : i, F.isToolEditingNow.setValue(! 0), this._lineBeingEdited.startChanging(i, t, n); const o = Object(r.ensureNotNull)(this.paneForSource(e)); this._lineBeingEdited.startDragPoint && void 0 !== i && void 0 !== t && this ._lineBeingEdited.startDragPoint(i, t), n || void 0 === i || void 0 === t || this._lineBeingEdited.setPoint(i, t, s, n), this._lineBeingEdited .updateAllViews(); const a = this._paneInvalidationMask(o, k.InvalidationLevel.Light); this.invalidate(a); const l = e.linkKey().value(); if (l && e.isSynchronizable() && void 0 !== i && void 0 !== t) { const e = Object(r.ensureNotNull)(this.externalTimeStamp(t.index)); Object(F.startChangingLineTool)({ linkKey: l, model: this, symbol: this.mainSeries().symbol(), point: { price: t.price, timeStamp: e }, pointIndex: i, envState: s || null }) } } createLineTool(e, t, i, s, o, a) { if (Object(r.assert)(Object(H.isLineToolName)(i), "Cannot create unknown line tool: " + i), "LineToolExecution" !== i && Object(c.trackEvent)("drawings", "Study_Drawing_" + i), s) { const e = s.state(); s = Object(H.createLineToolProperties)(i, e) } const l = Object(H.createLineTool)(i, this, s, null), h = !l.linkKey().value() && !o; Object(F.drawOnAllCharts)().value() ? l.linkKey().setValue(o || Object(U.randomHash) ()) : l.linkKey().setValue(o), a = a || Object(r.ensureNotNull)(e .mainDataSource()), s || Object(H.prepareLineToolPropertiesByOwnerSource)(l .properties(), a), l.setOwnerSource(a); const u = a.priceScale(); let d; if (e.addDataSource(l, u, !1), l.isFixed()) { const i = Object(r.ensureNotNull)(Object(r.ensureNotNull)(e.mainDataSource()) .firstValue()), s = this._timeScale.indexToCoordinate(t.index), o = Object(r.ensureNotNull)(u).priceToCoordinate(t.price, i); d = l.addFixedPoint(new n.Point(s, o)) } else d = l.addPoint(t); return d || (this._lineBeingCreated = l, this._paneBeingCreatedLineOn = e, F .isToolCreatingNow.setValue(!0)), h && l.enableCurrentIntervalVisibility(), this.fullUpdate(), l } endChangingLinetool(e, t) { const i = Object(r.ensureNotNull)(this._lineBeingEdited), s = i.endChanging(!1, e); this._lineBeingEdited = null, F.isToolEditingNow.setValue(!1), this ._linePointBeingEdited = null, this._linePointBeingChanged = null, this .lightUpdate(); const n = { points: i.normalizedPoints(), interval: this.mainSeries().interval() }, o = i.linkKey().value(); null !== o && i.isSynchronizable() && Object(F.finishChangingLineTool)({ model: this, linkKey: o, symbol: this.mainSeries().symbol(), finalState: n, changes: s }) } continueCreatingLine(e, t, i, s) { const n = Object(r.ensureNotNull)(this._lineBeingCreated), o = n.addPoint(e, t, i); n.updateAllViews(); const a = new k.InvalidationMask(k.InvalidationLevel.Light); return o && (this._paneBeingCreatedLineOn = null, this._lineBeingCreated = null, F .isToolCreatingNow.setValue(!1)), this.invalidate(a), o } cancelCreatingLine() { if (!this._lineBeingCreated) return; const e = this._lineBeingCreated; this.removeSource(this._lineBeingCreated), this._lineBeingCreated = null, this ._lineCancelled.fire(), F.isToolCreatingNow.setValue(!1), Object(F .drawOnAllCharts)().value() && e.isSynchronizable() && Object(F .cancelLineTool)({ model: this }) } lineBeingCreated() { return this._lineBeingCreated } paneBeingCreatedLineOn() { return this._paneBeingCreatedLineOn } lineCancelled() { return this._lineCancelled } isPhantomLine(e) { return this._phantomSourceContainer.source() === e } changeLinePoint(e, t, i) { const s = Object(r.ensureNotNull)(this._lineBeingEdited), n = Object(r.ensureNotNull)(this._linePointBeingEdited); let o = e.price, a = e.index; if (s.setPoint(n, e, t), !i) { const e = s.getPoint(n); null !== e && (a = e.index, o = e.price) } s.updateAllViews(), this.lightUpdate(); const l = s.linkKey().value(); if (!i && null !== l && s.isSynchronizable()) { const e = Object(r.ensureNotNull)(this._linePointBeingChanged), i = { indexesChanged: a !== e.index, pricesChanged: o !== e.price }, c = s.getChangePointForSync(n); if (null !== c) { const e = this.externalTimeStamp(a); null !== e && (o = c.price, Object(F.changeLineTool)({ linkKey: l, model: this, symbol: this.mainSeries().symbol(), point: { price: o, timeStamp: e }, envState: t, changes: i })) } } } changeLinePoints(e, t, i) { const s = e.points(), n = e.linkKey().value(); !i && n && e.isSynchronizable() && t.forEach((t, i) => { const o = s[i], a = o.price !== t.price, l = o.index !== t.index; if (e.getChangePointForSync(i)) { const e = Object(r.ensureNotNull)(this.externalTimeStamp(t.index)); Object(F.changeLineTool)({ linkKey: n, model: this, symbol: this.mainSeries().symbol(), point: { price: t.price, timeStamp: e }, changes: { pricesChanged: a, indexesChanged: l } }) } }), e.setPoints(t), e.updateAllViews(), this.lightUpdate() } addCustomSource(e, t, i = u.CustomSourceLayer.Foreground) { this._customSourcesMap.has(e) && oe.logWarn( `Attempt to add the same custom source multiple time "${e}"`), oe.logNormal( `Adding custom source "${e}"`); const s = t(e, this); switch (i) { case u.CustomSourceLayer.Background: this._bgCustomSources.push(s); break; case u.CustomSourceLayer.Foreground: this._fgCustomSources.push(s); break; case u.CustomSourceLayer.Topmost: this._topmostCustomSources.push(s); break; default: throw new Error("Unknown custom sources layer " + i) } this._allCustomSources.push(s), this._customSourcesMap.set(e, s), this.lightUpdate() } removeCustomSource(e) { this._removeCustomSource(e), this.lightUpdate() } hasCustomSource(e) { return this._customSourcesMap.has(e) } customSourceForName(e) { return this._customSourcesMap.get(e) || null } customSourceName(e) { let t = null; return this._customSourcesMap.forEach((i, s) => { i === e && (t = s) }), t } customSources(e) { switch (e) { case u.CustomSourceLayer.Background: return this._bgCustomSources; case u.CustomSourceLayer.Foreground: return this._fgCustomSources; case u.CustomSourceLayer.Topmost: return this._topmostCustomSources; default: return this._allCustomSources } } addMultiPaneSource(e) { this._multiPaneSources.push(e), this.lightUpdate() } removeMultiPaneSource(e) { const t = this._multiPaneSources.indexOf(e); - 1 === t ? oe.logWarn( "Attempt to remove multi-pane source which does not exist in the model") : this._multiPaneSources.splice(t, 1), this.lightUpdate() } multiPaneSources(e) { return this._multiPaneSources.filter(t => !e.hasDataSource(t)) } dateTimeFormatter() { return this._dateTimeFormatter } dateFormatter() { return this._dateFormatter } timeFormatter() { return this._timeFormatter } sessions() { return Object(r.ensureNotNull)(this._sessions) } createSessions(e) { Object(r.assert)(null === this._sessions, "Sessions are already created"), this .addCustomSource("sessions", (t, i) => (this._sessions = new I(t, i, e), this ._sessions.start(), this._sessions), u.CustomSourceLayer.Background) } createPrePostMarket(e) { this.addCustomSource("prePostMarket", (t, i) => new PrePostMarket(t, i, e)) } theme() { const e = this.properties().paneProperties.state(); delete e.topMargin, delete e.bottomMargin; const t = this.mainSeries().state().state; t && (delete t.symbol, delete t.interval, delete t.currencyId, delete t.unitId); const i = { mainSourceProperties: t, sessions: this.sessions().properties().state(), chartProperties: { paneProperties: e, scalesProperties: this.properties().scalesProperties.state() } }; return i.version = this.version(), i } onChartThemeLoaded() { return this._chartThemeLoaded } chartThemeLoaded() { this._chartThemeLoaded.fire() } shouldBeSavedEvenIfHidden() { return this._shouldBeSavedEvenIfHidden } setShouldBeSavedEvenIfHidden(e) { this._shouldBeSavedEvenIfHidden = e } externalTimeStamp(e) { const t = this.mainSeries().syncModel(); return this.timeScale().points().roughTime(e, t && t.projectTime.bind(t)) } syncESD() { null !== this._esdWatcher && this._esdWatcher.syncESDStudies() } recalcVisibleRangeStudies(e) { this._recalcVRStudiesParams.force = this._recalcVRStudiesParams.force || Boolean(e), this._recalcVisibleRangeStudiesImplDebounced() } recalcColorStudies(e) { this._recalcColorStudiesParams.force = this._recalcColorStudiesParams.force || Boolean(e), this._recalcColorStudiesImplDebounced() } alertsWatcher() { return this._alertsWatcher } showLegend() { return this._showLegendProperty } id() { return this._id } recalculatePriceRangeOnce() { const e = this.mainSeries(); for (const t of this._panes) for (const i of t.priceDataSources()) i.symbolSource() === e && i .disablePriceRangeReady() } invalidate(e) { var t; null === (t = this._invalidateHandler) || void 0 === t || t.call(this, e) } appliedTimeFrame() { return this._appliedTimeFrame.appliedTimeFrame() } _createESDWatcher() {} _updateDateTimeFormatter() { const e = R.dateFormatProperty.value(), t = new B.DateFormatter(e); if (this._dateFormatter = t, this.mainSeries().isDWM()) this._dateTimeFormatter = t, this._timeFormatter = new N.TimeFormatter("%h:%m"); else { const t = _.Interval.parse(this.mainSeries().interval()), i = t.isSeconds() || t.isTicks() ? "%h:%m:%s" : "%h:%m"; this._dateTimeFormatter = new V.a({ dateFormat: e, timeFormat: i, dateTimeSeparator: " " }), this._timeFormatter = new N.TimeFormatter(i) } } _setScalesResetAvailable(e) { this._isScalesResetAvailable !== e && (this._isScalesResetAvailable = e, this ._isScalesResetAvailableChanged.fire()) } _invalidationMaskForSource(e, t = k.InvalidationLevel.Light) { if (e === this.crossHairSource()) return k.InvalidationMask.cursor(); if (this._watermarkSource === e) return this._paneInvalidationMask(Object(r .ensureNotNull)(this.paneForSource(this.mainSeries())), t); if (-1 !== this._allCustomSources.indexOf(e)) { const e = new k.InvalidationMask; return e.invalidateAll(t), e } if (!Object(d.a)(e)) return null; if (e.isMultiPaneEnabled()) return new k.InvalidationMask(t); const i = this.paneForSource(e); return null !== i ? this._paneInvalidationMask(i, t) : null } _paneInvalidationMask(e, t = k.InvalidationLevel.Light) { const i = new k.InvalidationMask, s = this._panes.indexOf(e); return i.invalidateAllPane(s, t), i } _invalidationMaskForSourcePriceScale(e, t = k.InvalidationLevel.Light) { if (!Object(d.a)(e)) return new k.InvalidationMask(t); const i = this.paneForSource(e); if (null === i) return null; let s = e.priceScale(); if (null === s) return null; const r = this._panes.indexOf(i); let n = i.priceScalePosition(s); if ("overlay" === n) { const e = this._panes[r].defaultPriceScale(); s = e, n = i.priceScalePosition(e) } const o = i.priceScaleIndex(s, n); if (void 0 === o) return null; const a = new k.InvalidationMask; return a.invalidatePriceScale(r, n, o, t), a } _removeCustomSource(e) { const t = this._customSourcesMap.get(e); if (void 0 === t) return void oe.logWarn( `Attempt to remove custom source which does not exist in the model - "${e}"` ); oe.logNormal(`Removing custom source "${e}"`), this.selectionMacro(e => { e.removeSourceFromSelection(t) }), this._hoveredSource === t && this.setHoveredSource(null), this ._customSourceBeingMoved === t && this.setMovingCustomSource(null, null); const i = ae(this._bgCustomSources, t), s = ae(this._fgCustomSources, t), n = ae(this._topmostCustomSources, t), o = ae(this._allCustomSources, t); Object(r.assert)(i || s || n, "Source should be presented in one of the layers"), Object(r.assert)(o, "Source should be presented in the array"), this ._customSourcesMap.delete(e), t.destroy() } _updateShowLegendProperty() { const e = this._properties.childs().paneProperties.childs().legendProperties .childs().showLegend, t = this._showLegendProperty; if (e.value()) t.setValue(!0); else { for (const e of this._panes) { let i = 0; for (const s of e.dataSources()) if (s !== this.mainSeries() && null !== s.statusView() && (i++, i > 1)) return void t.setValue(!1) } t.setValue(!0) } } _pointToPercentPosition(e, t) { return { x: e.x / this._timeScale.width(), y: e.y / Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainDataSource()) .priceScale()).height() } } _percentPositionToPoint(e, t) { const i = e.x * this._timeScale.width(), s = e.y * Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainDataSource()) .priceScale()).height(); return new n.Point(i, s) } _recalcVisibleRangeStudiesImpl(e) { var t; if (e.timerId = null, this.timeScale().isEmpty()) return; const i = this.timeScale().visibleBarsStrictRange(); if (null === i) return; const s = this.mainSeries().nearestData(i.firstBar(), Q.PlotRowSearchMode .NearestRight), r = this.mainSeries().nearestData(i.lastBar(), Q.PlotRowSearchMode.NearestLeft), n = this.mainSeries().bars().lastIndex(), o = s ? s.index : void 0, a = r ? r.index : void 0, l = o === e.oldStartVisibleIndex, c = a === e.oldEndVisibleIndex; if (l && c && !e.force) return; e.force = !1, e.oldStartVisibleIndex = void 0 !== o ? o : NaN, e .oldEndVisibleIndex = void 0 !== a ? a : NaN; const h = { first_visible_bar_time: 1e3 * Math.floor(s && s.value ? s.value[0] : 0), last_visible_bar_time: 1e3 * Math.floor(r && r.value ? r.value[0] : 0), subscribeRealtime: r && r.index === n }, u = null !== (t = e.studies) && void 0 !== t ? t : this.priceDataSources(); e.studies = void 0; for (const e of u) if (Object(M.isStudy)(e)) { const t = e.metaInfo().inputs, i = []; for (const e of t) h.hasOwnProperty(e.id) && i.push(e.id); const s = e.properties().inputs; for (const e of i) s[e].setValueSilently(h[e]); i.length > 0 && s.listeners().fire(s) } } _recalcColorStudiesImpl(e) { var t; if (e.timerId = null, this.timeScale().isEmpty()) return; const i = this.backgroundColor().value(), s = this.isDark() ? a.colorsPalette["color-cold-gray-200"] : a.colorsPalette[ "color-cold-gray-900"], r = i === e.oldBgColor, n = s === e.oldFgColor; if (r && n && !e.force) return; e.force = !1, e.oldBgColor = i, e.oldFgColor = s; const o = { chart_bgcolor: i, chart_fgcolor: s }, l = null !== (t = e.studies) && void 0 !== t ? t : this.priceDataSources(); e.studies = void 0; for (const e of l) if (Object(M.isStudy)(e)) { const t = e.metaInfo(), i = t.inputs, s = t.isRGB, r = []; for (const e of i) o.hasOwnProperty(e.id) && r.push(e.id); const n = e.properties().inputs; for (const e of r) n[e].setValueSilently(s ? Object(G.colorToInteger)(o[ e]) : o[e]); r.length > 0 && n.listeners().fire(n) } } _getAllSources(e) { const t = []; for (const i of this._panes) { const s = i.sourcesByGroup().all(); for (const i of s) e(i) && t.push(i) } return t } _getAvailableCurrencies() { return this._options.currencyConversionEnabled ? Object(z.isArray)(this ._availableCurrenciesList) ? this._availableCurrenciesList : (null !== this ._availableCurrenciesList || (this._availableCurrenciesList = this .chartApi().availableCurrencies(), this._availableCurrenciesList.then( e => { this._destroyed || (this._availableCurrenciesList = e, this .lightUpdate()) }).catch(e => { oe.logWarn( "An error occurred while getting currencies config: " + e) })), []) : [] } _getAvailableUnits() { return this._options.unitConversionEnabled ? this ._availableUnitsObject instanceof Promise || null === this ._availableUnitsObject ? (null !== this._availableUnitsObject || (this ._availableUnitsObject = this.chartApi().availableUnits(), this ._availableUnitsObject.then(e => { this._destroyed || (this._availableUnitsObject = e, this .lightUpdate()) }).catch(e => { oe.logWarn("An error occurred while getting units config: " + e) })), {}) : this._availableUnitsObject : {} } _getBackgroundColor(e) { const t = this._properties.childs().paneProperties.childs(); if (t.backgroundType.value() === Y.ColorType.Gradient) { const i = t.backgroundGradientStartColor.value(), s = t.backgroundGradientEndColor.value(); return e ? i : s } return t.background.value() } _updateBackgroundColor() { this._backgroundColor.setValue(this._getBackgroundColor()), this._backgroundTopColor .setValue(this._getBackgroundColor(!0)) } _syncCrosshair(e) { if (!this._isSettingsExternalPosition) { const t = this._undoModel.chartWidget(), i = this._undoModel.mainSeries(), s = i.syncModel(), r = this._undoModel.crossHairSource(), n = r.pane; if (null !== s && null !== n) { const o = { timeStamp: this._timeScale.points().roughTime(r.index, s.projectTime .bind(s)), syncModel: s }; n.mainDataSource() === i && (o.price = r.price, o.symbol = i.symbol()), o .syncModel = s; let a = this._lineBeingCreated || null !== this._linePointBeingEdited || Boolean(this._sourcesBeingMoved.length); a = a && Object(F.drawOnAllCharts)().value(), t.chartWidgetCollection() .syncCrosshair(o, t, a, e) } this._phantomSourceContainer.onCursorPositionUpdated() } } _gotoTimeImpl(e, t) { const i = this.timeScale(), s = this.mainSeries(); let n; if (void 0 !== e) { if (this._scrollingState && this._scrollingState.deferred.reject(), n = Object(h .createDeferredPromise)(), !s.isDWM()) { const t = s.symbolInfo(); if (null !== t) { let i = this.properties().timezone.value(); "exchange" === i && (i = t.timezone); const r = Object(re.cal_to_utc)(Object(re.get_timezone)(i), new Date( e)), n = Object(ne.createTimeToBarTimeAligner)(s.interval(), t)(r); e = Object(re.utc_to_cal)(Object(re.get_timezone)(i), n).getTime() } } this._scrollingState = { targetDate: e, deferred: n, centerIfVisible: t.centerIfVisible } } else { if (!this._scrollingState) return oe.logError( "scrollTo called without an argument"), Promise.reject(); e = this._scrollingState.targetDate, n = this._scrollingState.deferred } if (void 0 === i.tickMarks().minIndex) return n.resolve(void 0), n.promise; let o = ((e, t) => { if ((e => Object(r.ensureNotNull)(i.tickMarks().indexToTime(Object(r .ensureDefined)(i.tickMarks().minIndex))).valueOf() - e)(t) < 0) { let n = i.tickMarks().nearestIndex(t); const o = s.bars().lastIndex(); if (null === o) return null; n = Math.min(n, o); let a = Object(r.ensureNotNull)(i.tickMarks().indexToTime(n)) .valueOf(); for (; a < t && n < o;) n++, a = Object(r.ensureNotNull)(i .tickMarks().indexToTime(n)).valueOf(); const l = Object(r.ensureNotNull)(i.visibleBarsStrictRange()), c = l.lastBar() - l.firstBar(); return !e && l.contains(n) || i.zoomToBarsRange(n - c / 2, n + c / 2), { timestamp: Object(r.ensureNotNull)(i.indexToTimePoint(n)) } } return null })(this._scrollingState.centerIfVisible, this._scrollingState.targetDate); if (!o) { const t = Object(r.ensureDefined)(i.tickMarks().minIndex), n = Object(r.ensureNotNull)(i.visibleBarsStrictRange()), a = n.lastBar() - n.firstBar(); if (s.endOfData()) i.zoomToBarsRange(t - a / 2, t + a / 2), o = { timestamp: Object(r.ensureNotNull)(i.indexToTimePoint(t)), eod: !0 }; else { const t = i.tickMarks().estimateLeft(e); i.requestMoreHistoryPoints(Math.ceil(t + a / 2)) } } return o && (this.fullUpdate(), this._scrollingState = null, n.resolve(o)), n .promise } _setCorrectedPositionToCrosshair(e, t, i, s) { const n = this.crossHairSource(); n.setPosition(e, t, s); const o = this._timeScale.indexToCoordinate(e), a = s.defaultPriceScale().priceToCoordinate(t, Object(r.ensureNotNull)(i)); n.saveOriginCoords(o, a) } } }, gQ5K: function(e, t, i) { "use strict"; i.r(t), i.d(t, "DateFormatter", (function() { return n })); var s = i("iboI"), r = i("e1ZQ"); class n { constructor(e = "yyyy-MM-dd") { this._dateFormatFunc = r.b[e] } format(e) { return s.customFormatters && s.customFormatters.dateFormatter ? s.customFormatters .dateFormatter.format(e) : this._dateFormatFunc(e, !1) } formatLocal(e) { return s.customFormatters.dateFormatter ? s.customFormatters.dateFormatter .formatLocal ? s.customFormatters.dateFormatter.formatLocal(e) : s .customFormatters.dateFormatter.format(e) : this._dateFormatFunc(e, !0) } } }, gWrr: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return n })); const s = new WeakMap; function r(e, t) { let i, r; return i = null == t ? document.documentElement : 9 === t.nodeType ? t.documentElement : t, s && (r = s.get(i)), r || (r = i.ownerDocument.createRange(), r.selectNodeContents(i), s && s.set(i, r)), r.createContextualFragment(e) } function n(e, t) { const i = r(e, t); let s; if ("firstElementChild" in i) s = i.firstElementChild; else { s = null; for (let e = 0; e < i.childNodes.length; e++) { const t = i.childNodes[e]; if (1 === t.nodeType) { s = t; break } } } return null !== s && i.removeChild(s), s } }, gaBL: function(e, t, i) { "use strict"; i.r(t), i.d(t, "sourceNewCurrencyOnPinningToPriceScale", (function() { return r })); var s = i("/tGj"); function r(e, t, i, r) { let n = null; if (i.currencyConversionEnabled() && Object(s.isSymbolSource)(e)) { const s = i.availableCurrencies(), o = t.currency(s), a = e.currency(); null !== o && null !== o.selectedCurrency && !o.allCurrenciesAreOriginal && o .selectedCurrency !== a && (r && null === a || null !== a && s.convertible(a)) && ( n = o.selectedCurrency) } return n } }, gf4d: function(e, t, i) { "use strict"; var s = i("Eyy1").assert, r = i("MSvv").StudyLineDataSource, n = i("tqok").INVALID_TIME_POINT_INDEX, o = "RegressionTrend@tv-basicstudies"; function a(e) { return void 0 !== e.startPrice && void 0 !== e.endPrice } class l extends r { constructor(e, t, s) { s = s || e.studyMetaInfoRepository().findByIdSync({ type: "java", studyId: o }); var n = t || r._createPropertiesFromStudyMetaInfo(s, e.studyVersioning()); super(e, s, "linreg_", n), this._trendData = null, i.e("lt-pane-views").then(i.t .bind(null, "IMGS", 7)).then(({ RegressionTrendPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } formatter() { s(!1, "This method should never be called") } pointsCount() { return 2 } clearData() { this._trendData = null, super.clearData() } state(e) { var t = r.prototype.state.call(this, e); return e ? Object.assign({}, t, { nonseriesdata: this._trendData }) : t } restoreData(e) { super.restoreData(e), this._trendData = e.nonseriesdata ? e.nonseriesdata : null } startIndex() { if (null === this._trendData || null === this._indexes) return null; var e = this._indexes[this._trendData.startIndex]; return e !== n ? e : null } endIndex() { if (null === this._trendData || null === this._indexes) return null; var e = this._indexes[this._trendData.endIndex]; return e !== n ? e : null } baseLine() { return null === this._trendData ? null : this._trendData.baseLine } downLine() { return null === this._trendData ? null : this._trendData.downLine } upLine() { return null === this._trendData ? null : this._trendData.upLine } pearsons() { return null === this._trendData ? null : this._trendData.pearsons } recalcStudyIfNeeded() { this._onStudyInputsMayChange() } _studyInputs(e) { s(2 === e.length, "all the line tool points should be defined"); var t = e[0], i = e[1]; if (t.index === i.index) return null; const r = this._getPointTime(t.index <= i.index ? t : i, !0), n = this._getPointTime(i.index >= t.index ? i : t, !0); if (null === r || null === n) return this._subscribeApplyInputsOnSeriesCompleted(), null; var o = 1e3 * r, a = 1e3 * n; return { "upper diviation": this.properties().inputs["upper diviation"].value(), "lower diviation": this.properties().inputs["lower diviation"].value(), "use upper diviation": this.properties().inputs["use upper diviation"].value(), "use lower diviation": this.properties().inputs["use lower diviation"].value(), "first bar time": o, "last bar time": a, source: this.properties().inputs.source.value() } } _onDataUpdated(e, t, i) { null !== t && (t.indexes_replace || (this._trendData = t.data), this._indexes = i, super._onDataUpdated(e, t, i)) } _updateAnchorsPrice() { !this._trendData || TradingView.isNaN(this._trendData.baseLine.startPrice) || TradingView.isNaN(this._trendData.baseLine.endPrice) || (this._points[0].price = this._trendData.baseLine.startPrice, this._points[1].price = this._trendData .baseLine.endPrice) } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(61), i.e(62), i.e( "study-property-pages-with-definitions")]).then(i.bind(null, "4lou"))) .RegressionTrendDefinitionsViewModel } _isReady() { return this._trendData && void 0 !== this._trendData.startIndex && void 0 !== this ._trendData.endIndex && a(this._trendData.upLine) && a(this._trendData .baseLine) && a(this._trendData.downLine) } static createProperties(e) { return r._createPropertiesFromStudyIdAndState(o, e) } static createPropertiesFromStudyMetaInfoAndState(e, t, i, s) { return r.createPropertiesFromStudyMetaInfoAndState(e, t, i, s) } static studyId() { return o } cloneable() { return !1 } } l.prototype.version = 2, t.LineToolRegressionTrend = l }, gvrv: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return m })); var s = i("Eyy1"), r = i("aIyQ"), n = i.n(r), o = i("k9/m"), a = i("hsV8"), l = i("jy4L"), c = i("w4Ji"), h = i("jenN"), u = i("txPx"); const d = Object(u.getLogger)("Chart.StudyDataSource"); var p, _; ! function(e) { e[e.Undefined = 0] = "Undefined", e[e.Loading = 1] = "Loading", e[e.Completed = 2] = "Completed", e[e.Error = 3] = "Error" }(p || (p = {})), function(e) { e[e.Idle = 0] = "Idle", e[e.AwaitingConnection = 1] = "AwaitingConnection", e[e .AwaitingParent = 2] = "AwaitingParent", e[e.AwaitingFirstDataUpdate = 3] = "AwaitingFirstDataUpdate", e[e.Active = 4] = "Active" }(_ || (_ = {})); class m { constructor(e, t, i, s) { this._inputs = null, this._status = _.Idle, this._studyId = null, this ._turnaroundCounter = 1, this._studyStatus = { type: p.Undefined }, this._studyStatusChanged = new n.a, this._graphics = new h.LiveStudyGraphics, this._dataCleared = new n.a, this._dataUpdated = new n.a, this ._boundOnGatewayIsConnectedChanged = this._onGatewayIsConnectedChanged.bind( this), this._ongoingDataUpdate = Promise.resolve(), this._gateway = e, this ._metaInfo = s, this._seriesSource = t, this._turnaroundPrefix = i, this ._plots = new o.PlotList(Object(c.studyPlotFunctionMap)(s), c .studyEmptyPlotValuePredicate), this._gateway.isConnected().subscribe(this ._boundOnGatewayIsConnectedChanged) } destroy() { this.stop(), this._gateway.isConnected().unsubscribe(this ._boundOnGatewayIsConnectedChanged), this._dataUpdated.destroy(), this ._dataCleared.destroy(), this._studyStatusChanged.destroy() } metaInfo() { return this._metaInfo } inputs() { return this._inputs } setInputs(e) { this._inputs = e, null !== this._studyId && (this._turnaroundCounter++, this ._onStudyStatusChangedTo({ type: p.Undefined }), this._gateway.modifyStudy(this._studyId, this._turnaround(), e, this ._onMessage.bind(this)), this._status === _.Active && this ._changeStatusTo(_.AwaitingFirstDataUpdate)) } isStarted() { return this._status !== _.Idle } isActive() { return this._status === _.Active } start() { this.isStarted() ? d.logNormal( "start: data source is already started, nothing to do") : (Object(s.assert)( null !== this._inputs, "Inputs should be defined when starting a study data source"), this ._gateway.isConnected().value() ? this._createStudy() : this ._changeStatusTo(_.AwaitingConnection)) } stop() { this.isStarted() ? (null !== this._studyId && (this._gateway.removeStudy(this ._studyId), this._studyId = null, this._onStudyStatusChangedTo({ type: p.Undefined })), this._changeStatusTo(_.Idle)) : d.logNormal( "stop: data source is already stopped, nothing to do") } studyId() { return this._studyId } studyStatus() { return this._studyStatus } studyStatusChanged() { return this._studyStatusChanged } plots() { return this._plots } graphics() { return this._graphics } clearData() { this._plots.clear(), this._graphics.clear(), this._dataCleared.fire() } stopAndStealData() { Object(s.assert)(this._status === _.Active, "Couldn't steal data from non-active data source"), this.stop(); const e = this._plots, t = this._graphics.extract(); return this._plots = new o.PlotList(Object(c.studyPlotFunctionMap)(this._metaInfo), c.studyEmptyPlotValuePredicate), { plots: e, graphics: t } } dataCleared() { return this._dataCleared } dataUpdated() { return this._dataUpdated } moveData(e) { this._ongoingDataUpdate = this._ongoingDataUpdate.then(() => { this._plots.move(e) }) } _changeStatusTo(e) { Object(s.assert)(this._status !== e, "Source and destination status should be distinct"), d.logNormal( `Status changed from ${_[this._status]} to ${_[e]}`), this._status = e } _createStudy() { const e = this._seriesSource.instanceId(); null !== e ? this._createStudyUsingParentId(e) : (this._changeStatusTo(_ .AwaitingParent), this._seriesSource.dataEvents().completed().subscribe( this, this._onSeriesCompleted, !0)) } _createStudyUsingParentId(e) { Object(s.assert)(this._status !== _.Active, 'Status should not be "Active" when creating a study'), Object(s.assert)( this._studyStatus.type === p.Undefined, 'Study status should be "Undefined" when creating a study'), Object(s .assert)(null === this._studyId, "Study id should be empty when creating a study"), this._studyId = Object(l .makeNextStudyId)(), this._gateway.createStudy(this._studyId, this ._turnaround(), e, this._metaInfo.fullId + ("tv-basicstudies" === this ._metaInfo.packageId ? "" : "!"), Object(s.ensureNotNull)(this._inputs), this._onMessage.bind(this)), this._changeStatusTo(_.AwaitingFirstDataUpdate) } _onGatewayIsConnectedChanged(e) { e ? this._onGatewayConnected() : this._onGatewayDisconnected() } _onGatewayConnected() { this._status === _.AwaitingConnection && this._createStudy() } _onGatewayDisconnected() { this._status !== _.Idle && this._status !== _.AwaitingConnection && (this._studyId = null, this._changeStatusTo(_.AwaitingConnection), this._studyStatus.type !== p.Undefined && this._onStudyStatusChangedTo({ type: p.Undefined })), this._turnaroundCounter = 1 } _onSeriesCompleted() { this._status === _.AwaitingParent && this._createStudyUsingParentId(Object(s.ensure) (this._seriesSource.instanceId())) } _onStudyStatusChangedTo(e) { const t = this._studyStatus; this._studyStatus = e, d.logNormal( `Study status type changed from ${p[t.type]} to ${p[e.type]}`), this ._studyStatusChanged.fire(t, e) } _onMessage(e) { if ("data_update" === e.method) { const { customId: t, turnaround: i, plots: r, nonseries: n } = e.params; t === this._studyId && this._checkTurnaround(i) && this._onDataUpdate(r, Object( s.ensureDefined)(n)) } else if ("study_loading" === e.method) { const [t, i, s] = e.params; t === this._studyId && this._checkTurnaround(i) && this._onStudyLoading(s) } else if ("study_completed" === e.method) { const [t, i, s] = e.params; t === this._studyId && this._checkTurnaround(i) && this._onStudyCompleted(s) } else if ("study_error" === e.method) { const [t, i, s, r, n] = e.params; t === this._studyId && this._checkTurnaround(i) && this._onStudyError(s, r, n) } else "clear_data" === e.method && this._checkTurnaround(e.params.turnaround) && this.clearData() } _onDataUpdate(e, t) { const i = Object(a.unpackNonSeriesData)(t.d); return this._ongoingDataUpdate = this._ongoingDataUpdate.then(() => i, () => i) .then(this._onDataUnpacked.bind(this, e, t.indexes)), this._ongoingDataUpdate } _onDataUnpacked(e, t, i) { this._status !== _.Idle && (this._status === _.AwaitingFirstDataUpdate && (this ._changeStatusTo(_.Active), this.clearData()), this._mergePlots(e), null !== i && (i.indexes_replace ? (Object(s.assert)("nochange" !== t), this ._graphics.replaceIndexesTo(t)) : ("nochange" !== t && this ._graphics.replaceIndexesTo(t), void 0 !== i.graphicsCmds && this._graphics.processCommands(i .graphicsCmds, this._metaInfo.graphics))), this._dataUpdated.fire(e, i, t)) } _onStudyLoading(e) { this._onStudyStatusChangedTo({ type: p.Loading, startTime: Date.now() }) } _onStudyError(e, t, i) { this.clearData(); const s = "string" == typeof e ? { error: e.split(":", 2)[0] } : e; this._onStudyStatusChangedTo({ type: p.Error, errorDescription: s }) } _onStudyCompleted(e) { this._onStudyStatusChangedTo({ type: p.Completed }) } _mergePlots(e) { this._plots.merge(e) } _turnaround() { return `${this._turnaroundPrefix}${this._turnaroundCounter}` } _checkTurnaround(e) { const t = this._turnaround(); return e === t || e === this._seriesSource.turnaround() || e === `${this._seriesSource.turnaround()}_${t}` } } }, gyZD: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PaneRendererLine", (function() { return l })); var s = i("aO4+"), r = i("GEp6"), n = i("VdBB"), o = i("jFln"), a = i("Zp/P"); class l { constructor(e) { this._data = e } hitTest(e, t) { const i = Object(a.interactionTolerance)().series + this._data.lineWidth / 2; let o = 0, l = this._data.items.length - 1; for (; l - o > 2;) { const t = Math.round((l + o) / 2); this._data.items[t].x <= e.x ? o = t : l = t } o = Math.max(1, o - 1), l = Math.min(this._data.items.length - 1, l + 1); for (let t = o; t <= l; ++t) { const o = this._data.items[t - 1], a = this._data.items[t], l = o.x, c = a.x; if (Object(r.distanceToSegment)(new s.Point(l, o.y), new s.Point(c, a.y), new s .Point(e.x, e.y)).distance <= i) return this._data.hittest ? this._data .hittest : new n.HitTestResult(n.HitTestResult.REGULAR) } return null } draw(e, t) { e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.lineCap = "square", e.lineJoin = "round", e.strokeStyle = this._data.lineColor, e.fillStyle = this._data .lineColor, e.lineWidth = this._data.lineWidth, Object(o.setLineStyle)(e, this ._data.lineStyle), Object(a.setValidLineStyle)(e, this._data.lineStyle), this._data.simpleMode ? this._drawSimpleMode(e, t.pixelRatio) : this._drawLines( e), e.restore() } _drawSimpleMode(e, t) { if (e.beginPath(), this._walkLine(e, this._data.items, !1, NaN), e.stroke(), this ._data.withMarkers) { e.save(), e.scale(1 / t, 1 / t); const i = Math.max(1, Math.floor(t)) % 2 / 2, s = (this._data.lineWidth + 2) * t + i, r = 2 * Math.PI; e.beginPath(); for (let n = this._data.items.length; n--;) { const o = this._data.items[n]; if (o) { const n = Math.round(o.x * t) + i, a = o.y * t; e.moveTo(n, a), e.arc(n, a, s, 0, r) } } e.fill(), e.restore() } } _walkLine(e, t, i, s) { if (!t) return; const r = .25 * this._data.barSpacing; let n, o, l, c, h; const u = a.coordinateIsValid; for (let e = 0; e < t.length; e++) { const i = t[e]; if (u(i.y)) { o = i, n = e; break } } if (void 0 !== n && void 0 !== o) for (let o = n; o < t.length; o++) { c = t[o], h = t[o + 1] || {}; const a = Math.round(c.x); if (u(c.y)) if (l && u(l.y)) e.lineTo(a, c.y), i && !u(h.y) && e.lineTo(a, s); else if (h && u(h.y)) i ? (o !== n && e.lineTo(a, s), e.lineTo(a, c .y)) : e.moveTo(a, c.y); else if (i) { if (0 === o) continue; o !== n && e.lineTo(a - r, s), e.lineTo(a - r, c.y), e.lineTo(a + r, c .y), e.lineTo(a + r, s) } else e.moveTo(a - r, c.y), e.lineTo(a + r, c.y); l = c } } _drawLines(e) { if (!this._data.items.length) return; let t, i, s; const r = .25 * this._data.barSpacing, n = a.coordinateIsValid; e.beginPath(); const o = this._data.items[0]; o && e.moveTo(o.x, o.y); let l, c = e.strokeStyle, h = e.lineWidth; for (let o = 1; o < this._data.items.length; ++o) { let _, m, f; t = this._data.items[o - 1], i = this._data.items[o], s = this._data.items[o + 1], i.style && !this._data.forceLineColor ? (_ = i.style.color, m = i .style.width, f = i.style.style) : (_ = this._data.lineColor, m = this ._data.lineWidth, f = this._data.lineStyle), this._data .ignorePaletteLineWidth && (m = this._data.lineWidth); (_ !== c || m !== h || f !== l) && (c = _, h = m, l = f, e.stroke(), e .beginPath(), e.strokeStyle = _, e.lineWidth = m, Object(a .setValidLineStyle)(e, f), e.moveTo(t.x, t.y)), u = t, p = s, n((d = i) .y) && (n(u.y) ? e.lineTo(d.x, d.y) : p && n(p.y) ? e.moveTo(d.x, d.y) : (e.moveTo(d.x - r, d.y), e.lineTo(d.x + r, d.y))) } var u, d, p; e.stroke() } } }, gzUS: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PointsetsManager", (function() { return o })); var s = i("LxhU"), r = i("txPx"); const n = Object(r.getLogger)("ChartApi.PointsetsManager"); class o { constructor() { this._pointsetsDataBySymbol = new Map } destroy() { this._pointsetsDataBySymbol.clear() } createPointset(e, t, i, s, r) { let o = this._pointsetsDataBySymbol.get(t); void 0 === o && (o = new Map, this._pointsetsDataBySymbol.set(t, o)); const a = []; for (const t of s) { const [i, s] = t; "number" != typeof i || Number.isNaN(i) ? n.logWarn( `Pointset time is invalid: id=${e}, ${i} of type ${typeof i}`) : a .push({ point: t, extrapolation: r.extrapolateTimeWithOffsetToTime(1e3 * i, s) }) } s.length === a.length && o.set(e, { resolution: i, points: a }) } removePointset(e) { const t = []; this._pointsetsDataBySymbol.forEach((i, s) => { i.delete(e), 0 === i.size && t.push(s) }); for (const e of t) this._pointsetsDataBySymbol.delete(e) } invalidatePointsetsForSymbol(e, t) { const i = this._pointsetsDataBySymbol.get(e); void 0 !== i && i.forEach((e, i) => { if (s.Interval.isEqual(e.resolution, t)) for (const t of e.points) null !== t.extrapolation && t .extrapolation.exact && (t.extrapolation.exact = !1) }) } getUpdatesForSymbol(e, t, i, s) { const r = new Map, n = this._pointsetsDataBySymbol.get(e); return void 0 !== n && n.forEach((e, n) => { const o = this._refreshPointsetData(e, t, i, s); null !== o && r.set(n, o) }), r } _refreshPointsetData(e, t, i, r) { if (s.Interval.isEqual(e.resolution, t)) for (let t = 0; t < e.points.length; ++t) { const s = e.points[t]; if (null !== s.extrapolation && s.extrapolation.exact) continue; const [r, n] = s.point; s.extrapolation = i.extrapolateTimeWithOffsetToTime(1e3 * r, n) } const o = []; for (let i = 0; i < e.points.length; ++i) { const s = e.points[i]; if (null === s.extrapolation) return null; const a = r.indexOfTime(s.extrapolation.timeMs); if (null === a) return n.logWarn( `Cannot get index of time: time=${s.extrapolation.timeMs}, ${e.resolution} -> ${t}` ), null; o.push({ index: i, value: [a.index, a.timeMs / 1e3] }) } return o } } }, h24c: function(e, t, i) { "use strict"; var s = i("Kxc7"), r = i("pPtI"), n = i("PT1i"), o = i("LxhU"); i.d(t, "d", (function() { return a })), i.d(t, "c", (function() { return l })), i.d(t, "a", (function() { return c })), i.d(t, "b", (function() { return h })); new RegExp("^quandl", "i"); function a(e) { let t; t = /^[,\s]*(\d*)\s*([hdwmst]?)\s*$/i; const i = t.exec(e) || [], s = ~~i[1], r = i[2] && i[2].toUpperCase() || null, n = { qty: !s && r ? 1 : s, unit: r }; return n.error = !s && !r, n.intraday = !(n.error || n.unit && "H" !== n.unit && "S" !== n .unit && "T" !== n.unit), n } function l(e) { if (s.enabled("allow_supported_resolutions_set_only")) { const t = o.Interval.normalize(e); return null !== t && Object(r.isAvailable)(t) } { const t = a(e); if (t.error) return !1; if (t.intraday) return n.linking.intraday.value(); { const e = n.linking.supportedResolutions.value(); return !e || null !== t.unit && !!~e.indexOf(t.unit) } } } function c() { let e = !1; return s.enabled("show_spread_operators") && (e = !0), e } function h(e) { return !e.ctrlKey && (!e.metaKey && (!!e.charCode && (!(!e.which || e.which <= 32) && ( null === e.target || !/^(input|textarea)$/i.test(e.target.tagName))))) } }, hBTJ: function(e, t, i) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.intersectPolygons = t.intersectPolygonAndHalfplane = t.intersectRayAndBox = t .intersectLineAndBox = t.intersectLineSegments = t.intersectLines = t .intersectLineSegmentAndBox = void 0; var s = i("Eyy1"), r = i("aO4+"), n = i("GEp6"), o = i("f6yo"); function a(e, t) { var i = e.A, s = t.A, n = e.B, o = t.B, a = e.C, l = t.C, c = i * o - s * n; if (Math.abs(c) < 1e-6) return null; var h = (n * l - o * a) / c, u = (s * a - i * l) / c; return new r.Point(h, u) } function l(e, t, i, s) { var r = function(e, t, i, s) { var r = t.subtract(e), n = s.subtract(i), o = r.x * n.y - r.y * n.x; if (Math.abs(o) < 1e-6) return null; var a = e.subtract(i); return (a.y * n.x - a.x * n.y) / o }(e, t, i, s); if (null === r) return null; var o = t.subtract(e).scaled(r).add(e), a = n.distanceToSegment(i, s, o); return Math.abs(a.distance) < 1e-6 ? r : null } function c(e, t) { for (var i = 0, s = e; i < s.length; i++) { var n = s[i]; if (r.equalPoints(n, t)) return !1 } return e.push(t), !0 } function h(e, t) { return !(e.length > 0 && (r.equalPoints(e[e.length - 1], t) || r.equalPoints(e[0], t))) && ( e.push(t), !0) } function u(e, t) { for (var i = [], s = 0; s < e.length; ++s) { var n = e[s], l = e[(s + 1) % e.length], c = r.lineThroughPoints(n, l); if (o.pointInHalfplane(n, t)) { if (h(i, n), !o.pointInHalfplane(l, t)) null !== (u = a(c, t.edge)) && h(i, u) } else if (o.pointInHalfplane(l, t)) { var u; null !== (u = a(c, t.edge)) && h(i, u) } } return i.length >= 3 ? i : null } t.intersectLineSegmentAndBox = function(e, t) { var i = e[0].x, s = e[0].y, n = e[1].x, o = e[1].y, a = t.min.x, l = t.min.y, c = t.max.x, h = t.max.y; function u(e, t, i, s, r, n) { var o = 0; return e < i ? o |= 1 : e > r && (o |= 2), t < s ? o |= 4 : t > n && (o |= 8), o } for (var d = u(i, s, a, l, c, h), p = u(n, o, a, l, c, h), _ = !1, m = 0;;) { if (m > 1e3) throw new Error("Cohen - Sutherland algorithm: infinity loop"); if (m++, !(d | p)) { _ = !0; break } if (d & p) break; var f = d || p, g = void 0, b = void 0; 8 & f ? (g = i + (n - i) * (h - s) / (o - s), b = h) : 4 & f ? (g = i + (n - i) * ( l - s) / (o - s), b = l) : 2 & f ? (b = s + (o - s) * (c - i) / (n - i), g = c) : (b = s + (o - s) * (a - i) / (n - i), g = a), f === d ? d = u(i = g, s = b, a, l, c, h) : p = u(n = g, o = b, a, l, c, h) } return _ ? r.equalPoints(r.point(i, s), r.point(n, o)) ? r.point(i, s) : r.lineSegment(r .point(i, s), r.point(n, o)) : null }, t.intersectLines = a, t.intersectLineSegments = l, t.intersectLineAndBox = function(e, t) { var i = t.min.x, n = t.min.y, o = t.max.x, a = t.max.y; if (0 === e.A) { var l = -e.C / e.B; return n <= l && l <= a ? r.lineSegment(r.point(i, l), r.point(o, l)) : null } if (0 === e.B) { var h = -e.C / e.A; return i <= h && h <= o ? r.lineSegment(r.point(h, n), r.point(h, a)) : null } var u = [], d = function(t) { var i = function(e, t) { return -(e.C + e.A * t) / e.B }(e, t); n <= i && i <= a && c(u, new r.Point(t, i)) }, p = function(t) { var s = function(e, t) { return -(e.C + e.B * t) / e.A }(e, t); i <= s && s <= o && c(u, new r.Point(s, t)) }; switch (d(i), p(n), d(o), p(a), u.length) { case 0: return null; case 1: return u[0]; case 2: return r.equalPoints(u[0], u[1]) ? u[0] : r.lineSegment(u[0], u[1]) } return s.assert(!1, "We should have at most two intersection points"), null }, t.intersectRayAndBox = function(e, t, i) { var s = l(e, t, i.min, new r.Point(i.max.x, i.min.y)), n = l(e, t, new r.Point(i.max.x, i.min.y), i.max), a = l(e, t, i.max, new r.Point(i.min.x, i.max.y)), c = l(e, t, new r.Point(i.min.x, i.max.y), i.min), h = []; if (null !== s && s >= 0 && h.push(s), null !== n && n >= 0 && h.push(n), null !== a && a >= 0 && h.push(a), null !== c && c >= 0 && h.push(c), 0 === h.length) return null; h.sort((function(e, t) { return e - t })); var u = o.pointInBox(e, i) ? h[0] : h[h.length - 1]; return e.addScaled(t.subtract(e), u) }, t.intersectPolygonAndHalfplane = u, t.intersectPolygons = function(e, t) { for (var i = e, s = 0; s < t.length && null !== i; ++s) { var n = t[s], o = t[(s + 1) % t.length], a = t[(s + 2) % t.length], l = r.lineThroughPoints(n, o); i = u(i, r.halfplaneThroughPoint(l, a)) } return i } }, hGf4: function(e, t, i) { "use strict"; (function(e, t) { var s = i("UXvI").default, r = i("hbEN").default, n = i("kcTO").PriceFormatter; const { uniq: o } = i("L6rT"); var a, l = i("e3/o"), c = i("i/Bj").parseUpdateMode, h = i("FIi8").deepExtend; function u(t, i) { this.options = Object.assign({ throttleTimeout: 125 }, i), this._connected = !1, this._symbol_data = {}, this._subscriptions = {}, this.onConnect = new e, this.onDisconnect = new e, this._quoteApi = new a(window .ChartApiInstance), this._type = t || "full", this._delayUpdateFastSymbols = r(this._updateFastSymbols, 250), this._throttledSymbolData = {}, this ._formatterValuesCache = {}, this._waitingForFormatters = {}, this ._snapshotValuesCache = {}, this._waitingForSnapshot = {}, this.connect() } a = i("wi9r"), u.prototype.destroy = function() { this._quoteApi.destroy(), this._quoteApi = null, this._connected = !1, this .onDisconnect.fire() }, u.prototype.typeFields = {}, u.prototype.typeFields.simple = [ "base-currency-logoid", "ch", "chp", "currency-logoid", "currency_code", "current_session", "description", "exchange", "format", "fractional", "is_tradable", "language", "local_description", "logoid", "lp", "lp_time", "minmov", "minmove2", "original_name", "pricescale", "pro_name", "short_name", "type", "update_mode", "volume" ], u.prototype.typeFields.simpleDetailed = [].concat(u.prototype.typeFields.simple, ["ask", "bid", "fundamentals", "high_price", "is_tradable", "low_price", "open_price", "prev_close_price", "rch", "rchp", "rtc", "rtc_time", "status", "basic_eps_net_income", "beta_1_year", "earnings_per_share_basic_ttm", "industry", "market_cap_basic", "price_earnings_ttm", "sector", "volume", "dividends_yield", "timezone" ]), u.prototype.typeFields.full = [], u.prototype.typeFields.watchlist = [] .concat(u.prototype.typeFields.simple, ["rchp", "rtc", "country_code", "provider_id" ]), u.prototype.typeFields.portfolio = ["pro_name", "short_name", "exchange", "description", "sector", "type", "currency_code", "currency_id", "ch", "chp", "logoid", "currency-logoid", "base-currency-logoid", "earnings_per_share_forecast_next_fq", "earnings_release_next_date", "earnings_release_date", "earnings_per_share_fq", "lp", "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" ], u.prototype.connect = function(e) { this._quoteApi.connect(this.quoteHandler.bind(this)) }, u.prototype.quoteHandler = function(e) { var t = e.method, i = e.params; switch (t) { case "connected": this._connected || (this._connected = !0, this.onConnected()); break; case "quote_list_fields": break; case "quote_symbol_data": this._connected && this.onSymbolData(i[0]); break; case "quote_completed": this._connected && this.onSymbolData({ symbolname: i[0], complete: performance.now(), values: {} }); break; case "disconnected": this._connected && (this._connected = !1, this.onDisconnect.fire()) } }, u.prototype.onConnected = function() { this.setFields(); var e = Object.keys(this._symbol_data); e.length && (this._quoteApi.quoteAddSymbols(e, { forcePermission: !0 }), this._delayUpdateFastSymbols()), this.onConnect.fire() }, u.prototype.setFields = function() { var e = u.prototype.typeFields[this._type]; e && e.length && this._quoteApi.quoteSetFields(e) }, u.prototype.onSymbolData = function(e) { var t = e.symbolname, i = this._throttledSymbolData[t]; i || (i = this._throttledSymbolData[t] = { fnDispatch: s(this.dipatchSymbolData.bind(this), this.options .throttleTimeout) }), i.cache ? h(i.cache, e) : i.cache = e, i.fnDispatch(t) }, u.prototype._parseUpdateMode = function(e) { var t = c(e.update_mode); null !== t && (e.update_mode = t.mode, e.update_mode_seconds = t.interval) }, u.prototype.dipatchSymbolData = function(e) { var t = this._symbol_data[e], i = this._throttledSymbolData[e].cache; if (delete this._throttledSymbolData[e].cache, this._symbol_data[e]) for (var s in h(t, i), t.values && this._parseUpdateMode(t.values), this ._subscriptions) { var r = this._subscriptions[s]; r.has(e) && r.get(e).forEach((function(e) { e(t, i) })) } }, u.prototype.subscribe = function(e, t, i) { this._subscriptions[e] = this._subscriptions[e] || new Map; var s = this._subscriptions[e]; t = [].concat(t); var r = []; t.forEach((function(e) { this._symbol_data[e] ? s && s.has(e) || this._symbol_data[e] .subscribers_count++ : (this._symbol_data[e] = { subscribers_count: 1 }, r.push(e)), s.has(e) || s.set(e, []), s.get(e).push(i), s .get(e).fast = !0, this._symbol_data[e] && this ._symbol_data[e].values && i(this._symbol_data[e], this ._symbol_data[e]) }), this), r.length && this._connected && (this._quoteApi.quoteAddSymbols( r, { forcePermission: !0 }), this._delayUpdateFastSymbols()) }, u.prototype.unsubscribe = function(e, t, i) { t = [].concat(t); for (var s = this._subscriptions[e], r = [], n = 0; n < t.length; n++) { var o = t[n]; if (s) if (s.has(o) && i) { var a = s.get(o).indexOf(i); ~a && s.get(o).splice(a, 1), s.get(o).length || s.delete(o) } else s.delete(o); s && 0 === s.size && delete this._subscriptions[e], this._symbol_data .hasOwnProperty(o) && (s && !s.has(o) && this._symbol_data[o] .subscribers_count--, this._symbol_data[o].subscribers_count || ( delete this._symbol_data[o], r.push(o))) } r.length && this._connected && (this._quoteApi.quoteRemoveSymbols(r), this ._delayUpdateFastSymbols()) }, u.prototype.setFastSymbols = function(e, t) { if (this._subscriptions[e]) for (var i = this._subscriptions[e], s = Array.from(i.keys()), r = 0; r < s .length; ++r) { var n = s[r]; i.get(n).fast = -1 !== t.indexOf(n) } this._delayUpdateFastSymbols() }, u.prototype._updateFastSymbols = function() { if (this._connected) { var e = this._fastSymbols(); 0 === e.length ? this._quoteApi.quoteHibernateAll() : this._quoteApi .quoteFastSymbols(e) } }, u.prototype._delayUpdateFastSymbols = u.prototype._updateFastSymbols, u.prototype ._fastSymbols = function() { var e = []; for (var t in this._subscriptions) for (var i = this._subscriptions[t], s = Array.from(i.keys()), r = 0; r < s .length; ++r) { var n = s[r]; i.get(n).fast && e.push(n) } return e = o(e) }, u.prototype.formatter = function(e, t) { var i = this; if (this._waitingForFormatters[e]) return this._waitingForFormatters[e]; function s(e) { var i = t && !e.fractional ? 1 : e.minmov; return new n(e.pricescale, i, e.fractional, e.minmove2) } var r = new Promise((function(t, r) { if (i._formatterValuesCache[e]) t(s(i._formatterValuesCache[ e])); else { var n = l.guid(); i.subscribe(n, [e], (function(o) { "error" === o.status && (i ._waitingForFormatters[e] = null, r( "Quotes snapshot is not received" )), function(e) { return e && null != e.pricescale && null != e.minmov }(o.values) && (i._waitingForFormatters[ e] = null, i ._formatterValuesCache[e] = o .values, t(s(o.values)), i .unsubscribe(n, e)) })) } })); return this._waitingForFormatters[e] = r, r }, u.prototype.snapshot = function(e) { var t = this; if (this._waitingForSnapshot[e]) return this._waitingForSnapshot[e]; var i = new Promise((function(i, s) { if (t._snapshotValuesCache[e]) i(t._snapshotValuesCache[e]); else { var r = l.guid(); t.subscribe(r, [e], (function(n) { "error" === n.status && (t ._waitingForSnapshot[e] = null, s( "Quotes snapshot is not received" )); var o = n.values; o && o.minmov && o.pricescale && o .description && (t._waitingForSnapshot[ e] = null, t ._snapshotValuesCache[e] = o, i(o), t.unsubscribe(r, e)) })) } })); return this._waitingForSnapshot[e] = i, i }, TradingView.QuoteSessionMultiplexer = u, t && t.exports && (t.exports = u) }).call(this, i("aIyQ"), i("YuTi")(e)) }, hOqT: function(e, t, i) { "use strict"; i.r(t), i.d(t, "getTranslatedSymbolDescription", (function() { return s })); i("YFKU"); function s(e) { return e.description || "" } }, hP9j: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolPolyline", (function() { return l })); var s = i("Eyy1"), r = i("aO4+"), n = i("Ocx9"), o = i("Zp/P"), a = i("Ss5c"); class l extends a.LineDataSource { constructor(e, t) { const s = t || l.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "C2CE")).then(t => { this._setPaneViews([new t.PolylinePaneView(this, e)]) }) } pointsCount() { return -1 } properties() { return super.properties() } name() { return "Polyline" } hasEditableCoordinates() { return !1 } addPoint(e, t, i) { var n; const a = Object(s.ensureNotNull)(this.priceScale()), l = this._model.timeScale().indexToCoordinate(e.index), c = e.price, h = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ? void 0 : n.firstValue()), u = a.priceToCoordinate(c, h), d = Object(o.interactionTolerance)().minDistanceBetweenPoints; if (this._points.length > 0) { const e = this._points[this._points.length - 1], t = this._model.timeScale().indexToCoordinate(e.index), i = e.price, s = a.priceToCoordinate(i, h); if (new r.Point(l, u).subtract(new r.Point(t, s)).length() < d) return this ._lastPoint = null, this.normalizePoints(), this .createServerPoints(), !0; const n = this._points[0], o = this._model.timeScale().indexToCoordinate(n.index), c = n.price, p = a.priceToCoordinate(c, h); if (new r.Point(l, u).subtract(new r.Point(o, p)).length() < d) return this .properties().childs().filled.setValue(!0), this._lastPoint = null, this.normalizePoints(), this.createServerPoints(), !0 } return super.addPoint(e, t, i) } setPoint(e, t, i) { var n; super.setPoint(e, t, i); const a = this.priceScale(); if (!(this._model.timeScale().isEmpty() || null === a || a.isEmpty() || e !== this._points.length - 1 && 0 !== e)) { const i = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ? void 0 : n.firstValue()), l = this._model.timeScale().indexToCoordinate(t.index), c = a.priceToCoordinate(t.price, i), h = e === this._points.length - 1 ? this._points[0] : this._points[this ._points.length - 1], u = this._model.timeScale().indexToCoordinate(h.index), d = a.priceToCoordinate(h.price, i); new r.Point(l, c).subtract(new r.Point(u, d)).length() < Object(o .interactionTolerance)().minDistanceBetweenPoints && this .properties().childs().filled.setValue(!0) } } static createProperties(e) { const t = new n.DefaultProperty("linetoolpolyline", e); return l._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "91EF")).then( e => e.PolylinesDefinitionsViewModel) } static _configureProperties(e) { a.LineDataSource._configureProperties(e), e.addExclusion("filled") } } }, hXqA: function(e, t, i) { "use strict"; var s = i("c7G1"); class r { constructor() { this.isUpdate = !1, this.graphicsCmds = new s.c, this._offsetsChanged = !1, this ._disableGraphicsAndData = !1 } isNaN() { return this.graphicsCmds.isNaN() } primitiveData(e) { const t = {}; if (!this._disableGraphicsAndData) { const i = this.graphicsCmds.primitiveData(e); null !== i && (t.graphicsCmds = i) } return this.isUpdate && (t.isUpdate = !0), void 0 === t.graphicsCmds ? void 0 : t } disable() { this._disableGraphicsAndData = !0 } checkForChangeAndResetChangedState(e) { const t = this._offsetsChanged, i = this.graphicsCmds.isModified(); this.graphicsCmds.setModified(!1), this._offsetsChanged = !1; return i || t || 0 !== e.length } } var n = i("ogJP"), o = i("dhFz"); function a(e) { return Boolean(e.isPosted) } class l { isIgnoredObj(e, t) { return l.isIgnoredObjDefault(e, t) } static isIgnoredObjDefault(e, t) { if (void 0 === t) return l.isIgnoredObjNaNable(e); const i = e[t]; return l.isIgnoredByGeneralRules(e, t) || l.isIgnoredObjNaNable(i) || l .isIgnoredObjListOfNaNables(i) } static isIgnoredObjNaNable(e) { return Object(o.a)(e) && e.isNaN() } static isIgnoredObjListOfNaNables(e) { if (!Object(n.isArray)(e)) return !1; let t = !0; for (const i of e) if (!Object(o.a)(i) || !i.isNaN()) { t = !1; break } return t } static isIgnoredObjPosted(e) { return a(e) && e.isPosted() } static isIgnoredObjErased(e) { return a(e) && e.isErased() } static isIgnoredByGeneralRules(e, t) { const i = e[t]; return Object(n.isArray)(i) && 0 === i.length } } class c { isIgnoredObj(e, t) { if (void 0 === t) return l.isIgnoredObjDefault(e) || l.isIgnoredObjErased(e); const i = e[t]; return l.isIgnoredObjDefault(e, t) || l.isIgnoredObjErased(i) } } class h { isIgnoredObj(e, t) { if (void 0 === t) return l.isIgnoredObjDefault(e) || l.isIgnoredObjErased(e) || l .isIgnoredObjPosted(e); const i = e[t]; return l.isIgnoredObjDefault(e, t) || l.isIgnoredObjErased(i) || l .isIgnoredObjPosted(i) } } i.d(t, "a", (function() { return u })); class u extends class extends class { constructor(e) { this._dataObj = new r, this._isDirty = !1, this._eraseCmds = [], this._enableCmdDataStudy = e } init(e) { this._dataObj.graphicsCmds.setCreate(e), this.update(!0) } dataObj() { return this._dataObj } setEraseCmds(e) { this._eraseCmds = e } resetDirtyState() { this._isDirty = !1 } disable() { this._dataObj.disable() } } { constructor(e) { super(e), this._snapshotPredicate = new c, this._dataSnapShot = {} } getData() { return this._dataSnapShot } getUpdate() { return this._isDirty ? this._dataSnapShot : {} } update(e) { (this._dataObj.checkForChangeAndResetChangedState(this._eraseCmds) || e) && ( null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds.create .deleteErasedObjs(), this._dataObj.graphicsCmds.erase = [new s.a]), this ._makeSnapshot(), this._isDirty = !0) } _makeSnapshot() { this._json = this._dataObj.primitiveData(this._snapshotPredicate), this ._dataSnapShot = { json: this._json } } } { constructor(e) { super(e), this._updatePredicate = new h, this._sendShapshotOnly = !0, this ._isFirstNotForcedUpdate = !0 } update(e) { (this._dataObj.checkForChangeAndResetChangedState(this._eraseCmds) || e) && ( null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds .erase = [new s.a]), this._dataObj.isUpdate = !0, this._makeSnapshot(), null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds .erase = this._eraseCmds), this._dataObj.isUpdate = !0, this._jsonUpdate = this._dataObj.primitiveData(this._updatePredicate), null !== this._dataObj .graphicsCmds.create && this._dataObj.graphicsCmds.create .deleteErasedAndMarkPostedObjs(), this._sendShapshotOnly = e || this ._isFirstNotForcedUpdate, this._isFirstNotForcedUpdate = Boolean(e), this ._isDirty = !0) } getUpdate() { return this._isDirty ? this._enableCmdDataStudy ? { json: this._sendShapshotOnly ? this._json : void 0, jsonUpdate: this._sendShapshotOnly ? void 0 : this._jsonUpdate } : { json: this._json, jsonUpdate: this._sendShapshotOnly ? void 0 : this._jsonUpdate } : {} } } }, hY0g: function(e, t, i) { "use strict"; (function(e) { var t = i("txPx").getLogger("Common.WatchedValue"); function s() {} function r(e) { if (!(this instanceof r)) return new r(e); arguments.length > 0 && (this._value = e), this._listeners = [] } r.prototype.value = function() { return this._owner ? this._owner._value : this._value }, r.prototype.setValue = function(e, i) { var s = this._owner ? this._owner : this; if ("function" == typeof s.hook && (e = s.hook(e)), s.writeLock) return s ._value; var r = s._value === e || Number.isNaN(s._value) && Number.isNaN(e); if (!i && r && s.hasOwnProperty("_value")) return e; s._value = e; for (var n = s._listeners.slice(), o = 0, a = 0; a < n.length; a++) { n[a].once && (s._listeners.splice(a - o, 1), o++); try { n[a].cb(e) } catch (e) { t.logError(e.stack || e.message) } } return e }, r.prototype.deleteValue = function() { var e = this._owner ? this._owner : this; if (e.hasOwnProperty("_value")) { if (e.writeLock) return e._value; delete e._value; for (var i = e._listeners.slice(), s = 0, r = 0; r < i.length; r++) { i[r].once && (e._listeners.splice(r - s, 1), s++); try { i[r].cb() } catch (e) { t.logError(e.stack || e.message) } } } }, r.prototype.subscribe = function(e, i) { if ("function" != typeof e) throw new TypeError("callback must be a function"); var s = !!i && !!i.once, r = !!i && !!i.callWithLast, n = this._owner ? this._owner : this; if (r && n.hasOwnProperty("_value")) { try { e(n._value) } catch (e) { t.logError(e.stack || e.message) } if (s) return } n._listeners.push({ cb: e, owner: this, once: !!i && !!i.once }) }, r.prototype.unsubscribe = function(e) { var t = this._owner ? this._owner : this; void 0 === e && (e = null); for (var i = t._listeners, s = i.length; s--;) i[s].owner !== this && t !== this || i[s].cb !== e && null !== e || i.splice(s, 1) }, r.prototype.listeners = function() { return (this._owner ? this._owner : this)._listeners }, r.prototype.readonly = function() { if (this._readonlyInstance) return this._readonlyInstance; var e = this._readonlyInstance = new s; return e.subscribe = this.subscribe.bind(this), e.unsubscribe = this.unsubscribe .bind(this), e.value = this.value.bind(this), e.when = this.when.bind(this), e.spawn = function() { return this.spawn().readonly() }.bind(this), this.destroy && (e.destroy = this.destroy.bind(this)), e }, r.prototype.spawn = function(e) { var i = new r; return delete i._listeners, i._owner = this._owner || this, i.destroy = function() { if ("function" == typeof e) try { e() } catch (e) { t.logError(e.stack || e.message) } this.unsubscribe(), delete this._owner }, i }, r.prototype.when = function(e) { var i = this; if (this.value()) try { e() } catch (e) { t.logError(e.stack || e.message) } else { var s = function(t) { t && (i.unsubscribe(s), e()) }; i.subscribe(s) } }, r.prototype.opposite = function() { if (!this._opposite) { var e = this, t = new r(!this.value()); this.subscribe((function(e) { t.setValue(!e) })), t.subscribe((function(t) { e.setValue(!t) })), this._opposite = t } return this._opposite }, "undefined" != typeof window && (window.WatchedValue = r), e && e.exports && (e .exports = r) }).call(this, i("YuTi")(e)) }, hY3j: function(e, t, i) { "use strict"; var s = i("PAcw").GridRenderer; function r() { this._id = "grid", this.visible = !0, this.horzLinesVisible = !0, this.horzLinesColor = "white", this.horzLinesStyle = "", this.vertLinesVisible = !0, this.vertLinesColor = "white", this.vertLinesStyle = "" } function n(e, t) { this.source = e, this.pane = t, this._renderer = new s } r.prototype.id = function() { return this._id }, r.prototype.paneViews = function(e) { return [new n(this, e)] }, n.prototype.update = function() {}, n.prototype.renderer = function() { var e = {}; return this.pane.defaultPriceScale().isEmpty() || this.pane.timeScale().isEmpty() ? null : (e.horzLinesVisible = !0, e.vertLinesVisible = !0, e.horzLinesColor = this .pane._model.properties().paneProperties.horzGridProperties.color.value(), e .vertLinesColor = this.pane._model.properties().paneProperties .vertGridProperties.color.value(), e.horzLineStyle = this.pane._model .properties().paneProperties.horzGridProperties.style.value(), e.vertLineStyle = this.pane._model.properties().paneProperties.vertGridProperties.style.value(), e .priceMarks = this.pane.defaultPriceScale().marks(), e.timeMarks = this.pane .timeScale().marks(), e.w = this.pane.width(), e.h = this.pane.height(), this ._renderer.setData(e), this._renderer) }, t.Grid = r }, hezA: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyPriceAxisView", (function() { return r })); var s = i("KcY8"); class r extends s.a { constructor(e, t) { super(), this._model = e.model(), this._source = e, this._data = t } _updateRendererData(e, t, i) { e.visible = !1, t.visible = !1; const s = this._source.model(), r = this._source.priceScale(); if (null === r) return; if (!s.isPriceScaleVisible(r)) return; const n = this._source.lastValueData(this._data.plotIndex, !1); if (n.noData) return; i.background = n.color; let o = n.color; "transparent" === o && (o = this._model.properties().scalesProperties .backgroundColor.value()), i.textColor = this.generateTextColor(o), i .coordinate = n.coordinate, i.floatCoordinate = n.floatCoordinate, this ._showAxisLabel() && (e.text = n.text, e.visible = !0), this ._updatePaneRendererData(t) } _showPaneLabel() { return this._model.properties().scalesProperties.showStudyPlotLabels.value() } _showAxisLabel() { return this._model.properties().scalesProperties.showStudyLastValue.value() } _updatePaneRendererData(e) { e.text = "", this._showPaneLabel() && (e.text = this._source.priceLabelText(this ._data.plotIndex), e.visible = !0) } } }, hfHJ: function(e, t, i) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.transformPoint = t.translationMatrix = t.scalingMatrix = t.rotationMatrix = t .multiplyMatrices = t.identityMatrix = void 0; var s = i("aO4+"); t.identityMatrix = function() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ] }, t.multiplyMatrices = function(e, t) { for (var i = [ [0, 0, 0], [0, 0, 0], [0, 0, 0] ], s = 0; s < 3; s++) for (var r = 0; r < 3; r++) for (var n = 0; n < 3; n++) i[s][r] += e[s][n] * t[n][r]; return i }, t.rotationMatrix = function(e) { var t = Math.cos(e), i = Math.sin(e); return [ [t, -i, 0], [i, t, 0], [0, 0, 1] ] }, t.scalingMatrix = function(e, t) { return [ [e, 0, 0], [0, t, 0], [0, 0, 1] ] }, t.translationMatrix = function(e, t) { return [ [1, 0, e], [0, 1, t], [0, 0, 1] ] }, t.transformPoint = function(e, t) { for (var i = [t.x, t.y, 1], r = [0, 0, 0], n = 0; n < 3; n++) for (var o = 0; o < 3; o++) r[n] += i[o] * e[n][o]; return new s.Point(r[0], r[1]) } }, hsV8: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ensureTimePointIndexIndex", (function() { return n })), i.d(t, "unpackNonSeriesData", (function() { return o })); var s = i("JmuD"), r = i("qySK"); function n(e) { if (e < 0) throw new Error("TimePointIndexIndex should be non-negative integer"); return e } async function o(e) { if ("" === e) return null; const t = JSON.parse(e); if (!Object(s.isObject)(t) || "function" == typeof t) throw new Error( "Non-object content in the non-series envelope"); if (Object(s.hasProperty)(t, "indexes_replace")) return { indexes_replace: !0 }; const i = { indexes_replace: !1 }; if (Object(s.hasProperty)(t, "offsets") && (i.offsets = t.offsets), Object(s .hasProperty)(t, "isUpdate")) { if ("boolean" != typeof t.isUpdate) throw new Error( 'Invalid type of "isUpdate" field'); i.isUpdate = t.isUpdate } return Object(s.hasProperty)(t, "data") && (i.data = t.data), Object(s.hasProperty)(t, "graphicsCmds") && (i.graphicsCmds = Object(r.b)(t.graphicsCmds)), i } }, htUT: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ChartChangesWatcher", (function() { return n })); var s = i("aIyQ"), r = i.n(s); class n { constructor(e, t, i) { this._hasChanges = !1, this._undoHistory = e, this._chartSaver = t, this ._globalEvents = i, this._onValueChanged = new r.a, this._subscribe() } destroy() { this._unsubscribe(), this._onValueChanged.destroy() } hasChanges() { return this._hasChanges } getOnChange() { return this._onValueChanged } _subscribe() { this._globalEvents.subscribe("chart_loaded", this._handleChartLoaded, this), this ._undoHistory.undoStack().onChange().subscribe(this, this ._handleChangeUndoStack), this._chartSaver.chartSaved().subscribe(this, this ._handleChartSaved) } _unsubscribe() { this._globalEvents.unsubscribe("chart_loaded", this._handleChartLoaded, this), this ._undoHistory.undoStack().onChange().unsubscribe(this, this ._handleChangeUndoStack), this._chartSaver.chartSaved().unsubscribe(this, this._handleChartSaved) } _setChanges(e) { this._hasChanges !== e && (this._hasChanges = e, this._onValueChanged.fire(e)) } _handleChartLoaded() { this._setChanges(!1) } _handleChangeUndoStack(e) { e && !e.customFlag("doesnt_affect_save") && this._setChanges(!0) } _handleChartSaved(e) { e && this._setChanges(!1) } } }, "hyq/": function(e, t, i) { "use strict"; i.r(t), i.d(t, "pivotPointsStandardStudyItem", (function() { return h })); var s = i("ocLq"), r = i("LxhU"); class n { constructor() { this.p = NaN, this.r1 = NaN, this.s1 = NaN, this.r2 = NaN, this.s2 = NaN, this.r3 = NaN, this.s3 = NaN, this.r4 = NaN, this.s4 = NaN, this.r5 = NaN, this.s5 = NaN, this.startIndex__t = NaN, this.endIndex__t = NaN } } class o { constructor() { this.pivots = [] } } function a(e, t) { e.setUTCMonth(e.getUTCMonth() + t) } function l(e, t) { if (s.Std.ismonthly(e)) { let i = new Date(t); return i.getUTCDay() < function(e, t) { return new Date(t, e, 0).getDate() }(i.getUTCMonth(), i.getUTCFullYear()) ? (a(i, s.Std.interval(e)), i = s.Std .add_days_considering_dst("Etc/UTC", i, 1 - i.getUTCDay())) : (i = s.Std .add_days_considering_dst("Etc/UTC", i, 1), a(i, s.Std.interval(e))), i .valueOf() } return t + r.Interval.parse(e.symbol.resolution).inMilliseconds(t) } function c(e, t) { switch (t) { case "Auto": return function(e) { const t = r.Interval.parse(e.symbol.interval + e.symbol.resolution); switch (t.kind()) { case r.ResolutionKind.Weeks: case r.ResolutionKind.Months: return "12M"; case r.ResolutionKind.Days: return "1M"; case r.ResolutionKind.Minutes: return t.multiplier() >= 1 && t.multiplier() <= 15 ? "1D" : "1W"; case r.ResolutionKind.Seconds: case r.ResolutionKind.Ticks: return "1D" } throw new Error("Unexpected resolution type: " + e.symbol.resolution) }(e); case "Daily": return "1D"; case "Weekly": return "1W"; case "Monthly": return "1M"; case "Yearly": return "12M"; default: throw new Error("No such pivTimeFrame: " + t) } } const h = { name: "Pivot Points Standard", metainfo: { _metainfoVersion: 44, defaults: { inputs: { kind: "Traditional", lookBack: 15, pivTimeFrame: "Auto", showHistoricalPivots: !0 }, precision: "4" }, description: "Pivot Points Standard", id: "PivotPointsStandard@tv-basicstudies-80", inputs: [{ defval: "Traditional", id: "kind", name: "Type", options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark", "Camarilla" ], type: "text" }, { defval: !0, id: "showHistoricalPivots", name: "Show historical pivots", type: "bool" }, { defval: "Auto", id: "pivTimeFrame", name: "Pivots Timeframe", options: ["Auto", "Daily", "Weekly", "Monthly", "Yearly"], type: "text" }, { defval: 15, id: "lookBack", max: 5e3, min: 2, name: "Number of Pivots Back", type: "integer" }], is_price_study: !0, linkedToSeries: !0, shortDescription: "Pivots" }, constructor: class { constructor() { this._secondaryRes = "1D", this._firstMainSeriesBarTime = NaN } init(e, t) { const i = t(0), r = t(1), n = t(2), a = t(3); this._data = new o, this._firstMainSeriesBarTime = NaN, this._kindPP = function(e) { switch (e) { case "Traditional": return 0; case "Fibonacci": return 1; case "Woodie": return 2; case "Classic": return 3; case "DeMark": return 4; case "Camarilla": return 5; default: throw new Error("Unknown kind " + e) } }(i), this._showHistoricalPivots = r, this._historicalPivotsToKeep = a, this._pivTimeFrame = n, this._isValidResolution = function(e, t) { return (!s.Std.isdaily(e) || "Daily" !== t) && ((!s.Std .isweekly(e) || "Daily" !== t && "Weekly" !== t) && (!s.Std.ismonthly(e) || "Daily" !== t && "Weekly" !== t && "Monthly" !== t)) }(e, this._pivTimeFrame), this._isValidResolution || s.Std.error( "You cannot see this pivot timeframe on this resolution"), this ._isValidResolution && (this._secondaryRes = c(e, this ._pivTimeFrame)), e.new_sym(e.symbol.tickerid, this ._secondaryRes) } main(e) { if (!this._isValidResolution) return null; if (e.symbol.time) return isNaN(this._firstMainSeriesBarTime) && (this ._firstMainSeriesBarTime = e.symbol.time, this ._removeUnusedPivots()), e.symbol.isLastBar && e.symbol .isNewBar ? this._createResponse() : null; e.select_sym(1); const t = e.new_var(s.Std.open(e)), i = e.new_var(s.Std.high(e)), r = e.new_var(s.Std.low(e)), o = e.new_var(s.Std.close(e)), a = e.new_var(s.Std.time(e)), c = this._data, h = t.get(0), u = a.get(0), d = t.get(1), p = i.get(1), _ = r.get(1), m = o.get(1), f = e.symbol.isLastBar; if (0 !== c.pivots.length && e.symbol.isNewBar) { const e = c.pivots[c.pivots.length - 1]; e.endIndex__t !== u && (e.endIndex__t = u) } if (0 === e.symbol.index || !e.symbol.isNewBar) return e.select_sym(0), null; const g = function(e, t, i, r, o, a, l, c) { const h = new n; let u = NaN; const d = i - r; switch (c) { case 0: u = (i + r + o) / 3, h.p = u, h.r1 = 2 * u - r, h.s1 = 2 * u - i, h.r2 = u + (i - r), h.s2 = u - (i - r), h .r3 = 2 * u + (i - 2 * r), h.s3 = 2 * u - (2 * i - r), h.r4 = 3 * u + (i - 3 * r), h.s4 = 3 * u - ( 3 * i - r), h.r5 = 4 * u + (i - 4 * r), h.s5 = 4 * u - (4 * i - r); break; case 1: u = (i + r + o) / 3, h.p = u, h.r1 = u + .382 * d, h .s1 = u - .382 * d, h.r2 = u + .618 * d, h.s2 = u - .618 * d, h.r3 = u + d, h.s3 = u - d; break; case 2: u = (i + r + 2 * e) / 4, h.p = u, h.r1 = 2 * u - r, h .s1 = 2 * u - i, h.r2 = u + d, h.s2 = u - d, h.r3 = i + 2 * (u - r), h.s3 = r - 2 * (i - u), h.r4 = h .r3 + d, h.s4 = h.s3 - d; break; case 3: u = (i + r + o) / 3, h.p = u, h.r1 = 2 * u - r, h.s1 = 2 * u - i, h.r2 = u + d, h.s2 = u - d, h.r3 = u + 2 * d, h.s3 = u - 2 * d, h.r4 = u + 3 * d, h.s4 = u - 3 * d; break; case 4: let n = NaN; n = s.Std.equal(t, o) ? i + r + 2 * o : s.Std.greater(o, t) ? 2 * i + r + o : 2 * r + i + o, u = n / 4, h .p = u, h.r1 = n / 2 - r, h.s1 = n / 2 - i; break; case 5: u = (i + r + o) / 3, h.p = u, h.r1 = o + 1.1 * d / 12, h .s1 = o - 1.1 * d / 12, h.r2 = o + 1.1 * d / 6, h .s2 = o - 1.1 * d / 6, h.r3 = o + 1.1 * d / 4, h .s3 = o - 1.1 * d / 4, h.r4 = o + 1.1 * d / 2, h .s4 = o - 1.1 * d / 2; break; default: throw new Error("Unknown kind") } return h.startIndex__t = a, h.endIndex__t = l, h }(h, d, p, _, m, u, l(e, u), this._kindPP); return e.select_sym(0), this._showHistoricalPivots || (c.pivots = []), c .pivots.push(g), c.pivots.length > this._historicalPivotsToKeep && c .pivots.shift(), f ? this._createResponse() : null } _createResponse() { return 0 === this._data.pivots.length ? null : { nonseries: !0, type: "non_series_data", data: { data: this._data } } } _removeUnusedPivots() { const e = Math.max(this._data.pivots.findIndex(e => e.startIndex__t > this._firstMainSeriesBarTime) - 1, 0); e > 0 && this._data.pivots.splice(0, e) } } } }, "i/Bj": function(e, t, i) { "use strict"; function s(e) { if (void 0 === e) return null; const t = e.match(/(delayed_streaming)_([\d]{1,4})/); return null === t ? null : { mode: t[1], interval: parseInt(t[2]) } } i.r(t), i.d(t, "parseUpdateMode", (function() { return s })) }, i126: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyColorRotatorFactory", (function() { return h })); var s = i("HGP3"), r = i("eJTA"), n = i("Tmoa"), o = i("3ClC"); const a = ["color-sky-blue-400", "color-banana-yellow-700", "color-deep-blue-500", "color-grapes-purple-a700", "color-iguana-green-500", "color-minty-green-a700", "color-ripe-red-a200", "color-berry-pink-200", "color-tv-blue-a100", "color-tan-orange-a200", "color-sky-blue-a400", "color-deep-blue-a100", "color-grapes-purple-400", "color-iguana-green-a700", "color-minty-green-200", "color-ripe-red-200", "color-berry-pink-a200", "color-ripe-red-500", "color-grapes-purple-500", "color-deep-blue-400", "color-tv-blue-a200", "color-sky-blue-500", "color-iguana-green-400", "color-minty-green-400", "color-banana-yellow-600", "color-tan-orange-500", "color-berry-pink-400", "color-ripe-red-300", "color-grapes-purple-300", "color-deep-blue-300", "color-tv-blue-300", "color-sky-blue-300", "color-iguana-green-300", "color-minty-green-300", "color-banana-yellow-400", "color-tan-orange-300", "color-berry-pink-300", "color-tan-orange-a700" ]; class l { constructor(e) { this._offset = 0, this._offset = e } getColor(e) { if (0 === this._offset) return e; const t = a[(this._offset - 1) % a.length], i = s.colorsPalette[t], o = Object(n.isHexColor)(e) ? 1 : Object(r.parseRgba)(e)[3]; return Object(n.generateColor)(i, Object(n.alphaToTransparency)(o)) } } class c { constructor(e, t) { this._offset = e, this._modelStartOffset = t } getColor(e) { if (Object(n.isHexColor)(e)) { const t = Object(r.parseRgb)(e); return Object(r.rgbToHexString)(Object(r.shiftRgb)(t, this._offset, this ._modelStartOffset)) } { const t = Object(r.parseRgba)(e); return Object(r.rgbaToString)(Object(r.shiftRgba)(t, this._offset, this ._modelStartOffset)) } } } class h { constructor(e) { this._chartModel = e } getColorRotator(e) { const t = Object(o.studyColorRotationMode)(e); if (null === t) return null; const i = this._calcDefaultColorsOffset(e); switch (t) { case "loop": return new l(i); case "shift": { const e = this._chartModel.getStudyShiftColorStartOffset(); return new c(i, e) } } } _calcDefaultColorsOffset(e) { let t = 0; const i = Object(o.useSameColorRotationComparator)(e); return this._chartModel.dataSources().filter(o.isStudy).forEach(s => { i(e, s.metaInfo()) && t++ }), t } } }, i6cO: function(e, t, i) { "use strict"; var s; function r(e) { e.lineWidth = void 0, e.lineStyle = void 0; for (let t = 0; t < e.colors.length; t++) e.colors[t] = void 0; return e } function n() { return { colors: [void 0, void 0, void 0, void 0, void 0, void 0, void 0] } } i.r(t), i.d(t, "ColorerType", (function() { return s })), i.d(t, "clearStyle", (function() { return r })), i.d(t, "createEmptyStyle", (function() { return n })), function(e) { e[e.Main = 0] = "Main", e[e.Background = 1] = "Background", e[e.Text = 2] = "Text", e[e .Border = 3] = "Border", e[e.Wick = 4] = "Wick", e[e.Up = 5] = "Up", e[e.Down = 6] = "Down" }(s || (s = {})) }, i80N: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "8MBc", 7)).then(({ FibSpiralPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 2 } name() { return "Fib Spiral" } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "nBUU"))) .FibSpiralDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolfibspiral", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolFibSpiral = n }, iDOr: function(e, t, i) { "use strict"; (function(e) { var s = i("Y7w9").moveToHead, r = i("704P").ExecutionsPositionController, n = i("Ss5c").LineDataSource, o = i("7ktv").PriceDataSource, a = i("CW80").isLineTool, l = i("1Wlv").PriceScale, c = i("MWAT").createPriceScaleSelectionStrategy, h = i("yfAl").PaneBase, u = i("s1Gx").sortSources; class d extends h { constructor(t, i, s, r) { super(t, i, s, r), this.m_timeScale = t, this.m_height = 0, this.m_width = 0, this.m_mainDataSource = null, this._properties = i, this._model = s, this._destroyed = new e, s.properties().priceScaleSelectionStrategyName .listeners().subscribe(null, function(e) { this._priceScaleSelectionStrategy = c(e.value()), this ._priceScaleSelectionStrategy.apply(this) }.bind(this)), this.m_timeScale.barSpacingChanged().subscribe(this, function() { this.m_mainDataSource === this._model.mainSeries() && this ._recalculatePriceScaleByScaleRatio(this.m_mainDataSource .priceScale()) }.bind(this)), i.topMargin.listeners().subscribe(this, d.prototype ._updateMargins), i.bottomMargin.listeners().subscribe(this, d .prototype._updateMargins), this._updateMargins(), this ._maximized = !1 } destroy() { this._properties.topMargin.listeners().unsubscribe(this, d.prototype ._updateMargins), this._properties.bottomMargin.listeners() .unsubscribe(this, d.prototype._updateMargins), this._model.properties() .priceScaleSelectionStrategyName.listeners().unsubscribeAll(this), this .m_timeScale.barSpacingChanged().unsubscribeAll(this), this ._leftPriceScales.concat(this._rightPriceScales).forEach((function(e) { e.modeChanged().unsubscribeAll(this), e.priceRangeChanged() .unsubscribeAll(this), e.internalHeightChanged() .unsubscribeAll(this) }), this); for (var e = 0; e < this.m_dataSources.length; e++) { var t = this.m_dataSources[e]; this.removeSourceFromPriceScale(t), t.destroy && t.destroy() } this._destroyed.fire() } model() { return this._model } width() { return this.m_width } height() { return this.m_height } setWidth(e) { this.m_width = e, this.updateAllViews() } setHeight(e) { this.m_height = e, this._leftPriceScales.forEach((function(t) { t.setHeight(e) })), this._rightPriceScales.forEach((function(t) { t.setHeight(e) })); for (var t = 0; t < this.m_dataSources.length; t++) { var i = this.m_dataSources[t]; this.isOverlay(i) && i.priceScale() && i.priceScale().setHeight(e) } this.updateAllViews() } leftPriceScales() { return this._leftPriceScales } rightPriceScales() { return this._rightPriceScales } visibleLeftPriceScales() { var e = this._model.priceScaleSlotsCount(); if (this._leftPriceScales.length > e.left) { var t = s(this._leftPriceScales, this.mainDataSource().priceScale()); return t.splice(e.left), t } return this._leftPriceScales } visibleRightPriceScales() { var e = this._model.priceScaleSlotsCount(); if (this._rightPriceScales.length > e.right) { var t = s(this._rightPriceScales, this.mainDataSource().priceScale()); return t.splice(e.right), t } return this._rightPriceScales } timeScale() { return this.m_timeScale } _processMainSourceChange() { var e; if (null === this.m_mainDataSource) for (var t = 0; t < this.m_dataSources.length; t++) { if ((r = this.m_dataSources[t]) instanceof o && !this.isOverlay( r) && (!r.properties().linkedToSeries || !r.properties() .linkedToSeries.value())) { this.m_mainDataSource = r, e = !0; break } } if (this.m_mainDataSource && e) { var i = []; for (t = 0; t < this.m_dataSources.length; t++) { (r = this.m_dataSources[t]) instanceof n && i.push(r) } i = u(i); for (t = 0; t < i.length; t++) this.move(i[t], this.m_mainDataSource .priceScale(), !0) } else if (!this.m_mainDataSource || this.isOverlay(this .m_mainDataSource) && 0 === this.nonOverlayPricesSourcesCount()) { var s = null; if (this.m_dataSources.includes(this._model.mainSeries())) s = this ._model.mainSeries(); else for (t = 0; t < this.m_dataSources.length; t++) { var r; if ((r = this.m_dataSources[t]) instanceof o && this.isOverlay( r) && r.showInObjectTree()) { s = r; break } } if (null !== s) { var a = this.m_mainDataSource === s; this.m_mainDataSource = s; var l = this.createNewPriceScaleIfPossible(); if (a && s === this._model.mainSeries()) { var c = s.priceScale(); this._model.children(s, !0).forEach(e => { this.removeSourceFromPriceScale(e), l.addDataSource( e), e.setPriceScale(l) }), this.removePriceScale(c) } this.move(s, l, !0), this.recalculatePriceScale(s.priceScale()) } } } startScrollPrice(e, t) { e.startScroll(t) } scrollPriceTo(e, t) { e.scrollTo(t), this.updateAllViews() } endScrollPrice(e) { e.endScroll() } setPriceAutoScale(e, t) { e.setMode({ autoScale: t }), this.timeScale().isEmpty() || this.recalculatePriceScale(e) } defaultPriceScale() { var e = this.m_mainDataSource ? this.m_mainDataSource.priceScale() : null; return null === e && (e = new l(this._model.properties().scalesProperties)), e } _priceScaleIsPrice(e) { var t = e.mainSource(); return !!t && (!!TradingView.isInherited(t.constructor, TradingView .Series) || !!TradingView.isInherited(t.constructor, TradingView .Study) && t.metaInfo().is_price_study) } findSuitableScale(e, t, i) { return this._priceScaleSelectionStrategy.findSuitableScale(this, e, t, i) } createNewPriceScaleIfPossible() { return this._priceScaleSelectionStrategy.createNewPriceScaleIfPossible(this) } canCreateNewPriceScale() { return this._priceScaleSelectionStrategy.canCreateNewPriceScale(this) } mainDataSource() { return this.m_mainDataSource } recalculate() { this.recalculatePriceScale(this.m_rightPriceScale), this .recalculatePriceScale(this.m_leftPriceScale); for (var e = 0; e < this.m_dataSources.length; e++) { var t = this.m_dataSources[e]; this.isOverlay(t) && !a(t) && this.recalculatePriceScale(t.priceScale()) } this.updateAllViews(), this._model.updatePane(this) } createDrawingsCaches() { r.recreateOrderedByBarsSourcesCache(this) } clearDrawingCaches() { r.clearOrderedByBarsSourcesCache() } _invalidateSourcesCache() { this._cachedOrderedSources.clear(), this._leftPriceScales.forEach((function( e) { e.invalidateSourcesCache() })), this._rightPriceScales.forEach((function(e) { e.invalidateSourcesCache() })) } onDestroyed() { return this._destroyed } clearSeries(e) { for (var t = this.m_dataSources.length - 1; t >= 0; t--) TradingView .isInherited(this.m_dataSources[t].constructor, TradingView.Series) && this._removeSourceFromCollections(t, e) } nonOverlayPricesSourcesCount() { return this.m_dataSources.filter((function(e) { return (!e.properties().linkedToSeries || !e.properties() .linkedToSeries.value()) && (TradingView .isInherited(e.constructor, o) && e .showInObjectTree() && !this.isOverlay(e)) }), this).length } canHaveMoreNoScaleSources() { return this.nonOverlayPricesSourcesCount() > 1 } actionNoScaleIsEnabled(e) { return !(!this.isOverlay(e) && TradingView.isInherited(e.constructor, o)) || this.canHaveMoreNoScaleSources() } executionsPositionController() { return this._executionsPositionController || (this ._executionsPositionController = new r(this, this._model .timeScale())), this._executionsPositionController } setMaximized(e) { this._maximized = e } isMaximized() { return this._maximized } properties() { return this._properties } priceScaleRatio() { return this._currentPriceScaleRatio } getPriceScaleById(e) { var t = this.m_dataSources.find((function(t) { return null !== t.priceScale() && t.priceScale().id() === e })); return void 0 === t ? null : t.priceScale() } setPriceScaleSelectionStrategy(e) { this._priceScaleSelectionStrategy = e, e.apply(this) } priceScaleIndex(e, t) { switch (t) { case "left": return this.leftPriceScales().indexOf(e); case "right": return this.rightPriceScales().indexOf(e) } } } d.DEFAULT_STRETCH_FACTOR = 1e3, d.PANE_ANIMATION_DURATION = 500, t.Pane = d }).call(this, i("aIyQ")) }, iPBr: function(e, t, i) { "use strict"; i.r(t), i.d(t, "TimeAxisWidget", (function() { return y })); var s = i("Eyy1"), r = i("XlJ7"), n = i("S8xo"), o = i("ikwP"), a = i("H0vP"), l = i("ogJP"), c = i("u+0B"), h = i("zDbI"), u = i("aIyQ"), d = i.n(u), p = i("mE5r"), _ = i("8OdW"), m = i("7KDR"), f = i("3/8U"), g = i("GxN8"), b = i("JWMC"), v = i("5VQP"); i("xrEm"); const S = { contextMenuEnabled: !0, timezoneMenuEnabled: !0, pressedMouseMoveScale: !0 }; class y { constructor(e, t, i, s, r) { this._rendererOptions = null, this._onLabelHovered = new d.a, this._mousedown = !1, this._currentCursorClassName = "invalid", this._options = Object(l.merge)( Object(l.clone)(S), t || {}), this.chart = e, this._properties = e .properties().childs().scalesProperties, this._element = document.createElement( "tr"), this._backgroundBasedTheme = r; const a = () => this.backgroundColor(), c = () => { throw new Error("Time axis does not support real price scales") }, h = { titlesProvider: i, stubContextMenuProvider: (e, t) => { const i = this.getContextMenuActions(!0); let r = s(e, t); if (r[r.length - 1] === this.chart.actions().scalesProperties) { const e = [new m.Separator].concat(i); Array.prototype.splice.apply(r, [r.length - 2, 0, ...e]) } else r.push(new m.Separator), r = r.concat(i); return r }, backgroundBasedTheme: r, rendererOptionsProvider: e.model().model().rendererOptionsProvider(), getBackgroundTopColor: a, getBackgroundBottomColor: a, showHorizontalBorder: !0 }; this._lhsStubContainer = new p.a(this._properties, "left", c, h, this._options .priceAxisLabelsOptions), this._lhsStubContainer.onLabelHovered().subscribe( this, (e, t) => { this._onLabelHovered.fire(e, t) }), this._rhsStubContainer = new p.a(this._properties, "right", c, h, this ._options.priceAxisLabelsOptions), this._rhsStubContainer.onLabelHovered().subscribe(this, (e, t) => { this._onLabelHovered.fire(e, t) }), this._element.appendChild(this._lhsStubContainer.getElement()), this._cell = document.createElement("td"), this._element.appendChild(this._cell), this._cell .classList.add("chart-markup-table", "time-axis"), this._cell.style.height = "25px", this._dv = document.createElement("div"), this._dv.style.width = "100%", this._dv.style.height = "100%", this._dv.style.position = "relative", this._dv .style.overflow = "hidden", this._cell.appendChild(this._dv), this ._canvasConfiguredHandler = () => this.chart.model().model().lightUpdate(), this ._canvasBinding = Object(o.createBoundCanvas)(this._dv, new o.Size(16, 16)), this._canvasBinding.subscribeCanvasConfigured(this._canvasConfiguredHandler); const u = this._canvasBinding.canvas; u.style.position = "absolute", u.style.zIndex = "1", u.style.left = "0", u.style .top = "0", this._topCanvasConfiguredHandler = () => this.chart.model().model() .lightUpdate(), this._topCanvasBinding = Object(o.createBoundCanvas)(this._dv, new o.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this ._topCanvasConfiguredHandler); const f = this._topCanvasBinding.canvas; f.style.position = "absolute", f.style.zIndex = "2", f.style.left = "0", f.style .top = "0", this._element.appendChild(this._rhsStubContainer.getElement()), this .restoreDefaultCursor(), this.update(), this._minVisibleSpan = _.MINUTE_SPAN, this._mouseEventHandler = new n.MouseEventHandler(this._topCanvasBinding.canvas, this, { treatVertTouchDragAsPageScroll: !0, treatHorzTouchDragAsPageScroll: !1 }), this.size = new o.Size(0, 0) } destroy() { this._mouseEventHandler.destroy(), this._topCanvasBinding .unsubscribeCanvasConfigured(this._topCanvasConfiguredHandler), this ._topCanvasBinding.destroy(), this._canvasBinding.unsubscribeCanvasConfigured( this._canvasConfiguredHandler), this._canvasBinding.destroy(), this ._rhsStubContainer.onLabelHovered().unsubscribeAll(this), this._lhsStubContainer .onLabelHovered().unsubscribeAll(this), this._lhsStubContainer.destroy(), this ._rhsStubContainer.destroy(), this.chart.properties().childs().paneProperties .childs().background.unsubscribeAll(this) } setCursor(e) { let t = ""; "grabbing" !== e && "ew-resize" !== e || (t = "time-axis--cursor-" + e), this ._currentCursorClassName !== t && (this._currentCursorClassName && this._cell .classList.remove(this._currentCursorClassName), t && this._cell.classList .add(t), this._currentCursorClassName = t, this._cell.style.cursor) } restoreDefaultCursor() { this.setCursor("") } getElement() { return this._element } optimalHeight() { const e = this.rendererOptions(); return Math.ceil(e.borderSize + e.offsetSize + e.fontSize + e.paddingTop + e .paddingBottom + e.labelBottomOffset) } setSizes(e, t, i) { this.size && this.size.equals(e) || (this.size = e, this._canvasBinding .resizeCanvas({ width: e.w, height: e.h }), this._topCanvasBinding.resizeCanvas({ width: e.w, height: e.h }), this._cell.style.width = e.w + "px", this._cell.style.height = e.h + "px"), this._lhsStubContainer.setSizes(e.h, t), this._rhsStubContainer .setSizes(e.h, i) } hardResetCanvas() { this.size && (Object(o.hardResizeCanvas)(this._canvasBinding, this.size), Object(o.hardResizeCanvas)(this._topCanvasBinding, this.size)) } rendererOptions() { if (!this._rendererOptions || this._rendererOptions.fontSize !== this.fontSize()) { const e = this.fontSize(); this._rendererOptions = { borderSize: 1, offsetSize: 5, fontSize: e, font: Object(r.makeFont)(e, h.CHART_FONT_FAMILY, ""), widthCache: new c.TextWidthCache, paddingTop: 3 * e / 12, paddingBottom: 3 * e / 12, paddingHorizontal: 9 * e / 12, labelBottomOffset: 4 * e / 12 } } return this._rendererOptions } backgroundColor() { return this.chart.model().model().backgroundColor().value() } lineColor() { return this._properties.childs().lineColor.value() } textColor() { return this._properties.childs().textColor.value() } fontSize() { return this._properties.childs().fontSize.value() } baseFont() { return Object(r.makeFont)(this.fontSize(), h.CHART_FONT_FAMILY) } baseBoldFont() { return Object(r.makeFont)(this.fontSize(), h.CHART_FONT_FAMILY, "", "bold") } hasCanvas(e) { return this._canvasBinding.canvas === e || this._topCanvasBinding.canvas === e } onLabelHovered() { return this._onLabelHovered } getScreenshotData() { return { content: this._canvasBinding.canvas.toDataURL(), canvas: this._canvasBinding.canvas, contentWidth: this.size.w, contentHeight: this.size.h, lhsStub: this._lhsStubContainer.getScreenshotData(), rhsStub: this._rhsStubContainer.getScreenshotData() } } getContextMenuActions(e) { const t = this.chart; t.updateActions(); const i = t.actions(), s = []; return e || s.push(i.timeScaleReset, new m.Separator), this._options .timezoneMenuEnabled && s.push(i.applyTimeZone), s.push(i.sessionBreaks), s } update() { if (!this.chart.hasModel()) return; const e = this.chart.model().timeScale().marks(); if (e) { this._minVisibleSpan = _.YEAR_SPAN; for (const t of e) this._minVisibleSpan = Math.min(t.span, this._minVisibleSpan) } } updatePriceAxisStubs() { const e = this.chart.model().model(), t = this.chart.isMaximizedPane() ? Object(s.ensureNotNull)(this.chart .maximizedPaneWidget()).state() : e.paneForSource(e.mainSeries()); if (!t) return; const i = e.priceScaleSlotsCount(); this._lhsStubContainer.setScales([], i.left, t.leftPriceScales().length, i.left + i .right), this._rhsStubContainer.setScales([], i.right, t.rightPriceScales() .length, i.left + i.right) } paint(e) { if (e === a.InvalidationLevel.None) return; const t = Object(o.getContext2D)(this._topCanvasBinding.canvas); if (e > a.InvalidationLevel.Cursor) { const i = Object(o.getContext2D)(this._canvasBinding.canvas), s = this._canvasBinding.pixelRatio; this.drawBackground(i, s), this.chart.hasModel() && (this.drawBorder(i, s), this .drawTickMarks(i, s), this.drawBackLabels(i, s), this .drawCrossHairLabel(t, s)), this._lhsStubContainer.paintStubs(e), this ._rhsStubContainer.paintStubs(e) } this.drawCrossHairLabel(t, this._topCanvasBinding.pixelRatio) } drawBackground(e, t) { if (Object(o.clearRect)(e, 0, 0, Math.ceil(this.size.w * t) + 1, Math.ceil(this.size .h * t) + 1, this.backgroundColor()), !this.chart.hasModel()) return; const i = this.chart.model(); if (!i.timeScale().isEmpty()) { const s = i.model().selection().lineDataSources().reduce((e, t) => { const i = t.timeAxisPoints(); return 0 === i.length ? e : e.concat(i) }, []); s.length > 0 && this._hightlightBackground(e, s, t) } const s = i.model().crossHairSource(); s.startMeasurePoint() && this._hightlightBackground(e, s.measurePoints(), t) } drawBorder(e, t) { e.save(), e.fillStyle = this.lineColor(); const i = Math.max(1, Math.floor(this.rendererOptions().borderSize * t)), s = Math.ceil(this.size.w * t); e.fillRect(0, 0, s + 1, i), e.restore() } drawTickMarks(e, t) { const i = this.chart.model().timeScale().marks(); if (!i || 0 === i.length) return; let s = i.reduce((e, t) => e.span > t.span ? e : t, i[0]).span; s > 30 && s < 40 && (s = 30), e.save(), e.strokeStyle = this.lineColor(); const r = this.rendererOptions(), n = r.borderSize + r.offsetSize + r.paddingTop + r.fontSize / 2; e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = this.textColor(), Object(o.drawScaled)(e, t, () => { e.font = this.baseFont(); for (let t = 0; t < i.length; t++) { const r = i[t]; r.span < s && e.fillText(r.label, r.coord, n) } e.font = this.baseBoldFont(); for (let t = 0; t < i.length; t++) { const r = i[t]; r.span >= s && e.fillText(r.label, r.coord, n) } }), e.restore() } drawBackLabels(e, t) { var i; e.save(); const s = new Set, r = this.chart.model().model(); let n = r.dataSources(); const o = r.selection().allSources(); for (const e of o) s.add(e); r.hoveredSource() && s.add(r.hoveredSource()); for (const e of r.sourcesBeingMoved()) s.add(e); const a = r.customSourceBeingMoved(); null !== a && s.add(a); const l = null !== (i = r.lineBeingEdited()) && void 0 !== i ? i : r .lineBeingCreated(); l && s.add(l), s.add(this.chart.model().crossHairSource()), n = n.concat(r .customSources()); const c = this.rendererOptions(); for (let i = 0; i < n.length; i++) { const r = n[i]; if (!s.has(r) && r.timeAxisViews) { const i = r.timeAxisViews(); if (i) for (let s = 0; s < i.length; s++) i[s].renderer().draw(e, c, t) } } e.restore() } drawCrossHairLabel(e, t) { var i; e.save(), e.clearRect(0, 0, Math.ceil(this.size.w * t) + 1, Math.ceil(this.size.h * t) + 1); const s = this.chart.model().model(), r = [], n = null !== (i = s.lineBeingEdited()) && void 0 !== i ? i : s .lineBeingCreated(); if (n && n.timeAxisViews) { const e = n.timeAxisViews(); e && e.length && r.push(e) } const o = s.customSourceBeingMoved(); this._addViewsOrMaxMin(null === o ? [] : [o], r), this._addViewsOrMaxMin(s .sourcesBeingMoved(), r), this._addViewsOrMaxMin(s.selection().allSources(), r); const a = s.hoveredSource(); if (a && Object(g.a)(a) && !s.selection().isSelected(a) && a.timeAxisViews) { const e = a.timeAxisViews(); e && e.length && r.push(e) } const l = s.crossHairSource(), c = l.timeAxisViews && l.timeAxisViews(); c && c.length && r.push(c); const h = this.rendererOptions(); for (const i of r) for (const s of i) e.save(), s.renderer().draw(e, h, t), e.restore(); e.restore() } mouseDownEvent(e) { this._mouseDownOrTouchStartEvent(e) } touchStartEvent(e) { this._mouseOrTouchEnterEvent(e), this._mouseDownOrTouchStartEvent(e) } mouseDownOutsideEvent() { this._zoomAvailable() && this._mousedown && (this._mousedown = !1, this.chart .model().endScaleTime(), this.restoreDefaultCursor()) } pressedMouseMoveEvent(e) { this._pressedMouseOrTouchMoveEvent(e) } touchMoveEvent(e) { this._pressedMouseOrTouchMoveEvent(e) } mouseUpEvent(e) { this._mouseUpOrTouchEndEvent(e) } touchEndEvent(e) { this._mouseUpOrTouchEndEvent(e), this._mouseOrTouchLeaveEvent(e) } contextMenuEvent(e) { this._contextMenuOrTouchContextMenuEvent(e) } touchContextMenuEvent(e) { this._contextMenuOrTouchContextMenuEvent(e) } mouseEnterEvent(e) { this._mouseOrTouchEnterEvent(e) } mouseLeaveEvent(e) { this._mouseOrTouchLeaveEvent(e) } mouseDoubleClickEvent(e) { this._mouseDoubleClickOrDoubleTapEvent(e) } doubleTapEvent(e) { this._mouseDoubleClickOrDoubleTapEvent(e) } _hightlightBackground(e, t, i) { const s = this.chart.model().timeScale(); let r = t[0].index, n = t[0].index; for (let e = 1; e < t.length; e++) r = Math.min(r, t[e].index), n = Math.max(n, t[e] .index); const a = Math.floor(s.indexToCoordinate(r) * i), l = Math.ceil(s.indexToCoordinate(n) * i); Object(o.fillRect)(e, a, 0, l - a, Math.ceil(this.size.h * i) + 1, f.a) } _addViewsOrMaxMin(e, t) { if (e.length <= 1) { for (const i of e) if (i.timeAxisViews) { const e = i.timeAxisViews(); e && e.length && t.push(e) } } else t.push(this._minMaxViews(e)) } _minMaxViews(e) { const t = []; let i = 1 / 0, s = -1 / 0, r = null, n = null; for (const t of e) if (t.timeAxisViews) { const e = t.timeAxisViews(); if (e && e.length) for (let t = 0; t < e.length; ++t) { const o = e[t], a = o.coordinate(); a >= s && (s = a, n = o), a <= i && (i = a, r = o) } } return n && t.push(n), r && t.push(r), t } _zoomAvailable() { return !this.chart.model().timeScale().isEmpty() && this.chart.model().model() .zoomEnabled() && this._options.pressedMouseMoveScale } _mouseDownOrTouchStartEvent(e) { if (this._mousedown || !this._zoomAvailable()) return; this._mousedown = !0; const t = this.chart.model(); t.timeScale().isEmpty() || t.startScaleTime(e.localX) } _pressedMouseOrTouchMoveEvent(e) { this._zoomAvailable() && this.chart.model().scaleTimeTo(e.localX) } _mouseUpOrTouchEndEvent(e) { this._zoomAvailable() && (this._mousedown = !1, this.chart.model().endScaleTime(), this.restoreDefaultCursor()) } _contextMenuOrTouchContextMenuEvent(e) { this._options.contextMenuEnabled && this._createContextMenu().then(t => t.show(e)) } _mouseOrTouchEnterEvent(e) { this._zoomAvailable() && this.setCursor("ew-resize") } _mouseOrTouchLeaveEvent(e) { this.restoreDefaultCursor() } _mouseDoubleClickOrDoubleTapEvent(e) { Object(b.trackEvent)("GUI", "Double click time scale"), this.chart.model() .resetTimeScale() } _createContextMenu() { return v.ContextMenuManager.createMenu(this.getContextMenuActions(), { statName: "TimeScaleContextMenu" }) } } }, iR50: function(e) { e.exports = JSON.parse( '{"color-white":"#ffffff","color-black":"#000000","color-cold-gray-50":"#F8F9FD","color-cold-gray-100":"#F0F3FA","color-cold-gray-150":"#E0E3EB","color-cold-gray-200":"#D1D4DC","color-cold-gray-250":"#C1C4CD","color-cold-gray-300":"#B2B5BE","color-cold-gray-350":"#A3A6AF","color-cold-gray-400":"#9598A1","color-cold-gray-450":"#868993","color-cold-gray-500":"#787B86","color-cold-gray-550":"#6A6D78","color-cold-gray-600":"#5D606B","color-cold-gray-650":"#50535E","color-cold-gray-700":"#434651","color-cold-gray-750":"#363A45","color-cold-gray-800":"#2A2E39","color-cold-gray-850":"#1E222D","color-cold-gray-900":"#131722","color-cold-gray-950":"#0C0E15","color-ripe-red-50":"#FFEBEE","color-ripe-red-100":"#FFCDD2","color-ripe-red-200":"#ef9a9a","color-ripe-red-300":"#E57373","color-ripe-red-400":"#EF5350","color-ripe-red-500":"#F44336","color-ripe-red-600":"#E53935","color-ripe-red-700":"#D32F2F","color-ripe-red-800":"#C62828","color-ripe-red-900":"#B71C1C","color-ripe-red-a200":"#FF5252","color-ripe-red-a700":"#862226","color-ripe-red-a800":"#5B1E24","color-ripe-red-a900":"#351E25","color-tan-orange-50":"#FFF3E0","color-tan-orange-100":"#FFE0B2","color-tan-orange-200":"#FFCC80","color-tan-orange-300":"#ffb74d","color-tan-orange-400":"#FFA726","color-tan-orange-500":"#FF9800","color-tan-orange-600":"#FB8C00","color-tan-orange-700":"#F57C00","color-tan-orange-800":"#EF6C00","color-tan-orange-900":"#e65100","color-tan-orange-a200":"#ffab40","color-tan-orange-a400":"#ff9100","color-tan-orange-a700":"#FF6D00","color-iguana-green-100":"#C8E6C9","color-iguana-green-200":"#A5D6A7","color-iguana-green-300":"#81c784","color-iguana-green-400":"#66BB6A","color-iguana-green-500":"#4caf50","color-iguana-green-600":"#43a047","color-iguana-green-700":"#388e3c","color-iguana-green-800":"#2E7D32","color-iguana-green-900":"#1B5E20","color-iguana-green-a700":"#00c853","color-banana-yellow-100":"#FFF9C4","color-banana-yellow-200":"#FFF59D","color-banana-yellow-300":"#FFF176","color-banana-yellow-400":"#ffee58","color-banana-yellow-500":"#ffeb3b","color-banana-yellow-600":"#fdd835","color-banana-yellow-700":"#fbc02d","color-banana-yellow-800":"#f9a825","color-banana-yellow-900":"#F57F17","color-banana-yellow-a400":"#ffea00","color-banana-yellow-a700":"#ffd600","color-tv-blue-50":"#E3EFFD","color-tv-blue-100":"#BBD9FB","color-tv-blue-200":"#90BFF9","color-tv-blue-300":"#5B9CF6","color-tv-blue-400":"#3179F5","color-tv-blue-500":"#2962FF","color-tv-blue-600":"#1E53E5","color-tv-blue-700":"#1848CC","color-tv-blue-800":"#143EB3","color-tv-blue-900":"#0C3299","color-tv-blue-a100":"#82b1ff","color-tv-blue-a200":"#448aff","color-tv-blue-a400":"#2979ff","color-tv-blue-a600":"#2962FF","color-tv-blue-a700":"#143A87","color-tv-blue-a800":"#142E61","color-tv-blue-a900":"#132042","color-deep-blue-100":"#D1C4E9","color-deep-blue-200":"#B39DDB","color-deep-blue-300":"#9575cd","color-deep-blue-400":"#7e57c2","color-deep-blue-500":"#673ab7","color-deep-blue-700":"#512da8","color-deep-blue-800":"#4527A0","color-deep-blue-900":"#311B92","color-deep-blue-a100":"#b388ff","color-deep-blue-a700":"#6200EA","color-minty-green-50":"#E0F2F1","color-minty-green-100":"#B2DFDB","color-minty-green-200":"#80cbc4","color-minty-green-300":"#4db6ac","color-minty-green-400":"#26a69a","color-minty-green-500":"#009688","color-minty-green-600":"#00897b","color-minty-green-700":"#00796b","color-minty-green-800":"#00695C","color-minty-green-900":"#004D40","color-minty-green-a400":"#1de9b6","color-minty-green-a700":"#00BFA5","color-grapes-purple-50":"#F3E5F5","color-grapes-purple-100":"#E1BEE7","color-grapes-purple-200":"#CE93D8","color-grapes-purple-300":"#ba68c8","color-grapes-purple-400":"#ab47bc","color-grapes-purple-500":"#9c27b0","color-grapes-purple-600":"#8e24aa","color-grapes-purple-700":"#7b1fa2","color-grapes-purple-800":"#6A1B9A","color-grapes-purple-900":"#4A148C","color-grapes-purple-a200":"#E040FB","color-grapes-purple-a400":"#D500F9","color-grapes-purple-a700":"#aa00ff","color-berry-pink-100":"#F8BBD0","color-berry-pink-200":"#f48fb1","color-berry-pink-300":"#f06292","color-berry-pink-400":"#ec407a","color-berry-pink-500":"#e91e63","color-berry-pink-600":"#D81B60","color-berry-pink-700":"#C2185B","color-berry-pink-800":"#AD1457","color-berry-pink-900":"#880E4F","color-berry-pink-a100":"#ff80ab","color-berry-pink-a200":"#ff4081","color-sky-blue-100":"#B2EBF2","color-sky-blue-200":"#80DEEA","color-sky-blue-300":"#4dd0e1","color-sky-blue-400":"#26c6da","color-sky-blue-500":"#00bcd4","color-sky-blue-600":"#00acc1","color-sky-blue-700":"#0097A7","color-sky-blue-800":"#00838F","color-sky-blue-900":"#006064","color-sky-blue-a400":"#00e5ff","color-sky-blue-a700":"#00B8D4","color-deep-blue-600":"#5E35B1","color-facebook":"#1877F2","color-deep-facebook":"#1564CA","color-twitter":"#1DA1F2","color-deep-twitter":"#188CD3","color-youtube":"#FF0000","color-linkedin":"#007BB5","color-aqua-spring":"#ebf9f5","color-army-green":"#3d2c12","color-army-green-2":"#31230d","color-athens-gray-1":"#f2f3f5","color-athens-gray-2":"#f7f8fa","color-athens-gray-3":"#eceff2","color-black-180":"#b4b4b4","color-blue-dianne":"#21384d","color-bluish":"#2185cc","color-bright-gray":"#363c4e","color-brownish-grey":"#8d6e63","color-carnation":"#f04561","color-catskill-white":"#e1ecf2","color-charade":"#2f3241","color-charcoal-grey":"#323337","color-curious-blue":"#299dcd","color-dark-blue-grey":"#123440","color-darkness-blue-grey":"#12213b","color-dark-grey":"#292a2d","color-dark-grey-blue":"#28415a","color-dark-sky-blue":"#37a6ef","color-deep-sea-blue":"#016087","color-ebony-clay":"#262b3e","color-foam":"#d7f0fb","color-gull-gray":"#9db2bd","color-humming-bird":"#d3eef9","color-keppel-1":"#37bc9b","color-keppel-2":"#34b293","color-lavender-blush":"#ffedf0","color-lightish-purple":"#a75ee8","color-loblolly":"#c5cbce","color-manatee":"#878ca8","color-mandy":"#eb4d5c","color-medium-blue":"#2e7bb2","color-milk-chocolate":"#6f2626","color-mirage-1":"#131722","color-mirage-2":"#171b29","color-mirage-3":"#1c2030","color-mischka":"#d6d8e0","color-morning-glory":"#9addcc","color-oslo-gray":"#8b8e95","color-pale":"#fff2cf","color-pale-grey-1":"#f9fafb","color-pale-grey-2":"#e7ebee","color-pale-sky":"#6b7988","color-picton-blue-1":"#3bb3e4","color-puerto-rico":"#3bc2a1","color-purple-brown":"#4e2934","color-purple-brown-2":"#3d2028","color-radical-red":"#ff4a68","color-regent-gray":"#8797a5","color-scooter":"#38acdb","color-silver-tree":"#53b987","color-slate-gray":"#758696","color-sundown":"#ffa4b3","color-sunglow":"#ffca3b","color-tan-hide":"#ff9850","color-trout-1":"#4c525e","color-trout-2":"#4f5966","color-violet-1":"#332738","color-violet-2":"#271d2b","color-white-ice":"#ebf7fc","color-wild-watermelon":"#ff5773","color-readonly-input":"#b4b4b4","color-brand-dark":"#2a2c39","color-seeking-alpha-brand":"#ff7200"}' ) }, iboI: function(e, t, i) { "use strict"; i.r(t), i.d(t, "customFormatters", (function() { return s })); const s = { dateFormatter: null, timeFormatter: null, tickMarkFormatter: null } }, icPo: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolIcon", (function() { return o })); var s = i("Ocx9"), r = i("Ss5c"), n = i("j3hX"); class o extends r.LineDataSource { constructor(e, t) { super(e, t || o.createProperties()), this._sizeScale = NaN, this.version = 1, document.fonts && document.fonts.check && document.fonts.load && !document .fonts.check("12px FontAwesome") && document.fonts.load("12px FontAwesome", "☺").then(() => { this._isDestroyed || e.updateSource(this) }), i.e("lt-pane-views").then(i.bind(null, "8GeE")).then(t => { this._setPaneViews([new t.IconPaneView(this, e)]) }) } pointsCount() { return 1 } name() { return "Icon" } hasEditableCoordinates() { return !1 } getAnchorLimit() { return 80 } applyTemplate(e) { delete e.icon, super.applyTemplate(e) } startChanging(e, t) { super.startChanging(e, t); const i = this.properties().childs(); i.size.value() < 80 ? this._sizeScale = i.size.value() / 80 : this._sizeScale = 1 } getChangePointForSync(e) { return null } setPoint(e, t, i) { const s = Object.assign({}, t), r = this.pointToScreenPoint(this.points()[0])[1], n = this.pointToScreenPoint(s)[1], o = this.properties().childs(); if (0 === e || 1 === e) { const t = n.subtract(r).normalized(), i = -t.x; let s = Math.acos(i); Math.asin(t.y) > 0 && (s = 2 * Math.PI - s), 0 === e && (s += Math.PI), o .angle.setValue(s) } else { let e = 2 * n.subtract(r).length(); e *= this._sizeScale, o.size.setValue(e), o.scale.setValue(1) } } endChanging(e, t) { const i = super.endChanging(e, t); return this._sizeScale = NaN, i } properties() { return super.properties() } getSourceIcon() { return { type: "text", text: String.fromCharCode(this.properties().childs().icon.value()) } } static createProperties(e) { const t = new s.DefaultProperty("linetoolicon", e); return o._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "XCOO")).then( e => e.IconsDefinitionsViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e), e.addChild("backgroundsColors", new n .LineToolColorsProperty([e.childs().color])), e.addExclusion("angle"), e .addExclusion("scale") } } }, ijBy: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SetChartLayoutCommand", (function() { return n })); var s = i("RDU5"), r = i("VNzU"); class n extends s.UndoCommand { constructor(e, t) { super("Change Chart Layout to " + r.layouts[t].title), this ._chartWidgetCollection = e, this._newLayoutType = t, this._oldLayoutType = e.layout.value() } redo() { this._chartWidgetCollection.setLayout(this._newLayoutType) } undo() { this._chartWidgetCollection.setLayout(this._oldLayoutType) } } }, ikwP: function(e, t, i) { "use strict"; i.r(t), i.d(t, "Size", (function() { return o })), i.d(t, "getCanvasDevicePixelRatio", (function() { return a })), i.d(t, "getContext2D", (function() { return l })), i.d(t, "getPrescaledContext2D", (function() { return c })), i.d(t, "getPretransformedContext2D", (function() { return h })), i.d(t, "hardResizeCanvas", (function() { return u })), i.d(t, "resizeCanvasPreservingContent", (function() { return d })), i.d(t, "fillRect", (function() { return p })), i.d(t, "clearRect", (function() { return _ })), i.d(t, "drawScaled", (function() { return m })), i.d(t, "createDisconnectedCanvas", (function() { return f })), i.d(t, "createDisconnectedBoundCanvas", (function() { return g })), i.d(t, "createBoundCanvas", (function() { return v })), i.d(t, "calcTextHorizontalShift", (function() { return S })), i.d(t, "disableSelection", (function() { return y })); var s = i("f2KN"), r = i("Eyy1"), n = i("Ialn"); class o { constructor(e, t) { this.w = e, this.h = t } equals(e) { return this.w === e.w && this.h === e.h } } function a(e) { var t, i; return Math.max(1, (null === (i = null === (t = e.ownerDocument) || void 0 === t ? void 0 : t.defaultView) || void 0 === i ? void 0 : i.devicePixelRatio) || 1) } function l(e) { const t = Object(r.ensureNotNull)(e.getContext("2d")); return t.setTransform(1, 0, 0, 1, 0, 0), t } function c(e) { const t = Object(r.ensureNotNull)(e.getContext("2d")), i = a(e); return t.setTransform(i, 0, 0, i, 0, 0), t } function h(e, t) { const i = Object(r.ensureNotNull)(e.canvas.getContext("2d")); return i.setTransform(e.pixelRatio, 0, 0, e.pixelRatio, 0, 0), t || i.translate(.5, .5), i } function u(e, t) { e.resizeCanvas({ width: 0, height: 0 }), e.resizeCanvas({ width: t.w, height: t.h }) } function d(e, t) { const i = g(document, t), s = c(i.canvas); return s.save(), s.setTransform(1, 0, 0, 1, 0, 0), s.drawImage(e.canvas, 0, 0, e.canvasSize .width * e.pixelRatio, e.canvasSize.height * e.pixelRatio), s.restore(), i } function p(e, t, i, s, r, n) { e.save(), e.translate(-.5, -.5), e.fillStyle = n, e.fillRect(t, i, s, r), e.restore() } function _(e, t, i, s, r, n) { e.save(), e.translate(-.5, -.5), e.globalCompositeOperation = "copy", e.fillStyle = n, e .fillRect(t, i, s, r), e.restore() } function m(e, t, i) { e.save(), e.scale(t, t), i(), e.restore() } function f(e, t, i) { const s = b(e); return void 0 === i && (i = a(s)), s.width = t.w * i, s.height = t.h * i, s } function g(e, t) { const i = b(e), r = Object(s.a)(i, { allowDownsampling: !1 }); return r.resizeCanvas({ width: t.w, height: t.h }), r } function b(e) { const t = e.createElement("canvas"); return y(t), t } function v(e, t) { const i = b(Object(r.ensureNotNull)(e.ownerDocument)); e.appendChild(i); const n = Object(s.a)(i, { allowDownsampling: !1 }); return n.resizeCanvas({ width: t.w, height: t.h }), n } function S(e, t) { return "center" === e.textAlign ? 0 : Object(n.isRtl)() ? "start" === e.textAlign || "right" === e.textAlign ? t : 0 : "start" === e.textAlign || "left" === e.textAlign ? 0 : t } function y(e) { e.style.userSelect = "none", e.style.webkitUserSelect = "none", e.style.msUserSelect = "none", e.style.MozUserSelect = "none", e.style.webkitTapHighlightColor = "transparent" } }, isVH: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty, n = i("j3hX").LineToolColorsProperty; class o extends s { constructor(e, t) { super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "D4q4", 7)).then(({ TrianglePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 3 } name() { return "Triangle" } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D"))) .GeneralFiguresDefinitionsViewModel } static createProperties(e) { var t = new r("linetooltriangle", e); return o._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e), e.addChild("linesColors", new n([e.childs().color])) } } t.LineToolTriangle = o }, it7y: function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyDataWindowView", (function() { return n })); var s = i("4miz"), r = i("EYFt"); class n extends s.b { constructor(e, t) { super(), this._invalidated = !0, this._study = e, this._model = t, this ._valueProvider = this._createValuesProvider(e, t), this._items = this ._valueProvider.getItems().map(e => new s.a(e.title, "")), this.update() } update() { this._invalidated = !0 } items() { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._items } study() { return this._study } _updateImpl() { this._header = this._study.title(!0), this._title = this._study.title(); const e = this._valueProvider.getValues(this._currentIndex()); for (let t = 0; t < e.length; ++t) { const i = e[t], s = this._items[t]; s.setValue(i.value), s.setVisible(i.visible), s.setColor(i.color) } } _currentIndex() { const e = this._model.crossHairSource().lockedIndex; return void 0 !== e ? e : null !== this._model.crossHairSource().pane ? this ._model.crossHairSource().appliedIndex() : null } _createValuesProvider(e, t) { return new r.a(e, t) } } }, iu9X: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return r })), i.d(t, "a", (function() { return n })); var s = i("Eyy1"); class r { constructor() { this._horizlines = [], this._hhists = [], this._polygons = [], this._vertlines = [], this._containersCache = [], this._containerNamesCache = [], this ._containersMapCache = new Map, this._addToCache("horizlines", this ._horizlines), this._addToCache("hhists", this._hhists), this._addToCache( "polygons", this._polygons), this._addToCache("vertlines", this._vertlines) } primitiveData(e) { const t = {}; let i = !1; for (const s of this._containerNamesCache) { const r = [], n = this.getObjsContainer(s); for (const t of n) { if (t.isNaN()) continue; const i = t.primitiveData(e); i.data.length > 0 && r.push(i) } r.length > 0 && (t[s] = r, i = !0) } return i ? t : null } deleteErasedAndMarkPostedObjs() { this.forEachList(e => { e.deleteErasedItems(), e.markPostedItems() }) } deleteErasedObjs() { this.forEachList(e => e.deleteErasedItems()) } getObjsContainer(e) { return Object(s.ensureDefined)(this._containersMapCache.get(e)) } forEachList(e) { for (const t of this._containersCache) for (const i of t) e(i.data) } _addToCache(e, t) { this._containersCache.push(t), this._containerNamesCache.push(e), this ._containersMapCache.set(e, t) } } class n { constructor(e, t) { this.styleId = e, this.data = t } isNaN() { return this.data.isNaN() } primitiveData(e) { return { styleId: this.styleId, data: this.data.primitivesData(e) } } } }, ivNn: function(e, t, i) { "use strict"; function s(e) { return Math.round(1e10 * e) / 1e10 } Object.defineProperty(t, "__esModule", { value: !0 }), t.alignTo = t.fixComputationError = t.isNaN = t.isInteger = t.isNumber = void 0, t .isNumber = function(e) { return "number" == typeof e && isFinite(e) }, t.isInteger = function(e) { return "number" == typeof e && e % 1 == 0 }, t.isNaN = function(e) { return !(e <= 0 || e > 0) }, t.fixComputationError = s, t.alignTo = function(e, t) { var i = e / t, r = Math.floor(i), n = i - r; return n > 2e-10 ? s(n > .5 ? (r + 1) * t : r * t) : e } }, j3hX: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolMultiplePropertyBaseImpl", (function() { return l })), i.d(t, "LineToolCollectedProperty", (function() { return c })), i.d(t, "LineToolWidthsProperty", (function() { return h })), i.d(t, "LineToolColorsProperty", (function() { return u })), i.d(t, "MultipleLineWidthsProperty", (function() { return p })), i.d(t, "MultipleLineColorsProperty", (function() { return _ })); var s = i("txPx"), r = i("aIyQ"), n = i.n(r); const o = Object(s.getLogger)("Chart.LineToolCollectedProperty"); class a { applyValue(e, t) { e.setValue(t) } } class l { constructor(e, t) { this._onChange = new n.a, this._properties = e, e.forEach(e => e.subscribe(this, () => { this._onChange.fire(this) })), this._showIfProperty = t } visible() { var e; return !this._showIfProperty || (null === (e = this._showIfProperty) || void 0 === e ? void 0 : e.value()) } value() { if (0 === this._properties.length) return o.logError( "Incorrect call, should not request value of 0 properties"), "mixed"; const e = this._properties[0].value(); return 1 === this._properties.length || this._properties.every(t => t.value() === e) ? e : "mixed" } state() {} merge() {} destroy() { this._properties.forEach(e => e.unsubscribeAll(this)) } subscribe(e, t) { this._onChange.subscribe(e, t) } unsubscribe(e, t) { this._onChange.unsubscribe(e, t) } unsubscribeAll(e) { this._onChange.unsubscribeAll(e) } } class c extends l { setValue(e, t, i) { if ("mixed" === e) return; const s = null != i ? i : new a; this._properties.forEach(t => s.applyValue(t, e)) } } class h extends c {} class u extends c { firstColor() { return this._properties[0].value() } } class d extends l { setValue(e, t, i) { if ("mixed" === e) return; const s = null != i ? i : new a; this._properties.forEach(t => t.setValue(e, void 0, s)) } } class p extends d {} class _ extends d {} }, j8de: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("tc+8"), r = i.n(s); class n extends r.a { constructor(e, t) { super(), this._lineSource = e, this._pointIndex = t } value() { return this._lineSource.points()[this._pointIndex].index } setValue(e) { const t = this._lineSource.points()[this._pointIndex]; t.index = e, this._lineSource.startChanging(this._pointIndex, t), this ._setPointImpl(t), this._lineSource.model().updateSource(this._lineSource), this._listeners.fire(this); const i = this._lineSource.endChanging(!0, !1); this._lineSource.syncMultichartState(i) } _setPointImpl(e) { this._lineSource.setPoint(this._pointIndex, e) } } }, jA0t: function(e, t, i) { "use strict"; var s = function() { var e = {}; function t(e) { return e.is_price_study } function i(e, t) { var i = t.slice(0).toLowerCase(); if (e) { for (var s = 0; s < e.length; ++s) if (e[s].description.toLowerCase() === i || e[s].shortDescription .toLowerCase() === i) return e[s]; throw new Error("Can't find metainfo for `" + t + "`") } throw new Error("There is no studies metainfo at all") } var s = { bool: function(e) { return !!e }, integer: function(e) { return parseInt(e) }, float: function(e) { return parseFloat(e) }, string: function(e) { return e } }; return e.getStudyRecordFromArray = function(e, r) { return function(e, r) { var n; if (!Array.isArray(e)) return { id: (n = i(r.model().studiesMetaData(), e)).id, overlay: t(n) }; for (var o, a = e.slice(0), l = a[0], c = t(n = i(r.model() .studiesMetaData(), l)), h = n.inputs.map((function(e) { return { id: e.id, type: e.type, name: e.name } })), u = a.splice(1), d = 0; d < u.length; ++d) { o || (o = {}); var p = s[h[d].type] || s.string; o[h[d].id] = p(u[d]) } return { id: n.id, name: l, overlay: c, inputs: o } }(e, r) }, e }(); e.exports = s }, jCNj: function(e, t, i) { "use strict"; var s = i("99ZO"), r = i("3UA0").tzData; function n(e) { this._name = e; var t = r[e]; if (t || (t = { time: [], offset: [] }, this._invalid = !0), t.time.length !== t.offset.length && (t = { time: [], offset: [] }, this._invalid = !0), !t.time_utc) { for (var i = t.time, s = t.offset, n = i.length, o = new Array(n), a = 0; a < n; a++) i[ a] *= 1e3, s[a] *= 1e3, o[a] = i[a] - s[a]; t.time_utc = o } this.tz = t } function o(e, t) { var i = e.length; if (0 === i) return -1; if (isNaN(t)) throw Error("Key is NaN"); for (var s = 0, r = i - 1, n = a((s + r) / 2);;) { if (e[n] > t) { if ((r = n - 1) < s) return n } else if (r < (s = n + 1)) return n < i - 1 ? n + 1 : -1; n = a((s + r) / 2) } } n.prototype.offset_utc = function(e) { return n._offset(this.tz.time_utc, this.tz.offset, e) }, n.prototype.offset_loc = function(e) { return n._offset(this.tz.time, this.tz.offset, e) }, n.prototype.name = function() { return this._name }, n.prototype.correction_loc = function(e) { var t = this.tz.time, i = this.tz.offset, s = o(t, e); if (s < 1) return 0; var r = i[s] - i[s - 1]; if (r > 0 && e - t[s - 1] <= r) return r; return 0 }, n.prototype.is_valid = function() { return !this._invalid }, n._offset = function(e, t, i) { var s = o(e, i); return -1 === s ? 0 : t[s] }; var a = function(e) { return 0 | e }, l = function(e) { return 60 * e * 1e3 }, c = function(e, t) { return h(e) - h(t) }, h = function(e) { return e < 0 ? a(e / 1e3) - (e % 1e3 != 0 ? 1 : 0) : a(e / 1e3) }; function u(e) { return e % 4 == 0 && (e % 100 != 0 || e % 400 == 0) } var d = { 0: 0, 1: 31, 2: 59, 3: 90, 4: 120, 5: 151, 6: 181, 7: 212, 8: 243, 9: 273, 10: 304, 11: 334 }, p = { ...s.WeekDays, ...s.Months, YEAR: 1, MONTH: 2, WEEK_OF_YEAR: 3, DAY_OF_MONTH: 5, DAY_OF_YEAR: 6, DAY_OF_WEEK: 7, HOUR_OF_DAY: 11, MINUTE: 12, SECOND: 13, minutesPerDay: 1440, millisecondsPerDay: l(1440), get_minutes_from_hhmm: function(e) { return -1 !== e.indexOf(":") && (e = e.split(":").join("")), e % 100 + 60 * a( e / 100) }, get_year: function(e) { return e.getUTCFullYear() }, get_month: function(e) { return e.getUTCMonth() }, get_hours: function(e) { return e.getUTCHours() }, get_minutes: function(e) { return e.getUTCMinutes() }, get_seconds: function(e) { return e.getUTCSeconds() }, get_day_of_month: function(e) { return e.getUTCDate() }, get_day_of_week: function(e) { return e.getUTCDay() + 1 }, get_day_of_year: function(e) { var t = e.getUTCMonth(), i = d[t]; return t > p.JANUARY + 1 && u(e.getUTCFullYear()) && (i += 1), i + e .getUTCDate() }, get_week_of_year: function(e) { var t = new Date(Date.UTC(e.getUTCFullYear(), 0, 1)).getUTCDay(), i = 0 === t ? 1 : 8 - t, s = p.get_day_of_year(e) - i; return Math.ceil(s / 7) + 1 }, get_minutes_from_midnight: function(e) { return 60 * p.get_hours(e) + p.get_minutes(e) }, set_hms: function(e, t, i, s, r, n) { e.setUTCHours(t), e.setUTCMinutes(i), e.setUTCSeconds(s), e.setUTCMilliseconds( r), p.correct_time(e, n) }, correct_time: function(e, t) { var i = e.getTime(), s = t.correction_loc(i); e.setTime(i + s) }, add_days_considering_dst: function(e, t, i) { var s = e.offset_utc(t), r = this.clone(t); this.add_date(r, i); var n = e.offset_utc(r); return r.setTime(r.getTime() + s - n), r }, add_date: function(e, t) { e.setTime(e.getTime() + t * p.millisecondsPerDay) }, add_minutes: function(e, t) { e.setTime(e.getTime() + l(t)) }, clone: function(e) { return new Date(e.getTime()) }, get_days_per_year: function(e) { var t = e.getUTCFullYear(); return this.days_per_year(t) }, days_per_year: function(e) { return u(e) ? 366 : 365 }, get_days_in_month: function(e, t) { let i; switch (e) { case 0: case 2: case 4: case 6: case 7: case 9: case 11: i = 31; break; case 1: i = 28, u(t) && i++; break; default: i = 30 } return i }, get_part: function(e, t) { switch (t) { case p.YEAR: return p.get_year(e); case p.MONTH: return p.get_month(e); case p.DAY_OF_MONTH: return p.get_day_of_month(e); case p.WEEK_OF_YEAR: return p.get_week_of_year(e); case p.DAY_OF_WEEK: return p.get_day_of_week(e); case p.HOUR_OF_DAY: return p.get_hours(e); case p.MINUTE: return p.get_minutes(e); case p.DAY_OF_YEAR: return p.get_day_of_year(e); case p.SECOND: return p.get_seconds(e); default: return e.getTime() } }, time_minutes: l, time_seconds: function(e) { return 1e3 * e }, time_minutes_diff: function(e, t) { return a(c(e, t) / 60) }, time_seconds_diff: c, utc_to_cal: function(e, t) { return new Date(p.utc_to_cal_ts(e, t)) }, utc_to_cal_ts: function(e, t) { return t + e.offset_utc(t) }, get_cal: function(e, t, i, s, r, n, o) { var a = new Date(Date.UTC(t, i, s, r || 0, n || 0, o || 0)), l = e.offset_utc(+a); return new Date(a.valueOf() - l) }, get_cal_from_unix_timestamp_ms: function(e, t) { return new Date(t + e.offset_utc(t)) }, get_cal_utc: function(e, t, i) { return new Date(Date.UTC(e, t, i)) }, cal_to_utc: function(e, t) { var i = t.getTime(); return i - e.offset_loc(i) }, get_timezone: function(e) { return new n(e) }, shift_day: function(e, t) { var i = e - 1; return (i += t) > 6 ? i %= 7 : i < 0 && (i = (7 + i % 7) % 7), i + 1 } }; e.exports = p }, jFln: function(e, t, i) { "use strict"; var s = i("Hr11"), r = s.greaterThan, n = s.lessThan, o = window.CanvasEx = i("8Uy/"); o.computeDashPattern = function(e) { return [ [e.lineWidth, 2 * e.lineWidth], [5 * e.lineWidth, 6 * e.lineWidth], [6 * e.lineWidth, 6 * e.lineWidth], [e.lineWidth, 4 * e.lineWidth], [2 * e.lineWidth, e.lineWidth] ][e.lineStyle - 1] }, o.drawLine = function(e, t, i, s, r) { isFinite(t) && isFinite(s) && isFinite(i) && isFinite(r) && (e.lineStyle !== o .LINESTYLE_SOLID ? o.drawDashedLine(e, t, i, s, r) : o.drawSolidLine(e, t, i, s, r)) }, o.drawArrow = function(e, t, i, s, r, n) { if (isFinite(t) && isFinite(s) && isFinite(i) && isFinite(r)) { var o = Math.round(n / 2), a = t + o, l = s + o; e.beginPath(), e.moveTo(l, r), e.lineTo(a, i), e.moveTo(t, i + o), e.lineTo(a, i), e .lineTo(t + n, i + o), e.stroke() } }, o.drawSolidLine = function(e, t, i, s, r) { e.beginPath(), e.moveTo(t, i), e.lineTo(s, r), e.stroke() }, o.setLineStyle = function(e, t) { e.lineStyle = t; var i = []; t !== o.LINESTYLE_SOLID && (i = o.computeDashPattern(e)), o.setLineDash(e, i) }, o.setLineDash = function(e, t) { "function" == typeof e.setLineDash ? e.setLineDash(t) : void 0 !== e.mozDash ? e .mozDash = t : void 0 !== e.webkitLineDash && (e.webkitLineDash = t) }, o.drawPoly = function(e, t, i) { e.beginPath(), e.moveTo(t[0].x, t[0].y); for (var s = 0; s < t.length; s++) { var r = t[s]; e.lineTo(r.x, r.y) } e.closePath(), e.stroke(), i && e.fill() }, o.drawDashedLine = function(e, t, i, s, r) { e.save(); var n = o.computeDashPattern(e); if (e.beginPath(), "function" == typeof e.setLineDash) e.setLineDash(n); else if (void 0 !== e.mozDash) e.mozDash = n; else { if (void 0 === e.webkitLineDash) return o.dashedLineTo(e, t, i, s, r, n), e .stroke(), void e.restore(); e.webkitLineDash = n } e.moveTo(t, i), e.lineTo(s, r), e.stroke(), e.restore() }, o.drawDashedLineHorizontal = function(e, t, i, s) { e.save(); var r = o.computeDashPattern(e), n = 0, a = e.lineWidth, l = a / 2; e.translate(-l, -l); for (var c = !0, h = t + s; t < h;) { var u = r[n]; c && e.fillRect(t, i, u, a), c = !c, t += u, n = n === r.length - 1 ? 0 : n + 1 } e.restore() }, o.drawDashedLineVertical = function(e, t, i, s) { e.save(); var r = o.computeDashPattern(e), n = 0, a = e.lineWidth, l = a / 2; e.translate(-l, -l); for (var c = !0, h = i + s; i < h;) { var u = r[n]; c && e.fillRect(t, i, a, u), c = !c, i += u, n = n === r.length - 1 ? 0 : n + 1 } e.restore() }, o.dashedLineTo = function(e, t, i, s, o, a) { var l = { thereYet: r, cap: Math.min }, c = { thereYet: r, cap: Math.min }; i - o > 0 && (c.thereYet = n, c.cap = Math.max), t - s > 0 && (l.thereYet = n, l.cap = Math.max), e.moveTo(t, i); for (var h = t, u = i, d = 0, p = !0; !l.thereYet(h, s) || !c.thereYet(u, o);) { var _ = Math.atan2(o - i, s - t), m = a[d]; h = l.cap(s, h + Math.cos(_) * m), u = c.cap(o, u + Math.sin(_) * m), p ? e.lineTo( h, u) : e.moveTo(h, u), d = (d + 1) % a.length, p = !p } }, o.setFont = function(e, t) { if (e.font !== t) try { e.font = t } catch (e) {} }, "undefined" != typeof CanvasRenderingContext2D && (CanvasRenderingContext2D.prototype .setFont = function(e) { o.setFont(this, e) }, CanvasRenderingContext2D.prototype.lineStyle = o.LINESTYLE_SOLID), e.exports = o }, jJ9X: function(e, t, i) {}, jRfx: function(e, t, i) { "use strict"; i.d(t, "c", (function() { return o })), i.d(t, "a", (function() { return a })), i.d(t, "b", (function() { return l })); var s = i("Eyy1"), r = i("3u3j"); class n extends r.a { constructor(e, t, i) { super(e, t, i), this._restorePane = !1 } redo() { const e = this._chartModel.panes().length, t = this._chartModel.panes()[this._targetPaneIndex()], i = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this ._sourceId)), r = Object(s.ensureNotNull)(this._chartModel.paneForSource(i)), n = this._chartModel.children(i, !0); r.bulkActionMacro(() => { n.forEach(e => this._chartModel.detachSource(e)), this ._restorePane = this._chartModel.detachSource(i) }); const o = "overlay" === this._initialPriceScalePosition ? this ._initialPriceScalePosition : void 0, a = t.findSuitableScale(i, void 0, o), l = 0 === a.dataSources().length; if (t.bulkActionMacro(() => { t.addDataSource(i, a, !1), n.forEach(e => t.addDataSource(e, a, !1)) }), i === this._chartModel.mainSeries()) { const e = t.priceScalePosition(a); t.movePriceScale(a, e, 0) } if (l) { Object(s.ensureNotNull)(i.priceScale()).restoreState(this ._newPriceScaleState(t.isOverlay(i))) } this._chartModel.fullUpdate(), e !== this._chartModel.panes().length && this ._chartModel.setShouldBeSavedEvenIfHidden(!0) } undo() { let e; e = this._restorePane ? this._chartModel.createPane(this._initialPaneIndex) : this._chartModel.panes()[this._initialPaneIndex]; const t = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this ._sourceId)), i = Object(s.ensureNotNull)(this._chartModel.paneForSource(t)), r = this._chartModel.children(t, !0); i.bulkActionMacro(() => { r.forEach(e => this._chartModel.detachSource(e)), this._chartModel .detachSource(t) }); let n = e.getPriceScaleById(this._initialPriceScaleId); null === n && (n = e.createPriceScaleAtPosition(this._initialPriceScalePosition, this._initialPriceScaleIndex)), e.bulkActionMacro(() => { e.addDataSource(t, n, !0), r.forEach(t => e.addDataSource(t, n, !1)) }), Object(s.ensureNotNull)(t.priceScale()).restoreState(this ._originalPriceScaleState()), this._chartModel.fullUpdate() } } class o extends n { constructor(e, t, i) { super(e, t, i) } _targetPaneIndex() { return this._initialPaneIndex - 1 } } class a extends n { constructor(e, t, i) { super(e, t, i) } _targetPaneIndex() { return this._initialPaneIndex + 1 } } class l extends n { constructor(e, t, i, s) { super(e, t, s), this._targetPane = i } _targetPaneIndex() { return this._targetPane } } }, jTis: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "CalloutConsts", (function() { return s })), function(e) { e[e.RoundRadius = 8] = "RoundRadius", e[e.TextMargins = 2] = "TextMargins", e[e .MinWidth = 100] = "MinWidth" }(s || (s = {})) }, jeZR: function(e, t, i) { "use strict"; i.r(t), i.d(t, "AppliedTimeFrame", (function() { return r })); var s = i("QfUd"); class r { constructor(e) { this._appliedTimeFrame = new s.a(null), this._appliedTimeFrameInfo = null, this ._appliedTimeFrameChangedBound = this._appliedTimeFrameChanged.bind(this), this ._model = e, e.mainSeries().dataEvents().seriesTimeFrame().subscribe(this, this ._onSeriesTimeFrame), this._appliedTimeFrame.subscribe(this ._appliedTimeFrameChangedBound) } destroy() { this._appliedTimeFrame.unsubscribe(this._appliedTimeFrameChangedBound), this._model .timeScale().logicalRangeChanged().unsubscribeAll(this), this._model .mainSeries().dataEvents().seriesTimeFrame().unsubscribeAll(this) } appliedTimeFrame() { return this._appliedTimeFrame } _appliedTimeFrameChanged() { this._model.timeScale().logicalRangeChanged().unsubscribe(this, this ._invalidateAppliedTimeFrame) } _onSeriesTimeFrame(e, t, i, s) { if (s) { const e = this._model.timeScale(); this._appliedTimeFrameInfo = { logicalRange: e.logicalRange(), baseIndex: e.baseIndex() }, e.logicalRangeChanged().subscribe(this, this._invalidateAppliedTimeFrame) } } _invalidateAppliedTimeFrame() { if (null === this._appliedTimeFrameInfo) return; const e = this._model.timeScale(), t = e.logicalRange(), i = e.baseIndex(), s = this._appliedTimeFrameInfo.logicalRange, r = this._appliedTimeFrameInfo.baseIndex; (null === t || null === s || Math.abs(i - t.left() - (r - s.left())) >= .01 || Math .abs(i - t.right() - (r - s.right())) >= .01) && this._appliedTimeFrame .setValue(null) } } }, jenN: function(e, t, i) { "use strict"; i.r(t); var s = i("txPx"), r = i("7Fue"), n = i("xWfy"), o = i("qySK"), a = i("KcY8"); class l extends a.a { constructor(e, t) { super(), this._source = e, this._data = t } _updateRendererData(e, t, i) { e.visible = !1; const s = this._source.priceScale(), r = this._source.properties().visible.value(); if (!s || s.isEmpty() || !r) return; const n = this._source.properties().graphics[this._data.lineType][this._data .styleId ]; if (!(n.visible && n.visible.value() && n.showPrice && n.showPrice.value())) return; const o = this._source.firstValue(); if (null === o) return; const a = this._data.line.level, l = n.color.value(); i.background = l, i.textColor = this.generateTextColor(l), i.coordinate = s .priceToCoordinate(a, o), e.text = s.formatPrice(a, o), e.visible = !0 } } i.d(t, "createGraphicsPaneViews", (function() { return d })), i.d(t, "createGraphicsPriceAxisViews", (function() { return _ })), i.d(t, "isStudyGraphicsEmpty", (function() { return r.a })), i.d(t, "StaticStudyGraphics", (function() { return n.a })), i.d(t, "emptyStudyGraphics", (function() { return n.b })), i.d(t, "loadStudyGraphics", (function() { return n.c })), i.d(t, "saveStudyGraphics", (function() { return n.d })), i.d(t, "LiveStudyGraphics", (function() { return o.a })); const c = Object(s.getLogger)("Chart.StudyGraphics"), h = new Set(["dwgtablecells"]); async function u(e, t, s, r) { switch (e) { case "hhists": return new((await i.e("study-pane-views").then(i.bind(null, "Gj0v"))) .HHistPaneView)(t, s, r); case "horizlines": return new((await i.e("study-pane-views").then(i.bind(null, "1sos"))) .HorizLinePaneView)(t, s, r); case "vertlines": return new((await i.e("study-pane-views").then(i.bind(null, "psYU"))) .VertLinePaneView)(t, s, r); case "polygons": return new((await i.e("study-pane-views").then(i.bind(null, "BJvp"))) .PolygonPaneView)(t, s, r) } return null } async function d(e, t, i) { const s = [], r = Object.keys(e.graphicsInfo()); r.sort((e, t) => p(e) - p(t)); for (const n of r) { const r = await u(n, e, t, i); null !== r ? s.push(r) : h.has(n) || c.logWarn(n + " is not supported by this build of graphics subsystem, skipping") } return s } function p(e) { switch (e) { case "polygons": return -100; case "trendchannels": return -90; default: return 0 } } function _(e) { const t = Object.keys(e.graphicsInfo()), i = []; for (const s of t) switch (s) { case "hlines": e.graphics().hlines().forEach((t, r) => { t.forEach(t => { void 0 !== t.level && i.push(new l(e, { line: { level: t.level }, styleId: r, lineType: s })) }) }); break; case "horizlines": e.graphics().horizlines().forEach((t, r) => { t.forEach(t => { void 0 !== t.level && i.push(new l(e, { line: { level: t.level }, styleId: r, lineType: s })) }) }) } return i } }, jkoZ: function(e, t, i) { "use strict"; var s = i("XlJ7").makeFont, r = i("XlJ7").parseFont, n = (0, i("txPx").getLogger)("Model.ChartTradingUtils"), o = { _fontHeightCache: {}, _parsedColorCache: {}, _parseColor: function(e) { if (this._parsedColorCache[e]) return this._parsedColorCache[e]; var t = document.createElement("div"); t.style.color = e; var i = t.style.color.match( /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i) || t.style.color .match( /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d*\.?\d+)\s*\)$/i), s = { r: i[1], g: i[2], b: i[3], a: i[4] || "1" }; return this._parsedColorCache[e] = s, s }, getColorFromProperties: function(e, t) { var i = 1 - t.value() / 100, s = this._parseColor(e.value()); return "rgba(" + s.r + "," + s.g + "," + s.b + "," + i + ")" }, setColorToProperties: function(e, t, i) { var s = this._parseColor(e); t.setValue("rgb(" + s.r + "," + s.g + "," + s.b + ")"); var r = 100 * (1 - s.a); i.setValue(Math.max(0, Math.min(r, 100))) }, getFontFromProperties: function(e, t, i, r) { return s(t.value(), e.value(), r.value() ? "italic" : "", i.value() ? "bold" : "") }, setFontToProperties: function(e, t, i, s, o) { var a = r(e); null !== a ? (a.family.length > 0 && t.setValue(a.family), i.setValue(a.size), s .setValue(a.bold), o.setValue(a.italic)) : n.logError("Invalid font: " + e) }, fontHeight: function(e) { if (!this._fontHeightCache[e]) { var t = document.createElement("span"); t.appendChild(document.createTextNode("height")), document.body.appendChild( t), t.style.cssText = "font: " + e + "; white-space: nowrap; display: inline;"; var i = t.offsetHeight; document.body.removeChild(t), this._fontHeightCache[e] = Math.ceil(i) } return this._fontHeightCache[e] }, drawPolyHoverOrPress: function(e, t, i, s) { s ? (e.save(), e.fillStyle = "rgba(0, 0, 0, 0.15)", CanvasEx.drawPoly(e, t, !0), e.restore()) : i && (e.save(), e.fillStyle = "rgba(0, 0, 0, 0.1)", CanvasEx.drawPoly(e, t, !0), e.restore()) }, repaint: function(e) { e.lightUpdate() }, roundToMinTick: function(e, t) { var i = 1 / e.mainSource().base(); return i * Math.round(t / i) } }; e.exports = o }, jofe: function(e, t, i) { "use strict"; function s() { let e, t; return { promise: new Promise((i, s) => { e = i, t = s }), reject: t, resolve: e } } i.r(t), i.d(t, "createDeferredPromise", (function() { return s })) }, jpZi: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); var s = i("Eyy1"), r = (i("YFKU"), i("HbRj"), i("RDU5")); const n = window.t("Exclude line tools from group {group}"); class o extends r.UndoCommand { constructor(e, t, i) { super(n.format({ group: t.name() })), this._model = e, this._groupId = t.id, this._groupName = t.name(), this ._lineToolsIds = i.map(e => e.id()) } redo() { const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId( this._groupId)), t = this._lineToolsIds.map(e => this._model.dataSourceForId(e)); e.excludeLineTools(t), 0 === e.lineTools().length && this._model .lineToolsGroupModel().removeGroup(e) } undo() { const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)), t = this._model.lineToolsGroupModel().groupForId(this._groupId); null !== t ? t.addLineTools(e) : this._model.lineToolsGroupModel().createGroup( e, this._groupName, this._groupId) } } }, jvrd: function(e, t, i) { "use strict"; i.d(t, "g", (function() { return n })), i.d(t, "e", (function() { return a })), i.d(t, "d", (function() { return l })), i.d(t, "c", (function() { return c })), i.d(t, "f", (function() { return h })), i.d(t, "a", (function() { return u })), i.d(t, "b", (function() { return d })); var s = i("Eyy1"), r = i("k9/m"); function n(e, t, i) { const s = e.barFunction(); switch (e.style()) { case 3: case 10: case 2: return s(t.value); default: return t.value[-1 === i ? 3 : 2] } } function o(e) { return e >= 0 ? 1 : -1 } function a(e, t) { return -1 === o(e) !== t ? -1 : 1 } function l(e, t, i, s) { const r = Math.min(t, Math.max(0, 1 === s ? i : t - i)); return i - s * Math.abs(r * e / 100) } function c(e, t, i) { const s = e.index(); return null === s ? null : { index: s, price: t.coordinateToPrice(t.height() / 2, i) } } function h(e, t) { const i = e.data().bars(), s = i.first(), a = i.last(); if (null === s || null === a) return null; let l; const c = t.index(); if (null === c) { if (void 0 === t.time) return null; const e = t.time(), n = s.value[0], o = a.value[0]; if (e < n - 86400 || e > o) return null; l = i.searchByTime(e, r.PlotRowSearchMode.NearestRight, 4) } else l = i.search(c); return null === l ? null : { index: l.index, price: n(e, l, o(t.position())) } } function u(e, t, i) { const s = c(e, t, i); if (null === s) return null; const r = a(e.position(), t.isInverted()); return { index: s.index, price: s.price, poleStartY: t.height(), visualDirection: 1, positionPointDirection: r } } function d(e, t) { const i = h(e, t), r = e.priceScale(), n = Object(s.ensureNotNull)(e.firstValue()); if (null === i) return u(t, r, n); let o = 0; const l = e.properties(), c = e.model().timeScale(), d = r.priceToCoordinate(i.price, n); switch (e.style()) { case 3: o = l.areaStyle.linewidth.value() / 2; break; case 2: o = l.lineStyle.linewidth.value() / 2; break; case 10: const e = Math.abs(100 - l.baselineStyle.baseLevelPercentage.value()); o = r.height() * e / 100 > d ? l.baselineStyle.topLineWidth.value() / 2 : l .baselineStyle.bottomLineWidth.value() / 2; break; case 1: case 9: case 8: case 12: o = 3; break; case 0: o = l.barStyle.thinBars.value() ? 3 : Math.max(3, .25 * c.barSpacing()); break; case 11: o = l.rangeStyle.thinBars.value() ? 3 : Math.max(3, .25 * c.barSpacing()); break; case 4: case 7: o = 3; break; case 5: o = Math.max(4, .25 * c.barSpacing()); break; case 6: o = Math.max(5, .25 * c.barSpacing()) } const p = a(t.position(), r.isInverted()), _ = d - p * o; return { index: i.index, price: i.price, poleStartY: _, visualDirection: p, positionPointDirection: p } } }, jy4L: function(e, t, i) { "use strict"; i.r(t), i.d(t, "makeNextSymbolId", (function() { return r })), i.d(t, "makeNextStudyId", (function() { return o })); let s = 0; function r() { return s++, "ss_" + s } let n = 0; function o() { return n++, "st" + n } }, k4w6: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })); var s = i("2ijp"); class r extends s.a { constructor(e) { super(), this._series = e, this._model = e.model() } } }, "k9/m": function(e, t, i) { "use strict"; i.r(t), i.d(t, "PlotRowSearchMode", (function() { return l })), i.d(t, "PlotList", (function() { return u })), i.d(t, "mergeMinMax", (function() { return d })), i.d(t, "mergePlotRows", (function() { return p })); var s = i("Eyy1"), r = i("Y7w9"), n = i("tqok"), o = i("txPx"); const a = Object(o.getLogger)("Chart.PlotList"); var l; ! function(e) { e[e.NearestLeft = -1] = "NearestLeft", e[e.Exact = 0] = "Exact", e[e.NearestRight = 1] = "NearestRight" }(l || (l = {})); function c(e) { return e.index } function h(e) { return e.value[0] } class u { constructor(e = null, t = null) { this._items = [], this._start = 0, this._end = 0, this._shareRead = !1, this ._minMaxCache = new Map, this._rowSearchCacheByIndex = new Map, this ._rowSearchCacheByIndexWithoutEmptyValues = new Map, this ._rowSearchCacheByTime = new Map, this._rowSearchCacheByTimeWithoutEmptyValues = new Map, this._plotFunctions = e || new Map, this._emptyValuePredicate = t } clear() { this._items = [], this._start = 0, this._end = 0, this._shareRead = !1, this ._minMaxCache.clear(), this._invalidateSearchCaches() } first() { return this.size() > 0 ? this._items[this._start] : null } last() { return this.size() > 0 ? this._items[this._end - 1] : null } firstIndex() { return this.size() > 0 ? this._indexAt(this._start) : null } lastIndex() { return this.size() > 0 ? this._indexAt(this._end - 1) : null } size() { return this._end - this._start } isEmpty() { return 0 === this.size() } contains(e) { return null !== this.search(e, l.Exact) } valueAt(e) { const t = this.search(e); return null !== t ? t.value : null } add(e, t) { if (this._shareRead) return a.logDebug( "add: readonly collection modification attempt"), !1; const i = { index: e, value: t }, s = this._nonCachedSearch(e, l.Exact, c); return this._invalidateSearchCaches(), null === s ? (this._items.splice(this ._lowerbound(e, c), 0, i), this._start = 0, this._end = this._items .length, !0) : (this._items[s] = i, !1) } search(e, t = l.Exact, i) { return this._searchImpl(e, t, this._rowSearchCacheByIndex, this ._rowSearchCacheByIndexWithoutEmptyValues, c, i) } searchByTime(e, t = l.Exact, i) { return this._searchImpl(e, t, this._rowSearchCacheByTime, this ._rowSearchCacheByTimeWithoutEmptyValues, h, i) } fold(e, t) { let i = t; for (let t = this._start; t < this._end; ++t) { i = e(this._indexAt(t), this._valueAt(t), i) } return i } findFirst(e, t) { const i = void 0 !== t && Math.min(this._start + t, this._end) || this._end; for (let t = this._start; t < i; ++t) { const i = this._indexAt(t), s = this._valueAt(t); if (e(i, s)) return { index: i, value: s } } return null } findLast(e, t) { const i = void 0 !== t && Math.max(this._end - t, this._start) || this._start; for (let t = this._end - 1; t >= i; --t) { const i = this._indexAt(t), s = this._valueAt(t); if (e(i, s)) return { index: i, value: s } } return null } each(e) { for (let t = this._start; t < this._end; ++t) { if (e(this._indexAt(t), this._valueAt(t))) break } } reduce(e, t) { let i = t; for (let t = this._start; t < this._end; ++t) { i = e(i, this._indexAt(t), this._valueAt(t)) } return i } range(e, t) { const i = new u(this._plotFunctions, this._emptyValuePredicate); return i._items = this._items, i._start = this._lowerbound(e, c), i._end = this ._upperbound(t), i._shareRead = !0, i } rangeIterator(e, t) { const i = this._lowerbound(e, c), s = this._upperbound(t); if (i === s) return { hasNext: () => !1, next: () => { throw new Error("Invalid operation") } }; let r = i - 1; return { hasNext: () => r < s - 1, next: () => (r += 1, this._items[r]) } } minMaxOnRangeCached(e, t, i) { if (this.isEmpty()) return null; let s = null; for (const r of i) { s = d(s, this._minMaxOnRangeCachedImpl(e - r.offset, t - r.offset, r.name)) } return s } minMaxOnRange(e, t, i) { if (this.isEmpty()) return null; let s = null; for (const r of i) { s = d(s, this._minMaxOnRange(e - r.offset, t - r.offset, r.name)) } return s } merge(e) { return this._shareRead ? (a.logDebug( "merge: readonly collection modification attempt"), null) : 0 === e.length ? null : this.isEmpty() || e[e.length - 1].index < this._items[0].index ? this ._prepend(e) : e[0].index > this._items[this._items.length - 1].index ? this ._append(e) : 1 === e.length && e[0].index === this._items[this._items.length - 1].index ? (this._updateLast(e[0]), e[0]) : this._merge(e) } addTail(e, t = !1) { let i = 0; t && this._end - this._start > 0 && (i = 1, this._items[this._end - this._start - 1] .value = e[0].value); for (let t = i; t < e.length; ++t) { const i = e[t], s = this.lastIndex(); if (null === s) { a.logError("Can't add tail to the empty plotlist"); break } this.add(s + 1, i.value) } this._invalidateSearchCaches() } move(e) { if (this._shareRead) return void a.logDebug( "move: readonly collection modification attempt"); if (0 === e.length) return; const t = this._items.slice(); for (const i of e) { const e = this._bsearch(i.old, c); if (null !== e && void 0 !== t[e]) if (i.new === n.INVALID_TIME_POINT_INDEX) t[e] = void 0; else { t[e] = { index: i.new, value: t[e].value }; const s = this._bsearch(i.new, c); if (null !== s) { const e = t[s]; void 0 !== e && e.index === i.new && (t[s] = void 0) } } } this._items = t.filter(e => void 0 !== e).sort((e, t) => e.index - t.index), this ._invalidateSearchCaches(), this._minMaxCache.clear(), this._start = 0, this ._end = this._items.length } remove(e) { if (this._shareRead) return a.logDebug( "remove: readonly collection modification attempt"), null; const t = this._nonCachedSearch(e, l.NearestRight, c); if (null === t) return null; const i = this._items.splice(t); return this._end = this._items.length, this._minMaxCache.clear(), this ._invalidateSearchCaches(), i.length > 0 ? i[0] : null } state() { return { start: this._start, end: this._end, data: this._items, shareread: this._shareRead } } restoreState(e) { e ? (this._start = e.start, this._end = e.end, this._shareRead = e.shareread, this ._items = e.data, this._minMaxCache.clear(), this._invalidateSearchCaches() ) : this.clear() } _indexAt(e) { return this._items[e].index } _valueAt(e) { return this._items[e].value } _length() { return this._items.length } _searchImpl(e, t, i, s, r, n) { const o = void 0 !== n ? i : s, a = void 0 !== n ? 1e4 * (t + 1) + n : t; let l = o.get(e); if (void 0 !== l) { const e = l.get(a); if (void 0 !== e) return e } const c = this._nonCachedSearch(e, t, r, n); if (null === c) return null; const h = { index: this._indexAt(c), value: this._valueAt(c) }; return void 0 === l && (l = new Map, o.set(e, l)), l.set(a, h), h } _nonCachedSearch(e, t, i, s) { const r = this._lowerbound(e, i), n = r === this._end || e !== i(this._items[r]); if (n && t !== l.Exact) switch (t) { case l.NearestLeft: return this._searchNearestLeft(r, s); case l.NearestRight: return this._searchNearestRight(r, s); default: throw new TypeError("Unknown search mode") } if (void 0 === s || n || t === l.Exact) return n ? null : r; switch (t) { case l.NearestLeft: return this._nonEmptyNearestLeft(r, s); case l.NearestRight: return this._nonEmptyNearestRight(r, s); default: throw new TypeError("Unknown search mode") } } _nonEmptyNearestRight(e, t) { const i = Object(s.ensure)(this._emptyValuePredicate), r = Object(s.ensure)(t); for (; e < this._end && i(this._valueAt(e), r);) e += 1; return e === this._end ? null : e } _nonEmptyNearestLeft(e, t) { const i = Object(s.ensureNotNull)(this._emptyValuePredicate), r = Object(s.ensure)(t); for (; e >= this._start && i(this._valueAt(e), r);) e -= 1; return e < this._start ? null : e } _searchNearestLeft(e, t) { if (e === this._start) return null; const i = e - 1, s = i !== this._end ? i : null; return void 0 !== t && null !== s ? this._nonEmptyNearestLeft(s, t) : s } _searchNearestRight(e, t) { const i = e, s = i !== this._end ? i : null; return void 0 !== t && null !== s ? this._nonEmptyNearestRight(s, t) : s } _bsearch(e, t) { const i = this._lowerbound(e, t); return i !== this._end && e === t(this._items[i]) ? i : null } _lowerbound(e, t) { return Object(r.lowerbound)(this._items, e, (e, i) => t(e) < i, this._start, this ._end) } _upperbound(e) { return Object(r.upperbound)(this._items, e, (e, t) => t.index > e, this._start, this ._end) } _plotMinMax(e, t, i) { let s = null; const r = this._plotFunctions.get(i); if (void 0 === r) throw new Error(`Plot "${i}" is not registered`); for (let i = e; i < t; i++) { const e = r(this._items[i].value); null == e || Number.isNaN(e) || (null === s ? s = { min: e, max: e } : (e < s.min && (s.min = e), e > s.max && (s.max = e))) } return s } _invalidateCacheForRow(e) { const t = Math.floor(e.index / 30); this._minMaxCache.forEach(e => e.delete(t)) } _prepend(e) { return Object(s.assert)(!this._shareRead, "collection should not be readonly"), Object(s.assert)(0 !== e.length, "plotRows should not be empty"), this ._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = e.concat( this._items), this._start = 0, this._end = this._items.length, e[0] } _append(e) { return Object(s.assert)(!this._shareRead, "collection should not be readonly"), Object(s.assert)(0 !== e.length, "plotRows should not be empty"), this ._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = this._items .concat(e), this._start = 0, this._end = this._items.length, e[0] } _updateLast(e) { Object(s.assert)(!this.isEmpty(), "plot list should not be empty"); const t = this._items[this._end - 1]; Object(s.assert)(t.index === e.index, "last row index should match new row index"), this._invalidateCacheForRow(e), this._invalidateSearchCaches(), this._items[this ._end - 1] = e } _merge(e) { return Object(s.assert)(0 !== e.length, "plot rows should not be empty"), this ._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = p(this ._items, e), this._start = 0, this._end = this._items.length, e[0] } _minMaxOnRangeCachedImpl(e, t, i) { if (this.isEmpty()) return null; let r = null; const n = Object(s.ensureNotNull)(this.firstIndex()), o = Object(s.ensureNotNull)(this.lastIndex()), a = Math.max(e, n), l = Math.min(t, o), c = 30 * Math.ceil(a / 30), h = Math.max(c, 30 * Math.floor(l / 30)); r = d(r, this._minMaxOnRange(a, Math.min(c, t, l), i)); let u = this._minMaxCache.get(i); void 0 === u && (u = new Map, this._minMaxCache.set(i, u)); for (let e = Math.max(c + 1, a); e < h; e += 30) { const t = Math.floor(e / 30); let s = u.get(t); if (void 0 === s) { const e = 30 * t, r = 30 * (t + 1) - 1; s = this._minMaxOnRange(e, r, i), u.set(t, s) } r = d(r, s) } r = d(r, this._minMaxOnRange(h, l, i)); return r } _minMaxOnRange(e, t, i) { return this._plotMinMax(this._lowerbound(e, c), this._upperbound(t), i) } _invalidateSearchCaches() { this._rowSearchCacheByIndex.clear(), this._rowSearchCacheByIndexWithoutEmptyValues .clear(), this._rowSearchCacheByTime.clear(), this ._rowSearchCacheByTimeWithoutEmptyValues.clear() } } function d(e, t) { if (null === e) return t; if (null === t) return e; return { min: Math.min(e.min, t.min), max: Math.max(e.max, t.max) } } function p(e, t) { const i = function(e, t) { const i = e.length, s = t.length; let r = i + s, n = 0, o = 0; for (; n < i && o < s;) e[n].index < t[o].index ? n++ : e[n].index > t[o].index ? o++ : (n++, o++, r--); return r }(e, t), s = new Array(i); let r = 0, n = 0; const o = e.length, a = t.length; let l = 0; for (; r < o && n < a;) e[r].index < t[n].index ? (s[l] = e[r], r++) : e[r].index > t[n] .index ? (s[l] = t[n], n++) : (s[l] = t[n], r++, n++), l++; for (; r < o;) s[l] = e[r], r++, l++; for (; n < a;) s[l] = t[n], n++, l++; return s } }, kIXa: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "am+t", 7)).then(({ TimeCyclesPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 2 } name() { return "Time Cycles" } setPoint(e, t, i) { var s = Object.assign({}, t), r = this._points[0], n = this._points[1]; r.price = s.price, n.price = s.price, this._points[e] = s, this.normalizePoints() } addPoint(e, t, i) { var r = s.prototype.addPoint.call(this, e, t, !0); if (r) { var n = this._points[0]; this._points[1].price = n.price, i || (this.normalizePoints(), this .createServerPoints()) } return r } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "BABJ"))) .TimeCyclesPatternDefinitionsViewModel } static createProperties(e) { var t = new r("linetooltimecycles", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolTimeCycles = n }, kNVT: function(e, t, i) { "use strict"; i.r(t), i.d(t, "setSymbolSearchCompleteOverrideFunction", (function() { return r })), i.d(t, "getSymbolSearchCompleteOverrideFunction", (function() { return n })); let s = e => Promise.resolve(e); function r(e) { s = e } function n() { return s } }, kcTO: function(e, t, i) { "use strict"; i.r(t), i.d(t, "formatterOptions", (function() { return l })), i.d(t, "numberToStringWithLeadingZero", (function() { return c })), i.d(t, "isFormatterHasForexAdditionalPrecision", (function() { return h })), i.d(t, "PriceFormatter", (function() { return u })); var s = i("YFKU"), r = i("ogJP"), n = i("Ialn"), o = i("txPx"); const a = Object(o.getLogger)("Chart.PriceFormatter"), l = { decimalSign: ".", decimalSignFractional: "'" }; function c(e, t) { if (!Object(r.isNumber)(e)) return "n/a"; if (!Object(r.isInteger)(t)) throw new TypeError("invalid length"); if (t < 0 || t > 16) throw new TypeError("invalid length"); if (0 === t) return e.toString(); return ("0000000000000000" + e.toString()).slice(-t) } function h(e) { return "hasForexAdditionalPrecision" in e } class u { constructor(e, t, i, n) { if (this.type = "price", this._formatterErrors = { custom: Object(s.t)("Price format is invalid."), fraction: Object(s.t)("Fraction part is invalid."), secondFraction: Object(s.t)("Second fraction part is invalid.") }, t || (t = 1), Object(r.isNumber)(e) && Object(r.isInteger)(e) || (e = 100), e < 0) throw new TypeError("invalid base"); this._priceScale = e, this._minMove = t, this._minMove2 = n, i && void 0 !== n && n > 0 && 2 !== n && 4 !== n && 8 !== n ? a.logDebug("invalid minmove2") : (this ._fractional = i, this.calculateDecimal()) } isFractional() { return !!this._fractional } state() { return { fractional: this._fractional, fractionalLength: this._fractionalLength, minMove: this._minMove, minMove2: this._minMove2, priceScale: this._priceScale } } calculateDecimal() { if (this._fractionalLength = 0, this._priceScale > 0 && this._minMove > 0) { let e = this._priceScale; for (this._fractional && this._minMove2 && (e /= this._minMove2); e > 1;) e /= 10, this._fractionalLength++ } } format(e, t, i, s = !0, r = !0) { let o, a = ""; return e < 0 ? (a = !1 === s ? "" : "−", e = -e) : e && !0 === t && (a = "+"), o = this._fractional ? a + this._formatAsFractional(e, i) : a + this ._formatAsDecimal(e, i), r ? Object(n.forceLTRStr)(o) : o } parse(e) { return e = (e = Object(n.stripLTRMarks)(e)).replace("−", "-"), this._fractional ? this._minMove2 ? this._parseAsDoubleFractional(e) : this ._parseAsSingleFractional(e) : this._parseAsDecimal(e) } hasForexAdditionalPrecision() { return !this._fractional && 10 === this._minMove2 } static serialize(e) { return e.state() } static deserialize(e) { return new u(e.priceScale, e.minMove, e.fractional, e.minMove2) } _formatAsDecimal(e, t) { //格式化价格 if (this.type == "price") { var price = "0.00"; //如果价格大于1则保留2位小数 if (e > 1) { price = e.toFixed(2) } else { //否则 let splitList = e.toString().split(".") let num = 0 if (splitList[1]) { for (var i = 0; i < splitList[1].length; i++) { if (splitList[1][i] == "0") { num++ } else { //如果不为0了 直接中断 break; } } } if (num >= 4) { var last = "" + splitList[1].substring(num, splitList[1].length) if (last.length >= 5) { if (parseInt(last[4]) >= 5) { price = '0.0{' + num + '}' + (parseInt(last[0] + last[1] + last[2] + last[ 3]) + 1) } else { price = '0.0{' + num + '}' + last[0] + last[1] + last[2] + last[3] } } else { price = '0.0{' + num + '}' + last } } else { price = Number(e).toFixed(5) } } return price } else { let i; t = t || 0, i = this._fractional ? Math.pow(10, this._fractionalLength || 0) : Math .pow(10, t) * this._priceScale / this._minMove; const s = 1 / i; let r; if (i > 1) r = Math.floor(e); else { const t = Math.floor(Math.round(e / s) * s); r = 0 === Math.round((e - t) / s) ? t : t + s } let n = ""; if (i > 1) { let s = +(Math.round(e * i) - r * i).toFixed(this._fractionalLength); s >= i && (s -= i, r += 1); const o = void 0 !== this._fractionalLength ? this._fractionalLength : NaN; n = l.decimalSign + c(+s.toFixed(this._fractionalLength) * this._minMove, o + t), n = this._removeEndingZeros(n, t) } return r.toString() + n } } _getFractPart(e, t) { const i = [0, 5], s = [0, 2, 5, 7]; return 2 === t ? void 0 === i[e] ? -1 : i[e] : 4 === t ? void 0 === s[e] ? -1 : s[ e] : e } _formatAsFractional(e, t) { const i = this._priceScale / this._minMove; let s = Math.floor(e), r = t ? Math.floor(e * i) - s * i : Math.round(e * i) - s * i; r === i && (r = 0, s += 1); let n = ""; if (t) { let o = (e - s - r / i) * i; o = Math.round(o * Math.pow(10, t)), n = c(o, t), n = this._removeEndingZeros(n, t) } if (!this._fractionalLength) throw new Error("_fractionalLength is not calculated"); let o = ""; if (this._minMove2) { const e = r % this._minMove2; r = (r - e) / this._minMove2; const t = c(r, this._fractionalLength), i = this._getFractPart(e, this._minMove2); o = t + l.decimalSignFractional + i } else r = this._getFractPart(r, this._priceScale), o = c(r * this._minMove, this ._fractionalLength); return s.toString() + l.decimalSignFractional + o + n } _removeEndingZeros(e, t) { for (let i = 0; i < t && "0" === e[e.length - 1]; i++) e = e.substr(0, e.length - 1); return e } _parseAsDecimal(e) { let t = new RegExp(/^(-?)[0-9]+$/).exec(e); if (t) { const t = parseFloat(e); return { value: t, res: !0, suggest: this.format(t) } } if (t = new RegExp("^(-?)[0-9]+\\" + l.decimalSign + "[0-9]*$").exec(e), t) { const t = parseFloat(e.replace(l.decimalSign, ".")); return { value: t, res: !0, suggest: this.format(t) } } return { error: this._formatterErrors.custom, res: !1 } } _patchFractPart(e, t) { const i = { 0: 0, 5: 1 }, s = { 0: 0, 2: 1, 5: 2, 7: 3 }; return 2 === t ? void 0 === i[e] ? -1 : i[e] : 4 === t ? void 0 === s[e] ? -1 : s[ e] : e } _parseAsSingleFractional(e) { let t = new RegExp(/^(-?)[0-9]+$/).exec(e); if (t) { const t = parseFloat(e); return { value: t, res: !0, suggest: this.format(t) } } if (t = new RegExp("^(-?)([0-9]+)\\" + l.decimalSignFractional + "([0-9]+)$").exec( e), t) { const e = !!t[1], i = parseInt(t[2]), s = this._priceScale, r = this._patchFractPart(parseInt(t[3]), s); if (r >= s || r < 0) return { error: this._formatterErrors.fraction, res: !1 }; let n = i + r / s; return e && (n = -n), { value: n, res: !0, suggest: this.format(n) } } return { error: this._formatterErrors.custom, res: !1 } } _parseAsDoubleFractional(e) { let t = new RegExp(/^(-?)[0-9]+$/).exec(e); if (t) { const t = parseFloat(e); return { value: t, res: !0, suggest: this.format(t) } } if (t = new RegExp("^(-?)([0-9]+)\\" + l.decimalSignFractional + "([0-9]+)\\" + l .decimalSignFractional + "([0-9]+)$").exec(e), t) { const e = !!t[1], i = parseInt(t[2]), s = void 0 !== this._minMove2 ? this._minMove2 : NaN, r = this._priceScale / s, n = this._minMove2, o = this._patchFractPart(parseInt(t[3]), r), a = this._patchFractPart(parseInt(t[4]), n); if (o >= r || o < 0) return { error: this._formatterErrors.fraction, res: !1 }; if (void 0 !== n && a >= n || a < 0) return { error: this._formatterErrors.secondFraction, res: !1 }; let l = void 0 !== n ? i + o / r + a / (r * n) : NaN; return e && (l = -l), { value: l, res: !0, suggest: this.format(l) } } return { error: this._formatterErrors.custom, res: !1 } } } }, krs7: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("O+9b"), n = i("ocLq"), o = i("KG+6"), a = i("LxhU"), l = i("8LSp"), c = i("aR4w"), h = i("WYmP"); class u extends c.a { constructor(e, t, i, s, r, n, o, a, l, c, u) { super(e, t, i, n, new h.a, o, !0, a, l, () => c, u, s, r, !1), this ._firstBarTime = s, this._lastBarTime = r } update(e) { this._supplyRowsLayout(this._ctx), this.timeInRequestedRange(e) && super.update( e) } timeInRequestedRange(e) { const t = this._timeScale().get(e); return this._firstBarTime <= t && t < this._lastBarTime } } var d = i("iu9X"), p = i("c7G1"), _ = i("hXqA"), m = i("WTyR"), f = i("rWtV"); i.d(t, "VolumeProfileVisibleRange", (function() { return g })), i.d(t, "volumeProfileVisibleRangeStudyItem", (function() { return b })); class g extends r.a { constructor() { super(...arguments), this._rowsLayout = "Number Of Rows", this._rowSize = 24, this._volume = "Up/Down", this._firstBarTime = 0, this._lastBarTime = 0, this._vaVolumePercent = 70, this._anInt = 0, this._eraseCmds = [] } nextGraphicsObjId() { return ++this._anInt } pushEraseObjCmd(e, t) { this._eraseCmds.push(new p.b(e, t)) } popEraseCmds() { const e = this._eraseCmds; return this._eraseCmds = [], e } init(e, t) { this._studyDataUpdate = new _.a(!0), this._hists = new l.a, this._pocLines = new h.a, this._valueAreaHists = new l.a; const i = new d.b; i.getObjsContainer("hhists").push(new d.a("histBars2", this._hists)), i .getObjsContainer("hhists").push(new d.a("histBarsVA", this ._valueAreaHists)), i.getObjsContainer("horizlines").push(new d.a( "pocLines", this._pocLines)), this._studyDataUpdate.init(i), this ._rowsLayout = t(0), this._rowSize = t(1), this._volume = t(2), this ._firstBarTime = t(3), this._lastBarTime = t(4), this._vaVolumePercent = t( 5), this.verifyRowSizeInput(this._rowSize, this._rowsLayout), this ._originalResolution = a.Interval.parse(e.symbol.interval + e.symbol .resolution); const n = this._lastBarTime + this._originalResolution.inMilliseconds(this ._lastBarTime); 0 === this._firstBarTime && 0 === this._lastBarTime ? this._basicResolution = this._originalResolution : this._basicResolution = this .findBasicResolutionForFromTo(this._originalResolution, this._firstBarTime, n, Object(s.ensureDefined)(e.symbol.info)), this._hasSecondarySymbol = ! this._originalResolution.isEqualTo(this._basicResolution), this ._hasSecondarySymbol && e.new_sym(e.symbol.tickerid, this._basicResolution .value()); const o = this._getRowsLayout(this._rowsLayout, this._rowSize); this._vbPCheckHaveVolumeExpr = new m.a(this), this._volumeByPriceExpr = new u( Object(r.c)(this._volume), e, this, this._firstBarTime, n, this._hists, this._pocLines, this._valueAreaHists, this._vaVolumePercent, o, Object(r .b)()), this._volumeByPriceExpr.setIdsGeneratorProxy(this), this ._developingPocSeries = new f.a, this._developingVAHighSeries = new f.a, this._developingVALowSeries = new f.a } main(e, t, i) { this._hasSecondarySymbol && e.select_sym(1), this._timeSeries = e .new_unlimited_var(), this._openSeries = e.new_unlimited_var(), this ._highSeries = e.new_unlimited_var(), this._lowSeries = e .new_unlimited_var(), this._closeSeries = e.new_unlimited_var(), this ._volumeSeries = e.new_unlimited_var(); const r = { type: "composite", data: [] }; if (i && i.period === this._basicResolution.value() && (this._timeSeries.set(n .Std.time(e)), this._openSeries.set(n.Std.open(e)), this._highSeries .set(n.Std.high(e)), this._lowSeries.set(n.Std.low(e)), this ._closeSeries.set(n.Std.close(e)), this._volumeSeries.set(n.Std.volume( e)), this._developingPocSeries.addHist(n.Std.time(e)), this ._developingVAHighSeries.addHist(n.Std.time(e)), this ._developingVALowSeries.addHist(n.Std.time(e)), this ._vbPCheckHaveVolumeExpr.update(0, e.symbol.isLastBar), this ._volumeByPriceExpr.update(0), this._developingPocSeries .removeLastIfNaN(), this._developingVAHighSeries.removeLastIfNaN(), this ._developingVALowSeries.removeLastIfNaN(), e.symbol.isLastBar)) { this._studyDataUpdate.setEraseCmds(this.popEraseCmds()), this ._studyDataUpdate.update(); const e = this._studyDataUpdate.getUpdate(); e.json && r.data.push({ nonseries: !0, type: "study_graphics", data: e.json }), e.jsonUpdate && r.data.push({ nonseries: !0, type: "study_graphics", data: e.jsonUpdate }) } if (this._hasSecondarySymbol && e.select_sym(0), i && i.period === this ._originalResolution.value()) { Object(s.assert)(e.symbol.time === i.time); const t = i.time, n = t + this._originalResolution.inMilliseconds(t) - 1; if (t && t >= this._firstBarTime) { const e = this._developingPocSeries.getLeftOrEqual(n), t = this._developingVAHighSeries.getLeftOrEqual(n), i = this._developingVALowSeries.getLeftOrEqual(n); r.data.push([e, t, i]) } else r.data.push([NaN, NaN, NaN]) } return r } time() { return this._timeSeries } open() { return this._openSeries } high() { return this._highSeries } low() { return this._lowSeries } close() { return this._closeSeries } volume() { return this._volumeSeries } developingPoc() { return this._developingPocSeries } developingVAHigh() { return this._developingVAHighSeries } developingVALow() { return this._developingVALowSeries } } const b = { constructor: g, name: "Volume Profile Visible Range", metainfo: { _metainfoVersion: 51, id: "VbPVisible@tv-basicstudies-49", description: "Volume Profile Visible Range", shortDescription: "VPVR", format: { type: "volume" }, is_price_study: !0, linkedToSeries: !0, palettes: {}, inputs: [{ id: "rowsLayout", name: "Rows Layout", defval: "Number Of Rows", options: ["Number Of Rows", "Ticks Per Row"], type: "text" }, { id: "rows", name: "Row Size", defval: 24, max: 1e6, min: 1, type: "integer" }, { id: "volume", name: "Volume", defval: "Up/Down", options: ["Up/Down", "Total"], type: "text" }, { id: "first_visible_bar_time", name: "First Visible Bar Time", defval: 0, isHidden: !0, max: 253370764800, min: -253370764800, type: "time" }, { id: "last_visible_bar_time", name: "Last Visible Bar Time", defval: 0, isHidden: !0, max: 253370764800, min: -253370764800, type: "time" }, { id: "vaVolume", name: "Value Area Volume", defval: 70, max: 100, min: 0, type: "integer" }], plots: [{ id: "developingPoc", type: "line" }, { id: "developingVAHigh", type: "line" }, { id: "developingVALow", type: "line" }], graphics: { hhists: { histBars2: { location: o.b.Relative, title: "Volume Profile", titles: ["Up Volume", "Down Volume"] }, histBarsVA: { location: o.b.Relative, title: "Value Area", titles: ["Value Area Up", "Value Area Down"] } }, horizlines: { pocLines: { name: "POC", showPrice: !0 } } }, defaults: { graphics: { hhists: { histBars2: { colors: ["#1592e6", "#fbc123"], direction: o.a.RightToLeft, percentWidth: 30, showValues: !1, transparencies: [76, 76], valuesColor: "#424242", visible: !0 }, histBarsVA: { colors: ["#1592e6", "#fbc123"], direction: o.a.RightToLeft, percentWidth: 30, showValues: !1, transparencies: [30, 30], valuesColor: "#424242", visible: !0 } }, horizlines: { pocLines: { color: "#ff0000", style: 0, visible: !0, width: 2 } } }, inputs: { first_visible_bar_time: 0, last_visible_bar_time: 0, rows: 24, rowsLayout: "Number Of Rows", vaVolume: 70, volume: "Up/Down" }, styles: { developingPoc: { color: "#ff0000", linestyle: 0, linewidth: 1, plottype: 9, trackPrice: !1, transparency: 0, visible: !1 }, developingVAHigh: { color: "#0000ff", linestyle: 0, linewidth: 1, plottype: 9, trackPrice: !1, transparency: 0, visible: !1 }, developingVALow: { color: "#0000ff", linestyle: 0, linewidth: 1, plottype: 9, trackPrice: !1, transparency: 0, visible: !1 } } }, styles: { developingPoc: { histogramBase: 0, title: "Developing Poc" }, developingVAHigh: { histogramBase: 0, title: "Developing VA High" }, developingVALow: { histogramBase: 0, title: "Developing VA Low" } } } } }, "l+oz": function(e, t, i) { "use strict"; i.r(t), i.d(t, "ChartSaverBase", (function() { return s })); class s { constructor(e) { this._chartWidgetCollection = e } _getCommonSavingInfo(e) { const t = this._chartWidgetCollection, i = this._chartWidgetCollection.chartsSymbols(), s = i[t.activeChartWidget.value().id()], r = { ...(n = s, { ...n, legs: JSON.stringify(null !== (o = n.legs) && void 0 !== o ? o : []) }) }; var n, o; const a = t.metaInfo; return a.id.value() && (r.id = a.id.value()), r.name = a.name.value() || "", r .description = a.description.value() || "", r.charts_symbols = function(e) { const t = {}; for (const i of Object.keys(e)) t[i] = { symbol: e[i].symbol }; return JSON.stringify(t) }(i), r.is_realtime = r.is_realtime = e ? "0" : "1", r } } }, l4sv: function(e, t, i) { "use strict"; i.r(t), i.d(t, "HorizontalLineRenderer", (function() { return a })); var s = i("VdBB"), r = i("jFln"), n = i("gAom"), o = i("Zp/P"); class a { constructor() { this._data = null, this._hitTest = new s.HitTestResult(s.HitTestResult.REGULAR) } setData(e) { this._data = e } setHitTest(e) { this._hitTest = e } hitTest(e) { if (null === this._data || !1 === this._data.visible) return null; const t = Object(o.interactionTolerance)().line, i = Math.abs(e.y - this._data.y) <= t + this._data.linewidth / 2, s = void 0 === this._data.left || this._data.left - e.x <= t, r = void 0 === this._data.right || e.x - this._data.right <= t; return i && s && r ? this._hitTest : null } draw(e, t) { if (null === this._data) return; if (!1 === this._data.visible) return; if (this._data.y < -this._data.linewidth / 2 || this._data.y > t.cssHeight + this ._data.linewidth / 2) return; const i = t.pixelRatio; e.lineCap = "butt", e.strokeStyle = this._data.color, e.lineWidth = Math.max(1, Math .floor(this._data.linewidth * i)), void 0 !== this._data.linestyle && Object(r.setLineStyle)(e, this._data.linestyle); const s = void 0 !== this._data.left ? Math.max(this._data.left, 0) : 0, o = void 0 !== this._data.right ? Math.min(this._data.right, t.cssWidth) : t .cssWidth, a = Math.round(this._data.y * i), l = Math.floor(s * i), c = Math.ceil(o * i); Object(n.drawHorizontalLine)(e, a, l, c) } } }, l7y7: function(e, t) { e.exports = '' }, lA7n: function(e, t, i) { "use strict"; i.r(t); var s = i("Kxc7"), r = i("ulZB"); class n extends r.b { constructor(e, t) { super(e, t, "FAVORITE_CHARTS_CHANGED", "loadChartDialog.favorites", {}) } } var o = i("zUrt"), a = i("FBuY"), l = i("Vdly"), c = i("/z0S"), h = i("sQaR"); i.d(t, "LoadChartService", (function() { return u })); class u extends h.a { constructor(e = null) { super(), this._favoriteChartsService = new n(a.TVXWindowEvents, l), this ._chartWidgetCollection = null, this._promise = null, this._dialog = null, this._subscribe = e => { this._setVisibility(e) }, this._getChartEntry = e => ({ id: e.id, url: e.url, title: e.name, symbol: e.short_symbol, interval: e.interval, toolsCount: 0, modified: e.modified_iso, active: () => this._isActiveChart(e.id), openAction: () => o.backend.loadChart(e), deleteAction: () => o.backend.removeChart(e.image_url).then(() => this._deleteChart(e.id)), favoriteAction: this._updateFavorites }), this._updateFavorites = e => this._favoriteChartsService.set(e), this ._isActiveChart = e => null !== this._chartWidgetCollection && e === this ._chartWidgetCollection.metaInfo.id.value(), this._deleteChart = e => { this._isActiveChart(e) && (s.enabled("saveload_storage_customization") ? null !== this._chartWidgetCollection && this ._chartWidgetCollection.clearChartMetaInfo() : location.href = "/chart/" + location.search) }, this._chartWidgetCollection = e } showLoadDialog() { Object(c.a)(this._showLoadDialog.bind(this), { source: "Load chart", sourceMeta: "Chart" }) } show() { this.showLoadDialog() } hide() { var e, t; null === (e = this._dialog) || void 0 === e || e.hide(), null === (t = this ._dialog) || void 0 === t || t.visible().unsubscribe(this._subscribe) } _showLoadDialog() { (s.enabled("saveload_requires_authentication") && !window.is_authenticated ? Promise.resolve([]) : o.backend.getCharts()).then(e => e.map(this ._getChartEntry)).then(e => { const t = this._promise = Promise.all([i.e("redux"), i.e("react"), i .e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i.e(19), i.e(22), i.e(24), i.e(63), i.e(80), i.e(0), i .e(2), i.e(5), i.e(7), i.e(10), i.e(18), i.e(20), i.e( 56), i.e("load-chart-dialog") ]).then(i.bind(null, "EgWQ")).then(i => { if (this._promise === t) { this._dialog && (this._dialog.hide(), this._dialog .visible().unsubscribe(this._subscribe)); const t = { charts: e, favoriteChartsService: this ._favoriteChartsService, chartWidgetCollection: this ._chartWidgetCollection }; this._dialog = new i.LoadChartDialogRenderer(t), this._dialog.visible().subscribe(this ._subscribe), this._dialog.show() } }) }) } } }, lCO3: function(e, t, i) { "use strict"; i.r(t), i.d(t, "Version", (function() { return r })); var s = i("Eyy1"); class r { constructor(e, t) { this._major = e, this._minor = t } major() { return this._major } minor() { return this._minor } isZero() { return 0 === this._major && 0 === this._minor } toString() { return this._major + "." + this._minor } compareTo(e) { return this._major < e._major ? -1 : this._major > e._major ? 1 : this._minor < e ._minor ? -1 : this._minor > e._minor ? 1 : 0 } isLess(e) { return this.compareTo(e) < 0 } isLessOrEqual(e) { return this.compareTo(e) <= 0 } isEqual(e) { return 0 === this.compareTo(e) } isGreater(e) { return this.compareTo(e) > 0 } isGreaterOrEqual(e) { return this.compareTo(e) >= 0 } static parse(e) { if (e instanceof r) return new r(e.major(), e.minor()); if ("number" == typeof e) return Object(s.assert)(Math.floor(e) === e, "Version should not be a float number"), new r(e, 0); if ("string" == typeof e) { const t = e.split("."); if (1 === t.length) { const i = parseInt(t[0], 10); return Object(s.assert)(!isNaN(i), "Bad version string: " + e), new r(i, 0) } if (2 === t.length) { const i = parseInt(t[0], 10); Object(s.assert)(!isNaN(i), "Bad version string: " + e); const n = parseInt(t[1], 10); return Object(s.assert)(!isNaN(n), "Bad version string: " + e), new r(i, n) } throw new Error("Bad version string (one dot expected): " + e) } throw new Error("Bad version: " + e) } } r.ZERO = new r(0, 0) }, lJvs: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("vAx0").ESDPaneView, n = i("fTGZ").BarsMarksContainer, o = i("mMWL"), a = i("FQhm"), l = i("zDbI").CHART_FONT_FAMILY, c = i("Tmoa").generateColor, h = i("XlJ7").makeFont; class u extends r { constructor(e, t, i) { super(e, t, i), this.source = t, this.stylesCache = {}, this.templatesCache = {}, this._lollipops = {}, this._lollipopsCounter = 0, this._itemIndexToId = new Map, this._createLollipops() } _createLollipops() { var e = this.source._model.timeScale(), t = r.prototype._getY.call(this.source), i = this.source._model.lastHittestData(), n = this.source._model.hoveredSource(), o = this; Object.keys(this.source._marks).forEach((function(r) { var a = this.source._marks[r], l = a.id, c = a.index; if (null !== c) { var h = l === o.getLastClickedLollipopId(), u = void 0 !== o._lollipops[l] ? o._lollipops[l].itemIndex : o._lollipopsCounter++; o._itemIndexToId.has(u) || o._itemIndexToId.set(u, l); var d = n === this.source && null !== i && i.activeItem === u; o._lollipops[l] = { id: l, itemIndex: u, basePoint: new s(e.indexToCoordinate(c) + 1, t), hovered: d, active: h, barY: null, label: a.label, color: a.color, items: a.tooltip, visible: !0 } } }), this), r.prototype._createRenderers.call(this) } createTooltipContent(e) { return e.items ? { title: e.items[0], subTitle: e.items[1], style: { color: e.color } } : null } clearCaches() { this.clearLastClicked(), this._lollipops = {}, this._lollipopsCounter = 0 } update() { this._createLollipops(), this._invalidated = !1 } renderer() { return this.update(), r.prototype.renderer.call(this) } _generateStyle(e, t, i) { var s = e + t + i; if (!(s in this.stylesCache)) { var r = "hovered" === e, n = "active" === e, o = r || n, a = "white"; n ? a = t : r && (a = c(t, 85)) === t && (n = !0); var u = { strokeStyle: t, lineWidth: 1, fillStyle: "white", barLine: { lineStyle: CanvasEx.LINESTYLE_DASHED }, lollipop: { width: 23, height: 23, lineWidth: 1.5, bottom: 2, fillStyle: a, fillCircle: o, strokeStyle: t, text: { label: i, strokeStyle: n ? "white" : t, font: h(12, l) } } }; this.stylesCache[s] = u } return this.stylesCache[s] } getStyle(e) { var t = e.active ? "active" : e.hovered ? "hovered" : "default"; return this._generateStyle(t, e.color, e.label) } createText(e, t) { "string" == typeof e.items ? t.addTextLine(e.items) : Array.isArray(e.items) && e .items.forEach((function(e) { t.addTextLine(e) })) } hasTooltip(e) { return e.items && e.items.length } _getLollipopIdByIndex(e) { return this._itemIndexToId.get(e) } } e.exports = class extends n { constructor(e) { super(e), this.toolname = "UserDefinedTimescaleMarks"; var t = this; o.hideMarksOnBars().subscribe(this, (function() { t._properties.visible.setValue(!o.hideMarksOnBars().value()) })), this._paneView = new u(e, this, this._showTooltip.bind(this)), this ._requestedPointsets = new Set } _initialize(e) { this._properties.visible.setValue(!0) } userEditEnabled() { return !1 } _plateViewData(e) { return { text: e.text } } onClicked(e) { var t = this._paneView._getLollipopIdByIndex(e.activeItem); a.emit("onTimescaleMarkClick", t) } clearMarks() { var e = this._model.chartApi(); if (e.connected()) { var t = this; Object.keys(this._marks).forEach((function(i) { var s = t._getPointsetId(i); e.removePointset(s) })) } this._requestedPointsets.clear(), super.clearMarks(), this._paneView .clearCaches(), this.onNeedRepaint.fire() } _getData(e) { var t = this._model.mainSeries().symbolInfo(); if (t) { var i = this.roundRange(this._rangeDifference(e)), s = this, r = this._model.mainSeries(), n = r.seriesSource().symbolInstanceId(), o = r.properties().interval.value(); ChartApiInstance.getTimescaleMarks(t, i.start, i.end, (function(t) { var i = s._model.chartApi(); t.forEach((function(e) { e.index = null; var t = e.id, r = s._getPointsetId(t), a = s._marks[t]; if (a && null !== a.index && (a.tickmark === e.tickmark ? e.index = a.index : s ._requestedPointsets.has(r) && i .connected() && (i.removePointset( r), s._requestedPointsets .delete(r))), s._marks[t] = e, null === e.index && i.connected()) { s._requestedPointsets.add(r); var l = [ [e.tickmark, 0] ]; i.createPointset(r, "turnaround", n, o, l, (function(e) { s._onPointsetData(e) })) } }), s), s._loadedRange = s._rangeUnion(e, s ._loadedRange), s.onNeedRepaint.fire() }), o) } } _getPointsetId(e) { return "pointsetMark_" + e } _onPointsetData(e) { var t = e.params.customId.split("_")[1], i = this._marks[t], s = e.params.plots; i && 1 === s.length && (i.index = s[0].value[0]) } updatePlateData(e, t) { return t.barWidth = this.barWidth(), t.text = e.text, t.tooltipMargin = -1 * Math.max(e.minSize / 2, .4 * this.barWidth()), t } hasContextMenu() { return !1 } paneViews() { return this._properties.visible.value() ? [this._paneView] : [] } _showTooltip(e, t) { var s = t(); if (s) { var r = this._model.timeScale(), n = [r.onScroll(), r.barSpacingChanged(), this._model.mainSeries() .onSymbolIntervalChanged() ], o = this.onClickOutside.bind(this); return Promise.all([i.e("react"), i.e(6), i.e(11), i.e(90), i.e(0), i.e(5), i.e("lollipop-tooltip-renderer") ]).then(i.bind(null, "qKHM")).then((function({ showLollipopTooltip: t }) { t({ items: s, position: e, customCloseSubscriptions: n, onClose: o, onClickOutside: o }) })) } } onClickOutside(e) { this._paneView.onClickOutside(e) } } }, "lNN+": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolTrianglePattern", (function() { return o })); var s = i("Ocx9"), r = i("Ss5c"), n = i("j3hX"); class o extends r.LineDataSource { constructor(e, t) { const s = t || o.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "Jej9")).then(t => { this._setPaneViews([new t.LineToolTrianglePatternPaneView(this, e)]) }) } pointsCount() { return 4 } name() { return "Triangle Pattern" } properties() { return super.properties() } static createProperties(e) { const t = new s.DefaultProperty("linetooltrianglepattern", e); return o._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then( e => e.PatternWithBackgroundDefinitionViewModel) } static _configureProperties(e) { r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n .LineToolColorsProperty([e.childs().color])), e.addChild("textsColors", new n.LineToolColorsProperty([e.childs().textcolor])), e.addChild( "backgroundsColors", new n.LineToolColorsProperty([e.childs() .backgroundColor ])) } } }, lReN: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolsGroupControllerApi", (function() { return o })); var s = i("s1Gx"), r = i("Eyy1"), n = i("CW80"); class o { constructor(e, t) { this._controller = e, this._model = t } createGroupFromSelection() { return this._controller.createGroupFromSelection().id } removeGroup(e) { const t = Object(r.ensureDefined)(this._groupById(e)); this._controller.removeGroup(t) } groups() { return this._controller.groups().map(e => e.id) } shapesInGroup(e) { const t = Object(r.ensureDefined)(this._groupById(e)); return Object(s.sortSources)(t.lineTools()).map(e => e.id()) } excludeShapeFromGroup(e, t) { const i = Object(r.ensureDefined)(this._groupById(e)), s = Object(r.ensureNotNull)(this._model.dataSourceForId(t)); Object(r.assert)(Object(n.isLineTool)(s), "Passed shapeId is not a line tool"), this ._controller.excludeLineToolFromGroup(i, s) } availableZOrderOperations(e) { const t = Object(r.ensureDefined)(this._groupById(e)); return this._controller.availableZOrderOperations(t) } bringToFront(e) { const t = Object(r.ensureDefined)(this._groupById(e)); this._controller.bringToFront(t) } bringForward(e) { const t = Object(r.ensureDefined)(this._groupById(e)); this._controller.bringForward(t) } sendBackward(e) { const t = Object(r.ensureDefined)(this._groupById(e)); this._controller.sendBackward(t) } sendToBack(e) { const t = Object(r.ensureDefined)(this._groupById(e)); this._controller.sendToBack(t) } insertAfter(e, t) { const i = Object(r.ensureDefined)(this._groupById(e)), s = Object(r.ensureNotNull)(this._groupById(t) || this._model.dataSourceForId( t)); this._controller.insertAfter(i, s) } insertBefore(e, t) { const i = Object(r.ensureDefined)(this._groupById(e)), s = Object(r.ensureNotNull)(this._groupById(t) || this._model.dataSourceForId( t)); this._controller.insertBefore(i, s) } groupVisibility(e) { return Object(r.ensureDefined)(this._groupById(e)).visibility() } setGroupVisibility(e, t) { const i = Object(r.ensureDefined)(this._groupById(e)); this._controller.setGroupVisibility(i, t) } groupLock(e) { return Object(r.ensureDefined)(this._groupById(e)).locked() } setGroupLock(e, t) { const i = Object(r.ensureDefined)(this._groupById(e)); this._controller.setGroupLock(i, t) } getGroupName(e) { return Object(r.ensureDefined)(this._groupById(e)).name() } setGroupName(e, t) { const i = Object(r.ensureDefined)(this._groupById(e)); this._controller.setGroupName(i, t) } canBeGroupped(e) { const t = e.map(e => Object(r.ensureNotNull)(this._model.dataSourceForId(e))); return !t.some(e => !Object(n.isLineTool)(e)) && this._controller.canBeGroupped(t) } _groupById(e) { return this._controller.groups().find(t => t.id === e) } } }, lUQk: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("qFKp"), n = i("JWMC"), o = i("FQhm"), a = i("txPx"), l = i("7ktv"), c = i("XPit"), h = i("tc+8"), u = i.n(h), d = i("n5al"), p = i("kcTO"), _ = i("dfhE"), m = i("nBJD"), f = i("YFKU"), g = i("Kxc7"), b = i.n(g), v = i("hOqT"), S = i("X0WL"), y = i("xDuj"); const w = b.a.enabled("hide_resolution_in_legend"); function P(e) { const t = "QUANDL" === (e = e || {}).exchange, i = { symbolDescription: "", interval: "", exchange: "", chartStyle: "", sessionDescription: "", provider: "", ticker: "" }; if (e.description && t) if (2 === e.description.split("/").length) i.symbolDescription = e.description.split( "/")[1]; else { e.description.split("'").filter(e => e.length).forEach(e => { let t = []; t = e && ("/" === e[0] || /\d+\/\(?/.test(e)) ? [e] : e.split("/") .filter(e => e.length), i.symbolDescription += t[2 === t.length ? 1 : 0] }) } else e.description ? i.symbolDescription = e.description : i.symbolDescription = e.symbol; if (e.interval && (i.interval = Object(y.translatedIntervalString)(e.interval)), t && e .description) { const t = /[\w_]+\/[\w_]+/.exec(e.description); t && t[0] ? i.provider = t[0].split("/")[0] : i.provider = e.description.split("/")[0] } return e.exchange && (i.exchange = e.exchange), i.chartStyle = function(e) { return e.inputs, 8 === e.style ? window.t("Heikin Ashi") : "" }(e), e.sessionDescription && (i.sessionDescription = e.sessionDescription), e.ticker && (i.ticker = e.ticker), i } const C = Object(f.t)("Symbol Error"), x = g.enabled("hide_unresolved_symbols_in_legend"); class T extends S.a { constructor(e, t, i, s) { super(t), this._series = e, this._statusViewProperties = i, this._options = s || {} } text() { return function(e) { const t = P(e); return (t.symbolDescription + (t.interval ? ", " + t.interval : "") + function(e, t = ", ") { return (e.provider ? `${t}${e.provider}` : "") + (e .exchange ? `${t}${e.exchange}` : "") + (e .chartStyle ? `${t}${e.chartStyle}` : "") + (e .sessionDescription ? `${t}${e.sessionDescription}` : "") }(t)).replace(/'/g, "") }(this._getTitleGenerationOptions()) } getSplitTitle() { return function(e) { const t = P(e), i = t.symbolDescription.replace(/'/g, ""), s = function(e) { const t = []; e.provider && t.push(e.provider); e.exchange && t.push(e.exchange); e.chartStyle && t.push(e.chartStyle); e.sessionDescription && t.push(e.sessionDescription); return t }(t).map(e => e.replace(/'/g, "")), r = []; return t.ticker && r.push(t.ticker), r.push(i), w || r.push(t .interval || ""), r.push(...s), r }(this._getTitleGenerationOptions()) } bold() { return !1 } size() { return this._statusViewProperties.childs().fontSize.value() + "px" } errorStatus() { const e = this._series.seriesErrorMessage(); return null !== e ? { error: e, title: C } : null } _getTitleGenerationOptions() { const e = this._series.symbolInfo(), t = this._statusViewProperties.childs().symbolTextSource.value(); return { description: "ticker" === t ? e && e.name || void 0 : Object(v .getTranslatedSymbolDescription)({ pro_name: e && e.pro_name || void 0, short_name: e && e.name || void 0, description: e && e.description || void 0, short_description: e && e.short_description || void 0, local_description: e && e.local_description || void 0, language: e && e.language || void 0 }), exchange: this._statusViewProperties.childs().showExchange.value() && e && e .exchange || void 0, symbol: x && null === e ? "" : this._series.symbol(), interval: this._statusViewProperties.childs().showInterval.value() && !this ._options.hideResolution ? this._series.interval() : void 0, style: this._series.properties().childs().style.value(), inputs: this._series.getInputsProperties().state(), boxSize: this._series.data().boxSize, reversalAmount: this._series.data().reversalAmount, ticker: "ticker-and-description" === t ? e && e.name || void 0 : "" } } } class I extends m.a { constructor(e, t, i) { super(new T(e, t, i)), this._invalidated = !0, this._series = e, this._series .onRestarted().subscribe(this, this.update), this._series.dataEvents() .symbolResolved().subscribe(this, this.update), this._series.dataEvents() .completed().subscribe(this, this.update), this._series.boxSizeValue() .subscribe(this.update.bind(this)), i.childs().symbolTextSource.listeners() .subscribe(this, this.update) } getSeriesPrecision() { let e = 4; const t = this._series.symbolInfo(); return t && t.pricescale && (e = Math.round(Math.log(t.pricescale) / Math.log( 10))), e } round(e) { const t = this.getSeriesPrecision(), i = Math.round(e * Math.pow(10, t)) / Math.pow(10, t); return i ? i.toString() : "" } update() { this._invalidated = !0 } text() { return this._updateImpl(), super.text() } color() { return this._updateImpl(), super.color() } bold() { return this._updateImpl(), super.bold() } size() { return this._updateImpl(), super.size() } getSplitTitle() { return this._updateImpl(), this._statusProvider.getSplitTitle() } _updateImpl() { this._invalidated && (this._bold = this._statusProvider.bold(), this._size = this._statusProvider.size(), this._text = this._statusProvider.text(), this._invalidated = !1) } } var M = i("4miz"), O = i("mMWL"), L = i("6I19"), A = i("CW80"); const E = r.CheckMobile.any(), k = b.a.enabled("hide_resolution_in_legend"); class D extends M.b { constructor(e, t) { super(), this._invalidated = !0, this._series = e, this._model = t, this ._valuesProvider = this._createValuesProvider(e, t), this._items = this ._valuesProvider.getItems().map(e => new M.a(e.title, "")), this.update() } update() { this._invalidated = !0 } items() { return this._invalidated && (this._updateImpl(), this._invalidated = !1), this ._items } series() { return this._series } _updateImpl() { const e = this._series.symbolInfo(); if (e) { const t = [e.name]; k || t.push(Object(y.translatedIntervalString)(this._series.interval())), t .push(e.exchange), this._header = t.join(", "), this._title = e .description } else this._header = this._series.symbol(); const t = this._model.crossHairSource().appliedIndex(), i = this._valuesProvider.getValues(t); for (let e = 0; e < i.length; ++e) { const t = i[e], s = this._items[e]; s.setValue(t.value), s.setVisible(t.visible), s.setColor(t.color) } } _createValuesProvider(e, t) { return new L.a(e, t) } _showLastPriceAndChangeOnly() { return E && (null === this._model.crossHairSource().pane || Object(A .isLineToolName)(O.tool.value()) || null !== this._model .lineBeingEdited()) } } const V = { open: Object(f.t)("O", { context: "in_legend" }), high: Object(f.t)("H", { context: "in_legend" }), low: Object(f.t)("L", { context: "in_legend" }), close: Object(f.t)("C", { context: "in_legend" }), hl2: Object(f.t)("HL2", { context: "in_legend" }), hlc3: Object(f.t)("HLC3", { context: "in_legend" }), ohlc4: Object(f.t)("OHLC4", { context: "in_legend" }) }; class B extends L.a { constructor(e, t) { super(e, t), this._showBarChange = t.properties().paneProperties .legendProperties.showBarChange, this._showSeriesOHLC = t.properties() .paneProperties.legendProperties.showSeriesOHLC, this._seriesStyle = e .properties().childs().style, this._emptyValues[0].title = V.open, this ._emptyValues[1].title = V.high, this._emptyValues[2].title = V.low, this ._emptyValues[3].title = V.close, this._emptyValues[6].title = "", this ._emptyValues[4].title = "" } getValues(e) { const t = super.getValues(e), i = this._showSeriesOHLC.value(), s = this._showBarChange.value(), r = 12 === this._series.style(), n = t[6]; if (n.visible = n.visible && s && !r, this._showLastPriceAndChangeOnly()) { const e = t[5]; return e.visible = e.visible && i, t } const o = Object(d.isPriceSourceStyle)(this._seriesStyle.value()), a = i && !o, l = i && o; return t[0].visible = a && !r, t[1].visible = a, t[2].visible = a, t[3] .visible = a && !r, t[4].visible = l, t } } const R = window.t("At close"); class N extends D { constructor(e, t) { super(e, t), this._showBarChange = t.properties().paneProperties.legendProperties .showBarChange, this._showSeriesOHLC = t.properties().paneProperties .legendProperties.showSeriesOHLC, this._showBarChange.subscribe(this, this .update), this._showSeriesOHLC.subscribe(this, this.update) } isValuesVisible() { return this._showSeriesOHLC.value() || this._showBarChange.value() } additional() { return null } marketTitle() { const e = this._series.marketStatusModel().status().value(); return this._showLastPriceAndChangeOnly() && ("pre_market" === e || "post_market" === e) ? R + ":" : "" } destroy() { this._showBarChange.unsubscribeAll(this), this._showSeriesOHLC.unsubscribeAll(this) } _createValuesProvider(e, t) { return new B(e, t) } } var j = i("hY0g"), F = i.n(j), W = i("x2L+"); class H { constructor(e, t) { this._marketStatus = new F.a(null), this._lastMarketStatus = null, W.b.subscribe( this, () => this._update()), this._quotesProvider = e, this._quotesProvider .quotesUpdate().subscribe(this, this._update.bind(this)), this ._resetSubscription = t, this._resetSubscription.subscribe(this, this ._resetStatus) } destroy() { W.b.unsubscribeAll(this), this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._resetSubscription.unsubscribeAll(this) } status() { return this._marketStatus } _resetStatus() { this._marketStatus.setValue(null) } _update(e = {}) { void 0 !== e.values && (this._lastMarketStatus = e.values.current_session), "market" !== this._lastMarketStatus || W.b.value() ? this._marketStatus .setValue(this._lastMarketStatus) : this._resetStatus() } } var U = i("LxhU"), z = i("+DwS"), G = i("8woN"), q = i.n(G); const Y = ["DJ", "CBOE", "JSE"]; var K = i("Cf1E"); const J = Object(a.getLogger)("Chart.Definitions.Series"); function Z(e) { const t = []; return ! function(e) { return "index" === e.type && Y.includes(e.listed_exchange) }(e) ? t.push("DelayToRealtime") : t.push("DelayNoRealtime"), t } function X(e, t) { const i = []; return void 0 !== (s = e.delay) && s > 0 ? Z(e) : function(e, t) { return q.a.hasEodSymbols(e.full_name) || t === _.STATUS_EOD }(e, t) ? (i.push("EOD"), i) : i; var s } class $ { constructor(e, t, i) { this._dataUpdatedModeStatus = new F.a(null), this._symbolInfo = Object(z.a)(e .getter, e.onChange), this._status = Object(z.a)(t.getter, t.onChange), this ._symbolInfo.subscribe(this._update.bind(this)), this._status.subscribe(this ._update.bind(this)), this._resetSubscription = i, this._resetSubscription .subscribe(this, this._resetStatus) } destroy() { this._symbolInfo.destroy(), this._status.destroy(), this._resetSubscription .unsubscribeAll(this) } status() { return this._dataUpdatedModeStatus.readonly() } symbolName() { const e = this._symbolInfo.value(); return null !== e ? e.name : "" } time() { const e = this._symbolInfo.value(), t = null !== e && e.delay && e.delay > 0 ? e.delay : 900; return Math.round(t / 60) } listedExchange() { const e = this._symbolInfo.value(); return null !== e ? e.listed_exchange : "" } async description() { const e = this._symbolInfo.value(); if (null === e) return ""; let t = {}; try { t = Object(s.ensureNotNull)(await async function(e) { return null }()) } catch (e) { J.logWarn("Cannot get exchange " + Object(K.a)(e)) } return t.description || e.listed_exchange } exchange() { const e = this._symbolInfo.value(); return null !== e ? e.exchange : "" } firstReplacedByBatsExchange() { const e = this._symbolInfo.value(); return e && null } _resetStatus() { this._dataUpdatedModeStatus.setValue(null) } _update() { const e = this._symbolInfo.value(); if (null === e) return void this._dataUpdatedModeStatus.setValue(null); const t = this._status.value(); if ("string" == typeof t) return void this._dataUpdatedModeStatus.setValue(null); if (t === _.STATUS_LOADING || t === _.STATUS_RESOLVING) return; const i = X(e, t); 0 !== i.length ? this._dataUpdatedModeStatus.setValue(i) : this ._dataUpdatedModeStatus.setValue(null) } } var Q = i("QfUd"), ee = i("ogJP"); class te { constructor(e, t) { this._dataProblem = new Q.a(null), this._quotesProvider = e, this._quotesProvider .quotesUpdate().subscribe(this, this._update.bind(this)), this ._resetSubscription = t, this._resetSubscription.subscribe(this, this ._resetStatus) } destroy() { this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._resetSubscription .unsubscribeAll(this) } status() { return this._dataProblem } _resetStatus() { this._dataProblem.setValue(null) } _update(e) { void 0 === e.values || void 0 === e.values.data_problem ? this._resetStatus() : this ._dataProblem.setValue(Object(ee.clone)(e.values.data_problem)) } } var ie = i("wOSo"), se = i("Tmoa"), re = i("KcY8"), ne = i("oXaB"); function oe(e) { return e < 10 ? "0" + e : e.toString() } const ae = [0, 1, 2, 3, 9, 8, 10], le = g.enabled("force_exchange_as_title"), ce = { alwaysShowGlobalLast: !1, visibleOnHistoryOnly: !1, showCountdown: !0, showSymbolLabel: !0 }; class he extends re.a { constructor(e, t, i) { super(), this._previousCountdown = "", this._source = e, this._model = t, this ._options = { ...ce, ...i } } updateCountdown() { this._countdownText() !== this._previousCountdown && (this.update(), this._model .updateSourcePriceScale(this._source)) } _getSource() { return this._source } _getModel() { return this._model } _isCountdownEnabled() { return this._options.showCountdown } _countdownText() { const e = U.Interval.parse(this._source.interval()); if (e.isDWM() || e.isTicks() || e.isSeconds() && 1 === e.multiplier()) return ""; const t = this._source.data().bars().last(); if (null === t) return ""; const i = 1e3 * Object(s.ensure)(t.value[0]), r = U.Interval.parse(this._source.interval()).inMilliseconds(), n = i.valueOf() + r; let o = Math.round((n - this._currentTime()) / 1e3); if (o <= 0) return ""; o = Math.min(o, r / 1e3); let a = null; o >= 3600 && (a = oe(Math.floor(o / 3600))), o %= 3600; const l = oe(Math.floor(o / 60)); o %= 60; const c = oe(Math.floor(o)); return null !== a ? `${a}:${l}:${c}` : `${l}:${c}` } _updateRendererData(e, t, i) { if (e.visible = !1, t.visible = !1, !this._source.isVisible()) return; const s = this._source.properties().childs(); if (12 === s.style.value()) return; if (this._options.visibleOnHistoryOnly) { const e = this._model.timeScale().visibleBarsStrictRange(), t = this._source.data().last(); if (null === e || null === t || e.contains(t.index)) return } const r = this._model.properties().scalesProperties; let n = r.showSeriesLastValue.value(), o = this._isCountdownEnabled() && -1 !== ae.indexOf(s.style.value()) && s .showCountdown.value(), a = this._options.showSymbolLabel && r.showSymbolLabels.value(); const l = r.seriesLastValueMode.value() === ne.PriceAxisLastValueMode .LastPriceAndPercentageValue, c = this._source.lastValueData(void 0, this._options.alwaysShowGlobalLast); if (c.noData) return; const h = 8 === s.style.value(); if ((n || o || a) && h && s.haStyle.showRealLastPrice.value()) { const e = this._source.lastValueData(void 0, !1), t = this._source.lastValueData(void 0, !0); e.noData || t.noData || e.index !== t.index || (n = !1, o = !1, a = !1) } if (n || o) { const t = this._axisFirstLineText(c, n); e.text = t, i.textColor = this.generateTextColor(i.background), e .textColor = i.textColor; const s = this._source.priceScale().isPercentage(), r = n && l ? s ? c.formattedPriceAbsolute : c.formattedPricePercentage : ""; e.secondLine = r, i.secondLineTextColor = i.textColor; const a = o ? this._countdownText() : ""; this._previousCountdown = a, e.thirdLine = a, i.thirdLineTextColor = Object( se.generateColor)(i.textColor, 25), 0 === t.length && 0 === r .length && 0 === a.length || (e.visible = !0) } a && (t.text = this._paneText(a), t.visible = t.text.length > 0), i.background = this._source.priceLineColor(c.color), i.coordinate = c.coordinate, i .floatCoordinate = c.floatCoordinate } _paneText(e) { let t = ""; const i = this._source.symbolInfo(); return le ? t = Object(d.displayedSymbolExchange)(i) : e && (t = Object(d .displayedSymbolName)(i)), t } _axisFirstLineText(e, t) { return t ? this._source.priceScale().isPercentage() ? e .formattedPricePercentage : e.formattedPriceAbsolute : "" } _currentTime() { return Date.now() + 1e3 * this._source.serverTimeOffset() } } var ue = i("TmNs"), de = i("k9/m"); class pe extends he { lastPrice() { return this._getSource().data().lastProjectionPrice } _updateRendererData(e, t, i) { e.visible = !1, t.visible = !1; const r = this._getModel(), n = this._getSource(), o = n.priceScale(), a = r.timeScale(), l = this.lastPrice(); if (a.isEmpty() || o.isEmpty() || void 0 === l) return; const c = a.visibleBarsStrictRange(); if (null === c) return; const h = c.firstBar(), u = c.lastBar(), d = n.data(), p = d.search(u, de.PlotRowSearchMode.NearestLeft); if (null === p) return; const _ = n.nearestIndex(h, de.PlotRowSearchMode.NearestRight); if (void 0 === _) return; const m = n.model().properties().scalesProperties, f = Object(s.ensureNotNull)(d.valueAt(_))[4]; let g = i.background, b = m.showSeriesLastValue.value(), v = !1, S = !1, y = !1; const w = n.lastValueData(4, !1), P = n.properties(); if (8 === P.style.value() && P.haStyle.showRealLastPrice.value()) { const e = n.lastValueData(4, !0); if (e.noData || e.color === i.background || (g = e.color), !e.noData && !w .noData) { const t = e.index === w.index; v = t && m.showSymbolLabels.value(), S = m.seriesLastValueMode.value() === ne.PriceAxisLastValueMode.LastPriceAndPercentageValue, b = b && t, y = t && this._isCountdownEnabled() && P.showCountdown.value() } } else { g = n.barColorer().barStyle(p.index, !0).barColor } if (i.background = g, i.textColor = this.generateTextColor(g), i .secondLineTextColor = i.textColor, i.thirdLineTextColor = Object(se .generateColor)(i.textColor, 25), i.coordinate = o.priceToCoordinate(l, f), e.visible = b || y, !w.noData) { w.text = o.formatPrice(l, f), w.formattedPriceAbsolute = o.formatPriceAbsolute( l), w.formattedPricePercentage = o.formatPricePercentage(l, f, !0), e .text = this._axisFirstLineText(w, b); const i = n.priceScale().isPercentage(); e.secondLine = b && S ? i ? w.formattedPriceAbsolute : w .formattedPricePercentage : "", e.thirdLine = y ? this._countdownText() : "", t.text = this._paneText(v) } t.visible = v } } var _e = i("KtbP"), me = i("2ijp"), fe = i("HGP3"), ge = i("8Uy/"); const be = { light: { lineStyle: ge.LINESTYLE_DOTTED, lineWidth: 1, textColor: fe.colorsPalette["color-cold-gray-900"], backgroundColor: fe.colorsPalette["color-tv-blue-50"], lineColor: fe.colorsPalette["color-cold-gray-500"] }, dark: { lineStyle: ge.LINESTYLE_DOTTED, lineWidth: 1, textColor: fe.colorsPalette["color-white"], backgroundColor: fe.colorsPalette["color-tv-blue-a800"], lineColor: fe.colorsPalette["color-cold-gray-500"] } }; function ve(e) { return e ? be.dark : be.light } class Se extends me.a { constructor(e, t, i) { super(), this._model = e, this._isVisible = t, this._getValue = i } _updateImpl() { const e = this._lineRendererData; if (e.visible = !1, !this._isVisible.value()) return; const t = this._model.mainSeries(), i = t.priceScale(), s = t.firstValue(), r = this._getValue(); if (null === s || null === r) return; const n = ve(this._model.isDark()); e.visible = !0, e.y = i.priceToCoordinate(r, s), e.linestyle = n.lineStyle, e .linewidth = n.lineWidth, e.color = n.lineColor } } class ye extends re.a { constructor(e, t, i, s) { super(), this._model = e, this._label = t, this._isVisible = i, this._getValue = s } _updateRendererData(e, t, i) { if (e.visible = !1, t.visible = !1, !this._isVisible.value()) return; const s = this._model.mainSeries(), r = s.priceScale(), n = s.firstValue(), o = this._getValue(); if (null === n || null === o) return; const a = ve(this._model.isDark()); e.visible = !0, t.visible = !0, e.text = r.formatPriceAbsolute(o), t.text = this ._label, i.coordinate = r.priceToCoordinate(o, n), i.background = a .backgroundColor, i.textColor = a.textColor } } class we extends ue.PriceLineAxisView { constructor(e, t, i) { super(), this._model = e, this._isLineVisible = t, this._getValue = i } _isVisible() { return this._isLineVisible.value() } _lineWidth() { return ve(this._model.isDark()).lineWidth } _lineStyle() { return ve(this._model.isDark()).lineStyle } _priceLineColor(e) { return ve(this._model.isDark()).lineColor } _value() { const e = this._model.mainSeries(), t = e.priceScale(), i = e.firstValue(), s = this._getValue(); if (null === i || null === s) return { noData: !0 }; const r = t.priceToCoordinate(s, i); return { noData: !1, floatCoordinate: r, coordinate: r, color: "", formattedPricePercentage: "", formattedPriceAbsolute: "", text: "", index: 0 } } } const Pe = Object(f.t)("High"), Ce = Object(f.t)("Low"), xe = Object(f.t)("Avg"); function Te(e, t, i, s, r, n) { const o = new Se(e, r, n), a = new ye(e, i, s, n); return { paneView: o, panePriceAxisView: new _e.PanePriceAxisView(a, t, e), priceAxisView: a, priceLineAxisView: new we(e, r, n) } } var Ie = i("aIyQ"), Me = i.n(Ie), Oe = i("WkOR"), Le = i("aO4+"); class Ae { constructor() { this._data = null } setData(e) { this._data = e } data() { return this._data } draw(e, t) { const i = this._data; if (null === i) return; const s = t.pixelRatio; e.save(); const r = Math.max(1, Math.floor(s)), n = r % 2 / 2, o = Math.round(i.center.x * s) + n, a = i.center.y * s; e.fillStyle = i.seriesLineColor, e.beginPath(); const l = Math.max(2, 1.5 * i.seriesLineWidth) * s; e.arc(o, a, l, 0, 2 * Math.PI, !1), e.fill(), e.fillStyle = i.fillColor, e .beginPath(), e.arc(o, a, i.radius * s, 0, 2 * Math.PI, !1), e.fill(), e .lineWidth = r, e.strokeStyle = i.strokeColor, e.beginPath(), e.arc(o, a, i .radius * s + r / 2, 0, 2 * Math.PI, !1), e.stroke(), e.restore() } hitTest(e, t) { return null } } function Ee(e) { return e } const ke = [{ start: 0, end: .25, startRadius: 4, endRadius: 10, startFillAlpha: .25, endFillAlpha: 0, startStrokeAlpha: .4, endStrokeAlpha: .8, easing: Ee }, { start: .25, end: .525, startRadius: 10, endRadius: 14, startFillAlpha: 0, endFillAlpha: 0, startStrokeAlpha: .8, endStrokeAlpha: 0, easing: Ee }, { start: .525, end: 1, startRadius: 14, endRadius: 14, startFillAlpha: 0, endFillAlpha: 0, startStrokeAlpha: 0, endStrokeAlpha: 0, easing: Ee }]; function De(e, t, i, s) { const r = i + (s - i) * t; return Object(se.applyTransparency)(e, Object(se.alphaToTransparency)(r)) } function Ve(e, t) { const i = e % 2600 / 2600; let s; for (const e of ke) if (i >= e.start && i <= e.end) { s = e; break } if (void 0 === s) throw new Error("Last price animation internal logic error"); const r = s.easing((i - s.start) / (s.end - s.start)); return { fillColor: De(t, r, s.startFillAlpha, s.endFillAlpha), strokeColor: De(t, r, s.startStrokeAlpha, s.endStrokeAlpha), radius: (n = r, o = s.startRadius, a = s.endRadius, o + (a - o) * n) }; var n, o, a } class Be { constructor(e) { this._renderer = new Ae, this._invalidated = !0, this._stageInvalidated = !0, this ._startTime = performance.now(), this._endTime = this._startTime - 1, this ._series = e } update(e) { if (this._invalidated = !0, e) { const e = performance.now(), t = this._endTime - e; if (t > 0) return void(t < 650 && (this._endTime += 2600)); this._startTime = e, this._endTime = e + 2600 } } invalidateStage() { this._stageInvalidated = !0 } animationActive() { return performance.now() <= this._endTime } stopAnimation() { this._endTime = this._startTime - 1 } renderer(e, t) { return this._invalidated ? (this._updateImpl(e, t), this._invalidated = !1, this ._stageInvalidated = !1) : this._stageInvalidated && (this ._updateRendererDataStage(), this._stageInvalidated = !1), this._renderer } _updateImpl(e, t) { this._renderer.setData(null); const i = this._series.model().timeScale(), s = i.visibleBarsStrictRange(), r = this._series.firstValue(), n = this._series.lastValueData(void 0, !0, !0); if (null === s || null === r || void 0 === n.index || void 0 === n.price || !s .contains(n.index)) return; const o = new Le.Point(i.indexToCoordinate(n.index), this._series.priceScale() .priceToCoordinate(n.price, r)), a = n.color, l = this._series.properties(); let c; switch (this._series.style()) { case 3: c = l.areaStyle.linewidth.value(); break; case 10: const t = l.baselineStyle, i = Math.round(e * (Math.abs(100 - t.baseLevelPercentage.value()) / 100)); c = o.y <= i ? t.topLineWidth.value() : t.bottomLineWidth.value(); break; default: c = l.lineStyle.linewidth.value() } const h = Ve(this._duration(), a); this._renderer.setData({ seriesLineColor: a, seriesLineWidth: c, fillColor: h.fillColor, strokeColor: h.strokeColor, radius: h.radius, center: o }) } _updateRendererDataStage() { const e = this._renderer.data(); if (null !== e) { const t = Ve(this._duration(), e.seriesLineColor); e.fillColor = t.fillColor, e.strokeColor = t.strokeColor, e.radius = t.radius } } _duration() { return this.animationActive() ? performance.now() - this._startTime : 2599 } } var Re = i("H0vP"), Ne = i("BZtw"); i.d(t, "SeriesBase", (function() { return Ue })); const je = g.enabled("price_scale_always_last_bar_value"), Fe = g.enabled("display_data_mode"), We = (r.CheckMobile.any(), Object(a.getLogger)("Chart.Series")), He = { countdownEnabled: !0, lastPriceAnimationEnabled: !0 }; class Ue extends l.PriceDataSource { constructor(e, t, i, r) { super(e), this.chartWidgetInitialized = new Me.a, this .requestingIntradayWhenNotSupported = new Me.a, this .requestingResolutionWhenNotSupported = new Me.a, this._paneView = null, this._priceStep = null, this._symbolInfo = null, this._prevSymbolInfo = null, this._isPrePostMarketPricesForbiddenProperty = new u.a(!0), this ._highLowAvgPriceCache = new Map, this._prevClosePriceAxisView = null, this._priceScaleChanged = new Me.a, this._priceScaleAboutToBeChanged = new Me.a, this._onRestarted = new Me.a, this._onStatusChanged = new Me.a, this._extendedHoursChanged = new Me.a, this._tagsChanged = new Me.a, this._sessionIdChanged = new Me.a, this ._currency = null, this._unit = null, this._endOfData = !1, this ._lineStyleLastPriceCirclePaneView = new Be(this), this ._prevClosePriceLineView = null, this._dataPoweredBy = null, this ._loading = !0, this._seriesLoaded = !1, this._status = 0, this ._boxSizeValue = new F.a, this._base = 100, this._pointValue = 1, this ._formatter = new p.PriceFormatter(this._base), this ._ignoreMinMoveFormatter = new p.PriceFormatter(this._base), this ._ignoreMinMovePriceStep = null, this._lastBarCloseTime = null, this ._onSessionIdPropertyChangedBound = this._onSessionIdPropertyChanged.bind( this), this._ignoreSessionIdProxyPropertyChanges = !1, this ._lastPriceAnimationActive = !1, this._currentSession = "out_of_session", this._onStyleChanged = new Me.a, this._intervalObj = null, this ._obsoleteZOrder = 0, this._seriesErrorMessage = null, this._seriesSource = new Ne.a(e.chartApi(), "s", r); const n = this._seriesSource.dataEvents(); n.symbolResolved().subscribe(this, this._onSymbolResolved), n.symbolError() .subscribe(this, this._onSymbolError), n.seriesTimeFrame().subscribe(this, this._onSeriesTimeFrame), n.seriesError().subscribe(this, this ._onSeriesError), n.loading().subscribe(this, this._onSeriesLoading), n .completed().subscribe(this, this._onSeriesCompleted), n.dataUpdated() .subscribe(this, this._onDataUpdated), n.barReceived().subscribe(this, this ._onBarReceived), this._quotesProvider = new ie.a, this._quotesProvider .quotesUpdate().subscribe(this, this._onQuotesUpdate); const o = t.childs(); if (t.hasChild("extendedHours")) { Object(s.ensureDefined)(o.extendedHours).value() && !t.hasChild( "sessionId") && t.addChild("sessionId", new u.a("extended")), t .removeProperty("extendedHours") } t.hasChild("sessionId") || t.addChild("sessionId", new u.a("regular")), this ._setProperties(t), this._sessionIdProxyProperty = new u.a(o.sessionId .value()), o.sessionId.subscribe(this, () => this ._updateSessionIdProxyProperty()), this._sessionIdProxyProperty .subscribe(this, this._onSessionIdProxyPropertyChanged), this._options = Object(ee.merge)(Object(ee.clone)(He), i), this._prevChartStyle = o.style .value(); const a = new he(this, e, { alwaysShowGlobalLast: !0, showCountdown: i.countdownEnabled }); this._priceAxisView = a; let l = null; je || (l = new he(this, e, { visibleOnHistoryOnly: !0, showSymbolLabel: !1, showCountdown: !1, alwaysShowGlobalLast: !1 })), this._priceLinePriceAxisView = new ue.SeriesPriceLineAxisView(this), this._priceLineAxisViews = [this._priceLinePriceAxisView]; const c = new pe(this, e, { showCountdown: i.countdownEnabled }); this._priceAxisViews = [a, c], null !== l && this._priceAxisViews.push(l), this ._panePriceAxisView = new _e.PanePriceAxisView(a, this, e), this ._historyPricePanePriceAxisView = null !== l ? new _e.PanePriceAxisView(l, this, e) : null, this._projectionPriceAxisView = new _e .PanePriceAxisView(c, this, e), this._labelPaneViews = [this ._panePriceAxisView, this._projectionPriceAxisView ], null !== this._historyPricePanePriceAxisView && this._labelPaneViews.push( this._historyPricePanePriceAxisView), this._highLowAvgPaneViews = [], this._createHighLowAvgViews(), this._subscribeRestartToSessionIdChange(); const h = this.properties(); h.visible.subscribe(this, this._updateLastPriceAnimationActive), this ._updateLastPriceAnimationActive(), this._dataWindowView = new D(this, e), this._legendView = new N(this, e), this._statusView = new I(this, this ._model.properties().scalesProperties.textColor, h.statusViewStyle), this._marketStatusModel = new H(this._quotesProvider, h.symbol.listeners()), this._dataUpdatedModeModel = Fe ? new $({ getter: this.symbolInfo.bind(this), onChange: n.symbolResolved() }, { getter: this.status.bind(this), onChange: this._onStatusChanged }, h.symbol.listeners()) : null, this._dataProblemModel = new te(this ._quotesProvider, h.symbol.listeners()) } seriesErrorMessage() { return this._seriesErrorMessage } destroy() { this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._model .timeScale().visibleBarsStrictRangeChanged().unsubscribeAll(this), this ._unsubscribeRestartToSessionIdChange() } zorder() { return 0 } quotesProvider() { return this._quotesProvider } currentSession() { return this._currentSession } labelPaneViews() { return this._labelPaneViews } topPaneViews() { if (this._lastPriceAnimationActive) { const e = this._lineStyleLastPriceCirclePaneView; return e.animationActive() && setTimeout(() => this._model.invalidate(Re .InvalidationMask.cursor()), 0), e.invalidateStage(), [e] } return null } priceAxisViews(e, t) { return e.findTargetPriceAxisViews(this, t, this._priceAxisViews, this ._priceLineAxisViews) } clearHighLowAvgPriceCache() { this._highLowAvgPriceCache.clear() } priceScaleChanged() { return this._priceScaleChanged } priceScaleAboutToBeChanged() { return this._priceScaleAboutToBeChanged } isStatusBad() { return 12 === this.status() || 4 === this.status() || 10 === this.status() } isStatusError() { return 12 === this.status() } actualSymbol() { return Object(d.actualSymbol)(this.symbolInfo(), this.symbol()) } proSymbol() { return Object(d.proSymbol)(this.symbolInfo(), this.symbol()) } onStyleChanged() { return this._onStyleChanged } style() { return this.properties().style.value() } symbolSameAsCurrent(e) { return Object(Oe.b)(e, this.m_symbol, this.symbolInfo()) } symbolInfo() { return this._symbolInfo } symbolResolved() { return this.dataEvents().symbolResolved() } formatter(e = !0) { return e ? this._formatter : this._ignoreMinMoveFormatter } priceStep(e = !0) { return e ? this._priceStep : this._ignoreMinMovePriceStep } interval() { return this.properties().interval.value() } intervalObj() { const e = this.interval(); if (null !== this._intervalObj && this._intervalObj.resolutionString === e) return this._intervalObj.interval; const t = U.Interval.parse(e); return this._intervalObj = { resolutionString: e, interval: t }, t } prevClose() { const e = this.priceScale(); if (e.isEmpty() || this.data().isEmpty()) return null; const t = this.quotes(), i = this.firstValue(); if (null === t || null === i) return null; const s = t.prev_close_price; return void 0 === s ? null : { coordinate: e.priceToCoordinate(s, i), floatCoordinate: e.priceToCoordinate(s, i), formattedPricePercentage: e.formatPricePercentage(s, i, !0), formattedPriceAbsolute: e.formatPriceAbsolute(s) } } hasClosePrice() { return 12 !== this.properties().style.value() } isDWM() { return this.intervalObj().isDWM() } nearestValue(e, t, i) { const s = this.nearestData(e, i); return s ? s.value[t] : void 0 } onStatusChanged() { return this._onStatusChanged } onRestarted() { return this._onRestarted } onExtendedHoursChanged() { return this._extendedHoursChanged } sessionId() { return this.properties().sessionId.value() } sessionIdChanged() { return this._sessionIdChanged } autoScaleInfo(e, t) { const i = this.priceRange(e, t); if (null === this._paneView) return { range: i }; const s = this._paneView; return { range: i, topPixelMargin: s.topPixelMargin ? s.topPixelMargin() : void 0, bottomPixelMargin: s.bottomPixelMargin ? s.bottomPixelMargin() : void 0 } } onChartStyleChanged() { this._updateBarFunction(), this.isNeedRestart() && (this.data().clear(), this .model().timeScale().scrollToRealtime(!1), this.restart()); const e = this.properties(); this._prevChartStyle = e.style.value(), this._onStyleChanged.fire(e.style .value()), this.invalidateBarStylesCache(), this ._updateLastPriceAnimationActive() } sessionIdProxyProperty() { return this._sessionIdProxyProperty } isPrePostMarketPricesForbiddenProperty() { return this._isPrePostMarketPricesForbiddenProperty } quotes() { return this.data().isEmpty() ? null : this._quotesProvider.quotes() } base() { return this._base } pointValue() { return this._pointValue } barCloseTime() { return this._lastBarCloseTime } barFunction() { return this._barFunction } setSymbolCurrencyUnit(e, t, i) { const s = this.properties(), r = void 0 !== e && e !== s.symbol.value(), n = void 0 !== t && t !== s.currencyId.value(), o = void 0 !== i && i !== s.unitId.value(); r && s.symbol.setValueSilently(e), n && s.currencyId.setValueSilently(t), o && s .unitId.setValueSilently(i), r && s.symbol.listeners().fire(s.symbol), n && s.currencyId.listeners().fire(s.currencyId), o && s.unitId.listeners().fire( s.unitId) } setSymbol(e) { this.setSymbolCurrencyUnit(e) } currency() { return this.properties().currencyId.value() || null } setCurrency(e) { this.setSymbolCurrencyUnit(void 0, e) } isConvertedToOtherCurrency() { return Object(d.isConvertedToOtherCurrency)(this.symbolInfo()) } unit() { return this.properties().unitId.value() || null } setUnit(e) { this.properties().unitId.setValue(e) } isConvertedToOtherUnit() { return Object(d.isConvertedToOtherUnit)(this.symbolInfo()) } symbolSource() { return this } title() { return this.symbolTitle() } symbolTitle(e, t) { let i = this.properties().symbol.value(); const s = this.symbolInfo(); return null !== s && (i = Object(d.symbolTitle)(s, e)), t ? i : `${i}, ${Object(y.translatedIntervalString)(this.properties().interval.value())}` } setObsoleteZOrder(e) { this._obsoleteZOrder = e } obsoleteZOrder() { return this._obsoleteZOrder } valuesProvider() { return new B(this, this.model()) } statusProvider(e) { return new T(this, this._model.properties().scalesProperties.textColor, this .properties().statusViewStyle, e) } open(e) { const t = this.data().valueAt(e); return t && t[1] } high(e) { const t = this.data().valueAt(e); return t && t[2] } low(e) { const t = this.data().valueAt(e); return t && t[3] } close(e) { const t = this.data().valueAt(e); return t && t[4] } moveItem(e, t, i) { if (10 === this.style() && 0 === t) { const t = this.priceScale(), i = this.properties().baselineStyle, s = t.height(), r = 100 - e.y / s * 100, n = r < 0 ? 0 : Math.round(10 * r) / 10; i.baseLevelPercentage.setValue(Math.max(Math.min(n, 100), 0)) } } endOfData() { return this._endOfData } dataPoweredBy() { return null } boxSizeValue() { return this._boxSizeValue } isUserDeletable() { return !1 } changeSymbol() { this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection() } changeInterval() { this.setSymbolIntervalCurrencyDelayed() } changeTimeFrame() { Object(n.trackEvent)("GUI", "Change timeframe") } onTagsChanged() { return this._tagsChanged } _updateBarFunction() { if (12 === this.properties().style.value()) this._barFunction = Object(c .barFunction)("low"); else { const e = this.priceSource() || "close"; this._barFunction = Object(c.barFunction)(e) } } _setProperties(e) { e.hasChild("timeframe") || e.merge({ timeframe: "" }), e.hasChild("shortName") || e.merge({ shortName: "" }), e.hasChild("currencyId") || e.addChild("currencyId", new u.a(null)), e .hasChild("unitId") || e.addChild("unitId", new u.a(null)), this ._properties = e; const t = e.childs(); t.symbol.listeners().subscribe(this, this.changeSymbol), t.interval.listeners() .subscribe(this, this.changeInterval), t.currencyId.listeners().subscribe( this, this._changeCurrency), t.unitId.listeners().subscribe(this, this ._changeUnit), t.timeframe.listeners().subscribe(this, this .changeTimeFrame), e.subscribe(this, this._onPropertiesChanged) } _updateSessionIdProxyProperty(e) { const t = this._properties.childs().sessionId.value(); let i = t; if (e) { const e = this.symbolInfo(); null !== e && (i = e.subsession_id || t) } this._ignoreSessionIdProxyPropertyChanges = !0, this._sessionIdProxyProperty .setValue(i), this._ignoreSessionIdProxyPropertyChanges = !1 } _onSessionIdProxyPropertyChanged() { this._ignoreSessionIdProxyPropertyChanges || this._properties.childs().sessionId .setValue(this._sessionIdProxyProperty.value()), this ._updateLastPriceAnimationActive() } _onSeriesLoading(e) { this._loading = !0, this._setStatus(2) } _onDataUpdated(e, t) { if (this.hasDelayedSymbolIntervalChange()) { if (this._willSymbolIntervalCurrencyChanged()) return void We.logNormal( "command comes during symbol/interval changing"); We.logNormal( "data_update comes when symbol interval delay present but symbol/interval should not be changed" ) } t ? this._endOfData = !1 : this._lastPriceAnimationActive && this ._seriesLoaded && this._lineStyleLastPriceCirclePaneView.update(!0), this ._lastBarCloseTime = e && e.closeTime || null, this._boxSizeValue.setValue( this.data().boxSize), this._statusView.update(), this .clearHighLowAvgPriceCache(); const i = this.model(), r = Object(s.ensureNotNull)(i.paneForSource(this)); i.recalculatePane(r), i.updateSource(this), i.updateLineTools() } _setStatus(e) { this._status = e, this._statusView.update(), this.model().updateSource(this), this._onStatusChanged.fire() } _willSymbolIntervalCurrencyChanged() { const e = this.properties(), t = this._checkIntervalWillChanged(e.interval.value()), i = this._checkSymbolWillChanged(e.symbol.value()), s = this._checkCurrencyWillChanged(e.currencyId.value()), r = this._checkUnitWillChanged(e.unitId.value()); return i || t || s || r } _checkSymbolWillChanged(e) { return !this.symbolSameAsCurrent(e) } _checkIntervalWillChanged(e) { return !U.Interval.isEqual(this.m_interval, e) } _recreateFormatter() { this._formatter = Object(d.createSeriesFormatter)(this.symbolInfo(), this .properties().minTick.value()), this._ignoreMinMoveFormatter = Object(d .createSeriesFormatter)(this.symbolInfo(), this.properties().minTick .value(), !0), this.priceScale() && this.priceScale().updateFormatter(), this._formatterChanged.fire() } _recreatePriceStep() { const { minMove: e, priceScale: t } = Object(d.getSeriesPriceFormattingState)(this.symbolInfo()), i = e / t; this._ignoreMinMovePriceStep = 1 / t, this._priceStep !== i && (this ._priceStep = i, this._priceStepChanged.fire()) } _recreatePriceFormattingDependencies() { this._recreateFormatter(), this._recreatePriceStep() } _onQuotesUpdate(e, t) { e.values.current_session !== this._currentSession && (this._currentSession = e .values.current_session, this._updateLastPriceAnimationActive()) } _updateIsPrePostMarketPricesForbiddenProperty() { const e = !this.isDWM() && !Object(d.isRegularSessionId)(this .sessionIdProxyProperty().value()); this._isPrePostMarketPricesForbiddenProperty.setValue(e) } _getSymbolForApi() { return Object(d.symbolForApi)(this.symbolInfo() || this._prevSymbolInfo, this .symbol()) } _getSymbolObject() { const e = this._getExtendedSymbolObject(); if (_.SYMBOL_STRING_DATA.hasOwnProperty(this.properties().style.value())) { return { symbol: e, type: this.styleStudyInfo(this.getStyleShortName() + "Style").studyId + "!", inputs: this.getInputsProperties().state() } } return e } _getExtendedSymbolObject() { const e = { symbol: this._getSymbolForApi() }; null !== this.currency() && (e["currency-id"] = this.currency()); const t = this.unit(); return null !== t && (e["unit-id"] = t), e } _changeCurrency() { this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection(), this._currencyChanged.fire() } _changeUnit() { this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection(), this._unitChanged.fire() } _checkCurrencyWillChanged(e) { return this._currency !== e } _checkUnitWillChanged(e) { return this._unit !== e } _createHighLowAvgViews() { const e = this.properties().highLowAvgPrice, t = this._getHighLowAvgPrice.bind(this), i = function(e, t, i, s) { const r = i.childs(), n = Te(e, t, Pe, r.highLowPriceLabelsVisible, r .highLowPriceLinesVisible, () => s(0)), o = Te(e, t, Ce, r.highLowPriceLabelsVisible, r .highLowPriceLinesVisible, () => s(1)), a = Te(e, t, xe, r.averageClosePriceLabelVisible, r .averageClosePriceLineVisible, () => s(2)); return { paneViews: [n.paneView, o.paneView, a.paneView], panePriceAxisViews: [n.panePriceAxisView, o.panePriceAxisView, a .panePriceAxisView ], priceAxisViews: [n.priceAxisView, o.priceAxisView, a.priceAxisView], priceLineAxisViews: [n.priceLineAxisView, o.priceLineAxisView, a .priceLineAxisView ] } }(this._model, this, e, t); this._highLowAvgPaneViews.push(...i.paneViews), this._labelPaneViews.push(...i .panePriceAxisViews), this._priceAxisViews.push(...i.priceAxisViews), this._priceLineAxisViews.push(...i.priceLineAxisViews) } _getHighLowAvgPrice(e) { if (!this._highLowAvgPriceCache.has(e)) { const t = this._model.timeScale().visibleBarsStrictRange(); if (null === t) return null; const i = this._model.mainSeries().bars(), s = t.firstBar(), r = t.lastBar(); if (2 === e) { const e = function(e, t, i) { const s = Object(c.barFunction)("close"); let r = 0, n = 0; for (let o = t; o <= i; o++) { const t = e.valueAt(o); null !== t && (r += s(t), n++) } return n ? r / n : null }(i, s, r); if (null === e) return null; this._highLowAvgPriceCache.set(2, e) } else { const e = function(e, t, i) { return e.minMaxOnRangeCached(t, i, [{ name: "low", offset: 0 }, { name: "high", offset: 0 }]) }(i, s, r); if (null === e) return null; this._highLowAvgPriceCache.set(1, e.min), this._highLowAvgPriceCache .set(0, e.max) } } return this._highLowAvgPriceCache.get(e) } _onSessionIdPropertyChanged() { this._sessionIdChanged.fire(), this.isDWM() || (this.restart(), this ._updateLastPriceAnimationActive()) } _subscribeRestartToSessionIdChange() { this.properties().sessionId.subscribe(this, this ._onSessionIdPropertyChangedBound) } _unsubscribeRestartToSessionIdChange() { this.properties().sessionId.unsubscribe(this, this ._onSessionIdPropertyChangedBound) } _updateLastPriceAnimationActive() { if (!this._options.lastPriceAnimationEnabled) return; const e = this._lastPriceAnimationActive, t = this.properties(), i = t.style.value(); if (this._model.isSnapshot() || !t.visible.value() || 3 !== i && 10 !== i && 2 !== i) this._lastPriceAnimationActive = !1; else { const e = this.currentSession(), t = !Object(d.isRegularSessionId)(this.sessionIdProxyProperty() .value()) && !this.isDWM(); this._lastPriceAnimationActive = "market" === e || t && ("pre_market" === e || "post_market" === e) } this._lastPriceAnimationActive && e !== this._lastPriceAnimationActive && this .model().invalidate(Re.InvalidationMask.cursor()) } _onPropertiesChanged(e) { const t = this._properties.childs(); e !== t.symbol && e !== t.interval && e !== t.timeframe && (this._tagsChanged .fire(), this.createPaneView(), this.updateAllViews(), this.model() .updateSource(this), Object(o.emit)("series_properties_changed", this ._id)) } } }, "lW/c": function(e, t, i) { "use strict"; i.r(t); i("YFKU"); var s = i("hY0g"), r = i.n(s), n = i("HySD"); class o { constructor(e) { this._document = e, this.isFullscreen = new r.a; const t = () => { const e = ["fullscreenElement", "webkitFullscreenElement", "mozFullscreenElement", "mozFullScreenElement", "msFullscreenElement" ]; for (let t = 0; t < e.length; t++) { const i = e[t]; if (i in this._document) { this.isFullscreen.setValue(!!this._document[i]); break } } }; t(); for (const i of ["fullscreenchange", "webkitfullscreenchange", "mozfullscreenchange", "MSFullscreenChange" ]) e.addEventListener(i, t, !1) } enter() { const e = this._document.documentElement; for (const t of ["requestFullscreen", "mozRequestFullScreen", "webkitRequestFullscreen", "msRequestFullscreen" ]) if ("function" == typeof e[t]) { e[t](); break } this.isFullscreen.setValue(!0) } exit() { const e = this._document; for (const t of ["exitFullscreen", "mozCancelFullScreen", "mozExitFullscreen", "webkitExitFullscreen", "msExitFullscreen" ]) if ("function" == typeof e[t]) { e[t](); break } this.isFullscreen.setValue(!1) } } class a { constructor(e) { let t; this.isVisible = new r.a(!0); let i = null; for (const s of ["", "moz", "ms", "webkit"]) { const r = s ? s + "Hidden" : "hidden"; if (r in e) { t = s + "visibilitychange", i = () => { this.isVisible.setValue(!e[r]) }, i(), e.addEventListener(t, i, !1); break } } this.destroy = () => { i && (e.removeEventListener(t, i, !1), i = null) } } } var l = i("mNbo"), c = i("Eyy1"), h = i("qFKp"); i.d(t, "Root", (function() { return u })); class u { constructor(e) { this._updateDocumentHeight = e => { "visual" === this._viewportType && this._window.document.documentElement .style.setProperty("height", e + "px", "important") }, this._window = e, this._fullscreenApi = new o(e.document), this ._viewportType = h.isChrome || Object(l.isOnMobileAppPage)("any") || !this ._window.visualViewport ? "quirks" : "visual", "visual" === this._viewportType ? this._viewport = Object(c.ensureDefined)(this._window.visualViewport) : this ._viewport = this._window; const t = this._layoutSizeSensor = this._window.document.createElement("div"); t.id = "layout-size-sensor", t.style.position = "fixed", t.style.top = "0", t.style .left = "0", t.style.right = "0", t.style.bottom = "0", t.style.pointerEvents = "none", t.style.visibility = "hidden", this._initFullscreen() } allocate() { this.free(); const e = this._window.document, t = e.createElement("div"); t.classList.add("js-rootresizer__contents"), t.style.position = "relative", t.style .width = "100%", t.style.height = "100%", e.body.insertAdjacentElement( "afterbegin", t), e.body.insertAdjacentElement("afterbegin", this ._layoutSizeSensor), this._visibilityApi = new a(this._window.document); const i = { alive: new r.a(!0), fullscreenable: new r.a(!0), container: new r.a(t), width: new r.a, height: new r.a, availWidth: new r.a, availHeight: new r.a, visible: this._visibilityApi.isVisible, fullscreen: this._fullscreenApi.isFullscreen, remove: () => { i.alive.setValue(!1) }, attach: () => { i.alive.setValue(!1), this._window.close() }, requestFullscreen: () => { this._requestFullscreen() }, exitFullscreen: () => { this._exitFullscreen() } }; return i.alive.subscribe(e => { e || i !== this._area || this.free() }), this._area = i, this._resizeHandler = () => { const e = this._width(i) || 800, t = this._height(i) || 600; i.availHeight.setValue(t), i.availWidth.setValue(e), i.height.setValue(t), i .width.setValue(e) }, this._area.height.subscribe(this._updateDocumentHeight, { callWithLast: !0 }), this._resizeHandler(), this._viewport.addEventListener("resize", this ._resizeHandler), new n.ResizerDetacherState(i).bridge() } free() { if (this._resizeHandler && (this._viewport.removeEventListener("resize", this ._resizeHandler), this._resizeHandler = void 0), this._visibilityApi && ( this._visibilityApi.destroy(), this._visibilityApi = void 0), this._area) { const e = this._area; this._area = void 0, e.height.unsubscribe(this._updateDocumentHeight), e.alive .setValue(!1); const t = e.container.value(), i = null == t ? void 0 : t.parentElement; i && (i.removeChild(t), i.removeChild(this._layoutSizeSensor)) } } _height(e) { if ("visual" === this._viewportType) return this._layoutSizeSensor.clientHeight; return e.container.value().clientHeight } _width(e) { return e.container.value().clientWidth } _requestFullscreen() { this._fullscreenApi.enter() } _exitFullscreen() { this._fullscreenApi.exit() } _initFullscreen() { this._fullscreenApi.isFullscreen.subscribe(e => { this._resizeHandler && this._resizeHandler() }) } } }, ltKl: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SeriesApi", (function() { return l })); var s = i("Eyy1"), r = i("jRfx"), n = i("HGup"), o = i("/ToI"), a = i("GD+X"); class l { constructor(e, t) { this._series = e, this._undoModel = t, this._model = t.model() } isUserEditEnabled() { return this._series.userEditEnabled() } setUserEditEnabled(e) { this._series.setUserEditEnabled(e) } mergeUp() { this._model.isMergeUpAvailableForSource(this._series) && new r.c(this._model, this ._series, "").redo() } mergeDown() { this._model.isMergeDownAvailableForSource(this._series) && new r.a(this._model, this ._series, "").redo() } unmergeUp() { this._model.isUnmergeAvailableForSource(this._series) && new n.c(this._model, this ._series, "").redo() } unmergeDown() { this._model.isUnmergeAvailableForSource(this._series) && new n.a(this._model, this ._series, "").redo() } detachToRight() { new o.b(this._model, this._series, this._pane(), "right", "").redo() } detachToLeft() { new o.b(this._model, this._series, this._pane(), "left", "").redo() } detachNoScale() { new o.b(this._model, this._series, this._pane(), "overlay", "").redo() } changePriceScale(e) { const t = Object(s.ensureNotNull)(this._model.paneForSource(this._series)); switch (e) { case "new-left": new o.b(this._model, this._series, t, "left", "").redo(); break; case "new-right": new o.b(this._model, this._series, t, "right", "").redo(); break; case "no-scale": Object(s.assert)(t.actionNoScaleIsEnabled(this._series), "Unable to leave a pane without any non-overlay price scale"), new o .b(this._model, this._series, t, "overlay", "").redo(); break; default: const i = this._model.dataSourceForId(e); if (null === i) throw new Error(`There is no study with entityId='${e}'`); const r = this._model.paneForSource(i) === t; Object(s.assert)(r, "Study should be on the main pane"); const n = Object(s.ensureNotNull)(i.priceScale()); new o.a(this._model, this._series, t, n, "").redo() } } isVisible() { return this._series.properties().visible.value() } setVisible(e) { this._series.properties().visible.setValue(e) } bringToFront() { this._model.bringToFront([this._series]) } sendToBack() { this._model.sendToBack([this._series]) } entityId() { return this._series.id() } chartStyleProperties(e) { return this._series.properties().child(c(e)).state(["inputs", "inputsInfo"]) } setChartStyleProperties(e, t) { this._series.properties().child(c(e)).mergeAndFire(t) } barsCount() { return this._series.bars().size() } symbolSource() { return { symbol: this._series.symbol(), currencyId: this._series.currency(), unitId: this._series.unit() } } isLoading() { return this._series.isLoading() } data() { return this._series.data() } priceScale() { return new a.a(this._undoModel, this._series.priceScale()) } _pane() { return Object(s.ensureNotNull)(this._model.paneForSource(this._series)) } } function c(e) { switch (e) { case 0: return "barStyle"; case 1: return "candleStyle"; case 2: return "lineStyle"; case 3: return "areaStyle"; case 4: return "renkoStyle"; case 5: return "kagiStyle"; case 6: return "pnfStyle"; case 7: return "pbStyle"; case 8: return "haStyle"; case 9: return "hollowCandleStyle"; case 10: return "baselineStyle"; case 11: return "rangeStyle"; case 12: return "hiloStyle"; default: Object(s.ensureNever)(e) } throw new Error("unsupported chart style: " + e) } }, lxNp: function(e, t, i) { "use strict"; i.r(t); var s = i("/3z9"), r = i("d700"), n = i("hY0g"), o = i.n(n); var a = i("JWMC"); class l { constructor(e, t) { this._group = e, this.hotkey = t.hotkey, this.handler = t.handler, this.desc = t.desc, this.element = t.element || null, t.isDisabled ? "function" == typeof t.isDisabled ? this.isDisabled = t .isDisabled : this.isDisabled = () => !0 : this.isDisabled = () => !1 } destroy() { this._group && (this._group.remove(this), this._group = null) } } class c { constructor(e, t) { this._actions = [], this._manager = e, this.modal = !(!t || !t.modal), t && (this .desc = t.desc), t && t.isDisabled ? "function" == typeof t.isDisabled ? this.isDisabled = t.isDisabled : this.isDisabled = () => !0 : this.isDisabled = () => !1, this._manager.registerGroup(this) } add(e) { const t = new l(this, e); return this._actions.push(t), t } remove(e) { for (let t = this._actions.length; t-- > 0;) this._actions[t] === e && this._actions .splice(t, 1) } handleHotkey(e, t) { for (let i = this._actions.length; i-- > 0;) { const r = this._actions[i]; if (r.hotkey === e && ((!r.element || t.target && r.element.contains(t .target)) && !r.isDisabled())) return r.handler(t), t.preventDefault(), Object(a.trackEvent)("Keyboard Shortcuts", Object(s.humanReadableHash)( e)), !0 } return !1 } promote() { this._manager.promoteGroup(this) } destroy() { this._actions.length = 0, this._manager.unregisterGroup(this) } } i.d(t, "pressedKeys", (function() { return u })), i.d(t, "createGroup", (function() { return d })), i.d(t, "registerWindow", (function() { return p })), i.d(t, "unregisterWindow", (function() { return _ })), i.d(t, "Modifiers", (function() { return s.Modifiers })); const h = new class { constructor() { this._groups = [], this._pressedKeys = new o.a(0), this._keyDownListener = e => { if (e.defaultPrevented) return; const t = Object(s.hashFromEvent)(e); if (this._pressedKeys.setValue(t), !Object(r.a)(t, e.target)) for (let i = this._groups.length; i-- > 0;) { const s = this._groups[i]; if (!s.isDisabled()) { if (s.handleHotkey(t, e)) return; if (s.modal) return } } }, this._keyUpListener = e => { const t = Object(s.hashFromEvent)(e); this._pressedKeys.setValue(t) }, this._blurEvent = () => { this._pressedKeys.setValue(0) }, this._mouseEvent = e => { const t = Object(s.modifiersFromEvent)(e), i = 255 & this._pressedKeys.value(); this._pressedKeys.setValue(t | i) } } listen(e) { e.addEventListener("keydown", this._keyDownListener), e.addEventListener( "keyup", this._keyUpListener), e.addEventListener("blur", this ._blurEvent), e.addEventListener("mousemove", this._mouseEvent) } unlisten(e) { e.removeEventListener("keydown", this._keyDownListener), e.removeEventListener( "keyup", this._keyUpListener), e.removeEventListener("blur", this ._blurEvent), e.removeEventListener("mousemove", this._mouseEvent) } registerGroup(e) { this._groups.push(e) } unregisterGroup(e) { for (let t = this._groups.length; t--;) this._groups[t] === e && this._groups .splice(t, 1) } promoteGroup(e) { let t = this._groups.length - 1; for (let i = this._groups.length; i--;) { if (this._groups[i] === e) return void(i !== t && (this._groups.splice(i, 1), this._groups.splice(t, 0, e))); this._groups[i].modal && (t = i - 1) } } pressedKeys() { return this._pressedKeys } }, u = h.pressedKeys(); function d(e) { return new c(h, e) } function p(e) { h.listen(e) } function _(e) { h.unlisten(e) } p(window) }, "m/3z": function(e, t, i) { "use strict"; i.d(t, "d", (function() { return d })), i.d(t, "c", (function() { return p })), i.d(t, "b", (function() { return _ })), i.d(t, "a", (function() { return m })); var s = i("lxNp"), r = i("/3z9"), n = i("d700"), o = i("hY0g"), a = i.n(o), l = i("KnF9"); const c = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Shift)), h = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Mod)), u = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Alt)); function d() { return c } function p() { return h } function _() { return new l.a({ altKey: u.value(), ctrlKey: p().value(), metaKey: p().value(), shiftKey: d().value() }) } s.pressedKeys.subscribe(e => { c.setValue(Boolean(e & r.Modifiers.Shift)), h.setValue(Boolean(e & r.Modifiers .Mod)), u.setValue(Boolean(e & r.Modifiers.Alt)) }); class m { constructor(e, t) { this._pressedKeyCode = null, this._boundKeydownHandler = null, this ._boundKeyupHandler = null, this._chartWidget = e, this._parent = t, this ._boundKeydownHandler = this._keydownHandler.bind(this), this ._boundKeyupHandler = this._keyupHandler.bind(this), this._parent.ownerDocument .addEventListener("keydown", this._boundKeydownHandler), this._parent .ownerDocument.addEventListener("keyup", this._boundKeyupHandler) } destroy() { null !== this._boundKeydownHandler && (this._parent.ownerDocument .removeEventListener("keydown", this._boundKeydownHandler), this ._boundKeydownHandler = null), null !== this._boundKeyupHandler && (this ._parent.ownerDocument.removeEventListener("keyup", this ._boundKeyupHandler), this._boundKeyupHandler = null) } _keydownHandler(e) { this._chartWidget.hasModel() && window.document.activeElement === window.document .body && this._chartWidget.isActive() && (this._handleMoveDrawingsKeyDown(e) || this._handleScrollKeyDown(e) || this._handleZoomKeyDown(e)) && e .preventDefault() } _keyupHandler(e) { this._chartWidget.hasModel() && this._handleScrollKeyUp(e) } _handleMoveDrawingsKeyDown(e) { const t = 255 & Object(r.hashFromEvent)(e), i = this._chartWidget.model(); switch (t) { case 37: return i.moveSelectedToolsLeft(); case 39: return i.moveSelectedToolsRight(); case 38: return i.moveSelectedToolsUp(); case 40: return i.moveSelectedToolsDown() } return !1 } _handleScrollKeyDown(e) { if (null !== this._pressedKeyCode) return !1; const t = Object(r.hashFromEvent)(e), i = 255 & t, s = Object(r.modifiersFromEvent)(e); let o; if (37 === i) o = 1; else { if (39 !== i) return !1; o = -1 } return !(r.isMacKeyboard && s === r.Modifiers.Mod || s !== r.Modifiers.Mod && s !== r.Modifiers.Alt && s !== r.Modifiers.None) && (!Object(n.a)(t, e.target) && (this._pressedKeyCode = i, s === r.Modifiers.None ? this._chartWidget .scrollHelper().moveByBar(o) : this._chartWidget.scrollHelper().move(o), !0)) } _handleScrollKeyUp(e) { if (null === this._pressedKeyCode) return !1; const t = Object(r.hashFromEvent)(e); if (Object(n.a)(t, e.target)) return !1; return (255 & t) === this._pressedKeyCode && (this._pressedKeyCode = null, this ._chartWidget.scrollHelper().stopMove(), !0) } _handleZoomKeyDown(e) { const t = Object(r.hashFromEvent)(e), i = 255 & t; if (Object(r.modifiersFromEvent)(e) !== r.Modifiers.Mod || Object(n.a)(t, e.target)) return !1; const s = this._chartWidget.model(); if (38 === i) s.zoomIn(); else { if (40 !== i) return !1; s.zoomOut() } return !0 } } }, "m/cY": function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("tc+8"), r = i.n(s); function n(e) { return new r.a(e) } }, mE5r: function(e, t, i) { "use strict"; var s = i("Eyy1"), r = i("ikwP"), n = i("gAom"), o = i("H0vP"), a = i("aO4+"), l = i("XlJ7"), c = i("EsvI"), h = i("OsWk"), u = i("rL76"), d = i("zDbI"); const p = parseInt(u.labelheight), _ = parseInt(u.bottommargin); function m(e) { return e / 11 } class f { constructor() { this._wrapper = document.createElement("div"), this._element = document .createElement("div"), this._labelElement = document.createElement("div"), this ._gearElement = document.createElement("div"), this._currentScale = 1, this ._info = null, this._mode = "auto", this._wrapper.appendChild(this._element), this._wrapper.classList.add(u.wrapper), this._element.classList.add(u.label), this._labelElement.className = u.symbol, this._element.appendChild(this ._labelElement), this._gearElement.className = u.gear, this._gearElement .innerHTML = h, this._element.appendChild(this._gearElement) } getElement() { return this._wrapper } setMode(e) { this._mode !== e && (this._mode = e) } align(e, t) { const i = m(t); Math.abs(i - this._currentScale) > .1 && (this._currentScale = i, Math.abs(this ._currentScale - 1) > .1 ? this._element.style.transform = `scale(${this._currentScale})` : (this._currentScale = 1, this._element .style.transform = "")) } drawLabelForScreenshot(e, t) { if (null === this._info || "gear" === this._mode) return; const i = Object(l.makeFont)(t.fontSize, d.CHART_FONT_FAMILY); e.fillStyle = c.themes[t.theme].getThemedColor("color-price-axis-label-back"), e .globalAlpha = .5, e.beginPath(); const s = m(t.fontSize) * p / 2, r = Object(a.point)(t.offset + t.width / 2, t.height / 2); e.arc(r.x, r.y, s, 0, 2 * Math.PI, !0), e.fill(), e.globalAlpha = 1, e.fillStyle = c .themes[t.theme].getThemedColor("color-price-axis-label-text"), e.textAlign = "center", e.font = i, e.textBaseline = "middle", e.fillText(this._info.label, r .x, r.y) } setAxisNameInfo(e) { this._info = e, null !== e && (this._labelElement.textContent = e.label) } static height(e) { return (p + _) * e } } var g = i("aIyQ"), b = i.n(g), v = i("S8xo"), S = i("5VQP"), y = i("CPmC"); const w = { enableTooltip: !0, showLabels: !0, enableMenu: !0, enableHighlight: !0 }; class P { constructor(e, t, i, s, n) { this._invalidated = !0, this._size = new r.Size(0, 0), this._offset = 0, this ._axisInfo = null, this._onLabelHovered = new b.a, this._highlighted = !1, this ._labelMode = "auto", this._fixedLabelMode = null, this ._canvasConfiguredHandler = () => this.update(), this._isLeft = "left" === e, this._rendererOptionsProvider = s.rendererOptionsProvider, this ._sourcesTitlesProvider = s.sourcesTitlesProvider, this ._contextMenuItemsProvider = s.contextMenuItemsProvider, this ._backgroundBasedTheme = s.backgroundBasedTheme, this._getBackgroundTopColor = s .getBackgroundTopColor, this._getBackgroundBottomColor = s .getBackgroundBottomColor, this._showHorizontalBorder = Boolean(s .showHorizontalBorder), this._properties = t, this._axisInfo = i, this ._labelOptions = { ...w, ...n }, this._properties.lineColor.subscribe(this, this._onPropertyChanged), this ._cell = document.createElement("div"), this._cell.classList.add(u[ "price-axis-stub"]), this._labelOptions.enableTooltip && this._cell .classList.add("apply-common-tooltip"), this._cell.style.width = "25px", this ._cell.style.height = "100%", this._cell.style.position = "absolute", this._cell .style.left = "0", this._cell.style.overflow = "hidden", this._labelOptions .showLabels ? (this._label = new f, this._label.setAxisNameInfo(this._axisInfo), this._cell.appendChild(this ._label.getElement()), this._labelOptions.enableTooltip && Object(y.b)( this._cell, "text", e => this._tooltipContent())) : this._label = null, this._mouseEventHandler = new v.MouseEventHandler(this._cell, this, { treatHorzTouchDragAsPageScroll: !0, treatVertTouchDragAsPageScroll: !0 }), this._canvasBinding = Object(r.createBoundCanvas)(this._cell, new r.Size(16, 16)), this._canvasBinding.subscribeCanvasConfigured(this ._canvasConfiguredHandler); const o = this._canvasBinding.canvas; o.style.position = "absolute", o.style.left = "0", o.style.top = "0" } destroy() { this._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this ._canvasBinding.destroy(), this._properties.lineColor.unsubscribe(this, this ._onPropertyChanged), this._mouseEventHandler.destroy() } mouseEnterEvent(e) { this._mouseOrTouchEnterEvent(e) } touchStartEvent(e) { this._mouseOrTouchEnterEvent(e) } mouseLeaveEvent(e) { this._mouseOrTouchLeaveEvent(e) } touchEndEvent(e) { this._mouseOrTouchLeaveEvent(e) } mouseClickEvent(e) { this._mouseClickOrTapEvent(e) } tapEvent(e) { this._mouseClickOrTapEvent(e) } update() { this._invalidated = !0 } getElement() { return this._cell } onLabelHovered() { return this._onLabelHovered } setSizeAndOffset(e, t) { if (e.w < 0 || e.h < 0) throw new Error( "Try to set invalid size to PriceAxisStub " + JSON.stringify(e)); this._size.equals(e) || (this._size = e, this._canvasBinding.resizeCanvas({ width: e.w, height: e.h }), this._cell.style.width = e.w + "px", this._cell.style.minWidth = e.w + "px", this._cell.style.height = e.h + "px", this._invalidated = !0), this ._offset !== t && (this._offset = t, this._cell.style.left = t + "px") } paint(e) { if (e < o.InvalidationLevel.Full && !this._invalidated) return; if (0 === this._size.w || 0 === this._size.h) return; this._invalidated = !1; const t = Object(r.getContext2D)(this._canvasBinding.canvas); this._drawBackground(t, this._canvasBinding.pixelRatio), this._drawVerticalBorder(t, this._canvasBinding.pixelRatio), this._showHorizontalBorder && this ._drawHorizontalBorder(t, this._canvasBinding.pixelRatio) } hardResetCanvas() { Object(r.hardResizeCanvas)(this._canvasBinding, this._size) } getWidth() { return this._size.w } getImage() { const e = Object(r.createDisconnectedCanvas)(document, this._size), t = Object(r.getPrescaledContext2D)(e), i = this._getBackgroundTopColor(), s = this._getBackgroundBottomColor(); return i === s ? Object(r.clearRect)(t, 0, 0, this._size.w, this._size.h, i) : Object(n.clearRectWithGradient)(t, 0, 0, this._size.w, this._size.h, i, s), t .drawImage(this._canvasBinding.canvas, 0, 0, this._size.w, this._size.h), null !== this._label && this._label.drawLabelForScreenshot(t, { offset: 0, width: this._size.w, height: this._size.h, fontSize: this._properties.fontSize.value(), theme: this._backgroundBasedTheme.value() }), e } setLabelMode(e) { e !== this._labelMode && (this._labelMode = e, null !== this._label && this._label .setMode(e), this._cell.classList.toggle(u["fixed-gear"], "gear" === e), this._cell.classList.toggle(u["fixed-symbol"], "symbol" === e), this._cell .classList.toggle("apply-common-tooltip", "symbol" !== e && this ._labelOptions.enableTooltip)) } _setHighlighted(e) { this._labelOptions.enableHighlight && (this._onLabelHovered.fire("stubButton", e), this._highlighted !== e && (this._highlighted = e, this._invalidated = !0)) } _onPropertyChanged() { this._invalidated = !0 } _drawVerticalBorder(e, t) { const i = this._size.w; e.save(), e.fillStyle = this._properties.lineColor.value(); const s = Math.max(1, Math.floor(this._rendererOptionsProvider.options() .borderSize * t)), r = this._isLeft ? Math.floor(i * t) - s : 0, n = Math.ceil(this._size.h * t); e.fillRect(r, 0, s, n + 1), e.restore() } _drawHorizontalBorder(e, t) { e.save(), e.fillStyle = this._properties.lineColor.value(); const i = Math.max(1, Math.floor(this._rendererOptionsProvider.options() .borderSize * t)), s = Math.ceil(this._size.w * t), r = this._isLeft ? 0 : i; e.fillRect(r, 0, s - i, i), e.restore() } _drawBackground(e, t) { const i = Math.ceil(t * this._size.w), s = Math.ceil(t * this._size.h), o = this._getBackgroundTopColor(), a = this._getBackgroundBottomColor(); if (o === a ? Object(r.clearRect)(e, 0, 0, i + 1, s + 1, o) : Object(n .clearRectWithGradient)(e, 0, 0, i + 1, s + 1, o, a), this._highlighted) { const t = c.themes[this._backgroundBasedTheme.value()].getThemedColor( "color-price-axis-highlight"); Object(r.fillRect)(e, 0, 0, i + 1, s + 1, t), e.globalAlpha = 1 } } _tooltipContent() { return this._sourcesTitlesProvider().join("\n") } _mouseOrTouchEnterEvent(e) { null !== this._label && "symbol" !== this._labelMode && this._labelOptions .enableHighlight && this._setHighlighted(!0) } _mouseOrTouchLeaveEvent(e) { "symbol" !== this._labelMode && this._setHighlighted(!1) } _mouseClickOrTapEvent(e) { e.preventDefault(), null === this._fixedLabelMode && "symbol" !== this._labelMode && this._labelOptions.enableMenu && this._labelOptions.showLabels ? (this ._fixedLabelMode = this._labelMode, this.setLabelMode("gear"), S .ContextMenuManager.createMenu(this._contextMenuItemsProvider(), { statName: "PriceScaleLabelContextMenu" }, () => { this.setLabelMode(Object(s.ensureNotNull)(this._fixedLabelMode)), this._fixedLabelMode = null }).then(e => e.show((e, t) => { const i = this._cell.getBoundingClientRect(); return { clientX: this._isLeft ? i.left : i.right - e, clientY: i.top - Math.min(t, i.top), overrideHeight: i.top < t ? i.top : void 0 } }, this.getElement(), !0))) : S.ContextMenuManager.hideAll() } } var C = i("Daqx"); i.d(t, "a", (function() { return x })); class x { constructor(e, t, i, s, n) { this._axises = [], this._stubs = [], this._size = new r.Size(0, 0), this ._onLabelHovered = new b.a, this._scalesProperties = e, this ._priceAxisWidgetFactory = i, this._rendererOptionsProvider = s .rendererOptionsProvider, this._titlesProvider = s.titlesProvider, this ._stubContextMenuProvider = s.stubContextMenuProvider, this ._backgroundBasedTheme = s.backgroundBasedTheme, this._getBackgroundTopColor = s .getBackgroundTopColor, this._getBackgroundBottomColor = s .getBackgroundBottomColor, this._showHorisontalBorder = Boolean(s .showHorizontalBorder), this._labelsOptions = { ...w, ...n }; const o = this._scalesProperties.childs(); this._stubProperties = { lineColor: o.lineColor, fontSize: o.fontSize }, this._side = t, this._cell = document.createElement("td"), this._cell .classList.add("chart-markup-table", "price-axis-container"), this._cell.style .width = "25px", this._cell.style.position = "relative" } destroy() { this.setScales([], 0, 0, 0) } onLabelHovered() { return this._onLabelHovered } setScales(e, t, i, r) { for (; e.length > this._axises.length && this._axises.length < t;) { const e = Object(C.a)(this._side, this._axises.length), t = this._priceAxisWidgetFactory(this._side, this._rendererOptionsProvider, this._scalesProperties, e, this._backgroundBasedTheme); this._axises.push(t), this._cell.appendChild(t.getElement()) } for (; e.length < this._axises.length;) { const e = Object(s.ensureDefined)(this._axises.pop()); this._cell.removeChild(e.getElement()), e.destroy() } for (let t = 0; t < this._axises.length; ++t) this._axises[t].setPriceScale(e[t]); const n = t - e.length, o = Math.max(0, n); for (; this._stubs.length > o;) { const e = Object(s.ensureDefined)(this._stubs.pop()); e.onLabelHovered().unsubscribeAll(this), this._cell.removeChild(e.getElement()), e.destroy() } for (; this._stubs.length < n;) { const e = this._labelsOptions.showLabels ? Object(C.a)(this._side, this._stubs .length) : null, t = this._stubs.length, i = new P(this._side, this._stubProperties, e, this._stubParams(t), this ._labelsOptions); i.onLabelHovered().subscribe(this, (t, i) => { this._labelsOptions.showLabels && this._labelsOptions .enableHighlight && this._onLabelHovered.fire({ owner: t, axis: Object(s.ensureNotNull)(e) }, i) }), this._stubs.push(i), this._cell.appendChild(i.getElement()) } const a = this._labelsOptions.enableMenu; 1 === r ? this._stubs.forEach((e, t) => e.setLabelMode(a ? "gear" : "symbol")) : this._stubs.forEach((e, t) => e.setLabelMode(t < i && a ? "auto" : "symbol")) } getElement() { return this._cell } optimalWidths() { return this._axises.map(e => e.optimalWidth()) } setSizes(e, t) { this._size = new r.Size(t.reduce((e, t) => e + t, 0), e), this._cell.style.width = this._size.w + "px", this._cell.style.minWidth = this._size.w + "px", this._cell .style.height = this._size.h + "px", t.length !== this._axises.length + this ._stubs.length && Object(s.assert)(t.length === this._axises.length + this ._stubs.length, "Widgets count should be the same as widths one"); let i = 0; this._forEachWidgetFromLeft((s, n) => { const o = t[n]; s.setSizeAndOffset(new r.Size(o, e), i), i += o }) } update() { this._axises.forEach(e => e.update()), this._stubs.forEach(e => e.update()) } paint(e) { this._axises.forEach((t, i) => t.paint(e(i))), this._stubs.forEach((t, i) => t .paint(e(i))) } paintStubs(e) { this._stubs.forEach(t => t.paint(e)) } hardResetCanvas() { this._axises.forEach(e => e.hardResetCanvas()), this._stubs.forEach(e => e .hardResetCanvas()) } restoreDefaultCursor() { this._axises.forEach(e => e.restoreDefaultCursor()) } getWidth() { return this._size.w } findAxisWidgetForScale(e) { const t = this._axises.find(t => t.priceScale() === e); return void 0 === t ? null : t } getScreenshotData() { const e = this._getImage(); return { content: e.toDataURL(), canvas: e, contentHeight: this._size.h, contentWidth: this._size.w } } getImage() { return this._getImage() } slotsCount() { return this._axises.length + this._stubs.length } highlightPriceAxisByLabel(e) { this._axises.forEach(t => { const i = t.axisInfo(); t.setHighlighted(null !== i && i.equals(e)) }) } axes() { return this._axises } _stubParams(e) { return { rendererOptionsProvider: this._rendererOptionsProvider, backgroundBasedTheme: this._backgroundBasedTheme, sourcesTitlesProvider: () => this._titlesProvider(this._side, e), contextMenuItemsProvider: () => this._stubContextMenuProvider(this._side, e), getBackgroundTopColor: this._getBackgroundTopColor, getBackgroundBottomColor: this._getBackgroundBottomColor, showHorizontalBorder: this._showHorisontalBorder } } _getImage() { const e = Object(r.createDisconnectedCanvas)(document, this._size), t = Object(r.getPrescaledContext2D)(e); let i = 0; return this._forEachWidgetFromLeft((e, s) => { const r = e.getWidth(); 0 !== r && (t.drawImage(e.getImage(), i, 0, r, this._size.h), i += r) }), e } _forEachWidgetFromLeft(e) { const t = [...this._axises, ...this._stubs], i = "left" === this._side, s = i ? -1 : t.length, r = i ? -1 : 1; for (let n = i ? t.length - 1 : 0; n !== s; n += r) e(t[n], n, t) } } }, "mKT+": function(e, t, i) { "use strict"; i.r(t); var s = i("QloM"); function r(e, t, s, r, n) { return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e( 9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(19), i.e(21), i.e(22), i.e(23), i.e(26), i.e(29), i.e(33), i.e(34), i.e(35), i.e(36), i.e(39), i.e(42), i.e(43), i.e(45), i.e(49), i.e(50), i.e(59), i.e(64), i.e(65), i.e(86), i.e(0), i.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(25), i .e(27), i.e(30), i.e(31), i.e(32), i.e(37), i.e(40), i.e(44), i.e(47), i.e(46), i.e(55), i.e(58), i.e("new-edit-object-dialog") ]).then(i.bind(null, "Y5hB")).then(i => { const s = new(0, i.EditObjectDialogRenderer)(e, t, r, n); return s.show(), s }) } var n = i("3ClC"); let o = null; var a = i("USzt"), l = i("CW80"); i.d(t, "resolveAndShowEditObjectDialog", (function() { return h })); const c = { [s.TabNames.symbol]: "symbol", [s.TabNames.legend]: "legend", [s.TabNames.scales]: "scales", [s.TabNames.trading]: "trading", [s.TabNames.events]: "events", [s.TabNames.timezoneSessions]: "appearance", [s.TabNames.text]: "text", [s.TabNames.style]: "style" }; async function h(e, t, s = {}, h, u) { const d = h.activeChartWidget.value(); if (Object(l.isStudyLineTool)(e) && function(e) { return [a.a].some(t => e instanceof t) }(e)) return d.propertiesDefinitionsForSource(e).then(i => null !== i ? r(e, t, 0, u, i) : null); if (Object(n.isStudy)(e) && function(e) { const { shortId: t } = e.metaInfo(); return "Overlay" === t }(e) || Object(l.isLineTool)(e)) return d.propertiesDefinitionsForSource(e).then( r => { if (null !== r) { const { tabName: n } = s; return function(e) { return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e( 3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i .e(19), i.e(21), i.e(22), i.e(23), i.e(26), i.e( 33), i.e(34), i.e(35), i.e(36), i.e(39), i .e(42), i.e(43), i.e(45), i.e(49), i.e(65), i.e( 96), i.e(0), i.e(2), i.e(5), i.e(7), i.e( 10), i.e(15), i.e(18), i.e(20), i.e(25), i .e( 27), i.e(30), i.e(31), i.e(32), i.e(37), i .e( 40), i.e(44), i.e(47), i.e(58), i.e( "source-properties-editor") ]).then(i.bind(null, "CbZh")).then(t => { const i = new(0, t .SourcePropertiesEditorRenderer)(e); return null !== o && o.hide(), i.show(), o = i, i }) }({ propertyPages: r, model: t, source: e, activePageId: n && c[n] }) } return null }); if (Object(n.isStudy)(e) && !Object(n.isESDStudy)(e)) return r(e, t, 0, u); { const { tabName: t } = s, i = Object(n.isESDStudy)(e) ? "events" : t && c[t], r = h .getChartPropertiesDialogRenderer(); return r.setActivePage(i), r.show() } } }, mMWL: function(e, t, i) { "use strict"; i.r(t), i.d(t, "toolIsCursor", (function() { return d })), i.d(t, "toolIsMeasure", (function() { return p })), i.d(t, "resetToCursor", (function() { return _ })), i.d(t, "lockTimeAxisTime", (function() { return y })), i.d(t, "tool", (function() { return w })), i.d(t, "iconTool", (function() { return P })), i.d(t, "cursorTool", (function() { return C })), i.d(t, "isToolCreatingNow", (function() { return x })), i.d(t, "isToolEditingNow", (function() { return T })), i.d(t, "isToolMovingNow", (function() { return I })), i.d(t, "isDirectionalMovementActive", (function() { return M })), i.d(t, "createdLineTool", (function() { return O })), i.d(t, "continuedLineTool", (function() { return L })), i.d(t, "cancelledLineTool", (function() { return A })), i.d(t, "beenSetLineToolLastPoint", (function() { return E })), i.d(t, "startedMovingLineTool", (function() { return k })), i.d(t, "movedLineTool", (function() { return D })), i.d(t, "finishedMovingLineTool", (function() { return V })), i.d(t, "startedChangingLineTool", (function() { return B })), i.d(t, "changedLineTool", (function() { return R })), i.d(t, "finishedChangingLineTool", (function() { return N })), i.d(t, "removedLineTool", (function() { return j })), i.d(t, "finishedLineTool", (function() { return F })), i.d(t, "changedLineStyle", (function() { return W })), i.d(t, "copiedLineTool", (function() { return H })), i.d(t, "restoredLineTool", (function() { return U })), i.d(t, "restoredLineToolState", (function() { return z })), i.d(t, "createLineTool", (function() { return Y })), i.d(t, "continueLineTool", (function() { return K })), i.d(t, "cancelLineTool", (function() { return J })), i.d(t, "setLineToolLastPoint", (function() { return Z })), i.d(t, "startMovingLineTool", (function() { return X })), i.d(t, "moveLineTool", (function() { return $ })), i.d(t, "finishMovingLineTool", (function() { return Q })), i.d(t, "startChangingLineTool", (function() { return ee })), i.d(t, "changeLineTool", (function() { return te })), i.d(t, "finishChangingLineTool", (function() { return ie })), i.d(t, "removeLineTool", (function() { return se })), i.d(t, "finishLineTool", (function() { return re })), i.d(t, "changeLineStyle", (function() { return ne })), i.d(t, "copyLineTool", (function() { return oe })), i.d(t, "restoreLineTool", (function() { return ae })), i.d(t, "restoreLineToolState", (function() { return le })), i.d(t, "init", (function() { return ue })), i.d(t, "runOnDrawingStateReady", (function() { return de })), i.d(t, "properties", (function() { return pe })), i.d(t, "hideAllDrawings", (function() { return _e })), i.d(t, "hideAllIndicators", (function() { return me })), i.d(t, "lockDrawings", (function() { return fe })), i.d(t, "hideMarksOnBars", (function() { return ge })), i.d(t, "drawOnAllCharts", (function() { return be })), i.d(t, "lockTimeAxis", (function() { return ve })); var s = i("Eyy1"), r = i("m/cY"), n = i("Ocx9"), o = i("hY0g"), a = i.n(o), l = i("aIyQ"), c = i.n(l), h = i("Vdly"), u = i("FQhm"); function d(e) { return "cursor" === e || "arrow" === e || "dot" === e } function p(e) { return "measure" === e } function _(e = !1) { if (!e && m) { if (m.childs().stayInDrawingMode.value()) return } w.setValue(C.value()) } let m = null, f = null, g = null, b = null, v = null, S = null; const y = new a.a, w = new a.a, P = new a.a, C = new a.a, x = new a.a(!1), T = new a.a(!1), I = new a.a(!1), M = new a.a(!1), O = new c.a, L = new c.a, A = new c.a, E = new c.a, k = new c.a, D = new c.a, V = new c.a, B = new c.a, R = new c.a, N = new c.a, j = new c.a, F = new c.a, W = new c.a, H = new c.a, U = new c.a, z = new c.a; function G(e, t) { const i = t || { value: !1 }; return t => { i.value || (i.value = !0, e.fire(t), i.value = !1) } } const q = { value: !1 }, Y = G(O, q), K = G(L, q), J = G(A, q), Z = G(E, q), X = G(k), $ = G(D), Q = G(V), ee = G(B), te = G(R), ie = G(N), se = G(j), re = G(F), ne = G(W, q), oe = G(H, q), ae = G(U), le = G(z); let ce = !1, he = []; function ue() { ce || (w.setValue(h.getValue("chart.cursorPreference", "cursor")), w.subscribe(e => d(e) && C.setValue(e), { callWithLast: !0 }), C.subscribe(e => { e && h.setValue("chart.cursorPreference", e) }), m = new n.DefaultProperty("drawings"), f = Object(r.a)(), g = Object(r.a)(), b = Object(r.a)(), v = Object(r.a)(), S = Object(r.a)(), f.setValue(!1), g.setValue(!1), b.setValue(!1), v.setValue(!1), S.setValue(!1), w.subscribe(() => { Object(u.emit)("onSelectedLineToolChanged") }), ce = !0, he.forEach(e => e()), he = []) } function de(e) { ce ? e() : he.push(e) } function pe() { return Object(s.ensureNotNull)(m) } function _e() { return Object(s.ensureNotNull)(f) } function me() { return Object(s.ensureNotNull)(g) } function fe() { return Object(s.ensureNotNull)(b) } function ge() { return Object(s.ensureNotNull)(v) } function be() { return pe().childs().drawOnAllCharts } function ve() { return Object(s.ensureNotNull)(S) } }, mNbo: function(e, t, i) { "use strict"; function s(e, t = !1) { return !1 } function r(e) { return e } i.r(t), i.d(t, "isOnMobileAppPage", (function() { return s })), i.d(t, "urlWithMobileAppParams", (function() { return r })) }, mPvX: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolsGroupModel", (function() { return o })); var s = i("aIyQ"), r = i.n(s), n = i("UqOQ"); class o { constructor(e) { this._onChanged = new r.a, this._groups = [], this._groups = e || [], this._groups .forEach(e => { e.onChanged().subscribe(null, t => this._onChanged.fire(e.id, t)) }) } groups() { return this._groups.filter(e => e.isActualSymbol()) } groupsForAllSymbols() { return this._groups } createGroup(e, t, i) { t = t || this._generateNextName(); const s = new n.a(e, t, i); this._groups.push(s), s.onChanged().subscribe(null, e => this._onChanged.fire(s.id, e)); const r = { visibilityChanged: !1, lockedChanged: !1, titleChanged: !1, isActualIntervalChanged: !1, affectedLineTools: e.map(e => e.id()) }; return this._onChanged.fire(s.id, r), s } addGroup(e) { this._groups.push(e), e.onChanged().subscribe(null, t => this._onChanged.fire(e.id, t)), this._onChanged.fire(e.id) } removeGroup(e) { const t = this._groups.findIndex(t => t.id === e.id); this._groups.splice(t, 1), this._onChanged.fire(e.id) } groupForId(e) { return this._groups.find(t => t.id === e) || null } groupForLineTool(e) { return this._groups.find(t => t.containsLineTool(e)) || null } removeLineTools(e) { this._groups.forEach(t => t.excludeLineTools(e)); this._groups.filter(e => 0 === e.lineTools().length).forEach(e => this.removeGroup( e)) } state(e) { return { groups: (e ? this._groups.filter(e => e.isActualSymbol()) : this._groups).map( e => e.state()) } } onChanged() { return this._onChanged } fireChangedAll() { this._groups.forEach(e => { this._onChanged.fire(e.id) }) } static fromState(e, t) { const i = []; for (const s of t.groups) { const t = n.a.fromState(e, s); null !== t && i.push(t) } return new o(i) } _generateNextName() { const e = new Set(this.groups().map(e => e.name())); for (let t = 1;; t++) { const i = "Group " + t, s = "Group_" + t; if (!e.has(i) && !e.has(s)) return i } } } }, mZrn: function(e, t, i) { "use strict"; i.r(t); var s = i("FBuY"), r = i("JWMC"), n = i("+6II"); function o(e, t = !1) { ("attachEvent" in document ? "complete" === document.readyState : "loading" !== document .readyState) ? t ? setTimeout(() => e(), 1) : e(): document.addEventListener( "DOMContentLoaded", () => e()) } new Promise(e => { o(e) }); const a = /\b(msie|trident)\b/i.test(navigator.userAgent) ? 1 : 0; function l(e) { return e.offsetWidth + a < e.scrollWidth } o(() => { document.addEventListener("mouseenter", e => { const t = e.target; var i; t instanceof HTMLElement && t.matches(".apply-overflow-title") && ((i = t).getAttribute("title") || i.offsetWidth + a >= i .scrollWidth || i.setAttribute("title", i.textContent || "")) }, !0), document.addEventListener("mouseenter", e => { const t = e.target; if (t instanceof HTMLElement && t.matches(".apply-overflow-tooltip")) { if (t.matches(".apply-overflow-tooltip--check-children")) { let e = !1; const i = t.children; for (let t = 0; t < i.length; t++) { const s = i[t]; if (s instanceof HTMLElement && l(s)) { e = !0; break } } if (!e) return } else if (!l(t)) return; let e = ""; e = t.matches && t.matches(".apply-overflow-tooltip--allow-text") ? t.textContent || "" : Array.from(t.childNodes).reduce((e, t) => (t.nodeType === Node.TEXT_NODE && e.push(t.textContent || ""), e), []).join("").trim(), Object(n.c)(t, { text: e }); const i = () => { Object(n.a)(), ["mouseleave", "mousedown"].forEach(e => t .removeEventListener(e, i)) }; ["mouseleave", "mousedown"].forEach(e => t.addEventListener(e, i)) } }, !0) }); var c = i("aIyQ"), h = i.n(c), u = i("VVxS"), d = i("FIi8"); let p; function _(e) { window.iframeAuthWidget && !1 === window.user.profile_data_filled && (window .iframeAuthWidget.preventClose = !0); const t = window.user.available_offers || {}; window.TVSettings && window.TVSettings.sync(window.user.settings), window.is_authenticated ? (e || (initOfferLoginStateChangeButton(), onGoPro() && window.user.is_pro && window .location.reload()), !1 === window.user.profile_data_filled && (Object(r .trackEvent)("Conversion", "First login"), delete window.user .profile_data_filled)) : (Object.keys(t).forEach(e => { const i = e; t[i].available_for_anons || delete t[i] }), window.user = { username: "Guest", following: "0", followers: "0", ignore_list: [], available_offers: t }, u.TVLocalStorage.removeItem("trial_availiable")) } p = window.loginStateChange ? window.loginStateChange : window.loginStateChange = new h.a, p .subscribe(null, _), s.TVXWindowEvents.on("loginStateChange", e => { const t = JSON.parse(e); window.user = t.user, window.is_authenticated = !!t.is_authenticated, p.fire() }), s.TVXWindowEvents.on("signOut", () => { ! function() { if (window.initData.lfs) { const e = document.getElementsByClassName("js-admin-warning")[0]; document.body.removeChild(e) } let e = !0; [/^\/chart\//, /^\/share-your-love\//].forEach(t => { t.test(window.location.pathname) && (e = !1) }), e && window.location.reload() }() }), (() => { const e = {}; window.crossTabSyncUserAttr = e => { const t = {}; e instanceof Array ? e.forEach(e => { t[e] = window.user[e] }) : t[e] = window.user[e], s.TVXWindowEvents.emit("user-obj-changed", JSON.stringify(t)) }, s.TVXWindowEvents.on("user-obj-changed", t => { const i = JSON.parse(t); let s; for (s in i) if (i.hasOwnProperty(s)) { window.user[s] = i[s]; (e[s] || []).forEach(e => { e.fire(i[s]) }) } }) })(), window.TradingView.changeLoginState = e => { window.is_authenticated = !!e, s.TVXWindowEvents.emit("loginStateChange", JSON .stringify({ is_authenticated: window.is_authenticated, user: window.user })), p.fire() }, window.loginUser = function(e, t) { window.TVDialogs && window.TVDialogs.signModal && window.TVDialogs.signModal.close(), window.user = Object(d.deepExtend)({}, e), window.TradingView.changeLoginState(!0), "function" == typeof t && window.TVDialogs && window.TVDialogs.signModal ? window .TVDialogs.signModal.on("signinSuccess", () => { t() }) : "function" == typeof t && t() }, window.loginRequiredDelegate = new h.a, window.runOrSignIn = (e, t) => { t || (t = {}), e() }, window.onLoginStateChange = _, window.TradingView.setTrialAvailiable = e => { u.TVLocalStorage.setItem("trial_availiable", e ? "1" : "0") }, window.TradingView.notificationsChanged = new h.a }, me8f: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolBalloon", (function() { return h })); var s = i("YFKU"), r = i("Ocx9"), n = i("Ss5c"), o = i("tc+8"), a = i.n(o), l = i("j3hX"); const c = Object(s.t)("Comment"); class h extends n.LineDataSource { constructor(e, t) { const s = t || h.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "Hyqq")).then(t => { this._setPaneViews([new t.BalloonPaneView(this, e)]) }) } pointsCount() { return 1 } name() { return "Balloon" } properties() { return super.properties() } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e } static createProperties(e) { const t = new r.DefaultProperty("linetoolballoon", e); return h._configureProperties(t), t } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "RhWr")).then( e => e.BalloonDefinitionsViewModel) } static _configureProperties(e) { n.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new a.a(c)), e.addExclusion("text"), e.addChild("linesColors", new l.LineToolColorsProperty([e.childs().borderColor])), e.addChild( "textsColors", new l.LineToolColorsProperty([e.childs().color])) } } }, mf9N: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("GD+X"), n = i("96Yh"), o = i("ogJP"), a = i("RDU5"); class l extends a.UndoCommand { constructor(e, t, i) { super("Change Pane Height"), this._model = e, this._paneIndex = t, this ._paneHeight = i, this._prevStretchFactors = this._model.panes().map(e => e .stretchFactor()) } redo() { this._model.changePanesHeight(this._paneIndex, this._paneHeight) } undo() { const e = this._model.panes(); for (let t = 0; t < e.length; ++t) e[t].setStretchFactor(Object(s.ensureDefined) (this._prevStretchFactors[t])); this._model.fullUpdate() } } i.d(t, "PaneApi", (function() { return c })); class c { constructor(e, t) { this._priceScales = new WeakMap, this._pane = e, this._chartWidget = t } hasMainSeries() { return this._pane.containsMainSeries() } getLeftPriceScales() { return this._pane.leftPriceScales().map(this._getPriceScaleApi, this) } getRightPriceScales() { return this._pane.rightPriceScales().map(this._getPriceScaleApi, this) } getMainSourcePriceScale() { const e = this._pane.mainDataSource(); if (null === e) return null; const t = e.priceScale(); return null === t || this._pane.isOverlay(e) ? null : this._getPriceScaleApi(t) } setMaximized(e) { if (this._pane.isMaximized() !== e) for (const e of this._chartWidget.paneWidgets()) if (e.state() === this._pane) { this._chartWidget.toggleMaximizePane(e); break } } legendLoaded() { const e = this._chartWidget.paneByState(this._pane); return Boolean(e && e.statusWidget()) } getAllEntities() { const e = this._pane.model(); return this._pane.sourcesByGroup().allIncludingHidden().map(t => Object(n .entityForDataSource)(e, t)).filter(o.notNull).filter(e => null !== e.name) } getHeight() { return this._pane.height() } setHeight(e) { const t = this._chartWidget.model().model(), i = t.panes(); Object(s.assert)(i.length > 1, "Unable to change pane's height if there is only one pane"); const r = i.indexOf(this._pane); Object(s.assert)(-1 !== r, "Invalid pane index"); const n = new l(t, r, e); this._chartWidget.model().undoHistory().pushUndoCommand(n) } moveTo(e) { const t = this.paneIndex(); t !== e && (Object(s.assert)(e >= 0 && e < this._chartWidget.paneWidgets().length, "Invalid pane index"), this._chartWidget.model().movePane(t, e)) } paneIndex() { return this._chartWidget.model().model().panes().indexOf(this._pane) } _getPriceScaleApi(e) { let t = this._priceScales.get(e); return void 0 === t && (t = new r.a(this._chartWidget.model(), e), this._priceScales .set(e, t)), t } } }, mkn5: function(e, t, i) { "use strict"; (function(t, s) { i("AE9l"), i("YFKU"); var r = i("UCjq").PaneWidgetBase, n = i("1IXQ").scaleRatioForContextMenuTransformer(7), o = i("CW80").isLineToolName, a = i("YmeR").ActionBinder, l = i("7KDR"), c = l.Action, h = l.Separator, u = i("mMWL"), d = i("FQhm"), p = i("S8xo").MouseEventHandler; e.exports.PaneWidget = class extends r { constructor(e, i, s, r) { super(e, i, s, r), this.setCursorForTool(), this._mouseEventHandler = new p(this._topCanvasBinding.canvas, this, { treatVertTouchDragAsPageScroll: !this._options.handleScroll .vertTouchDrag, treatHorzTouchDragAsPageScroll: !this._options.handleScroll .horzTouchDrag }), this.actions = [], this.readonlyActions = [], this ._prevHoveredHittest = null, this._chart.withModel(this, ( function() { var e = this._chartUndoModel(); e.onSimpleZoomIn().subscribe(this, this ._updateCrosshairOnZoom), e.onSimpleZoomOut() .subscribe(this, this._updateCrosshairOnZoom) })), this._highlightedPriceAxis = new t({ owner: "", axis: null }), this._highlightedPriceAxis.subscribe(function(e) { this._highlightPriceAxisByLabel(e.axis) }.bind(this)), this._prevPinchScale = 0, this._isDestroyed = !1 } destroy() { for (var e in super.destroy(), this._prevHoveredHittest = null, this ._mouseEventHandler.destroy(), this._rowElement.parentElement .removeChild(this._rowElement), this) delete this[e]; this._isDestroyed = !0 } _highlightPriceAxisByLabel(e) { this._lhsPriceAxisesContainer.highlightPriceAxisByLabel(e), this ._rhsPriceAxisesContainer.highlightPriceAxisByLabel(e) } chart() { return this._chart } stretchFactor() { return this._state ? this._state._stretchFactor : 0 } setStretchFactor(e) { this.hasState() && (this._state._stretchFactor = e) } hideInplaceEditor() { return !!this._inplaceEditor && (this._inplaceEditor.remove(), this ._inplaceEditor = void 0, !0) } drawRightThere(e) { if (o(e)) { var t = this._chartUndoModel(), i = t.crossHairSource(), s = t.model().magnet().align(i.price, i.index, this._state); t.createLineTool(this.state(), { index: i.index, price: s }, e) } } createRemoveMenu() { var e = this._chart.actions(); return new c({ label: window.t("Remove"), statName: "Remove", subItems: [e.paneRemoveAllStudies, e .paneRemoveAllDrawingTools, e .paneRemoveAllStudiesDrawingTools ] }) } _customActions() { var e = { top: [], bottom: [], remove: [] }, t = this._chartUndoModel().timeScale(), i = this._state && this._state.defaultPriceScale(); if (!s.enabled("custom_items_in_context_menu")) return e; var r, n = t.isEmpty() ? void 0 : t.indexToUserTime(t.coordinateToIndex( this._contextMenuX)); if (i && !i.isEmpty()) { var o = this._state.mainDataSource().firstValue(); r = i.coordinateToPrice(this._contextMenuY, o) } return d.emit("onContextMenu", { unixtime: n ? n / 1e3 : void 0, price: r, callback: function(t) { [].concat(t).forEach((function(t) { var i; t.text && (t.text.length > 1 && "-" === t.text[0] ? e.remove .push(t.text.slice(1)) : ( i = "-" === t.text ? new h : new c({ label: t.text, onExecute: t .click }), t.position && "top" === t.position ? e .top.push(i) : e.bottom .push(i))) })) } }), e } update() { this._lhsPriceAxisesContainer.update(), this._rhsPriceAxisesContainer .update(), null !== this._legendWidget && this._legendWidget .update(), this.updateControls() } createActionLockScale(e) { if (!(e instanceof TradingView.Series)) return null; var t = n(e.priceScale(), this._chartUndoModel().model() .mainSeriesScaleRatio()), i = new c({ checkable: e.priceScale().isLockScale(), label: window.t("Lock Scale") + " " + t, statName: "LockScale" }); return i._binding = new a(i, e.priceScale().properties().lockScale, this ._chartUndoModel(), "Lock Scale", (function() { var t = { lockScale: this.value() }; this._undoModel.setPriceScaleMode(t, e.priceScale(), this._undoText) })), i } _updateCrosshairOnZoom() { if (u.lockTimeAxis().value()) { var e = this._chartUndoModel().crossHairSource(); e.setPosition(e.index, e.price, this.state()) } } highlightedPriceAxis() { return this._highlightedPriceAxis } } }).call(this, i("hY0g"), i("Kxc7")) }, n0Bl: function(e, t, i) { "use strict"; i.r(t), i.d(t, "migrateShortcut", (function() { return o })); var s = i("/3z9"); function r(e) { if ("number" == typeof e) return e; switch (e.toLowerCase()) { case "ctrl": return s.Modifiers.Control; case "shift": return s.Modifiers.Shift; case "alt": return s.Modifiers.Alt; default: return e.toUpperCase().charCodeAt(0) } } function n(e) { let t = 0; for (let i = 0; i < e.length; i++) t |= r(e[i]); return t } function o(e) { return "number" == typeof e ? e : "string" == typeof e ? n(e.split("+")) : Array.isArray( e) ? n(e) : 0 } }, n40Z: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolVertLine", (function() { return h })); var s = i("Eyy1"), r = i("aO4+"), n = i("Ocx9"), o = i("tc+8"), a = i.n(o), l = i("Ss5c"), c = i("GmZZ"); class h extends l.LineDataSource { constructor(e, t) { const s = t || h.createProperties(); super(e, s), this._timeAxisView = new c.a(this), this._paneViewFactory = null, this.properties().childs().extendLine.subscribe(this, () => e .lightUpdate()), i.e("lt-pane-views").then(i.bind(null, "BSCN")).then(t => { this._paneViewFactory = i => new t.VertLinePaneView(this, e, i), this._model.lightUpdate() }) } destroy() { this.properties().childs().extendLine.unsubscribeAll(this), super.destroy() } pointsCount() { return 1 } properties() { return super.properties() } name() { return "Vertical Line" } timeAxisViews() { return this.isSourceHidden() ? null : this.properties().childs().showTime .value() ? [this._timeAxisView] : null } updateAllViews() { super.updateAllViews(), this._timeAxisView.update() } canHasAlert() { return !0 } template() { const e = super.template(); return e.text = this.properties().childs().text.value(), e.showLabel = this .properties().childs().showLabel.value(), e } isMultiPaneAvailable() { return !0 } isMultiPaneEnabled() { return this.properties().childs().extendLine.value() } paneViews(e) { return e = Object(s.ensureDefined)(e), this.isMultiPaneEnabled() || this._model .paneForSource(this) === e ? (null === this._getPaneViews(e) && null !== this._paneViewFactory && this._setPaneViews([this._paneViewFactory(e)], e, !0), super.paneViews(e)) : null } priceAxisViews() { return null } priceAxisPoints() { return [] } pointToScreenPoint(e) { const t = this._model.timeScale(); if (t.isEmpty()) return [new r.Point(0, 0), new r.Point(0, 0)]; const i = t.indexToCoordinate(e.index), s = new r.Point(i, 0); return [s, s] } convertYCoordinateToPriceForMoving(e) { return 0 } static createProperties(e) { null != e && (void 0 === e.textOrientation && (e.textOrientation = "horizontal"), void 0 === e.extendLine && (e.extendLine = !1)); const t = new n.DefaultProperty("linetoolvertline", e); return h._configureProperties(t), t } _getAlertPlots() { const e = this._points[0], t = { index: e.index, price: e.price + 1 }; return [this._linePointsToAlertPlot([e, t], null, !0, !0)] } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "FkpW")).then( e => e.VerticalLineDefinitionsViewModel) } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text || ""), this.properties().childs().showLabel.setValue(Boolean(e.showLabel)) } static _configureProperties(e) { l.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new a.a("")), e.addExclusion("text"), e.addExclusion( "showLabel") } } }, n5al: function(e, t, i) { "use strict"; i.r(t), i.d(t, "isRequiringRestartSeriesStyles", (function() { return v })), i.d(t, "isRangeBasedStyle", (function() { return S })), i.d(t, "isRangeStyle", (function() { return y })), i.d(t, "isTimeBasedStyle", (function() { return w })), i.d(t, "isValidStyle", (function() { return P })), i.d(t, "isSingleValueBasedStyle", (function() { return C })), i.d(t, "setLastUsedStyle", (function() { return x })), i.d(t, "getLastUsedStyle", (function() { return T })), i.d(t, "getDefaultStyle", (function() { return I })), i.d(t, "getChartStyleByResolution", (function() { return M })), i.d(t, "chartStyleStudyId", (function() { return O })), i.d(t, "preparePriceAxisProperties", (function() { return L })), i.d(t, "hasProjection", (function() { return E })), i.d(t, "isPriceSourceStyle", (function() { return k })), i.d(t, "getSeriesPriceFormattingState", (function() { return D })), i.d(t, "createSeriesFormatter", (function() { return V })), i.d(t, "symbolCurrencyConvertible", (function() { return B })), i.d(t, "symbolCurrency", (function() { return R })), i.d(t, "symbolOriginalCurrency", (function() { return N })), i.d(t, "symbolBaseCurrency", (function() { return j })), i.d(t, "isConvertedToOtherCurrency", (function() { return F })), i.d(t, "symbolUnitConvertible", (function() { return W })), i.d(t, "symbolUnit", (function() { return H })), i.d(t, "symbolOriginalUnit", (function() { return U })), i.d(t, "isConvertedToOtherUnit", (function() { return z })), i.d(t, "symbolUnitConvertibleGroupsIfExist", (function() { return G })), i.d(t, "symbolCurrentContract", (function() { return q })), i.d(t, "extractSymbolNameFromSymbolInfo", (function() { return Y })), i.d(t, "symbolTitle", (function() { return K })), i.d(t, "displayedSymbolName", (function() { return J })), i.d(t, "displayedSymbolExchange", (function() { return Z })), i.d(t, "actualSymbol", (function() { return X })), i.d(t, "proSymbol", (function() { return $ })), i.d(t, "symbolForApi", (function() { return Q })), i.d(t, "isRegularSessionId", (function() { return ee })); var s = i("Vdly"), r = i("dfhE"), n = i("LxhU"), o = i("kcTO"), a = i("Kxc7"), l = i("Eyy1"), c = i("nEwK"), h = i("GH0z"); const u = a.enabled("pay_attention_to_ticker_not_symbol"), d = a.enabled("uppercase_instrument_names"), p = a.enabled("charting_library_single_symbol_request"), _ = a.enabled("use_ticker_on_symbol_info_update"), m = [4, 5, 6, 7, 8], f = [4, 5, 6, 7, 8, 11], g = [0, 1, 9, 2, 3, 10], b = [2, 10, 3]; function v(e) { return -1 !== m.indexOf(e) } function S(e) { return -1 !== f.indexOf(e) } function y(e) { return 11 === e } function w(e) { return -1 !== g.indexOf(e) } function P(e) { return S(e) || w(e) } function C(e) { switch (e) { case 3: case 10: case 2: return !0; default: return !1 } } function x(e) { P(e) && 11 !== e && s.setValue("chart.lastUsedStyle", e) } function T() { const e = s.getInt("chart.lastUsedStyle"); return void 0 === e ? 1 : e } function I(e) { return e ? 11 : 1 } function M(e, t) { const i = y(t), s = n.Interval.isRange(e); return !i && s ? I(!0) : i && !s ? I(!1) : t } function O(e, t) { const i = r.SYMBOL_STRING_DATA[e]; return void 0 === i ? null : t ? `${i.type}-${i.basicStudyVersion}` : i.type } function L(e) { const t = e.priceAxisProperties, i = t.lockScale.value(), s = 6 === e.style.value(); (s || i) && (t.log.setValue(!1), t.percentage.setValue(!1)), t.logDisabled.setValue(!(!s && !i)), t.percentageDisabled.setValue(!(!s && !i)) } const A = [4, 7, 5, 6]; function E(e) { return -1 !== A.indexOf(e) } function k(e) { return b.includes(e) } function D(e, t = "default", i = !1) { let s, r, n = 100, o = 1; if ("default" === t) null != e && (n = e.pricescale, o = e.minmov, s = e.fractional, r = e .minmove2); else { let e = t.split(","); 3 !== e.length && (e = ["100", "1", "false"]), n = parseInt(e[0]), o = parseInt(e[1]), s = "true" === e[2] } return i && (o = 1), { priceScale: n, minMove: o, fractional: s, minMove2: r } } function V(e, t, i = !1) { if ("default" === t && null != e && ("volume" === e.formatter || "volume" === e.format)) return new c.VolumeFormatter(2); if ("default" === t && null != e && ("percent" === e.formatter || "percent" === e.format)) return new h.PercentageFormatter; const { priceScale: s, minMove: r, fractional: n, minMove2: a } = D(e, t, i); return new o.PriceFormatter(s, r, n, a) } function B(e) { return null !== e && "spread" !== e.type } function R(e, t, i) { if (null === e) return null; const s = !t || i ? e.currency_id : e.currency_code; return void 0 === s || "" === s ? null : s } function N(e, t) { return (t ? e.original_currency_code : e.original_currency_id) || R(e, t) } function j(e) { return e.base_currency_id || null } function F(e) { return !(null === e || !B(e)) && (void 0 !== e.original_currency_id && e .original_currency_id !== e.currency_id) } function W(e) { return null !== e && "spread" !== e.type } function H(e) { if (null === e) return null; const t = e.unit_id; return void 0 === t || "" === t ? null : t } function U(e) { return e.original_unit_id || H(e) } function z(e) { return !(null === e || !W(e)) && (void 0 !== e.original_unit_id && e.original_unit_id !== e .unit_id) } function G(e) { return null !== e && W(e) ? e.unit_conversion_types || null : [] } function q(e) { return "futures" === e.type && e.front_contract || null } function Y(e, t) { let i = e && (e.pro_name || e.full_name || e.name); return p && t ? i = t : _ && e && e.ticker && (i = e.ticker), d && i && (i = i .toUpperCase()), i } function K(e, t) { return t ? e.name : `${e.name}, ${e.exchange}` } function J(e) { let t = e && (q(e) || e.name) || ""; return t.length > 40 && (t = t.substr(0, 37) + "..."), t.trim() } function Z(e) { const t = e ? e.exchange : ""; return d ? t.toUpperCase() : t } function X(e, t) { return null !== e ? e.full_name : t } function $(e, t) { return null !== e ? e.pro_name : t } function Q(e, t) { return u && e ? Object(l.ensureDefined)(e.ticker) : X(e, t) } function ee(e) { return "regular" === e || "us_regular" === e } }, nBJD: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor(e) { this._text = "", this._color = "", this._size = "13px", this._bold = !1, this ._statusProvider = e } text() { return this._text } getSplitTitle() { return [this._text] } color() { return this._statusProvider.color() } bold() { return this._bold } size() { return this._size } } }, nEwK: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PLACE_HOLDER", (function() { return a })), i.d(t, "VolumeFormatter", (function() { return l })); var s = i("YFKU"), r = i("zXvd"), n = i("ogJP"), o = i("ivNn"); const a = "---"; class l { constructor(e) { this.type = "volume", this._numericFormatter = new r.NumericFormatter, this ._fractionalValues = void 0 !== e && e > 0, this._precision = e } state() { return { precision: this._precision } } format(e, t) { if (!Object(n.isNumber)(e)) return a; let i = ""; return e < 0 ? (i = "−", e = -e) : e > 0 && t && (i = "+"), e >= 1e100 ? Object(s.t) ("N/A") : (!this._fractionalValues || e >= 995 ? e = Math.round(e) : this ._fractionalValues && (e = +e.toFixed(this._precision)), e < 995 ? i + this ._formatNumber(e) : e < 999995 ? i + this._formatNumber(e / 1e3) + "K" : e < 999999995 ? (e = 1e3 * Math.round(e / 1e3), i + this._formatNumber(e / 1e6) + "M") : e < 999999999995 ? (e = 1e6 * Math.round(e / 1e6), i + this._formatNumber(e / 1e9) + "B") : (e = 1e9 * Math.round(e / 1e9), i + this._formatNumber(e / 1e12) + "T")) } parse(e) { if ("---" === e) return { error: "not a number", res: !1, value: NaN }; const t = { K: 1e3, M: 1e6, B: 1e9 }, i = e.slice(-1); if (t.hasOwnProperty(i)) { const s = this._numericFormatter.parse(e.slice(0, -1)); return Object(n.isNumber)(s) ? { res: !0, value: s * t[i] } : { error: "not a number", res: !1, value: NaN } } { const t = this._numericFormatter.parse(e); return Object(n.isNumber)(t) ? { res: !0, value: t } : { error: "not a number", res: !1, value: NaN } } } static serialize(e) { return e.state() } static deserialize(e) { return new l(e.precision) } _formatNumber(e) { return this._fractionalValues && (e = Object(o.fixComputationError)(e)), this ._numericFormatter.format(e).replace(/(\.[1-9]*)0+$/, (e, t) => t) } } }, nW7S: function(e, t, i) { "use strict"; (function(e) { var s = i("aO4+").Point, r = i("Ss5c").LineDataSource, n = i("Ocx9").DefaultProperty; class o extends e { constructor(e) { super(), this._lineSource = e } value() { var e = 180 * this._lineSource._angle / Math.PI; return Math.round(e) } setValue(e) { var t = e * Math.PI / 180; this._lineSource._angle = t; var i = this._lineSource.pointToScreenPoint(this._lineSource.points()[0])[ 0], r = Math.cos(this._lineSource._angle), n = -Math.sin(this._lineSource._angle), o = new s(r, n), a = i.addScaled(o, this._lineSource._distance), l = this._lineSource.screenPointToPoint(a); this._lineSource._points[1] = l, this._lineSource._model.updateSource(this ._lineSource), this._lineSource.updateAllViews(), this._lineSource ._model.updateSource(this._lineSource) } } class a extends r { constructor(e, t) { super(e, t || a.createProperties()), this._properties.addChild("angle", new o(this)), i.e("lt-pane-views").then(i.t.bind(null, "XHET", 7)) .then(({ TrendAnglePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } isSynchronizable() { return !1 } pointsCount() { return 2 } name() { return "Trend Angle" } _calculateAngle() { var e = this.pointToScreenPoint(this.points()[0])[0], t = this.pointToScreenPoint(this.points()[1])[0], i = t.subtract(e); i.length() > 0 ? (i = i.normalized(), this._angle = Math.acos(i.x), i.y > 0 && (this._angle = -this._angle), this._distance = t.subtract(e) .length()) : delete this._angle, this.properties().hasOwnProperty( "angle") && this.properties().angle.listeners().fire(this .properties().angle) } addPoint(e, t) { var i = r.prototype.addPoint.call(this, e, t); return i && this._calculateAngle(), i } setLastPoint(e, t) { super.setLastPoint(e, t), this.points().length > 1 && this._calculateAngle() } axisPoints() { if (this.points().length < 2) return []; var e = [this.points()[0]], t = this.pointToScreenPoint(this.points()[0])[1], i = Math.cos(this._angle) * this._distance, r = -Math.sin(this._angle) * this._distance, n = t.add(new s(i, r)), o = this.screenPointToPoint(n); return e.push(o), e } setPoint(e, t, i) { super.setPoint(e, t, i), this.points().length > 1 && 1 === e && this ._calculateAngle() } restoreData(e) { this._angle = e.angle, this._distance = e.distance } state(e) { var t = r.prototype.state.call(this, e); return t.angle = this._angle, t.distance = this._distance, t } cloneData(e) { this._angle = e._angle, this._distance = e._distance } canHasAlert() { return !0 } _getAlertPlots() { return [this._linePointsToAlertPlot(this._points, null, this.properties() .extendLeft.value(), this.properties().extendRight.value())] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "o1gc"))).TrendAngleDefinitionsViewModel } _snapTo45DegreesAvailable() { return !0 } static createProperties(e) { var t = new n("linetooltrendangle", e); return a._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e) } } t.LineToolTrendAngle = a }).call(this, i("tc+8")) }, "nd9+": function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolGannComplex", (function() { return h })); var s = i("aO4+"), r = i("Eyy1"), n = i("T6Of"), o = i("Ss5c"), a = i("FaJS"), l = i("LAp3"), c = i("j3hX"); class h extends o.LineDataSource { constructor(e, t) { super(e, t || h.createProperties()), this.version = 2, this ._scaleRatioFormatter = new n.LimitedPrecisionNumericFormatter(7), i.e( "lt-pane-views").then(i.bind(null, "X4Cb")).then(({ GannComplexPaneView: e }) => { this._setPaneViews([new e(this, this.model())]) }); const s = this.properties(); this._adjustScaleRatio(s), s.subscribe(this, this._adjustScaleRatio), s.childs() .scaleRatio.subscribe(this, this._correctFirstPoint), this ._syncStateExclusions = ["scaleRatio"], s.addExclusion("scaleRatio"), this .properties().onRestoreFactoryDefaults().subscribe(this, this ._handleRestoringFactoryDefaults), this._onTemplateApplying.subscribe( this, this._handleTemplateApplying), this._onTemplateApplied.subscribe( this, this._correctFirstPoint) } properties() { return super.properties() } migrateVersion(e, t, i) { 1 === e && (this._points.length >= this.pointsCount() ? setTimeout(() => this ._migratePoint()) : this._timePoint.length >= this.pointsCount() && this._pointAdded.subscribe(this, this._migratePoint)) } destroy() { const e = this.properties(); e.unsubscribe(this, this._adjustScaleRatio), e.childs().scaleRatio.unsubscribe( this, this._correctFirstPoint), this.properties() .onRestoreFactoryDefaults().unsubscribe(this, this ._handleRestoringFactoryDefaults), this._onTemplateApplying.unsubscribe( this, this._handleTemplateApplying), this._onTemplateApplied .unsubscribe(this, this._correctFirstPoint), super.destroy() } pointsCount() { return 2 } name() { return "Gann Square" } addPoint(e, t, i) { this._points.length > 1 && this._points.pop(); const s = super.addPoint(e, t, i), n = this.priceScale(); return !Object(r.ensureNotNull)(n).isLog() && s && this._correctFirstPoint(), s } setPoint(e, t, i) { super.setPoint(e, t, i), void 0 !== i && i.shift() ? this._correctPoint(e) : this._correctScaleRatio() } setLastPoint(e, t) { const i = this.priceScale(); Object(r.ensureNotNull)(i).isLog() || (this._points[1] = e, this._correctPoint( 1)), super.setLastPoint(e, t) } isReversed() { return this.properties().childs().reverse.value() } levelsCount() { return this.properties().childs().levels.childCount() } levels() { const e = [], t = this.properties().childs(), i = t.levels.childCount(); for (let s = 0; s < i; s++) { const i = t.levels.childs()[s].childs(); e.push({ index: s, visible: i.visible.value(), color: i.color.value(), width: i.width.value() }) } return e } fanLinesCount() { return this.properties().childs().fanlines.childCount() } fanLines() { const e = [], t = this.properties().childs(), i = t.fanlines.childCount(); for (let s = 0; s < i; s++) { const i = t.fanlines.childs()[s].childs(); e.push({ index: s, visible: i.visible.value(), x: i.x.value(), y: i.y.value(), color: i.color.value(), width: i.width.value() }) } return e } arcsCount() { return this.properties().childs().arcs.childCount() } arcs() { const e = [], t = this.properties().childs(), i = t.arcs.childCount(); for (let s = 0; s < i; s++) { const i = t.arcs.childs()[s].childs(); e.push({ index: s, visible: i.visible.value(), x: i.x.value(), y: i.y.value(), color: i.color.value(), width: i.width.value() }) } return e } arcsBackgroundTransparency() { return this.properties().childs().arcsBackground.childs().transparency.value() } isArcsBackgroundFilled() { return this.properties().childs().arcsBackground.childs().fillBackground.value() } isLabelsVisible() { return this.properties().childs().showLabels.value() } getLabelsStyle() { const e = this.properties().childs(), { font: t, fontSize: i, bold: s, italic: r } = e.labelsStyle.childs(), n = e.levels.childCount(); return { textColor: e.levels.childs()[n - 1].childs().color.value(), font: t.value(), fontSize: i.value(), bold: s.value(), italic: r.value() } } getScaleRatioStep() { return 1e-7 } getScaleRatioFormatter() { return this._scaleRatioFormatter } getPriceDiff() { const e = this.points(); if (e.length < 2) return null; const [t, i] = e; return i.price - t.price } getIndexDiff() { const e = this.points(); if (e.length < 2) return null; const [t, i] = e; return i.index - t.index } getScaleRatio() { const e = this.getPriceDiff(), t = this.getIndexDiff(); return null !== e && null !== t && 0 !== t ? Math.abs(e / t) : null } static createProperties(e) { const t = Object(l.a)("linetoolganncomplex", e); return h._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "WfUZ")).then( e => e.GannComplexAndFixedDefinitionsViewModel) } static _configureProperties(e) { o.LineDataSource._configureProperties(e); const t = [], i = [], s = e.childs(); { const e = s.levels.childCount(); for (let r = 0; r < e; r++) { const e = s.levels.childs()[r].childs(); t.push(e.width), i.push(e.color) } } { const e = s.fanlines.childCount(); for (let r = 0; r < e; r++) { const e = s.fanlines.childs()[r].childs(); t.push(e.width), i.push(e.color) } } { const e = s.arcs.childCount(); for (let r = 0; r < e; r++) { const e = s.arcs.childs()[r].childs(); t.push(e.width), i.push(e.color) } } e.addChild("linesColors", new c.LineToolColorsProperty(i)), e.addChild( "linesWidths", new c.LineToolWidthsProperty(t)) } _correctScaleRatio() { const e = this.properties().childs(), t = this.getScaleRatio(); e.scaleRatio.setValue(t) } _getAdjustedScaleRatio() { const e = this.model().mainSeries().priceScale(), t = this.model().timeScale(); return Object(a.scaleRatio)(t, e) } _adjustScaleRatio(e) { const t = e.scaleRatio.value(); "" !== t && null !== t || e.scaleRatio.setValue(this._getAdjustedScaleRatio()) } _correctPoint(e) { if (this._points.length < 2) return; const t = this.getIndexDiff(); if (null === t) return; const i = this.properties().childs().scaleRatio.value(); if (null !== i) { const s = this._points[e], r = 0 === e ? this._points[1] : this._points[0], n = s.price - r.price > 0, o = s.index - r.index > 0; let a = n && !o || !n && o ? -1 : 1; 0 === e && (a = -a), s.price = r.price + a * t * i, this._pointChanged.fire( e) } this.normalizePoints() } _correctFirstPoint() { this._correctPoint(this.isReversed() ? 0 : 1) } _handleRestoringFactoryDefaults() { this.properties().childs().scaleRatio.setValue(this._getAdjustedScaleRatio()) } _handleTemplateApplying(e) { "" === e.scaleRatio && (e.scaleRatio = this._getAdjustedScaleRatio()) } _migratePoint() { if (this.points().length < this.pointsCount()) return; const e = this._getScreenPoints(); if (null === e) return; const t = this.screenPointToPoint(e[1]); this.setPoint(1, t), this._pointAdded.unsubscribe(this, this._migratePoint) } _getScreenPoints() { const e = this._calcAngle(); if (null === e) return null; let [t, i] = this.points(); this.isReversed() && ([t, i] = [i, t]); const r = this.pointToScreenPoint(t)[0], n = this.pointToScreenPoint(i)[0], o = Math.sqrt(Math.pow(r.x - n.x, 2) + Math.pow(r.y - n.y, 2)), a = new s.Point(Math.cos(e), -Math.sin(e)), l = a.normalized(), c = l.x < 0 ? -1 : 1, h = l.y < 0 ? -1 : 1; return [r.addScaled(a, o), r.add(new s.Point(5 * o * c, 5 * o * h))] } _calcAngle() { const [e, t] = this.points(), i = this.pointToScreenPoint(e)[0]; let s = this.pointToScreenPoint(t)[0].subtract(i); if (s.length() > 0) { s = s.normalized(); let e = Math.acos(s.x); return s.y > 0 && (e = -e), e } return null } } }, nda6: function(e, t, i) { "use strict"; i.r(t), i.d(t, "TimeSpanFormatter", (function() { return s })); i("YFKU"); class s { format(e) { const t = e < 0; e = Math.abs(e); const i = Math.floor(e / 86400); e -= 86400 * i; const s = Math.floor(e / 3600); e -= 3600 * s; const r = Math.floor(e / 60); e -= 60 * r; let n = ""; return i && (n += i + window.t("d", { context: "dates" }) + " "), s && (n += s + window.t("h", { context: "dates" }) + " "), r && (n += r + window.t("m", { context: "dates" }) + " "), e && (n += e + window.t("s", { context: "dates" }) + " "), t && (n = "-" + n), n.trim() } } }, "ng+v": function(e, t, i) { "use strict"; i.r(t); var s = i("aO4+"), r = i("Eyy1"), n = i("FQhm"), o = i("txPx"), a = i("fgLi"), l = i("mMWL"), c = i("aIyQ"), h = i.n(c), u = i("tc+8"), d = i.n(u), p = i("j3hX"); class _ extends d.a { constructor(e, t) { super(), this._lineSource = e, this._pointIndex = t, e.pointAdded().subscribe( this, e => { this._pointIndex === e && this._listeners.fire(this) }), e.pointChanged().subscribe(this, e => { this._pointIndex === e && this._listeners.fire(this) }) } value() { const e = this._lineSource.points()[this._pointIndex].price, t = Object(r.ensureNotNull)(this._lineSource.ownerSource()).formatter(); if (t.parse) { const i = t.format(e), s = t.parse(i); return s.res ? s.value : e } return e } setValue(e) { const t = this._lineSource.points()[this._pointIndex]; t.price = parseFloat("" + e), this._lineSource.startChanging(this._pointIndex, t), this._lineSource.setPoint(this._pointIndex, t), this._lineSource .model().updateSource(this._lineSource), this._listeners.fire(this); const i = this._lineSource.endChanging(!0, !1); this._lineSource.syncMultichartState(i) } } var m = i("j8de"), f = i("LxhU"), g = i("dOnf"), b = i("Ocx9"), v = i("WkOR"), S = i("n5al"), y = i("hY0g"), w = i.n(y), P = i("H0vP"), C = i("pPtI"), x = i("eCE5"); i.d(t, "LineDataSourceBase", (function() { return O })); const T = Object(o.getLogger)("Chart.LineDataSource"); class I { constructor() { this._states = [] } start(e) { this._states.push(e) } finish(e) { const t = Object(r.ensureDefined)(this._states.pop()); return s = t, (i = e).length !== s.length ? { indexesChanged: !0, pricesChanged: !0 } : i.reduce((e, t, i) => { const r = s[i]; return e.indexesChanged = e.indexesChanged || t.index !== r.index, e .pricesChanged = e.pricesChanged || t.price !== r.price, e }, { indexesChanged: !1, pricesChanged: !1 }); var i, s } isEmpty() { return 0 === this._states.length } } let M = 0; class O extends a.DataSource { constructor(e, t) { super(), this._currentPointsetId = null, this._pointChanged = new h.a, this ._pointAdded = new h.a, this._alertUndoMode = !1, this._priceAxisViews = [], this._timeAxisViews = [], this._timePoint = [], this._points = [], this ._lastPoint = null, this._paneViews = new Map, this ._normalizedPointsChanged = new h.a, this._fixedPointsChanged = new h.a, this._changeStatesStack = new I, this ._startMovingPoint = null, this._currentMovingPoint = null, this ._fixedPoints = [], this._isActualSymbol = !1, this._isActualInterval = !1, this._isActualCurrency = !1, this._isActualUnit = !1, this ._onIsActualIntervalChange = new h.a, this._linkKey = new w.a(null), this ._model = e, this._properties = t, this.localAndServerAlertsMismatch = !1, e .mainSeries().symbolResolved().subscribe(this, this ._onMainSeriesSymbolResolved) } destroy() { this._paneViews.forEach((e, t) => this._destroyPanePaneViews(t)), this._model .mainSeries().symbolResolved().unsubscribeAll(this) } linkKey() { return this._linkKey } boundToSymbol() { return !0 } points() { const e = []; for (let t = 0; t < this._points.length; t++) { const i = this._points[t]; e.push({ index: i.index, price: i.price, time: i.time }) } return this._lastPoint && e.push({ index: this._lastPoint.index, price: this._lastPoint.price }), !this.isFixed() && this._currentMovingPoint && this._startMovingPoint && this._correctPoints(e), e } timeAxisPoints() { return this.points() } priceAxisPoints() { return this.points() } normalizedPoints() { return this._timePoint } normalizedPointsChanged() { return this._normalizedPointsChanged } fixedPointsChanged() { return this._fixedPointsChanged } widthsProperty() { var e; return null !== (e = this._properties.childs().linesWidths) && void 0 !== e ? e : null } lineColorsProperty() { var e; return null !== (e = this._properties.childs().linesColors) && void 0 !== e ? e : null } backgroundColorsProperty() { var e; return null !== (e = this._properties.childs().backgroundsColors) && void 0 !== e ? e : null } textColorsProperty() { var e; return null !== (e = this._properties.childs().textsColors) && void 0 !== e ? e : null } pointsProperty() { return this._pointsProperty } startMoving(e, t, i, s) { this.isFixed() && this.restoreFixedPoints(), this._startMovingPoint = e } move(e, t, i, s) { if (i && (i.shiftOnly() || i.controlShift())) if (this.isFixed()) { const t = this._alignScreenPointHorizontallyOrVertically(Object(r .ensureDefined)(e.screen)); this._currentMovingPoint = { screen: t } } else { const t = this._alignPointHorizontallyOrVertically(Object(r .ensureDefined)(e.logical)); this._currentMovingPoint = { logical: t } } else this._currentMovingPoint = e; this.updateAllViews() } endMoving(e, t) { let i = !1, s = !1; if (this._currentMovingPoint && this._startMovingPoint) { if (this.isFixed()) this._correctFixedPoints(this._fixedPoints) && this ._fixedPointsChanged.fire(); else { const e = Object(r.ensureDefined)(this._currentMovingPoint.logical), t = Object(r.ensureDefined)(this._startMovingPoint.logical); i = e.index !== t.index, s = e.price !== t.price; if (this._correctPoints(this._points)) { n.emit("drawing_event", this._id, "move"); for (let e = 0; e < this._points.length; e++) this._pointChanged .fire(e) } } this._startMovingPoint = null, this._currentMovingPoint = null } const o = { indexesChanged: i, pricesChanged: s }; return this.isFixed() ? (this.calcPositionPercents(), this.updateAllViews(), o) : (this.updateAllViews(), i && !e ? (this._properties.childs() .interval .setValue(this._model.mainSeries().interval()), this .normalizePoints(), this.createServerPoints()) : (this ._copyPricesWithoutNormalization(), this._normalizedPointsChanged .fire()), (s || i) && this.synchronizeAlert(!this._alertUndoMode), o) } startMovingPoint() { return this._startMovingPoint ? { ...this._startMovingPoint } : null } currentMovingPoint() { return this._currentMovingPoint ? { ...this._currentMovingPoint } : null } startChanging(e, t) { void 0 !== e && void 0 !== t && (e < this._priceAxisViews.length && this ._priceAxisViews[e].setActive(!0), e < this._timeAxisViews.length && this._timeAxisViews[e].setActive(!0)), this._changeStatesStack.start( this.points()) } endChanging(e, t) { const i = this._changeStatesStack.finish(this.points()); i.indexesChanged && this._changeStatesStack.isEmpty() ? (this._properties .childs().interval.setValue(this._model.mainSeries().interval()), this .normalizePoints(), t || this.createServerPoints()) : (this ._copyPricesWithoutNormalization(), this._normalizedPointsChanged.fire() ); for (let e = 0; e < this._priceAxisViews.length; e++) this._priceAxisViews[e] .setActive(!1); for (let e = 0; e < this._timeAxisViews.length; e++) this._timeAxisViews[e] .setActive(!1); return this.synchronizeAlert(!e), i } setPoint(e, t, i, s) { if (i && i.shift() && this._snapTo45DegreesAvailable()) { const i = 0 === e ? 1 : e - 1; this._snapPoint45Degree(t, this.points()[i]) } this._points[e].index === t.index ? (this._points[e].price = t.price, this ._pointChanged.fire(e)) : (this._points[e] = t, this._pointChanged.fire( e)) } getPoint(e) { return this.points()[e] || null } setLastPoint(e, t) { this._lastPoint = this._preparePoint(e, t), this.updateAllViews() } lastPoint() { return this._lastPoint } getChangePointForSync(e) { return this.getPoint(e) } setPoints(e) { this._points = e } clearData() { this._points = [] } denormalizeTimePoints() { let e = []; for (let t = 0; t < this._timePoint.length; t++) { const i = this._model.timeScale().denormalizeTimePoint(this._timePoint[t]); if (void 0 === i) { e = []; break } e.push({ index: i, price: this._timePoint[t].price }) } e.length > 0 && (this._points = e) } restorePoints(e, t, i) { this._timePoint = Object(g.deepCopy)(e), this._points = t, i || this .denormalizeTimePoints() } calcIsActualSymbol() { if (this._model.mainSeries().hasDelayedSymbolIntervalChange()) return; const e = this.ownerSource(); if (null === e) this._isActualSymbol = !1; else { const t = Object(r.ensureNotNull)(e.symbolSource()); this._migrateSymbolProperty(); const i = this._properties.childs().symbol, s = i.value(); if (this._isActualSymbol = t.symbolSameAsCurrent(s), this._isActualSymbol) { const e = t.symbol(); Object(v.a)(s, e) || (T.logWarn( 'Possible drawing "migrating" detected from "' + s + '" to "' + e + '"'), T.logWarn("Series symbolInfo: " + JSON .stringify(t.symbolInfo())), T.logWarn("" + (new Error) .stack)), i.setValue(e) } } this.calcIsActualInterval(), this.calcIsActualCurrency(), this .calcIsActualUnit(), this._onSourceHiddenMayChange() } calcIsActualCurrency() { const e = this.ownerSource(); if (null === e) return void(this._isActualCurrency = !1); const t = this._properties.childs().currencyId.value(); if (null !== t) { const i = e.symbolSource(); if (null === i) return; this._isActualCurrency = t === Object(S.symbolCurrency)(i.symbolInfo(), void 0, !0) } else { const t = Object(r.ensureNotNull)(e.symbolSource()).symbolInfo(); this._isActualCurrency = null !== t && Object(S.symbolCurrency)(t) === Object(S.symbolOriginalCurrency)(t) } this._onSourceHiddenMayChange() } calcIsActualUnit() { const e = this.ownerSource(); if (null === e) return void(this._isActualUnit = !1); const t = this._properties.childs().unitId.value(); if (null !== t) this._isActualUnit = t === Object(r.ensureNotNull)(e .symbolSource()).unit(); else { const t = Object(r.ensureNotNull)(e.symbolSource()).symbolInfo(); this._isActualUnit = null !== t && Object(S.symbolUnit)(t) === Object(S .symbolOriginalUnit)(t) } this._onSourceHiddenMayChange() } calcIsActualInterval() { const e = this._isActualInterval, t = this._properties, i = this._model.mainSeries(); this._isActualInterval = Object(x.a)(f.Interval.parse(i.interval()), t.childs() .intervalsVisibilities), !this._isActualInterval && this._model .selection().isSelected(this) && this._model.selectionMacro(e => e .removeSourceFromSelection(this)), this._isActualInterval !== e && this ._onIsActualIntervalChange.fire(), this._onSourceHiddenMayChange() } paneViews(e) { if (this.isSourceHidden()) return null; const t = this._getPaneViews(this.isMultiPaneAvailable() ? e : void 0); if (null === t) return null; if (1 === t.length) return [t[0]]; const i = []; for (let e = t.length - 1; e >= 0; --e) i.push(t[e]); return i } detachAlert() { const e = this.getAlertSync(); if (e && this._alertCallbacks) { const t = this._alertCallbacks; e.off("destroy", t.remove), e.off("change:hovered", t.hovered), e.off( "change:selected", t.selected) } this.hasAlert.setValue(!1), this._alertId = void 0 } start() { this.createServerPoints() } onData(e) { "pointset_error" !== e.method ? e.params.customId === this ._currentPointsetIdWithPrefix() && this._onPointsetUpdated(e.params.plots) : T.logError(`Error getting pointset: ${e.params[0]} ${e.params[1]}`) } isActualSymbol() { return this._isActualSymbol } isActualCurrency() { return this._isActualCurrency } isActualInterval() { return this._isActualInterval } isActualUnit() { return this._isActualUnit } onIsActualIntervalChange() { return this._onIsActualIntervalChange } setOwnerSource(e) { null !== this._ownerSource && (this._ownerSource.currencyChanged() .unsubscribeAll(this), this._ownerSource.unitChanged().unsubscribeAll( this)), super.setOwnerSource(e), e && (this.setPriceScale(e .priceScale()), e.currencyChanged().subscribe(this, this .calcIsActualCurrency), e.unitChanged().subscribe(this, this .calcIsActualUnit), this.calcIsActualSymbol(), this ._migrateZOrder()) } dataAndViewsReady() { return this._paneViews.size > 0 } pointAdded() { return this._pointAdded } pointChanged() { return this._pointChanged } addPoint(e, t, i) { const s = this._preparePoint(e, t); return this._addPointIntenal(s, t, i) } updateAllViewsAndRedraw() { this.updateAllViews(), this._model.updateSource(this) } restoreExternalPoints(e, t) { if (this._timePoint = Object(g.deepCopy)(e.points), t.indexesChanged) { if (this.properties().interval.setValue(e.interval), !this.isActualSymbol()) return this._clearServerPoints(), void this._normalizedPointsChanged .fire(); this.createServerPoints() } else { const t = Math.min(this._points.length, e.points.length); for (let i = 0; i < t; i++) this._points[i].price = e.points[i].price } this._normalizedPointsChanged.fire() } isSourceHidden() { return !this._properties.childs().visible.value() || Object(l.hideAllDrawings)() .value() && this.canBeHidden() || !this._isActualInterval || !this ._isActualSymbol || !this._isActualCurrency || !this._isActualUnit } createServerPoints() { if (!this._isActualSymbol) return; if (!this._model.chartApi().isConnected().value()) return; if (this._clearServerPoints(), this._model.timeScale().isEmpty()) return; if (0 === this._timePoint.length && this._points.length > 0 && this .normalizePoints(), !this._readyToCreatePointset()) return; this._currentPointsetId = ++M; const e = Object(r.ensureNotNull)(this._model.mainSeries().seriesSource() .symbolInstanceId()), t = this._pointsForPointset(), i = Object(C.getServerInterval)(this.properties().interval.value()); this._model.chartApi().createPointset(this._currentPointsetIdWithPrefix(), "turnaround", e, i, t, this.onData.bind(this)) } finish() {} tryCreateServerPoints() { this.isFixed() || this.isSourceHidden() || null === this._currentPointsetId && this.createServerPoints() } stop() { this._clearServerPoints() } restart() { this.isFixed() || (this._currentPointsetId = null, this.createServerPoints()) } isStarted() { return null !== this._currentPointsetId } convertYCoordinateToPriceForMoving(e, t) { var i; const s = Object(r.ensureNotNull)(this.priceScale()); if (s.isEmpty()) return null; const n = this.ownerSource(), o = Object(r.ensure)(null === (i = n || t) || void 0 === i ? void 0 : i .firstValue()); return s.coordinateToPrice(e, o) } syncMultichartState(e) { const t = { points: this._timePoint, interval: this._model.mainSeries().interval() }, i = this.linkKey().value(); if (null !== i && this.isSynchronizable()) { const s = { model: this._model, linkKey: i, symbol: this._model.mainSeries().symbol(), finalState: t, changes: e }; Object(l.finishChangingLineTool)(s) } } enableCurrentIntervalVisibility() { const e = this.properties().intervalsVisibilities.state(); Object(x.b)(e, f.Interval.parse(this._model.mainSeries().interval())), this .properties().intervalsVisibilities.mergeAndFire(e) } clonePositionOffset() { return this.isFixed() ? { barOffset: 0, xCoordOffset: 20, yCoordOffset: 20 } : { barOffset: 0, xCoordOffset: 0, yCoordOffset: -40 } } _pointsForPointset() { return this._timePoint.map(e => [e.time_t, e.offset]) } _snapPoint45Degree(e, t, i) { const s = this._model.timeScale(), n = s.indexToCoordinate(t.index), o = s.indexToCoordinate(e.index) - n, a = Object(r.ensureNotNull)(this.priceScale()), l = t.price, c = e.price, h = Object(r.ensureNotNull)(Object(r.ensureNotNull)(this.ownerSource()) .firstValue()), u = a.priceToCoordinate(l, h), d = a.priceToCoordinate(c, h) - u, p = Math.round(Math.atan2(o, d) / Math.PI * 4); if (2 === Math.abs(p)) i || (e.price = l); else if (0 === Math.abs(p) || 4 === Math.abs(p)) i || (e.index = t.index); else { const t = Math.sqrt(o * o + d * d), i = o < 0 ? -1 : 1, r = d < 0 ? -1 : 1; let l = Math.max(Math.abs(d), Math.abs(o)); l /= l * Math.sqrt(2) / t; const c = Math.round(s.coordinateToIndex(n + l * i)), p = Math.abs(s.indexToCoordinate(c) - n), _ = a.coordinateToPrice(u + p * r, h); e.index = c, e.price = _ } } normalizePoint(e) { return { ...this._model.timeScale().normalizeBarIndex(e.index), price: e.price } } normalizePoints() { this._timePoint = []; for (let e = 0; e < this._points.length; e++) if (void 0 !== this._points[e].index) { const t = this.normalizePoint(this._points[e]); if (!t.time_t) { this._timePoint = []; break } this._timePoint.push(t) } this._normalizedPointsChanged.fire() } _setPaneViews(e, t, i) { this._paneViews.set(t, e), void 0 !== t && i && t.onDestroyed().subscribe(this, () => this._destroyPanePaneViews(t)), this._model.lightUpdate() } _getPaneViews(e) { return this._paneViews.get(e) || null } _updateAllPaneViews() { this._paneViews.forEach(e => { for (const t of e) t.update() }) } _alignPointHorizontallyOrVertically(e) { const t = this.pointToScreenPoint(e)[1], i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint) .logical), s = this.pointToScreenPoint(i)[1], n = Math.abs(s.x - t.x), o = Math.abs(s.y - t.y); if (n < 10 && o < 10) return e; return { index: n < o ? i.index : e.index, price: n < o ? e.price : i.price } } _alignScreenPointHorizontallyOrVertically(e) { const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this ._startMovingPoint).screen), i = Math.abs(t.x - e.x), n = Math.abs(t.y - e.y); return i < 10 && n < 10 ? e : i < n ? new s.Point(t.x, e.y) : new s.Point(e.x, t .y) } _correctPoints(e) { const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this ._currentMovingPoint).logical), i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint) .logical), s = t.index - i.index, n = t.price - i.price; if (0 === s && 0 === n) return !1; for (let t = 0; t < e.length; t++) { const i = e[t]; i.index = i.index + s, i.price += n, e[t] = i } return !0 } _correctFixedPoints(e) { const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this ._currentMovingPoint).screen), i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint) .screen), s = t.subtract(i); if (s.length() >= 1) { for (let t = 0; t < e.length; t++) e[t] = e[t].add(s); return !0 } return !1 } _currentPointsetIdWithPrefix() { return "pointset_" + this._currentPointsetId } _clearServerPoints() { null !== this._currentPointsetId && this._model.chartApi().isConnected() .value() && this._model.chartApi().removePointset(this ._currentPointsetIdWithPrefix()), this._currentPointsetId = null } _createPointProperty(e) { const t = this._pointsProperty.childs().points; t.addProperty("" + e, {}); const i = t[e]; i.addChild("price", new _(this, e)), i.addChild("bar", new m.a(this, e)) } _createPointsProperties() { this._pointsProperty = new d.a, this._pointsProperty.addChild("points", new d .a); for (let e = 0; e < this.pointsCount(); e++) this._createPointProperty(e) } _alignPointToRangeOfActualData(e) { const t = Object(r.ensureNotNull)(this._model.mainSeries().bars().firstIndex()), i = Object(r.ensureNotNull)(this._model.mainSeries().bars().lastIndex()); let s = Math.max(e.index, t); return s = Math.min(s, i), { ...e, index: s } } _migrateSymbolProperty() { const e = this._properties.childs(); if (e.symbolStateVersion.value() < 2) { const t = Object(r.ensureNotNull)(this.ownerSource()), i = Object(r.ensureNotNull)(t.symbolSource()); if (i === this._model.mainSeries()) return void e.symbolStateVersion .setValueSilently(2); if (null === i.symbolInfo()) return; this._model.mainSeries().symbolSameAsCurrent(e.symbol.value()) && e.symbol .setValueSilently(i.symbol()), e.symbolStateVersion.setValueSilently(2) } } _migrateZOrder() { const e = this._properties.childs(); e.zOrderVersion.value() < 2 && (this.ownerSource() === this.model() .mainSeries() && this.setZorder(this.zorder() - this.model() .mainSeries() .obsoleteZOrder()), e.zOrderVersion.setValueSilently(2)) } _preparePoint(e, t) { const i = e; return t && t.shift() && this.points().length >= 2 && this ._snapTo45DegreesAvailable() && this._snapPoint45Degree(i, this.points()[ this.points().length - 2]), i } _addPointIntenal(e, t, i) { this._points.push(e); const s = this._points.length === this.pointsCount(); return s ? (this._lastPoint = null, i || (this.normalizePoints(), this .createServerPoints())) : this._lastPoint = e, this._pointAdded.fire( this._points.length - 1), s } _onSourceHiddenMayChange() { this._model.invalidate(P.InvalidationMask.validateAction(() => { this._isDestroyed || this._processHibernate() })) } _processHibernate() { this.isSourceHidden() ? this.isStarted() && this.stop() : this.isStarted() || this.start() } _onPointsetUpdated(e) { if (0 === e.length) return; for (let t = 0; t < e.length; t++) { const i = e[t], s = this._timePoint[i.index], r = { index: i.value[0], time: new Date(1e3 * i.value[1]), price: s.price }; this._points.length <= i.index ? (this._points.push(r), this._pointAdded .fire(this._points.length - 1)) : (this._points[i.index] = r, this ._pointChanged.fire(i.index)) } const t = this; t.checkAlert && t.checkAlert(), this.updateAllViewsAndRedraw() } _snapTo45DegreesAvailable() { return !1 } _onMainSeriesSymbolResolved() { const e = this.ownerSource(); null === e || this._model.mainSeries() === e.symbolSource() || this .isSourceHidden() || this.createServerPoints() } _readyToCreatePointset() { return this._timePoint.length > 0 } static _addCollectedProperties(e) { e.hasChild("linewidth") && e.addChild("linesWidths", new p .LineToolWidthsProperty([Object(r.ensureDefined)(e.child("linewidth"))]) ), e.hasChild("linecolor") && e.addChild("linesColors", new p .LineToolColorsProperty([Object(r.ensureDefined)(e.child("linecolor"))]) ), e.hasChild("backgroundColor") && e.addChild("backgroundsColors", new p.LineToolColorsProperty([Object(r.ensureDefined)(e.child( "backgroundColor"))])), e.hasChild("textColor") && e.addChild( "textsColors", new p.LineToolColorsProperty([Object(r.ensureDefined)(e .child("textColor"))])), e instanceof b.DefaultProperty && (e .addExclusion("linesWidths"), e.addExclusion("linesColors"), e .addExclusion("backgroundsColors"), e.addExclusion("textsColors")) } static _initialSymbolStateVersion() { return 1 } static _initialZOrderVersion() { return 1 } _destroyPanePaneViews(e) { const t = this._paneViews.get(e); if (void 0 !== t) for (const e of t) e.destroy && e.destroy(); void 0 !== e && e.onDestroyed().unsubscribeAll(this), this._paneViews.delete(e) } _copyPricesWithoutNormalization() { const e = Math.min(this._points.length, this._timePoint.length); for (let t = 0; t < e; t++) this._timePoint[t].price = this._points[t].price } } }, nqXy: function(e, t, i) { "use strict"; function s(e, t) { let { deltaX: i, deltaY: s } = e; switch (i /= 100, s /= 100, t.deltaMode) { case t.DOM_DELTA_PAGE: i *= 120, s *= 120; break; case t.DOM_DELTA_LINE: i *= 32, s *= 32 } return { deltaX: i, deltaY: s } } i.d(t, "a", (function() { return r })); class r { constructor() { this._totalDeltaX = 0, this._totalDeltaY = 0, this._prevWheelTime = 0 } processWheel(e) { e.timeStamp - this._prevWheelTime > 100 && this._reset(), this._totalDeltaX += e.deltaX, this._totalDeltaY += e.deltaY, this ._prevWheelTime = e.timeStamp; const t = { deltaX: e.deltaX, deltaY: e.deltaY }; return 0 === this._totalDeltaX || 0 === this._totalDeltaY || (Math.abs(this ._totalDeltaX) >= Math.abs(3 * this._totalDeltaY) && (t.deltaY = 0), Math.abs(this._totalDeltaY) >= Math.abs(3 * this._totalDeltaX) && (t .deltaX = 0)), s(t, e) } _reset() { this._totalDeltaX = 0, this._totalDeltaY = 0 } } }, o2pV: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SelectionIndexes", (function() { return r })); var s = i("Eyy1"); class r { constructor(e) { this._baseIndex = null, this._offsetInBar = null, this._offsetInTime = null, this ._barsBetweenPoints = null, this._timescale = e } indexes() { const e = this._timescale.visibleBarsStrictRange(); if (null === e) return []; const t = e.firstBar(), i = e.lastBar(); if (null === this._offsetInTime || null === this._barsBetweenPoints) { const e = this._timescale.barSpacing(); this._barsBetweenPoints = Math.floor(120 / e), this._offsetInBar = i % this ._barsBetweenPoints, this._offsetInTime = this._timescale.indexToTimePoint( this._offsetInBar), this._baseIndex = this._timescale.baseIndex() } const r = this._timescale.baseIndex(); this._baseIndex !== r && (this._baseIndex = r, this._offsetInBar = Object(s .ensureNotNull)(this._timescale.timePointToIndex(this._offsetInTime))); const n = Object(s.ensureNotNull)(this._offsetInBar), o = []; let a = Math.floor((t - n) / this._barsBetweenPoints); const l = Math.floor((i - n) / this._barsBetweenPoints); for (; a <= l; a++) o.push(n + a * this._barsBetweenPoints); return o } clear() { this._offsetInBar = null, this._offsetInTime = null, this._baseIndex = null, this ._barsBetweenPoints = null } } }, oIoN: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()), this.version = n.version, i.e("lt-pane-views") .then(i.t.bind(null, "pBAL", 7)).then(({ DisjointChannelPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 3 } name() { return "Disjoint Channel" } hasEditableCoordinates() { return !1 } addPoint(e, t) { return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this.points()[this.points().length - 2]), s.prototype.addPoint.call(this, e) } setLastPoint(e, t) { return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this.points()[this.points().length - 2]), s.prototype.setLastPoint.call( this, e) } setPoint(e, t, i) { var s = .5 * (this._points[1].price + this._points[2].price); if (i && i.shift() && 1 === e) { this._snapPoint45Degree(t, this.points()[0]) } if (e < 3 && super.setPoint(e, t), 0 !== e && 2 !== e) { if (1 === e) { var r = this._points[1].price - s; this._points[2].price = this._points[1].price - 2 * r } else if (3 === e) { r = t.price - this._points[2].price; this._points[0].price = this._points[1].price - r, this._points[0].index = t .index } this.normalizePoints() } } getPoint(e) { if (e < 3) return s.prototype.getPoint.call(this, e); var t = this._points[0].price - this._points[2].price; return { index: this._points[0].index, price: this._points[1].price - t } } canHasAlert() { return !0 } _getAlertPlots() { var e = this._points[0], t = this._points[1], i = []; e.index <= t.index ? (i.push(e), i.push(t)) : (i.push(t), i.push(e)); var s = this._points[2]; s.time = t.time, s.index = t.index; var r, n, o, a, l = { price: s.price + (t.price - e.price), time: e.time, index: e.index }, c = []; s.index <= l.index ? (c.push(s), c.push(l)) : (c.push(l), c.push(s)), i[0].price > c[0].price ? (r = i, n = c) : c[0].price > i[0].price || c[1].price > i[1] .price ? (r = c, n = i) : (r = i, n = c); var h = this.properties().extendLeft.value(), u = this.properties().extendRight.value(); return e.index <= t.index ? (o = h, a = u) : (o = u, a = h), [this ._linePointsToAlertPlot(r, "Upper", o, a), this._linePointsToAlertPlot(n, "Lower", o, a) ] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "vm8R"))) .GeneralTrendFiguresDefinitionsViewModel } static createProperties(e) { var t = new r("linetooldisjointangle", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } n.version = 1, t.LineToolDisjointChannel = n }, oV8k: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return s })); class s { constructor(e, t) { this._id = e, this._model = t } id() { return this._id } isHoveredEnabled() { return !0 } isSelectionEnabled() { return !1 } priceScale() { return null } paneViews(e) { return [] } labelPaneViews(e) { return [] } priceAxisViews(e, t) { return [] } updateViewsForPane(e) { e.containsMainSeries() && this.updateAllViews() } } }, oXaB: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "PriceAxisLastValueMode", (function() { return s })), function(e) { e[e.LastPriceAndPercentageValue = 0] = "LastPriceAndPercentageValue", e[e .LastValueAccordingToScale = 1] = "LastValueAccordingToScale" }(s || (s = {})) }, oamr: function(e, t, i) { "use strict"; var s = i("ocLq"); class r { constructor(e, t, i, s) { this._value = e, this._name = t, this._owner = i, this._comparer = void 0 !== s ? s : (e, t) => null == e ? null != t : e === t } getName() { return this._name } set(e) { const t = this._comparer(this._value, e); return t && this._owner.dirty(), this._value = e, t } get() { return this._value } } class n { constructor(e, t, i) { this._owner = null, this._value = e, this._name = t, this._owner = i } getName() { return this._name } set(e) { return this._value !== e && (this._value = e, null !== this._owner && this._owner .dirty(), !0) } get() { return this._value } } class o extends r { constructor(e, t, i, s) { super(e, t, i, s) } } class a { constructor(e) { this._owner = e } createField(e, t) { return new r(e, t, this) } createDoubleField(e, t) { return new r(e, t, this, (e, t) => !s.Std.equal(e, t)) } createDoubleArrayField(e, t) { return new o(e, t, this, (e, t) => { if (e === t) return !1; const i = e.length; if (t.length !== i) return !0; for (let r = 0; r < i; r++) { const i = e[r], n = t[r]; if (!s.Std.equal(i, n)) return !0 } return !1 }) } createTimeField(e, t) { return new n(e, t, this) } dirty() { null !== this._owner && this._owner.dirty() } setOwner(e) { this._owner = e } } i.d(t, "a", (function() { return l })); class l { constructor(e) { this._mixinJSONObject = new a(this), this._state = 0, this._owner = null, this ._gen = e, this._id = e.nextGraphicsObjId(), this._id2 = this._mixinJSONObject .createField(this.id(), "id") } dirty() { null !== this._owner && this._owner.dirty() } setOwner(e) { this._owner = e } id() { return this._id } unsetOwner(e) { this._owner === e && (this._owner = null) } state() { return this._state } erase() { 1 === this._state && this._gen.pushEraseObjCmd(this._id, this.jsonName()), this ._state = 2, this.dirty() } markAsPosted() { 1 !== this._state && (this._state = 1, this.dirty()) } isErased() { return 2 === this._state } isPosted() { return 1 === this._state } isNaN() { return !1 } _processObjUpdate() { 1 === this._state && (this._gen.pushEraseObjCmd(this._id, this.jsonName()), this ._id = this._gen.nextGraphicsObjId(), this._id2.set(this._id), this._state = 0), this.dirty() } } }, ocLq: function(e, t, i) { "use strict"; (function(t) { var s = i("5B3K").StudyError, r = i("Y7w9"), n = i("ogJP").inherit, o = i("E6p6").SessionStage, a = i("LxhU").Interval, l = i("OLhd").createDwmAligner, c = i("OLhd").createTimeToBarTimeAligner, h = i("5fI3").decodeExtendedSymbol, u = i("5fI3").encodeExtendedSymbolOrGetSimpleSymbolString, d = function() { var e, p = "undefined" != typeof window ? window : t, _ = p.PineJsCalendar ? p.PineJsCalendar : i("jCNj"), m = i("IiTo"), f = i("IDnv").extrapolateBarsFrontToTime, g = {}; function b(e, t, i, s, r) { var n = r, o = 0; if (isNaN(e.get(t - 1))) return { index: NaN, value: NaN }; for (var a = 0; a < t; ++a) s(e.get(a), n) && (o = a, n = e.get(a)); return { index: o, value: n } } function v(e, t, i, s, r) { this._areaRight = e, this._areaLeft = t, this._pivotType = i, this._series = s, this._currentIndex = r.new_var(0), this._currentValue = r.new_var( NaN), this._pivotIndex = r.new_var(-1), this._index = g.n(r), this ._isNewBar = r.symbol.isNewBar; var n = this._currentIndex.get(1), o = this._currentValue.get(1), a = this._pivotIndex.get(1); this._index > 1 && (this._currentIndex.set(n), this._currentValue.set(o), this._pivotIndex.set(a)) } function S(e, t, i) { this._deviation = e; var s = i.new_var(g.high(i)), r = i.new_var(g.low(i)); s.get(2 * t + 1), r.get(2 * t + 1), this._pivotHigh = new v(t, t, v.HIGH, s, i), this._pivotLow = new v(t, t, v.LOW, r, i), this._lastVal = i .new_var(NaN), this._lastIndex = i.new_var(-1), this._lastType = i .new_var(), this._index = g.n(i), this._isNewBar = i.symbol.isNewBar, this._isBarClosed = i.symbol.isBarClosed; var n = this._lastIndex.get(1), o = this._lastVal.get(1), a = this._lastType.get(1); this._index > 1 && this.addPivot(n, o, a), this.processPivot(this ._pivotHigh), this.processPivot(this._pivotLow) } function y(e) { this.symbol = e, this.vars = [], this.vars_index = 0, this.ctx = [], this .ctx_index = 0, this.minimumAdditionalDepth = null } function w(e) { this.mindepth = 0, this.original = NaN, this.modified = !1, this.symbol = e } function P(e) { w.call(this, e) } function C(e, t, i, s, r, n) { var o = h(e); const l = "string" == typeof o.symbol ? o : o.symbol; this.ticker = l.symbol, this.currencyCode = i || l["currency-id"], this .unitId = s || l["unit-id"]; var c = l["currency-id"] !== this.currencyCode || l["unit-id"] !== this .unitId; l["currency-id"] = this.currencyCode, l["unit-id"] = this.unitId, c && (e = u(o)), this.tickerid = e; var d = a.parse(t); this.resolution = d.letter(), this.interval = d.multiplier(), this.period = d.value(), this.index = -1, this.time = NaN, this.open = NaN, this .high = NaN, this.low = NaN, this.close = NaN, this.volume = NaN, this .updatetime = NaN, this.isNewBar = !1, this.isBarClosed = !1, this .session = new m.SessionInfo("Etc/UTC", "24x7"), this.script = r, this .isAdditionalDepthAllowed = void 0 === o.type, n && this.set_symbolinfo( n) } function x(e, t, i, s, r, n, o, a, l, c) { this.body = n, this.symbols = [], this.runner = r, this.inputCallback = a, this.out = o, this.nonseriesOut = l, this.ctx = new y(this.add_sym(e, t, i, s, c)), this.init() } function T(e) { this.symbols = [], this.barsets = [], this.subscription = [], this.host = e, this.isRecalculated = !1, this .isStarted = !1, this.start() } function I(e) { this.runner = new T(e) } function M(e, t) { this.info = e, this.bars = t || [], this.isBarClosed = !0, this .firstLoadedTimeMs = 0 !== this.bars.length ? this.bars[0].time : 1 / 0 } function O(e, t) { this.period = e, this.generateEmptyBars = !!t } function L() {} return g.max_series_default_size = 10001, g.n = function(e) { return e.symbol.index + 1 }, g.nz = function(e, t) { return t = t || 0, isFinite(e) ? e : t }, g.na = function(e) { return 0 === arguments.length ? NaN : isNaN(e) ? 1 : 0 }, g.isZero = function(e) { return Math.abs(e) <= 1e-10 }, g.toBool = function(e) { return isFinite(e) && !g.isZero(e) }, g.eq = function(e, t) { return g.isZero(e - t) }, g.neq = function(e, t) { return !g.eq(e, t) }, g.ge = function(e, t) { return g.isZero(e - t) || e > t }, g.gt = function(e, t) { return !g.isZero(e - t) && e > t }, g.lt = function(e, t) { return !g.isZero(e - t) && e < t }, g.le = function(e, t) { return g.isZero(e - t) || e < t }, g.and = function(e, t) { return isNaN(e) || isNaN(t) ? NaN : g.isZero(e) || g.isZero(t) ? 0 : 1 }, g.or = function(e, t) { return isNaN(e) || isNaN(t) ? NaN : g.isZero(e) && g.isZero(t) ? 0 : 1 }, g.not = function(e) { return isNaN(e) ? NaN : g.isZero(e) ? 1 : 0 }, g.eps = function() { return 1e-10 }, g.greaterOrEqual = function(e, t, i) { return t - e < (i || 1e-10) }, g.lessOrEqual = function(e, t, i) { return e - t < (i || 1e-10) }, g.equal = function(e, t, i) { return Math.abs(e - t) < (i || 1e-10) }, g.greater = function(e, t, i) { return e - t > (i || 1e-10) }, g.less = function(e, t, i) { return t - e > (i || 1e-10) }, g.compare = function(e, t, i) { return g.equal(e, t, i) ? 0 : g.greater(e, t, i) ? 1 : -1 }, g.max = Math.max, g.min = Math.min, g.pow = Math.pow, g.abs = Math.abs, g .log = Math.log, g.log10 = function(e) { return Math.log(e) / Math.LN10 }, g.sqrt = Math.sqrt, g.sign = function(e) { return isNaN(e) ? NaN : g.isZero(e) ? 0 : e > 0 ? 1 : -1 }, g.exp = Math.exp, g.sin = Math.sin, g.cos = Math.cos, g.tan = Math.tan, g .asin = Math.asin, g.acos = Math.acos, g.atan = Math.atan, g.floor = Math .floor, g.ceil = Math.ceil, g.round = Math.round, g.avg = function(e, t, i, s, r, n) { if (2 === arguments.length) return (e + t) / 2; for (var o = 0, a = 0; a < arguments.length; a++) o += arguments[a]; return o / arguments.length }, g.open = function(e) { return e.symbol.open }, g.high = function(e) { return e.symbol.high }, g.low = function(e) { return e.symbol.low }, g.close = function(e) { return e.symbol.close }, g.hl2 = function(e) { return (e.symbol.high + e.symbol.low) / 2 }, g.hlc3 = function(e) { return (e.symbol.high + e.symbol.low + e.symbol.close) / 3 }, g.ohlc4 = function(e) { return (e.symbol.open + e.symbol.high + e.symbol.low + e.symbol.close) / 4 }, g.volume = function(e) { return e.symbol.volume }, g.updatetime = function(e) { return e.symbol.updatetime }, g.time = function(e) { return e.symbol.bartime() }, g.period = function(e) { return e.symbol.period }, g.tickerid = function(e) { return e.symbol.tickerid }, g.currencyCode = function(e) { return e.symbol.currencyCode }, g.unitId = function(e) { return e.symbol.unitId }, g.ticker = function(e) { return e.symbol.ticker }, g.interval = function(e) { return e.symbol.interval }, g.isdwm = function(e) { return e.symbol.isdwm() }, g.isintraday = function(e) { return !e.symbol.isdwm() }, g.isdaily = function(e) { return "D" === e.symbol.resolution }, g.isweekly = function(e) { return "W" === e.symbol.resolution }, g.ismonthly = function(e) { return "M" === e.symbol.resolution }, g.year = function(e) { return g.timepart(e.symbol, _.YEAR, arguments[1]) }, g.month = function(e) { return g.timepart(e.symbol, _.MONTH, arguments[1]) }, g.weekofyear = function(e) { return g.timepart(e.symbol, _.WEEK_OF_YEAR, arguments[1]) }, g.dayofmonth = function(e) { return g.timepart(e.symbol, _.DAY_OF_MONTH, arguments[1]) }, g.dayofweek = function(e) { return g.timepart(e.symbol, _.DAY_OF_WEEK, arguments[1]) }, g.hour = function(e) { return g.timepart(e.symbol, _.HOUR_OF_DAY, arguments[1]) }, g.minute = function(e) { return g.timepart(e.symbol, _.MINUTE, arguments[1]) }, g.second = function(e) { return g.timepart(e.symbol, _.SECOND, arguments[1]) }, g.add_days_considering_dst = function(e, t, i) { return _.add_days_considering_dst(_.get_timezone(e), t, i) }, g.selectSessionBreaks = function(e, t) { if (g.isdwm(e) || void 0 === e.symbol.session.timezone) return []; var i = m.newBarBuilder(e.symbol.period, e.symbol.session), s = [], r = t.length; if (i.moveTo(t[r - 1]), 1 === r && i.startOfBar(0) === t[0]) s.push(t[ 0]); else { for (var n = r - 2; n >= 0; --n) { var o = t[n]; if (!(o >= i.startOfBar(0))) { i.moveTo(o); var a = t[n + 1]; s.push(a) } } s.reverse() } return s }, g.iff = function(e, t, i) { return g.not(e) ? i : t }, g.rising = function(e, t) { for (var i = 1; i < t + 1; ++i) if (e.get(i) > e.get(0)) return 0; return 1 }, g.falling = function(e, t) { for (var i = 1; i < t + 1; ++i) if (e.get(i) < e.get(0)) return 0; return 1 }, g.timepart = function(e, t, i) { var s = _.utc_to_cal(e.timezone, i || e.bartime()); return _.get_part(s, t) }, g.rsi = function(e, t) { return g.isZero(t) ? 100 : g.isZero(e) ? 0 : 100 - 100 / (1 + e / t) }, g.sum = function(e, t, i) { var s = i.new_var(), r = g.nz(e.get()) + g.nz(s.get(1)) - g.nz(e.get(t)); return s.set(r), r }, g.sma = function(e, t, i) { var s = g.sum(e, t, i); return g.na(e.get(t - 1)) ? NaN : s / t }, g.smma = function(e, t, i) { var s = i.new_var(e), r = d.Std.sma(s, t, i), n = i.new_var(), o = (n.get(1) * (t - 1) + e) / t; return n.set(d.Std.na(n.get(1)) ? r : o), n.get(0) }, g.rma = function(e, t, i) { var s = g.sum(e, t, i), r = t - 1, n = e.get(r), o = i.new_var(), a = o.get(1), l = e.get(), c = g.na(n) ? NaN : g.na(a) ? s / t : (l + a * r) / t; return o.set(c), c }, g.fixnan = function(e, t) { var i = t.new_var(); return isNaN(e) ? i.get(1) : (i.set(e), e) }, g.tr = function(e, t) { 1 === arguments.length && (t = e, e = void 0); var i = void 0 !== e && !!e, s = t.new_var(g.close(t)), r = s.get(1); return i && isNaN(r) && (r = g.close(t)), g.max(g.max(g.high(t) - g.low( t), g.abs(g.high(t) - r)), g.abs(g.low(t) - r)) }, g.atr = function(e, t) { var i = t.new_var(g.tr(t)); return g.sma(i, e, t) }, g.ema = function(e, t, i) { var s = g.sum(e, t, i), r = i.new_var(), n = e.get(0), o = e.get(t - 1), a = r.get(1), l = g.na(o) ? NaN : g.na(a) ? s / t : 2 * (n - a) / (t + 1) + a; return r.set(l), l }, g.wma = function(e, t, i) { for (var s = 0, r = t = Math.round(t); r >= 0; r--) { s += (t - r) * e.get(r) } return 2 * s / (t * (t + 1)) }, g.vwma = function(e, t, i) { var s = i.new_var(g.volume(i)), r = i.new_var(e.get(0) * g.volume(i)); return g.sma(r, t, i) / g.sma(s, t, i) }, g.swma = function(e, t) { return (e.get(0) + 2 * e.get(1) + 2 * e.get(2) + e.get(3)) / 6 }, g.lowestbars = function(e, t, i) { return -b(e, t, 0, (function(e, t) { return g.lt(e, t) }), Number.MAX_VALUE).index }, g.lowest = function(e, t, i) { return b(e, t, 0, (function(e, t) { return g.lt(e, t) }), Number.MAX_VALUE).value }, g.highestbars = function(e, t, i) { return -b(e, t, 0, (function(e, t) { return g.gt(e, t) }), Number.MIN_VALUE).index }, g.highest = function(e, t, i) { return b(e, t, 0, (function(e, t) { return g.gt(e, t) }), Number.MIN_VALUE).value }, g.cum = function(e, t) { var i = t.new_var(), s = g.nz(i.get(1)) + e; return i.set(s), s }, g.accdist = function(e) { var t = g.high(e), i = g.low(e), s = g.close(e), r = g.volume(e); return g.cum(s === t && s === i || t === i ? 0 : r * (2 * s - i - t) / ( t - i), e) }, g.correlation = function(e, t, i, s) { var r = g.sma(e, i, s), n = g.sma(t, i, s), o = s.new_var(e.get() * t.get()); return (g.sma(o, i, s) - r * n) / Math.sqrt(g.variance2(e, r, i) * g .variance2(t, n, i)) }, g.stoch = function(e, t, i, s, r) { var n = g.highest(t, s), o = g.lowest(i, s); return g.fixnan(100 * (e.get() - o) / (n - o), r) }, g.tsi = function(e, t, i, s) { var r = s.new_var(g.change(e)), n = s.new_var(g.abs(g.change(e))), o = s.new_var(g.ema(r, i, s)), a = s.new_var(g.ema(n, i, s)); return g.ema(o, t, s) / g.ema(a, t, s) }, g.cross = function(e, t, i) { if (isNaN(e) || isNaN(t)) return !1; var s, r = i.new_var((s = e - t) < 0 ? -1 : 0 === s ? 0 : 1); return !isNaN(r.get(1)) && r.get(1) !== r.get() }, g.linreg = function(e, t, i) { for (var s = 0, r = 0, n = 0, o = 0, a = 0; a < t; ++a) { var l = e.get(a), c = t - 1 - a + 1; s += c, r += l, n += c * c, o += l * c } var h = (t * o - s * r) / (t * n - s * s); return r / t - h * s / t + h + h * (t - 1 - i) }, g.sar = function(e, t, i, s) { var r = s.new_var(), n = s.new_var(), o = s.new_var(), a = g.high(s), l = g.low(s), c = g.close(s), h = s.new_var(a), u = s.new_var(l), d = s.new_var(c), p = s.new_var(), _ = p.get(1), m = n.get(1), f = o.get(1); n.set(m), o.set(f); var b = !1, v = u.get(1), S = u.get(2), y = h.get(1), w = h.get(2), P = d.get(), C = d.get(1); 2 === g.n(s) && (g.greater(P, C) ? (r.set(1), o.set(h.get()), _ = v, f = h.get()) : (r.set(-1), o.set(u.get()), _ = y, f = u.get()), b = !0, n.set(e), m = e); var x = _ + m * (f - _); return 1 === r.get() ? g.greater(x, u.get()) && (b = !0, r.set(-1), x = Math.max(h.get(), o.get()), o.set(u.get()), n.set(e)) : g.less( x, h.get()) && (b = !0, r.set(1), x = Math.min(u.get(), o .get()), o.set(h.get()), n.set(e)), b || (1 === r.get() ? g .greater( h.get(), o.get()) && (o.set(h.get()), n.set(Math.min(n .get() + t, i))) : g.less(u.get(), o.get()) && (o.set(u .get()), n.set(Math.min(n.get() + t, i)))), 1 === r.get() ? (x = Math .min(x, v), g.n(s) > 2 && (x = Math.min(x, S))) : (x = Math.max( x, y), g.n(s) > 2 && (x = Math.max(x, w))), p.set(x), x }, g.alma = function(e, t, i, s) { for (var r = Math.floor(i * (t - 1)), n = t / s * (t / s), o = [], a = 0, l = 0; l < t; ++l) { var c = Math.exp(-1 * Math.pow(l - r, 2) / (2 * n)); a += c, o.push(c) } for (l = 0; l < t; ++l) o[l] /= a; var h = 0; for (l = 0; l < t; ++l) h += o[l] * e.get(t - l - 1); return h }, g.wvap = function(e, t) { return e.get() - e.get(1) }, g.change = function(e) { return e.get() - e.get(1) }, g.roc = function(e, t) { var i = e.get(t); return 100 * (e.get() - i) / i }, g.dev = function(e, t, i) { var s = g.sma(e, t, i); return g.dev2(e, t, s) }, g.dev2 = function(e, t, i) { for (var s = 0, r = 0; r < t; r++) { var n = e.get(r); s += g.abs(n - i) } return s / t }, g.stdev = function(e, t, i) { var s = g.variance(e, t, i); return g.sqrt(s) }, g.variance = function(e, t, i) { var s = g.sma(e, t, i); return g.variance2(e, s, t) }, g.variance2 = function(e, t, i) { for (var s = 0, r = 0; r < i; r++) { var n = e.get(r), o = g.abs(n - t); s += o * o } return s / i }, g.percentrank = function(e, t) { if (g.na(e.get(t - 1))) return NaN; for (var i = 0, s = e.get(), r = 1; r < t; r++) { var n = e.get(r); g.ge(s, n) && i++ } return 100 * i / t }, g.createNewSessionCheck = function(e) { if (void 0 === e.symbol.session.timezone) return function() { return !1 }; var t = m.newBarBuilder(e.symbol.period, e.symbol.session); return function(e) { return t.indexOfBar(e) === o.POST_SESSION && (t.moveTo(e), !0) } }, g.error = function(e) { throw new s(e) }, v.LOW = 0, v.HIGH = 1, v.prototype.isPivotFound = function() { return -1 !== this._pivotIndex.get() }, v.prototype.pivotIndex = function() { return this._pivotIndex.get() }, v.prototype.currentValue = function() { return this._currentValue.get() }, v.prototype.pivotType = function() { return this._pivotType }, v.prototype.reset = function() { this._currentValue.set(NaN), this._currentIndex.set(0), this._pivotIndex .set(-1) }, v.prototype.isRightSideOk = function(e) { return e - this._currentIndex.get() === this._areaRight }, v.prototype.isViolate = function(e, t) { if (e < 1 || isNaN(this._currentValue.get())) return !0; var i = this._series.get(this._index - e); return !!isNaN(i) || (i === this._currentValue.get() ? t : this ._pivotType === v.HIGH ? i > this._currentValue.get() : i < this ._currentValue.get()) }, v.prototype.processPoint = function(e) { this.isViolate(e, !1) && (this._currentValue.set(this._series.get()), this._currentIndex.set(e)) }, v.prototype.isRestartNeeded = function(e) { return e - this._currentIndex.get() > this._areaRight }, v.prototype.update = function() { if (this._isNewBar && this.isPivotFound() && this.reset(), this .processPoint(this._index), this.isRightSideOk(this._index)) { if (-1 === this._pivotIndex.get()) { for (var e = !0, t = 0; t < this._areaLeft; ++t) if (this.isViolate(this._currentIndex.get() - 1 - t, !0)) { e = !1; break } e && this._pivotIndex.set(this._currentIndex.get()) } } else -1 !== this._pivotIndex.get() && this._pivotIndex.set(-1); if (this.isRestartNeeded(this._index)) { this.reset(); for (t = 0; t <= this._areaRight; ++t) this.processPoint(this ._index - this._areaRight + t) } }, S.prototype.addPivot = function(e, t, i) { this._lastIndex.set(e), this._lastVal.set(t), this._lastType.set(i) }, S.prototype.updatePivot = function(e, t) { this._lastIndex.set(e), this._lastVal.set(t) }, S.prototype.lastPrice = function() { return this._lastVal.get() }, S.prototype.lastIndex = function() { return this._lastIndex.get() }, S.prototype.addPoint = function(e, t, i) { if (isNaN(this._lastVal.get())) this.addPivot(e, t, i); else { var s = this._lastVal.get(); if (this._lastType.get() !== i) Math.abs(s - t) / t > this ._deviation && this.addPivot(e, t, i); else(i === v.HIGH ? t > s : t < s) && this.updatePivot(e, t) } }, S.prototype.processPivot = function(e) { e.update(), this._isBarClosed && e.isPivotFound() && this.addPoint(e .pivotIndex(), e.currentValue(), e.pivotType()) }, g.zigzag = function(e, t, i) { return new S(e, t, i).lastPrice() }, g.zigzagbars = function(e, t, i) { var s = new S(e, t, i); return -1 === s.lastIndex() ? NaN : s.lastIndex() - g.n(i) }, y.prototype.new_sym = function(e, t, i, s) { return this.symbol.script.add_sym(e, t, i, s) }, y.prototype.select_sym = function(e) { this.symbol = this.symbol.script.get_sym(e) }, y.prototype.new_var = function(e) { var t = this.vars; t.length <= this.vars_index && t.push(new w(this.symbol)); var i = t[this.vars_index++]; return arguments.length > 0 && i.set(e), i }, y.prototype.new_unlimited_var = function(e) { var t = this.vars; t.length <= this.vars_index && t.push(new P(this.symbol)); var i = t[this.vars_index++]; return arguments.length > 0 && i.set(e), i }, y.prototype.new_ctx = function() { return this.ctx.length <= this.ctx_index && this.ctx.push(new y(this .symbol)), this.ctx[this.ctx_index++] }, y.prototype.prepare = function(e) { this.ctx_index = 0, this.vars_index = 0; for (var t = 0; t < this.vars.length; t++) this.vars[t].prepare(e); for (var i = 0; i < this.ctx.length; i++) this.ctx[i].prepare(e) }, y.prototype.maxAdditionalDepth = function() { if (null !== this.minimumAdditionalDepth) return this .minimumAdditionalDepth; for (var e = 0, t = 0; t < this.vars.length; t++) { var i = this.vars[t].mindepth; !isNaN(i) && i > e && (e = i) } return e }, y.prototype.stop = function() { this.symbol = null, this.vars = null }, y.prototype.setMinimumAdditionalDepth = function(e) { this.minimumAdditionalDepth = e }, w.prototype.valueOf = function() { return this.get(0) }, w.prototype.get = function(e) { return isNaN(e) && (e = 0), e = e || 0, this.hist ? e >= this.hist .length ? (console.error("not enough depth: " + this), NaN) : this ._get(e) : (this.mindepth = g.max(this.mindepth, e), NaN) }, w.prototype._get = function(e) { var t = this.hist_pos - e; return t < 0 && (t += this.hist.length), this.hist[t] }, w.prototype.set = function(e) { this.hist && (this.hist[this.hist_pos] = e, this.modified = !0) }, w.prototype.prepare = function(e) { e === this.symbol && (e.isNewBar ? (this.original = this.get(0), !this .modified && this.hist || this.add_hist()) : this.set(this .original), this.modified = !1) }, w.prototype.add_hist = function() { if (!this.hist) { var e = g.na(this.mindepth) ? g.max_series_default_size : g.max(this .mindepth + 1, 1); e = Math.round(e); for (var t = new Array(e), i = 0; i < e; i++) t[i] = NaN; this.hist = t, this.hist_pos = -1 } this.hist_pos = Math.min(this.hist_pos + 1, this.hist.length), this .hist_pos === this.hist.length && (this.hist_pos = this.hist .length - 1, this.hist.shift(), this.hist.push(NaN)), this.hist[ this.hist_pos] = this.original }, w.prototype.adopt = function(e, t, i) { this.hist || (this.mindepth = NaN); var s = t.get(), r = e.indexOf(s); if (0 !== i) { var n = t.get(1); if (!g.na(n)) r = r === e.indexOf(n) ? -1 : r } return r < 0 ? NaN : this._get(r) }, w.prototype.indexOf = function(e) { if (!this.hist) return this.mindepth = NaN, -1; if (g.na(e)) return -1; var t = this.hist.length, i = this.symbol.index + 1, s = Math.min(t, i), n = r.upperbound_int(this.hist, e, 0, s); return 0 === n ? -1 : s - n }, n(P, w), P.prototype.add_hist = function() { if (this.hist || (this.hist = new Float64Array(2e3), this.hist_pos = - 1), this.hist_pos = this.hist_pos + 1, this.hist_pos === this .hist .length) { var e = new Float64Array(2 * this.hist.length); e.set(this.hist), this.hist = e } this.hist[this.hist_pos] = this.original }, C.prototype.set_symbolinfo = function(e) { e || console.error("WARN: symbolinfo isn't defined for " + this .tickerid), this.info = e, this.minTick = e.minmov / e .pricescale, this.currencyCode = e.currency_code, this.unitId = e .unit_id, this.timezone = _.get_timezone(e.timezone), this.session .init(e.timezone, e.session, e.session_holidays, e.corrections) }, C.prototype.isdwm = function() { return "" !== this.resolution && "S" !== this.resolution && "T" !== this .resolution }, C.prototype.enable_dwm_aligning = function(e, t) { this.dwm_aligner = m.newBarBuilder(this.period, e, t) }, C.prototype.bartime = function() { var e = this.time; if (!this.isdwm() || isNaN(e)) return e; var t = _.utc_to_cal(this.timezone, e); return this.session.spec.correctTradingDay(t), _.cal_to_utc(this .timezone, t) }, C.prototype.lastbar = function(e) { if (!isNaN(e.time)) { var t = e.time; this.dwm_aligner && (this.dwm_aligner.moveTo(t), t = this .dwm_aligner.startOfBar(0)); var i = this.time !== t; i && this.index >= 0 && !this.isBarClosed && (this.isNewBar = !1, this.isBarClosed = !0, this.script.calc(this)), this.time = t, this.open = e.open, this.high = e.high, this.low = e.low, this.close = e.close, this.volume = e.volume, this.updatetime = e.updatetime, this.isNewBar = i, this.isBarClosed = e .isBarClosed, this.isLastBar = e.isLastBar, this.isNewBar && ( this.index++, this.isFirstBar = 0 === this.index), this .script.calc(this) } }, x.prototype.calc = function(e) { var t = this.ctx, i = this.body; t.prepare(e); var s = i.main(t, this.inputCallback, e); if (s && "composite" === s.type) for (let e = 0; e < s.data.length; ++e) this._processResult(s.data[ e]); else this._processResult(s) }, x.prototype._processResult = function(e) { var t = this.ctx, i = this; this.out && e && (!isNaN(t.symbol.time) || e.nonseries) && (e .nonseries ? ("projection" === e.type && (e.projectionTime = t .symbol.time), this.nonseriesOut(t.symbol, e)) : e.bars ? e .bars.forEach((function(e) { i.out(t.symbol, e) })) : this.out(t.symbol, e)) }, x.prototype.init = function() { var e = this.ctx, t = this.body; t.init && t.init(e, this.inputCallback), t.main(e, this.inputCallback) }, x.prototype.add_sym = function(e, t, i, s, r) { var n = this.runner.add_sym(e, t, i, s, this, r); return this.symbols.push(n), n.isdwm() && this.symbols.length > 1 && n .enable_dwm_aligning(this.symbols[0].session, n.session), n }, x.prototype.maxAdditionalDepth = function() { return this.symbols[0].isAdditionalDepthAllowed ? this.ctx .maxAdditionalDepth() : 0 }, x.prototype.stop = function() { this.symbols = null, this.ctx.stop(), this.ctx = null }, x.prototype.get_sym = function(e) { return this.symbols[e] }, T.prototype.add_sym = function(e, t, i, s, r, n) { var o = new C(e, t, i, s, r, n); return this.symbols.push(o), o }, T.prototype.get_sym = function(e) { return this.symbols[e] }, T.prototype.out = function(e, t) { if (this.nonseriesUpdate) { var i = Object.assign({}, this.nonseriesUpdate); t.splice(0, 0, e.time), i.lastBar = t, this.host.nonseriesOut(e, i) } else this.host.out(e, t) }, T.prototype.start = function() { this.isStarted = !0; var e = this.host; this._script = new x(e.tickerid, e.period, e.currencyCode, e.unitId, this, e.body, this.out.bind(this), e.input, e.nonseriesOut, e .symbolInfo); var t = this, i = [], s = this.symbols, r = Object.assign({}, e.dataRange, { countBack: e.dataRange.countBack + t._script .maxAdditionalDepth() }), n = s[0]; function o(t, s, r) { i.push(T.feed.subscribe(t.tickerid, t.currencyCode, t.unitId, t .period, r, e.onErrorCallback, e.symbolInfo, e .sessionId, s, e.forceAlignBars)) } function h(i, s) { "series" === (s.nonseries ? "nonseries" : "series") ? t.update(i, s): s.lastBar ? (t.nonseriesUpdate = s, s.lastBar .isLastBar = ! 0, t.symbols[0].lastbar(s.lastBar), t.nonseriesUpdate = null ) : e.nonseriesOut(p, s) } function u() { return r } o(n, u, (function(e) { !e.nonseries && Number.isFinite(e.firstLoadedTimeMs) && function(e) { function i(i, s) { var r = c(i, s)(e), n = l(i, s); return null !== n && (r = n .timeToExchangeTradingDay(r)), { to: r, countBack: t._script .maxAdditionalDepth() } } for (var r = 1; r < s.length; r++) { var u = s[r], d = u.period; a.isEqual(d, n.period) || o(u, i.bind(null, d), h.bind(null, r)) } }(e.firstLoadedTimeMs), h(0, e) })); for (var d = 1; d < s.length; d++) { var p = s[d]; a.isEqual(p.period, n.period) && o(p, u, h.bind(null, d)) } this.subscription = i }, T.prototype.stop = function() { var e = this.subscription; if (e || this._script) { for (var t = 0; t < e.length; t++) T.feed.unsubscribe(e[t]); this.subscription = null, this._script.stop(), this._script = null, this.symbols = null, this.isStarted = !1 } else console.warn("Recurring script engine stop happened.") }, T.prototype.update = function(e, t) { if (t) { var i = this.symbols[e]; if (this.isRecalculated) { var s = t.bar(t.count() - 1); s.isBarClosed = t.isLastBarClosed(), s.isLastBar = !0, i .lastbar(s) } else this.barsets[e] || (this.barsets[e] = t, i.set_symbolinfo(t .symbolinfo()), this.recalc()) } else console.error("Unexpected barset = null") }, T.prototype.recalc = function() { for (var e = this.symbols, t = 0; t < e.length; t++) if (!this.barsets[t]) return; try { for (var i = e.length - 1; i >= 0; i--) for (var s = e[i], r = this.barsets[i], n = r.count(), o = 0; o < n; o++) { var a = r.bar(o); a.isLastBar = o === n - 1, a.isBarClosed = !a.isLastBar || r .isLastBarClosed(), s.lastbar(a) } this.isRecalculated = !0, this.barsets[0] && this.barsets[0] .endOfData && this.host.setNoMoreData(), this.host.recalc( this, { endOfData: this.barsets[0].endOfData, firstLoadedTimeMs: this.barsets[0].firstLoadedTimeMs }) } catch (e) { if (!e.studyError) throw e; this.host.onErrorCallback(e.message) } }, T.feed = { subscribe: function(e, t, i, s, r) { console.error("must be initialized with setupFeed") }, unsubscribe: function(e) { console.error("must be initialized with setupFeed") } }, I.prototype.stop = function() { this.runner.stop() }, I.prototype.isStarted = function() { return this.runner.isStarted }, M.prototype.symbolinfo = function() { return this.info }, M.prototype.isLastBarClosed = function() { return this.isBarClosed }, M.prototype.setLastBarClosed = function(e) { this.isBarClosed = e }, M.prototype.bar = function(e) { return this.bars[e] }, M.prototype.count = function() { return this.bars.length }, M.prototype.add = function(e, t) { var i = e, s = this.bars, r = s.length, n = i.time, o = 0 === r ? NaN : s[r - 1].time; 0 === r || o < n ? s.push(i) : o === n ? s[r - 1] = i : console.error( "time order violation, prev: " + new Date(o).toUTCString() + ", cur: " + new Date(n).toUTCString()), this.isBarClosed = !!t }, O.prototype.init = function(e) { this.bb = m.newBarBuilder(this.period, e.symbol.session), this .bbEmptyBars = this.generateEmptyBars ? m.newBarBuilder(this.period, e.symbol.session) : void 0, e.setMinimumAdditionalDepth(0) }, O.prototype.extrapolate = function(e, t) { return isNaN(e) || isNaN(t) ? void 0 : f(this.bbEmptyBars, e, t, Number .MAX_SAFE_INTEGER, !0).times }, O.prototype.main = function(e) { var t = e.symbol.time, i = this.bb.alignTime(t), s = e.new_var(i), r = g.na(i), n = s.get(1), o = g.na(n) ? 1 : g.neq(i, n), a = e.new_var(), l = e.new_var(), c = e.new_var(), h = e.new_var(), u = a.get(1), d = l.get(1), p = c.get(1), _ = h.get(1), m = r ? NaN : o ? g.open(e) : u, f = r ? NaN : o ? g.high(e) : g.max(g.high(e), d), b = r ? NaN : o ? g.low(e) : g.min(g.low(e), p), v = r ? NaN : g.close(e), S = r ? NaN : o ? g.volume(e) : g.volume(e) + _, y = r ? NaN : t, w = e.symbol.isBarClosed && this.bb.isLastBar(0, t), P = this.generateEmptyBars && o ? this.extrapolate(n, i) : void 0, C = e.new_var(g.close(e)).get(1), x = P instanceof Array ? C : NaN; return a.set(m), l.set(f), c.set(b), h.set(S), [i, m, f, b, v, S, y, w, P, x ] }, L.prototype.main = function(e) { return [g.open(e), g.high(e), g.low(e), g.close(e), g.volume(e), g .updatetime(e) ] }, { Std: g, Series: w, Symbol: C, SymbolInfo: function(e, t) { this.timezone = e || "America/New_York", this.session = t || "0000-0000" }, StudyEngine: I, BarSet: M, OHLCV: L, BarBuilder: O, setupFeed: function(e) { T.feed = e }, getVolumeProfileResolutionForPeriod: function(t, i, s, r) { return void 0 !== e ? e(t, i, s, r) : t }, overwriteVolumeProfileResolutionForPeriodGetter: function(t) { e = t } } }(); e.exports = d }).call(this, i("yLpj")) }, ocrj: function(e, t, i) { "use strict"; i.r(t), i.d(t, "RemoveSourcesCommand", (function() { return u })); var s = i("Eyy1"), r = i("RDU5"), n = i("CW80"), o = i("txPx"), a = i("pQ+n"), l = i("3ClC"), c = i("jpZi"); const h = Object(o.getLogger)("Chart.RemoveSourcesCommand"); class u extends r.UndoCommand { constructor(e, t, i) { super(i), this._excludeLineToolsUndoCommands = [], this._initialPriceScaleMode = null, this._chartModel = e, this._sourceIds = Object(a.a)(e, t).map(e => e .id()), this._sourceStates = [], this._paneIndexes = [], this ._priceScalePositionIds = [], this._paneStates = [], this ._restorePanes = []; const r = t[0]; 1 === t.length && Object(l.isStudy)(r) && (this._initialPriceScaleMode = Object( s.ensureNotNull)(r.priceScale()).mode()) } removedIds() { return this._sourceIds } redo() { this._chartModel.panes().length; const e = this._sourceIds.map(e => Object(s.ensureNotNull)(this._chartModel .dataSourceForId(e))); this._sourceStates = e.map(e => Object(s.ensureNotNull)(e.state(!1))); const t = e.map(e => Object(s.ensureNotNull)(this._chartModel.paneForSource( e))); this._paneIndexes = t.map(e => this._chartModel.panes().indexOf(e)); const i = this._chartModel.lineToolsGroupModel(), r = new Map; e.forEach(e => { if (Object(n.isLineTool)(e)) { const t = i.groupForLineTool(e); if (null !== t) { const i = r.get(t) || []; i.push(e), r.set(t, i) } } }), r.forEach((e, t) => { const i = new c.a(this._chartModel, t, e); i.redo(), this._excludeLineToolsUndoCommands.push(i) }), this._priceScalePositionIds = e.map((e, i) => { if (Object(n.isLineTool)(e)) return null; const s = e.priceScale(); if (null === s) return null; const r = t[i].priceScalePosition(s); return { id: s.id(), position: r, priceScaleIndex: t[i].priceScaleIndex(s, r) } }); const o = new Set; e.forEach((e, t) => { Object(n.isLineTool)(e) || o.add(this._paneIndexes[t]) }), this._paneStates = e.map((e, i) => { const s = this._paneIndexes[i]; return o.has(s) ? t[i].state(!1, !0) : null }), this._restorePanes = e.map(e => this._chartModel.removeSource(e)) } undo() { const e = []; for (let t = this._sourceStates.length - 1; t >= 0; t--) { const i = this._chartModel.restoreSource(this._restorePanes[t], this ._paneIndexes[t], this._paneStates[t], this._sourceStates[t], this ._priceScalePositionIds[t]); i && e.push(i) } e.some((t, i) => t.id() !== this._sourceIds[e.length - i - 1]) && h.logError( "Source was restored improperly - source ids does not match"), null !== this._initialPriceScaleMode && Object(s.ensureNotNull)(e[0].priceScale()) .setMode(this._initialPriceScaleMode), this._excludeLineToolsUndoCommands .forEach(e => e.undo()) } } }, odCa: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("fgLi").DataSource, n = i("tc+8"), o = i("Ocx9").DefaultProperty, a = i("jTis").CalloutConsts, l = i("j3hX").LineToolColorsProperty; class c extends s { constructor(e, t) { super(e, t || c.createProperties()), this._barOffset = 0, this._timeScale = e .timeScale(), i.e("lt-pane-views").then(i.t.bind(null, "B4Hi", 7)).then(({ CalloutPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 2 } name() { return "Callout" } _correctPoints(e) { var t = this._currentMovingPoint.logical.index - this._startMovingPoint.logical .index, i = this._currentMovingPoint.logical.price - this._startMovingPoint.logical .price, s = e[1]; s.index += t, s.price += i, e[1] = s } addPoint(e) { var t = s.prototype.addPoint.call(this, e); return t && this._calculateBarOffset(), t } _calculateBarOffset() { this.points().length > 1 && (this._barOffset = this.points()[1].index - this .points()[0].index) } setLastPoint(e) { super.setLastPoint(e), 2 === this.points().length && this._calculateBarOffset() } setPoint(e, t) { switch (e) { case 0: super.setPoint(e, t), this._calculateBarOffset(); break; case 1: var i = this.properties(); if (!i.wordWrapWidth) return; var s = this._points, r = this._dragStartLeftEdgeIndex, n = Math.round((t.index - r) / 2); if (isFinite(r) && isFinite(n)) { s[1] = { index: r + n, price: s[1].price }, this._calculateBarOffset(), this.normalizePoints(); var o = this._timeScale.indexToCoordinate(r + 2 * n) - this._timeScale .indexToCoordinate(r) - a.RoundRadius - a.TextMargins; if (!isFinite(o)) return; i.wordWrapWidth.setValue(Math.max(a.MinWidth, o)); break } s[1] = t, this._calculateBarOffset(), this.normalizePoints() } } setPoints(e) { super.setPoints(e); var t = this.properties(); if (t.wordWrapWidth) { var i = this._dragStartLeftEdgeIndex, s = Math.round((e[1].index - i) / 2); if (this._calculateBarOffset(), this.normalizePoints(), isFinite(i) && isFinite( s)) { var r = this._timeScale.indexToCoordinate(i + 2 * s) - this._timeScale .indexToCoordinate(i) - a.RoundRadius - a.TextMargins; if (!isFinite(r)) return; t.wordWrapWidth.setValue(Math.max(a.MinWidth, r)) } } } _onPointsetUpdated(e) { super._onPointsetUpdated(e), 0 !== e.length && (this._dragStartLeftEdgeIndex = this .points()[1].index) } move(e, t, i) { super.move(e, t, i), this._calculateBarOffset() } state(e) { var t = s.prototype.state.call(this, e); return t.barOffset = this._barOffset, t } restoreData(e) { e.barOffset ? this._barOffset = e.barOffset : this._calculateBarOffset(), this ._calculatePoint2() } setPriceScale(e) { r.prototype.setPriceScale.call(this, e), e && e.priceRange() && this ._calculatePoint2() } template() { var e = s.prototype.template.call(this); return e.text = this.properties().childs().text.value(), e } _applyTemplateImpl(e) { super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text) } _calculatePoint2() { if (!(this._model.lineBeingEdited() === this || this._model.sourcesBeingMoved() .includes(this) || this._points.length < 2)) { var e = this.points()[0], t = this.points()[1]; this._points[1] = { price: t.price, index: e.index + this._barOffset } } } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "xhf0"))) .CalloutDefinitionsViewModel } static createProperties(e) { var t = new o("linetoolcallout", e); return c._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e), e.hasChild("text") || e.addChild("text", new n(window.t( "Text"))), e.addExclusion("text"), e.addChild("textsColors", new l([e.childs().color])) } } t.LineToolCallout = c }, oiZD: function(e, t, i) { "use strict"; i.r(t); var s = i("hY0g"), r = i.n(s); i.d(t, "watchedTheme", (function() { return n })), i.d(t, "setTheme", (function() { return o })); const n = new r.a; function o(e) { n.setValue(e) } n.subscribe(e => { ! function(e, t = window) { const i = "theme-" + e, s = t.document.documentElement.classList; for (const e of Array.from(s)) e.startsWith("theme-") && e !== i && s.remove(e); s.add(i) }(e, window) }) }, okVO: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SyncModel", (function() { return o })); var s = i("IiTo"), r = i("IDnv"); let n = 0; class o { constructor(e, t) { this._extrapolatedData = [], this._cacheForFuture = !1, this._modelId = n++, this ._builderCache = null, this._resolution = t, this._symbolInfo = e, this._valid = Boolean(e.timezone) && Boolean(e.session), this._session = new s.SessionInfo(e .timezone, e.session, e.session_holidays, e.corrections) } getSymbolInfo() { return this._symbolInfo } getSession() { return this._session } getResolution() { return this._resolution } uniqueId() { return this._modelId } distance(e, t) { if (!this.isValid()) return { success: !1 }; if (e > t) return { success: !1 }; if (e === t) return { success: !0, result: 0 }; let i = this._extrapolatedData.length, s = 0 !== i ? this._extrapolatedData[0] : null, n = null !== s ? this._extrapolatedData[i - 1] : null; const o = e < t; if (1e3 * e === s && this._cacheForFuture === o || (this._extrapolatedData = [1e3 * e ], i = 1, s = null, n = null), null === s || null !== n && 1e3 * t > n) { const s = Object(r.extrapolateBarsFrontToTime)(this._barBuilder(), n || 1e3 * e, 1e3 * t, 2e3, !0); this._extrapolatedData = this._extrapolatedData.concat(s.times), i = this ._extrapolatedData.length, this._cacheForFuture = o } if (n = this._extrapolatedData[i - 1], n < 1e3 * t) return { success: !1 }; const a = this._extrapolatedData.indexOf(1e3 * t); return -1 === a ? { success: !1 } : { success: !0, result: a } } projectTime(e, t) { if (!this.isValid()) return e; let i = this._extrapolatedData.length, s = i > 0 ? this._extrapolatedData[0] : null, n = null !== s ? this._extrapolatedData[i - 1] : null; const o = t >= 0; 1e3 * e === s && this._cacheForFuture === o || (this._extrapolatedData = [1e3 * e], i = 1, s = null, n = null); const a = Math.abs(t); if (null === s || a >= i) { const s = Object(r.extrapolateBarsFrontByCount)(this._barBuilder(), n || 1e3 * e, Math.sign(t) * (a - i + 1), !0); this._extrapolatedData = this._extrapolatedData.concat(s.times), i = this ._extrapolatedData.length, this._cacheForFuture = o } return i < a ? e : this._extrapolatedData[a] / 1e3 } isValid() { return this._valid } dataSize() { return this._extrapolatedData.length } createNewModelWithResolution(e) { return new o(this._symbolInfo, e) } _barBuilder() { return null === this._builderCache && (this._builderCache = Object(s.newBarBuilder)( this._resolution, this._session, this._session)), this._builderCache } } }, onDC: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("aO4+"), n = i("vwKG"), o = i("4O8T"), a = i.n(o), l = i("0YCj"), c = i.n(l), h = i("txPx"); const u = window.t("Move All Scales To Left"), d = window.t("Move All Scales To Right"), p = Object(h.getLogger)("Chart.MergeAllScales"); var _ = i("MY2c"), m = i("RDU5"); class f extends m.UndoCommand { constructor(e, t, i, s, r, n) { super(n), this._model = e, this._paneIndex = e.panes().indexOf(t), this ._targetPosition = s, this._targetIndex = r, this._scaleId = i.id(), this._sourcePosition = t .priceScalePosition(i), "overlay" !== this._sourcePosition && (this ._sourceIndex = t.priceScaleIndex(i, this._sourcePosition)) } redo() { const e = this._model.panes()[this._paneIndex], t = Object(s.ensureNotNull)(e.getPriceScaleById(this._scaleId)); e.movePriceScale(t, this._targetPosition, this._targetIndex), this._model .fullUpdate() } undo() { const e = this._model.panes()[this._paneIndex], t = Object(s.ensureNotNull)(e.getPriceScaleById(this._scaleId)); e.movePriceScale(t, this._sourcePosition, this._sourceIndex), this._model .fullUpdate() } } var g = i("CW80"); class b extends m.UndoCommand { constructor(e, t, i, s) { super(s), this._createdIds = [], this._model = e, this._withoutShift = i, this ._origStates = t.map(e => e.state(!0)); const r = e.lineToolsGroupModel(); this._origGroups = t.map(e => { const t = r.groupForLineTool(e); return t && t.id }) } redo() { const e = this._model.lineToolsGroupModel(), t = this._origStates.map((t, i) => { const r = Object(s.ensureNotNull)(this._model.dataSourceForId(t .id)), n = 0 === this._createdIds.length ? void 0 : Object(s .ensureDefined)(this._createdIds[i]), o = Object(g.cloneLineTool)(this._model, r, !this._withoutShift, n), a = Object(s.ensureNotNull)(r.priceScale()); Object(s.ensureNotNull)(this._model.paneForSource(r)).addDataSource( o, a, !1); const l = this._origGroups[i]; if (null !== l) { const t = e.groupForId(l); t && t.addLineTools([o]) } return this._model.updateSource(o), o }); 0 === this._createdIds.length && (this._createdIds = t.map(e => e.id())), this ._model.selectionMacro(e => { e.clearSelection(), t.forEach(t => { e.addSourceToSelection(t) }) }), this._model.setShouldBeSavedEvenIfHidden(!0) } undo() { const e = this._model.lineToolsGroupModel(); this._createdIds.forEach(t => { const i = Object(s.ensureNotNull)(this._model.dataSourceForId(t)), r = e.groupForLineTool(i); null !== r && r.excludeLineTool(i), this._model.removeSource(i) }) } newIds() { return this._createdIds } } var v = i("ocrj"), S = i("jpZi"), y = i("ogJP"); class w extends m.UndoCommand { constructor(e, t, i, s = !0) { super(i, s), this._newStates = [], this._model = e, this._savedStates = t.map( e => e.state(!1)) } redo() { this._applyState(this._newStates) } undo() { 0 === this._newStates.length && this.saveNewState(), this._applyState(this ._savedStates) } saveNewState() { const e = this._savedStates.filter(y.notNull).map(e => Object(s.ensureNotNull)( this._model.dataSourceForId(e.id))); this._newStates = e.map(e => e.state(!1)) } _applyState(e) { for (const t of e) if (null !== t) { const e = this._model.dataSourceForId(t.id); null !== e && this._model.restoreLineToolState(e, t) } } } var P = i("HGup"), C = i("jRfx"), x = i("s1Gx"), T = i("0qMc"); class I extends m.UndoCommand { constructor(e, t, i, s, r = !0) { super("Create " + T.lineToolsLocalizedNames[i], !1), this._lineId = null, this ._lineState = null, this._model = e, this._paneIndex = e.panes().indexOf(t), this._lineTool = i, this._ownerSourceId = s.id(), this ._needCopyToOtherCharts = r } startCreatingLine(e, t, i) { const s = this._model.panes()[this._paneIndex], r = this._model.dataSourceForId(this._ownerSourceId), n = this._model.createLineTool(s, e, this._lineTool, t, i, r); return this._lineId = n.id(), !this._model.lineBeingCreated() } continueCreatingLine(e, t, i, s) { const r = this._model.continueCreatingLine(e, t, i, s); return r && this._model.setShouldBeSavedEvenIfHidden(!0), r } line() { return null === this._lineId ? null : this._model.dataSourceForId(this._lineId) } undo() { const e = this.line(); null !== e && (this._lineState = e.state(!1), this._model.removeSource(e), this ._lineId = null) } redo() { if (null === this._lineState) return; const e = this._model.restoreSource(!1, this._paneIndex, null, Object(s .ensureNotNull)(this._lineState), null); null !== e && (this._lineId = e.id(), this._lineState = null) } needCopyToOtherCharts() { return this._needCopyToOtherCharts } } var M = i("GVQo"); class O extends m.UndoCommand { constructor(e, t, i) { super(i), this._sourcesByPanes = new Map, this._originalState = new Map, this ._model = e, t.forEach(t => { const i = Object(s.ensureNotNull)(e.paneForSource(t)), r = e.panes().indexOf(i), n = this._sourcesByPanes.get(r) || []; n.push(t.id()), this._sourcesByPanes.set(r, n) }), Array.from(this._sourcesByPanes.keys()).forEach(t => { const i = e.panes()[t], s = new Map; i.sourcesByGroup().allIncludingHidden().forEach(e => { s.set(e.id(), e.zorder()) }), this._originalState.set(t, s) }) } undo() { this._originalState.forEach((e, t) => { const i = this._model.panes()[t], r = new Map; e.forEach((e, t) => { const n = Object(s.ensureNotNull)(i.dataSourceForId(t)); r.set(n, e) }), i.setZOrders(r) }) } redo() { this._sourcesByPanes.forEach((e, t) => { const i = this._model.panes()[t], r = e.map(e => Object(s.ensureNotNull)(i.dataSourceForId(e))); this._paneOperation(i, r) }) } } class L extends O { constructor(e, t) { super(e, t, `Bring ${t[0].title()} to front`) } _paneOperation(e, t) { e.bringToFront(t) } } class A extends O { constructor(e, t) { super(e, t, `Send ${t[0].title()} to back`) } _paneOperation(e, t) { e.sendToBack(t) } } class E extends O { constructor(e, t, i, s) { super(e, t, s), this._targetSource = i } _paneOperation(e, t) { e.insertAfter(t, this._targetSource) } } class k extends E { constructor(e, t, i) { super(e, t, i, `Insert ${t[0].title()} after ${i.title()}`) } } class D extends O { constructor(e, t, i, s) { super(e, t, s), this._targetSource = i } _paneOperation(e, t) { e.insertBefore(t, this._targetSource) } } class V extends D { constructor(e, t, i) { super(e, t, i, `Insert ${t[0].title()} before ${i.title()}`) } } function B(e, t) { const i = t[0], s = e.sourcesByGroup().all().filter(e => e.zorder() < i.zorder()); if (0 === s.length) throw new Error("Cannot move backward source that alreadt on back"); let r = s[s.length - 1]; if (Object(g.isLineTool)(r)) { const t = e.model().lineToolsGroupModel().groupForLineTool(r); null !== t && (r = t.lineTools()[0]) } return r } class R extends D { constructor(e, t, i) { super(e, i, B(t, i), `Send ${i[0].title()} backward`) } } function N(e, t) { const i = t[t.length - 1], s = e.sourcesByGroup().allExceptSpecialSources().filter(e => e.zorder() > i.zorder()); if (0 === s.length) throw new Error("Cannot bring forward source that alreadt on back"); let r = s[0]; if (Object(g.isLineTool)(r)) { const t = e.model().lineToolsGroupModel().groupForLineTool(r); if (null !== t) { const e = t.lineTools(); r = e[e.length - 1] } } return r } class j extends E { constructor(e, t, i) { super(e, i, N(t, i), `Send ${i[0].title()} backward`) } } function F(e, t) { return Object(s.ensureNotNull)(e.paneForSource(t.lineTools()[0])) } class W extends D { constructor(e, t) { super(e, t.lineTools(), B(F(e, t), t.lineTools()), `Send Group ${t.name()} backward`) } } class H extends E { constructor(e, t) { super(e, t.lineTools(), N(F(e, t), t.lineTools()), `Bring Group ${t.name()} backward`) } } class U extends m.UndoCommand { constructor(e, t, i) { super("Rearrange panes"), this._chartModel = e, this._index = t, Object(y .isNumber)(i) ? this._dstIndex = i : this._dstIndex = "up" === i ? t - 1 : t + 1 } redo() { this._checkIndices() && this._chartModel.movePane(this._index, this._dstIndex) } undo() { this._checkIndices() && this._chartModel.movePane(this._dstIndex, this._index) } _checkIndices() { const e = this._chartModel.panes().length; return this._index >= 0 && this._index < e && this._dstIndex >= 0 && this ._dstIndex < e } } var z = i("XcdR"), G = i("Fixu"), q = i("Ocx9"), Y = i("n5al"), K = i("PT1i"), J = i("pPtI"); class Z extends m.UndoCommand { constructor(e, t, i, s, r, n) { super(s), this._prevPriceAxisProps = {}, this._property = e, this._mainSeries = i, this._value = t, this._model = r, this._chartWidget = n } redo() { const e = this._mainSeries, t = e.properties(); t.style === this._property && e.isNeedRestart(this._value) && this._chartWidget .screen.show(), this._prevResolution = t.interval.value(), this._prevValue = this._property.value(), this._storePriceAxisProps(), Object(q .saveDefaultProperties)(!0); const i = t.interval.value(), s = this._model.defaultResolutions(), r = Object(J.getResolutionByChartStyle)(this._value, i, s); K.linking.interval.setValue(r), e.setChartStyleWithIntervalIfNeeded(this._value, r), Object(Y.setLastUsedStyle)(this._value), Object(Y .preparePriceAxisProperties)(t), Object(q.saveDefaultProperties)(!1), this._invalidateModel() } undo() { const e = this._mainSeries; e.properties().style === this._property && e.isNeedRestart(this._value) && this ._chartWidget.screen.show(), Object(q.saveDefaultProperties)(!0), e .setChartStyleWithIntervalIfNeeded(this._prevValue, this._prevResolution), this._restorePriceAxisProps(), K.linking.interval.setValue(this ._prevResolution), Object(q.saveDefaultProperties)(!1), this ._invalidateModel() } _storePriceAxisProps() { const e = this._mainSeries.priceScale(); this._prevPriceAxisProps = e.mode() } _restorePriceAxisProps() { this._mainSeries.priceScale().setMode(this._prevPriceAxisProps) } _invalidateModel() { this._model && (this._model.recalculateAllPanes(), this._model.lightUpdate()) } } var X = i("ufwo"), $ = i("LxhU"); class Q extends m.UndoCommand { constructor(e, t) { super("Change date range"), this._modelsData = [], this._rangeOptions = t, this ._modelsData.push({ model: e, prevResolution: e.mainSeries().properties().interval.value(), barSpacing: e.timeScale().barSpacing(), rightOffset: e.timeScale().rightOffset(), rangeOptions: e.appliedTimeFrame().value() }) } redo() { const e = []; for (const t of this._modelsData) { const i = t.model.mainSeries(), s = i.properties().interval; $.Interval.isEqual(this._rangeOptions.res, s.value()) ? i.loadDataTo(this ._rangeOptions.val) : (e.push(s), i.setDefaultTimeframe(this ._rangeOptions.val), s.setValueSilently(this._rangeOptions.res)) } for (const t of e) t.listeners().fire(t) } undo() { const e = []; for (const t of this._modelsData) { const i = t.model.mainSeries(), s = i.properties().interval; t.prevResolution !== s.value() ? (e.push(s), null !== t.rangeOptions && i.setDefaultTimeframe(t.rangeOptions .val), s.setValueSilently(t.prevResolution)) : null !== t .rangeOptions && i.loadDataTo(t.rangeOptions.val); const r = t.model.timeScale(); r.setBarSpacing(t.barSpacing), r.setRightOffset(t.rightOffset) } for (const t of e) t.listeners().fire(t) } canMerge(e) { return e instanceof Q && Object(X.rangesAreEqual)(e._rangeOptions, this ._rangeOptions) } merge(e) { if (!(e instanceof Q)) throw new Error("Invalid command to merge"); this._modelsData = this._modelsData.concat(e._modelsData) } } var ee = i("//lZ"), te = i("UqOQ"); i("YFKU"), i("HbRj"); class ie extends m.UndoCommand { constructor(e, t, i) { super(i), this._model = e, this._groupId = t.id, this._groupName = t.name(), this._lineToolsIds = t.lineTools().map(e => e.id()) } redo() { const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId( this._groupId)); this._model.lineToolsGroupModel().removeGroup(e) } undo() { const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)), t = new te.a(e, this._groupName, this._groupId); this._model.lineToolsGroupModel().addGroup(t) } } const se = window.t("Create line tools group"); class re extends m.UndoCommand { constructor(e, t) { super(se), this._groupId = null, this._model = e, this._sourcesIds = t.map(e => e.id()) } redo() { const e = this._sourcesIds.map(e => this._model.dataSourceForId(e)), t = null === this._groupId ? void 0 : this._groupId; this._groupId = this._model.lineToolsGroupModel().createGroup(e, this._title, t) .id } undo() { const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId( Object(s.ensureNotNull)(this._groupId))); this._model.lineToolsGroupModel().removeGroup(e) } createdGroupId() { return this._groupId } } const ne = window.t("Add line tool(s) {lineTool} to group {group}"); class oe extends m.UndoCommand { constructor(e, t, i) { super(ne.format({ group: t.name() })), this._model = e, this._groupId = t.id, this._lineToolsIds = i.map(e => e.id()) } redo() { const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId( this._groupId)), t = this._lineToolsIds.map(e => this._model.dataSourceForId(e)); e.addLineTools(t) } undo() { const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)); Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(this ._groupId)).excludeLineTools(e) } } var ae = i("bJYc"); class le extends m.UndoCommand { constructor(e, t, i, s) { super(s), this._chartModel = e, this._groupId = t.id, this._oldName = t.name(), this._newName = i } redo() { Object(s.ensureNotNull)(this._chartModel.lineToolsGroupModel().groupForId(this ._groupId)).setName(this._newName) } undo() { Object(s.ensureNotNull)(this._chartModel.lineToolsGroupModel().groupForId(this ._groupId)).setName(this._oldName) } } var ce = i("mMWL"); const he = window.t("Create line tools group from selection"), ue = window.t("Removing line tools group {name}"), de = window.t("Add line tool {lineTool} to group {name}"), pe = window.t("Make group {group} visible"), _e = window.t("Make group {group} invisible"), me = window.t("Lock group {group}"), fe = window.t("Unlock group {group}"), ge = window.t("Rename group {group} to {newName}"); class be { constructor(e) { this._environment = e } createGroupFromSelection() { const e = this._environment.model(); Object(s.assert)(!e.selection().isEmpty(), "Cannot create group from empty selection"); const t = Object(x.sortSources)(e.selection().lineDataSources()); Object(s.assert)(t.length === e.selection().allSources().length, "A group could contain line tools only"); const i = t.reduce((e, t) => e.zorder() > t.zorder() ? e : t, t[0]); let r = i; const n = e.lineToolsGroupModel().groupForLineTool(i); if (null !== n) { const e = n.lineTools(); r = e[e.length - 1] } this._environment.beginUndoMacro(he); const o = new Map, a = new Set; t.forEach(t => { const i = this._groupForLineTool(t); if (null === i) return; const r = o.get(i) || []; r.push(t), o.set(i, r); const n = Object(s.ensureNotNull)(e.paneForSource(t)); a.add(n) }), Object(s.assert)(a.size <= 1, "All selected sources should be on the same pane"), o.forEach((t, i) => { const s = new S.a(e, i, t); this._environment.pushUndoCommand(s) }); const l = new re(e, Object(x.sortSources)(t)); this._environment.pushUndoCommand(l); const c = new k(e, t, r); this._environment.pushUndoCommand(c), this._environment.endUndoMacro(); const h = Object(s.ensureNotNull)(l.createdGroupId()); return Object(s.ensureNotNull)(e.lineToolsGroupModel().groupForId(h)) } removeGroup(e) { const t = this._environment.model(), i = e.lineTools(); this._environment.beginUndoMacro(ue.format({ name: e.name() })); const r = new ie(t, e, ""); this._environment.pushUndoCommand(r); const n = new v.RemoveSourcesCommand(t, i, ""); this._environment.pushUndoCommand(n); const o = t.mainSeries().symbol(); i.forEach(e => { null !== e.linkKey().value() && Object(ce.removeLineTool)({ withUndo: !0, model: t, symbol: o, sourceTitle: e.title(), lineToolState: e.state(!1), linkKey: Object(s.ensureNotNull)(e.linkKey().value()) }) }), this._environment.endUndoMacro() } groups() { return this._environment.model().lineToolsGroupModel().groups() } excludeLineToolFromGroup(e, t) { const i = this._environment.model(), s = new S.a(i, e, [t]); this._environment.pushUndoCommand(s) } addLineToolToGroup(e, t) { const i = this._environment.model(), s = i.lineToolsGroupModel().groupForLineTool(t); if (s === e) return; const r = de.format({ lineTool: t.title(), name: e.name() }); this._environment.beginUndoMacro(r), null !== s && this._environment .pushUndoCommand(new S.a(i, s, [t])), this._environment.pushUndoCommand(new oe( i, e, [t])), this._environment.endUndoMacro() } bringToFront(e) { const t = this._environment.model(), i = new L(t, e.lineTools()); this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e .lineTools() ]) } sendToBack(e) { const t = this._environment.model(), i = new A(t, e.lineTools()); this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e .lineTools() ]) } bringForward(e) { const t = this._environment.model(), i = new H(t, e); this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e .lineTools() ]) } sendBackward(e) { const t = this._environment.model(), i = new W(t, e); this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e .lineTools() ]) } insertAfter(e, t) { const i = this._environment.model(); let s; if (t instanceof te.a) { const e = t.lineTools(); s = e[e.length - 1] } else s = t; const r = new k(i, e.lineTools(), s); this._environment.pushUndoCommand(r), this._environment.emitEvent("changeZOrder", [e .lineTools() ]) } insertBefore(e, t) { const i = this._environment.model(); let s; if (t instanceof te.a) { s = t.lineTools()[0] } else s = t; const r = new V(i, e.lineTools(), s); this._environment.pushUndoCommand(r), this._environment.emitEvent("changeZOrder", [e .lineTools() ]) } availableZOrderOperations(e) { const t = this._environment.model(), i = e.lineTools(), r = i[0], n = i[i.length - 1], o = Object(s.ensureNotNull)(t.paneForSource(i[0])).sourcesByGroup() .allExceptSpecialSources(), a = o[0], l = o[o.length - 1]; return { bringForwardEnabled: n !== l, bringToFrontEnabled: n !== l, sendBackwardEnabled: r !== a, sendToBackEnabled: r !== a } } setGroupVisibility(e, t) { const i = (t ? pe : _e).format({ group: e.name() }), s = this._environment.model(); this._environment.beginUndoMacro(i), e.lineTools().forEach(e => { const i = e.properties().visible, r = new ae.SetPropertyUndoCommand(i, t, "", s); this._environment.pushUndoCommand(r) }), this._environment.endUndoMacro() } setGroupLock(e, t) { const i = (t ? me : fe).format({ group: e.name() }), s = this._environment.model(); this._environment.beginUndoMacro(i), e.lineTools().forEach(e => { const i = e.properties().frozen, r = new ae.SetPropertyUndoCommand(i, t, "", s); this._environment.pushUndoCommand(r) }), this._environment.endUndoMacro() } setGroupName(e, t) { const i = this._environment.model(), s = ge.format({ group: e.name(), newName: t }), r = new le(i, e, t, s); this._environment.pushUndoCommand(r) } canBeGroupped(e) { const t = this._environment.model(); return new Set(e.map(e => t.paneForSource(e))).size <= 1 } _groupForLineTool(e) { return this._environment.model().lineToolsGroupModel().groups().find(t => t .containsLineTool(e)) || null } } var ve = i("3ClC"), Se = i("pQ+n"), ye = i("Vs8b"), we = i("2jby"); const Pe = window.t("Apply study template {template}"); class Ce extends m.UndoCommand { constructor(e, t, i) { super(Pe.format({ template: i })), this._model = e, this._templateContent = t, this._initialState = e .studyTemplate(!0, !0, !0), this._initialGroupsState = e .lineToolsGroupModel().state() } redo() { const e = this._merge(this._templateContent).filter(g.isLineTool); this._model.lineToolsGroupModel().removeLineTools(e), this._model.mainSeries() .onChartStyleChanged(); const t = this._model.mainSeries().properties(); Object(Y.preparePriceAxisProperties)(t), this._model.recalcVisibleRangeStudies(! 0), this._model.setShouldBeSavedEvenIfHidden(!0) } undo() { this._merge(this._initialState), this._model.mainSeries().onChartStyleChanged() } _merge(e) { const t = e.version || 0, i = this._model, r = i.mainSeries(), n = r.id(); if (r.priceScale().properties().childs().lockScale.setValue(!1), this ._initialState.symbol && e.symbol) { const t = r.properties(); t.currencyId.setValue(e.currency || null), t.unitId.setValue(e.unit || null), t.symbol.setValue(e.symbol) } if (this._initialState.symbol && e.interval) { const t = Object(Y.getChartStyleByResolution)(e.interval, r.properties() .style.value()); r.setChartStyleWithIntervalIfNeeded(t, e.interval) } const o = i.panes(), a = []; for (let e = o.length; e--;) { const t = o[e], i = t.containsMainSeries(), s = t.dataSources(); for (let e = s.length; e--;) { const t = s[e]; (!i || Object(ve.isStudy)(t) && t.isRemovedByStudyTemplates()) && a .push(t) } } i.resetDeferredStudies(); const l = Object(Se.a)(i, a); for (let e = 0; e < l.length; ++e) i.removeSource(l[e]); const c = e.panes; for (let e = 0; e < c.length; e++) { let s = -1; const r = Object(y.clone)(c[e]); r.sources.sort((e, t) => e.zorder - t.zorder); for (let e = 0; e < r.sources.length; e++) { const t = r.sources[e]; if (Object(ye.isMainSeriesState)(t)) { delete t.state, s = e; break } } const n = s > -1, a = n ? o[e] : i.createPane(e); n && t < 3 && Object(we.reorderDataSourcesStateZOrder)(r.sources), a .restoreState(r, !1, t), null !== a.mainDataSource() || i.removePane(a) } return Object(s.ensureNotNull)(i.paneForSource(r)).changeSourceId(r, n), i .syncESD(), r.priceScale().setMode({ autoScale: !0 }), i.startNotStartedStudies(), i.recalculateAllPanes(), i.fullUpdate(), l } } var xe = i("e3/o"), Te = i("/tGj"); const Ie = Object(h.getLogger)("Chart.ChartUndoModel"); class Me extends m.UndoCommand { constructor(e, t, i, r, n) { super("Paste Drawing"), this._needCopyToOtherCharts = !1, this._sourceState = null, this._model = e, this._clipboardData = t, this._paneIndex = this ._model.panes().indexOf(i || Object(s.ensureNotNull)(this._model .paneForSource(this._model.mainSeries()))), this._pasteWithData = !!r, this._keepZIndex = !!n } redo() { const e = this._model.panes()[this._paneIndex], t = Object(s.ensureNotNull)(e.clipboardLineToolOwnerSource(this ._clipboardData.source.id)); null === this._sourceState && (this._sourceState = this._getSourceState(t)); const i = e.restoreLineTool(this._sourceState, this._pasteWithData, this ._keepZIndex); this._clipboardData.centeredOnChart && i.centerPosition && i.centerPosition(); const r = Object(s.ensureNotNull)(t.priceScale()); i.setOwnerSource(t), i.setPriceScale(r), r.addDataSource(i), i .restoreFixedPoints(), Object(g.prepareLineToolPropertiesByOwnerSource)(i .properties(), t), i.calcIsActualSymbol(), i.createServerPoints(); const n = Object(Te.isSymbolSource)(t) || t.metaInfo().is_price_study; this._needCopyToOtherCharts = Boolean(n && (Object(ce.drawOnAllCharts)() .value() || i.linkKey().value() && i.isSynchronizable())), this._model .setShouldBeSavedEvenIfHidden(!0) } undo() { if (!this._sourceState) return void Ie.logError( "This command was never executed - nothing to undo"); const e = this.source(); this._clipboardData.centeredOnChart && (this._clipboardData.centeredOnChart = ! 1, this._sourceState.points = e.normalizedPoints()), this._model .removeSource(e) } source() { return Object(s.ensureNotNull)(this._model.dataSourceForId(Object(s .ensureNotNull)(this._sourceState).id)) } needCopyToOtherCharts() { return this._needCopyToOtherCharts } _getSourceState(e) { const t = Object(y.clone)(this._clipboardData.source); delete t.state.symbol, null != t.linkKey && (t.linkKey = Object(xe.randomHash) ()); const i = Object(s.ensureNotNull)(e.priceScale()), n = this._model; let o = !1; this._clipboardData.source.state.symbol === Object(s.ensureNotNull)(e .symbolSource()).symbol() && (Object(Te.isSymbolSource)(e) ? o = !0 : Object(ve.isStudy)(e) && (o = Boolean(e.metaInfo().is_price_study))); const a = e => { const t = e.x * n.timeScale().width(), s = e.y * i.height() - 40; return new r.Point(t, s) }, l = Object(s.ensureNotNull)(e.firstValue()); if (this._model.id() === this._clipboardData.modelId || !o) for (let e = 0; e < this._clipboardData.geometry.length; ++e) { const s = a(this._clipboardData.geometry[e]), r = n.timeScale().coordinateToIndex(s.x), c = n.timeScale().normalizeBarIndex(r); if (o) { const s = i.priceToCoordinate(t.points[e].price, l) + -40; c.price = i.coordinateToPrice(s, l) } else c.price = i.coordinateToPrice(s.y, l); t.points[e] = c } return t.id = Object(xe.guid)(), t } } var Oe = i("xo8u"), Le = i("Yt+L"), Ae = i("/ToI"); class Ee extends m.UndoCommand { constructor(e, t, i) { super("Change Symbol"), this._sourceId = e.id(), this._newSymbol = t, this ._prevSymbol = e.symbol(), this._prevCurrency = e.currency(), this ._prevUnit = e.unit(), this._chartWidget = i, this._showFade = e === i .model().mainSeries() } redo() { this._showFade && this._chartWidget.screen.show(), this._symbolSource() .setSymbolCurrencyUnit(this._newSymbol, null, null) } undo() { this._showFade && this._chartWidget.screen.show(), this._symbolSource() .setSymbolCurrencyUnit(this._prevSymbol, this._prevCurrency, this._prevUnit) } _symbolSource() { return Object(s.ensureNotNull)(this._chartWidget.model().model() .dataSourceForId(this._sourceId)) } } var ke = i("JWMC"), De = i("gaBL"); const Ve = Object(h.getLogger)("Chart.ChartUndoModel"); class Be extends m.UndoCommand { constructor(e, t, i) { super("Paste Indicator"), this._sourceState = null, this._model = e, this ._clipboardData = t, this._paneId = i } redo() { if (!this._sourceState) { const e = Object(y.clone)(this._clipboardData.source); e.id = Object(xe.guid)(), this._sourceState = e } let e, t; e = this._paneId ? Object(s.ensureNotNull)(this._model.paneForId(this ._paneId)) : this._sourceState.metaInfo.is_price_study ? Object(s .ensureNotNull)(this._model.paneForSource(this._model.mainSeries())) : this._model.createPane(); const i = !e.mainDataSource(); this._sourceState.zorder = e.newStudyZOrder(); const r = e.restoreStudy(this._sourceState, !1); this._sourceState.metaInfo.linkedToSeries && r.setOwnerSource(this._model .mainSeries()), i || (t = this._sourceState.metaInfo.is_price_study ? t = this._model.mainSeries().priceScale() : this._paneId ? e .findSuitableScale(r) : e.defaultPriceScale(), t !== r.priceScale() && e .move(r, t)), Object(ve.isStudy)(r) && r.start() } undo() { if (null === this._sourceState) return void Ve.logError( "This command was never executed - nothing to undo"); const e = Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceState .id)); this._model.removeSource(e) } state() { return this._sourceState } } class Re extends m.UndoCommand { constructor(e, t, i, s, r) { super("", !1), this._model = e, this._paneA = t, this._paneB = i, this ._prevStretchA = s, this._currStretchA = r } redo() { const e = this._paneA.stretchFactor() + this._paneB.stretchFactor(); this._paneA.setStretchFactor(this._currStretchA), this._paneB.setStretchFactor( e - this._currStretchA), this._model.fullUpdate() } undo() { const e = this._paneA.stretchFactor() + this._paneB.stretchFactor(); this._paneA.setStretchFactor(this._prevStretchA), this._paneB.setStretchFactor( e - this._prevStretchA), this._model.fullUpdate() } } var Ne = i("KnF9"); class je extends m.UndoCommand { constructor(e, t, i, s) { super("Move", !1), this._endEvent = null, this._model = e, this._sourceId = t .id(), this._itemIndex = i, this._startEvent = s } move(e) { this._endEvent = e, this._move(e) } hasChanges() { return null !== this._endEvent } undo() { this._move(this._startEvent) } redo() { this._move(Object(s.ensureNotNull)(this._endEvent)) } _move(e) { const t = Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)); Object(s.assert)(void 0 !== t.moveItem, 'The method "moveItem" is not defined'), t.moveItem && t.moveItem(new r.Point(e.localX, e.localY), this._itemIndex, new Ne.a(e)) } } class Fe extends m.UndoCommand { constructor(e, t, i, s, r, n, o, a, l, c, h, u) { super(u), this._studyId = null, this._paneState = null, this._chartModel = e, this._studyMetaInfo = t, this._props = s, this._addAsOverlay = r, this ._parentId = null == n ? null : n.id(), this._inputs = i, this ._targetZOrder = h, this._preferredPriceScale = o, this ._allowChangeCurrency = a, this._allowChangeUnit = l, this._paneSize = c } redo() { const e = null === this._parentId ? void 0 : this._chartModel.dataSourceForId( this._parentId), t = this._chartModel.insertStudyWithParams(this._studyMetaInfo, this ._inputs, this._targetZOrder, this._props, this._addAsOverlay, e, this ._preferredPriceScale, this._allowChangeCurrency, this._allowChangeUnit, this._paneSize, null === this._studyId ? void 0 : this._studyId); if (this._studyId = t.id(), t.childStudyByRebind().subscribe(null, () => Object( ke.trackEvent)("SOS", "Apply SOS", "Rebind SOS")), this._chartModel .setShouldBeSavedEvenIfHidden(!0), null !== this._paneState) { Object(s.ensureNotNull)(this._chartModel.paneForSource(t)).restoreState(this ._paneState, !1, this._chartModel.version()), this._paneState = null } } undo() { const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(Object(s .ensureNotNull)(this._studyId))), t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)).state(); this._chartModel.removeSource(e) && (this._paneState = t) } insertedStudy() { return this._chartModel.dataSourceForId(Object(s.ensureNotNull)(this._studyId)) } } var We = i("pOzK"), He = i("cWHH"), Ue = i.n(He), ze = i("SwuQ"), Ge = i("7MWe"), qe = i("Kxc7"); class Ye extends m.UndoCommand { constructor(e, t, i, s, r, n) { super("Zoom"), this._timeScaleState = null, this._priceScaleState = null, this ._model = e, this._startBar = t, this._endBar = i, this._startPrice = s, this._endPrice = r, this._pane = n } redo() { this._timeScaleState = this._model.timeScale().state(), this._priceScaleState = this._pane.defaultPriceScale().state(), this._model.zoomToViewport(this ._startBar, this._endBar, this._startPrice, this._endPrice, this._pane) } undo() { this._model.timeScale().restoreState(Object(s.ensureNotNull)(this ._timeScaleState)), this._pane.defaultPriceScale().restoreState(Object(s .ensureNotNull)(this._priceScaleState)), this._model .recalculateAllPanes(), this._model.lightUpdate() } } const Ke = Object(h.getLogger)("Chart.ChartUndoModel"); class Je extends m.UndoCommand { constructor(e, t, i) { super("Zoom"), this._baseCmd = e, this._zoomStack = t, this._inOut = i } undo() { if (this._inOut) { if (this._baseCmd !== this._zoomStack.head()) return void Ke.logDebug( "zoom stack inconsistency"); this._baseCmd.undo(), this._zoomStack.pop() } else this._baseCmd.redo(), this._zoomStack.push(this._baseCmd) } redo() { if (this._inOut) this._baseCmd.redo(), this._zoomStack.push(this._baseCmd); else { if (this._baseCmd !== this._zoomStack.head()) return void Ke.logDebug( "zoom stack inconsistency"); this._baseCmd.undo(), this._zoomStack.pop() } } } class Ze extends m.UndoCommand { constructor(e, t) { super("Stop Syncing Drawing"), this._model = e, this._sourceId = t.id(), this ._linkKey = t.linkKey().value() } redo() { Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)).linkKey() .setValue(null) } undo() { Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)).linkKey() .setValue(this._linkKey) } } class Xe extends m.UndoCommand { constructor(e, t, i = "Restore Defaults") { super(i), this._chartModel = e, this._defaultProperty = t, this._state = t .state() } redo() { this._chartModel.restoreFactoryDefaults(this._defaultProperty) } undo() { this._defaultProperty.mergeAndFire(this._state), this._chartModel.mainSeries() .onChartStyleChanged() } } var $e = i("0C7r"); class Qe extends Xe { redo() { this._defaultProperty.hasChild("intervalsVisibilities") && this._defaultProperty .childs().intervalsVisibilities.mergeAndFire($e.intervalsVisibilitiesDefaults), super.redo() } } var et = i("eCE5"); i.d(t, "ChartUndoModelBase", (function() { return ot })); const tt = window.t("Send {title} backward"), it = window.t("Bring {title} forward"), st = window.t("Insert {title} after {target}"), rt = window.t("Insert {title} before {target}"); function nt(e, t) { return { bringForwardEnabled: e.bringForwardEnabled || t.bringForwardEnabled, bringToFrontEnabled: e.bringToFrontEnabled || t.bringToFrontEnabled, sendBackwardEnabled: e.sendBackwardEnabled || t.sendBackwardEnabled, sendToBackEnabled: e.sendToBackEnabled || t.sendToBackEnabled } } class ot extends a.a { constructor(e, t, i, s, r, n, o, a, l) { super(), this._createLineCommand = null, this._initialTimeScrollState = null, this._initialTimeScrollPos = null, this._currentSourceMoveCommand = null, this._currentLineChangeCommand = null, this._currentCustomMoveCommand = null, this._zoomStack = new _.a, this._chartWidget = n, this.m_model = new Ue.a(e, t, i, s, r, this, a, l), this._undoHistory = o, this ._lineToolsGroupController = new be({ model: this._model.bind(this), pushUndoCommand: this._pushUndoCommand.bind(this), beginUndoMacro: this._undoHistory.beginUndoMacro.bind(this ._undoHistory), endUndoMacro: this._undoHistory.endUndoMacro.bind(this ._undoHistory), emitEvent: this.emitEvent.bind(this) }) } undoHistory() { return this._undoHistory } lineToolsGroupController() { return this._lineToolsGroupController } mergeAllScales(e) { ! function(e, t) { e.beginUndoMacro("left" === t ? u : d), e.model().panes().forEach(i => { const s = "left" === t ? i.rightPriceScales() : i .leftPriceScales(), r = ("left" === t ? i.leftPriceScales() : i .rightPriceScales()).concat(s), n = "overlay" === i.priceScalePosition(i .defaultPriceScale()) ? r[0] : i.defaultPriceScale(); e.movePriceScale(i, n, t, 0), r.forEach(t => { if (t === n) return; let s = t.mainSource(); for (; null !== s;) { e.moveToScale(s, i, n, "", !0); const r = t.mainSource(); if (r === s) { p.logError( "Loop detected while trying to merge scales" ); break } s = r } }) }), e.endUndoMacro(), e.model().fullUpdate() }(this, e) } movePriceScale(e, t, i, s) { const r = new f(this._model(), e, t, i, s, window.t("Move scale")); this._pushUndoCommand(r) } createLineTool(e, t, i, r, o, a, l) { const c = "Create " + T.lineToolsLocalizedNames[i]; if (("LineToolRegressionTrend" === i || "LineToolAnchoredVWAP" === i) && !this .canCreateStudy()) return Object(n.showTooManyStudiesNotice)(), null; this.beginUndoMacro(c); const h = !l; this._createLineCommand = new I(this._model(), e, i, a || Object(s .ensureNotNull)(e.mainDataSource()), h); const u = this._createLineCommand.startCreatingLine(t, r, o || null), d = Object(s.ensureNotNull)(this._createLineCommand.line()); let p = null; if (u && (h && this.finishLineTool(d), this._pushUndoCommand(this ._createLineCommand), this._createLineCommand = null, p = { points: d.normalizedPoints(), interval: this.mainSeries().interval() }), h && void 0 === o && Object(ce.drawOnAllCharts)().value() && d .isSynchronizable()) { const e = Object(s.ensureNotNull)(this.model().externalTimeStamp(t.index)), r = { point: { price: t.price, timeStamp: e }, linetool: i, properties: d.properties(), symbol: this.mainSeries().symbol(), model: this.model(), linkKey: Object(s.ensureNotNull)(d.linkKey().value()), finalState: p }; d.isFixed() && (r.pointPositionPercents = d.calcPositionPercents()[0]), Object(ce.createLineTool)(r) } return this.endUndoMacro(), d } continueCreatingLine(e, t, i, r) { const n = Object(s.ensureNotNull)(this._createLineCommand); this.beginUndoMacro(n.text()); const o = Object(s.ensureNotNull)(this._model().lineBeingCreated()), a = n.continueCreatingLine(e, t, i, r); let l = null; if (a && (this.finishLineTool(o), this._pushUndoCommand(n), this ._createLineCommand = null, l = { points: o.normalizedPoints(), interval: this.mainSeries().interval() }), n.needCopyToOtherCharts() && Object(ce.drawOnAllCharts)().value() && o.isSynchronizable()) { const i = Object(s.ensureNotNull)(this._model().externalTimeStamp(e.index)); Object(ce.continueLineTool)({ point: { price: e.price, timeStamp: i }, envState: t, finalState: l, model: this._model() }) } return this.endUndoMacro(), a } continueExternalLine(e, t, i) { const r = Object(s.ensureNotNull)(this._createLineCommand), n = r.continueCreatingLine(e, t, i); return n && (this._pushUndoCommand(r), this._createLineCommand = null), n } finishLineTool(e) { this._model().finishLineTool(e) } pasteImageAsLineTool(e, t, i) { return null } loadRange(e) { this._pushUndoCommand(new Q(this._model(), e)) } unlinkLines(e) { const t = this.model(); this.beginUndoMacro("Stop syncing line tool(s)"); for (const i of e) null !== i.linkKey().value() && Object(ce.removeLineTool)({ withUndo: !0, model: this.model(), symbol: i.symbol(), linkKey: Object(s.ensureNotNull)(i.linkKey().value()), sourceTitle: i.title(), lineToolState: i.state(!1) }), this._pushUndoCommand(new Ze(t, i)); this.endUndoMacro() } zoomFromViewport() { const e = new Je(Object(s.ensureDefined)(this._zoomStack.head()), this ._zoomStack, !1); this._pushUndoCommand(e) } zoomToViewport(e, t, i, s, r) { const n = new Ye(this.m_model, e, t, i, s, r), o = new Je(n, this._zoomStack, !0); this._pushUndoCommand(o) } zoomStack() { return this._zoomStack } withMacro(e, t) { const i = this.beginUndoMacro(e); try { t() } finally { this.endUndoMacro() } return i } canZoomIn() { return this.model().canZoomIn() } canZoomOut() { return this.model().canZoomOut() } zoomOut() { const e = this.timeScale().width(); if (this.canZoomOut()) { try { this.beginUndoMacro("Zoom Out") } catch (e) { return } Object(ee.doAnimate)({ to: e / 5, onStep: e => { this.startScaleTime(0), this.scaleTimeTo(e), this .endScaleTime() }, onComplete: () => this.endUndoMacro() }) } } zoomIn() { const e = this.timeScale().width(); if (this.canZoomIn()) { try { this.beginUndoMacro("Zoom In") } catch (e) { return } Object(ee.doAnimate)({ to: e / 5, onStep: e => { this.startScaleTime(e), this.scaleTimeTo(0), this .endScaleTime() }, onComplete: () => this.endUndoMacro() }) } } startMovingSources(e, t, i, s) { e.filter(e => e.doesMovingAffectsUndo()).length && (this ._currentSourceMoveCommand = new w(this.model(), e, "Move Drawing(s)", ! 1)), this.model().startMovingSources(e, t, i, new Map, s) } moveSources(e, t) { this.model().moveSources(e, new Map, t) } endMovingSource(e) { this.model().endMovingSources(e), null !== this._currentSourceMoveCommand && ( this._currentSourceMoveCommand.saveNewState(), this._pushUndoCommand( this._currentSourceMoveCommand)), this._currentSourceMoveCommand = null } startChangingLinetool(e, t, i, s, r) { this._currentLineChangeCommand = new w(this.model(), [e], "Change " + i + " point", !1), this.model().startChangingLinetool(e, t, i, s, r) } changeLinePoint(e, t) { this.model().changeLinePoint(e, t) } endChangingLinetool(e) { this.model().endChangingLinetool(e), null !== this._currentLineChangeCommand && (this._currentLineChangeCommand.saveNewState(), this._pushUndoCommand(this ._currentLineChangeCommand)), this._currentLineChangeCommand = null } setChartStyleProperty(e, t, i) { if (e.value() !== t) { const s = new Z(e, t, this.mainSeries(), i, this.model(), this .chartWidget()); this._pushUndoCommand(s), this.emitEvent("setChartStyleProperty"), Object(G .a)(e.value()) } } restorePropertiesForSource(e) { Object(g.isLineTool)(e) ? this._restoreLineToolFactoryDefaults(e) : this ._restoreStudyFactoryDefaults(e) } restoreState(e, t, i) { return this.m_model.restoreState(e, t, i) } async clipboardCopy(e, t = this.selection().dataSources()) { if (!Object(qe.enabled)("datasource_copypaste")) return; const i = t.filter(e => e.copiable()); if (0 === i.length) return; for (const e of i) if (Object(ve.isStudy)(e) && e.isChildStudy()) throw new Error( "Can not copy child study"); const s = Object(M.a)(this._model().id(), i); return null !== s ? e.write({ app: JSON.stringify(s), text: s.title }) : void 0 } async clipboardCut(e, t = this.selection().dataSources()) { if (!Object(qe.enabled)("datasource_copypaste")) return; const i = t.filter(e => e.copiable()); if (0 === i.length) return; await this.clipboardCopy(e, i); const s = i.filter(e => e.isUserDeletable()); if (0 === s.length) return; const r = 1 === s.length ? "Cut " + s[0].title : "Cut sources"; this.beginUndoMacro(r), this.m_model.selectionMacro(() => { this.removeSources(s, !1, r) }), this.endUndoMacro() } async clipboardPaste(e, t) { let i = null; if (Object(qe.enabled)("datasource_copypaste") && (i = i || await e.read(), i .app)) { const e = JSON.parse(i.app); if (null !== this.pasteSourceFromClip(t, e)) return } await this._processSpecialLineToolsContents(e, i, t) } applyStudyTemplate(e, t) { const i = new Ce(this._model(), e, t); this._pushUndoCommand(i) } startCustomMoving(e, t, i) { this._currentCustomMoveCommand = new je(this.model(), e, t, i) } customMoveBeingProcessed() { return null !== this._currentCustomMoveCommand } processCustomMove(e) { Object(s.ensureNotNull)(this._currentCustomMoveCommand).move(e) } endCustomMoving() { null !== this._currentCustomMoveCommand && this._currentCustomMoveCommand .hasChanges() && (this._pushUndoCommand(this._currentCustomMoveCommand), this._currentCustomMoveCommand = null) } cloneLineTools(e, t) { for (let t = 0; t < Math.min(5, e.length); ++t) Object(G.b)(e[t]); this.beginUndoMacro(window.t("Clone line tools")); const i = new b(this._model(), e, t, window.t("Clone line tools")); if (this._pushUndoCommand(i), Object(ce.drawOnAllCharts)().value()) { const e = i.newIds().map(e => Object(s.ensureNotNull)(this.model() .dataSourceForId(e))); this.copyToOtherCharts(e) } return this.endUndoMacro(), this.emitEvent("cloneLineTools"), i.newIds() } removeSource(e, t, i) { if (this.lineBeingCreated() === e) return void this.cancelCreatingLine(); const s = "Remove " + e.title(); this.removeSources([e], t, s, i) } removeSelectedSources() { const e = this._model().selection().dataSources(); if (!e.length) return; const t = e.length > 1 ? "Remove drawings group" : "Remove " + e[0].title(); this.removeSources(e, !1, t) } removeSources(e, t, i, r) { r || (e = e.filter(e => e.isUserDeletable())); const n = this._model(), o = n.lineToolsGroupModel(); this.beginUndoMacro(i), n.selectionMacro(r => { const a = new Map; e.forEach(e => { if (Object(g.isLineTool)(e)) { const t = o.groupForLineTool(e); if (null !== t) { const i = a.get(t) || []; i.push(e), a.set(t, i) } null !== e.linkKey().value() && Object(ce .removeLineTool)({ withUndo: !0, model: this.model(), linkKey: Object(s.ensureNotNull)(e .linkKey().value()), symbol: this.model().mainSeries() .symbol(), lineToolState: e.state(!1), sourceTitle: e.title() }) } }), a.forEach((e, t) => { const i = new S.a(n, t, e); this._pushUndoCommand(i) }); const l = new v.RemoveSourcesCommand(n, e, i), c = l.removedIds(); this._pushUndoCommand(l), !t && c.length > 0 && (1 === c.length ? this.emitEvent("removeSource", [c[0]]) : this.emitEvent( "removeSources", [c])) }), this.endUndoMacro() } removeUnloadedLineTool(e, t, i, s, r, n) {} mergeSourceUp(e) { const t = new C.c(this._model(), e, "Merge up"); this._mergeUnmergeSource(e, t) } mergeSourceDown(e) { const t = new C.a(this._model(), e, "Merge down"); this._mergeUnmergeSource(e, t) } mergeToPane(e, t) { const i = this._model().panes().indexOf(t), s = new C.b(this._model(), e, i, "Merge to pane"); this._mergeUnmergeSource(e, s) } unmergeSourceUp(e) { const t = new P.c(this._model(), e, "Unmerge up"); this._mergeUnmergeSource(e, t) } unmergeSourceDown(e) { const t = new P.a(this._model(), e, "Unmerge down"); this._mergeUnmergeSource(e, t) } unmergeToNewBottomPane(e) { const t = new P.b(this._model(), e, "Unmerge to new bottom pane"); this._mergeUnmergeSource(e, t) } availableZOrderOperations(e) { const t = this._model().lineToolsGroupModel(), i = e.filter(g.isLineTool), r = i.map(e => t.groupForLineTool(e)); Object(s.assert)(new Set(r).size <= 1, "Cannot move line tools from different group"); const n = 0 === r.length ? null : r[0]; let o = { bringForwardEnabled: !1, bringToFrontEnabled: !1, sendBackwardEnabled: !1, sendToBackEnabled: !1 }; const a = new Set(i); for (const t of Object(x.sortSources)(e)) { if (Object(g.isLineTool)(t) && null !== n) { const e = Object(x.sortSources)(n.lineTools().filter(e => !a.has(e) || e === t)); o = nt(o, { bringForwardEnabled: t !== e[e.length - 1], bringToFrontEnabled: t !== e[e.length - 1], sendBackwardEnabled: t !== e[0], sendToBackEnabled: t !== e[0] }); continue } const e = Object(s.ensureNotNull)(this._model().paneForSource(t)) .sourcesByGroup().allExceptSpecialSources(); if (0 === e.length) continue; const i = t.zorder(), r = e[0].zorder(), l = e[e.length - 1].zorder(); o = nt(o, { bringForwardEnabled: i !== l, bringToFrontEnabled: i !== l, sendBackwardEnabled: i !== r, sendToBackEnabled: i !== r }) } return o } sendToBack(e) { if (!this.availableZOrderOperations(e).sendToBackEnabled) throw new Error( "Send to back operation is unavailable"); let t = null; const i = e[0]; if (Object(g.isLineTool)(i)) { const s = this._model().lineToolsGroupModel().groupForLineTool(i); if (null !== s) { const i = s.lineTools(); t = new V(this.model(), Object(x.sortSources)(e), i[0]) } } null === t && (t = new A(this.model(), Object(x.sortSources)(e))), this ._pushUndoCommand(t), this.emitEvent("changeZOrder", [e]) } bringToFront(e) { if (!this.availableZOrderOperations(e).bringToFrontEnabled) throw new Error( "Bring to front operation is unavailable"); let t = null; const i = e[0]; if (Object(g.isLineTool)(i)) { const s = this._model().lineToolsGroupModel().groupForLineTool(i); if (null !== s) { const i = s.lineTools(); t = new k(this.model(), Object(x.sortSources)(e), i[i.length - 1]) } } null === t && (t = new L(this.model(), Object(x.sortSources)(e))), this ._pushUndoCommand(t), this.emitEvent("changeZOrder", [e]) } sendBackward(e) { if (!this.availableZOrderOperations(e).sendBackwardEnabled) throw new Error( "Send backward operation is unavailable"); const t = tt.format({ title: e[0].title() }); this._sendBackOrBringForward(t, Object(x.sortSources)(e), (e, t) => new R(this .model(), e, t)) } bringForward(e) { if (!this.availableZOrderOperations(e).bringForwardEnabled) throw new Error( "Bring forward operation is unavailable"); const t = it.format({ title: e[0].title() }); this._sendBackOrBringForward(t, Object(x.sortSources)(e), (e, t) => new j(this .model(), e, t)) } insertAfter(e, t) { e = Object(x.sortSources)(e); const i = st.format({ title: e[0].title(), target: t.title() }); this._insertAfterOrBefore(i, e, t, () => new k(this.model(), e, t)) } insertBefore(e, t) { e = Object(x.sortSources)(e); const i = rt.format({ title: e[0].title(), target: t.title() }); this._insertAfterOrBefore(i, e, t, () => new V(this.model(), e, t)) } detachToRight(e, t) { Object(ke.trackEvent)("Chart", "Move to new right scale"); const i = window.t("Move {title} To New Price Scale").format({ title: e.title() }), s = new Ae.b(this.model(), e, t, "right", i); this._pushUndoCommand(s), this.emitEvent("moveSource", [e]) } detachToLeft(e, t) { Object(ke.trackEvent)("Chart", "Move to new left scale"); const i = window.t("Move {title} To New Left Scale").format({ title: e.title() }), s = new Ae.b(this.model(), e, t, "left", i); this._pushUndoCommand(s), this.emitEvent("moveSource", [e]) } detachNoScale(e, t) { Object(ke.trackEvent)("Chart", "Make source no scale"); const i = window.t("Make {title} No Scale (Full Screen)").format({ title: e.title() }), s = new Ae.b(this.model(), e, t, "overlay", i); this._pushUndoCommand(s), this.emitEvent("moveSource", [e]) } moveToScale(e, t, i, s, r) { Object(ke.trackEvent)("Chart", "Move source to target scale"), this .beginUndoMacro(s); const n = new Ae.a(this.model(), e, t, i, s), o = r ? null : Object(De.sourceNewCurrencyOnPinningToPriceScale)(e, i, this ._model()), a = r ? null : Object(ze.sourceNewUnitOnPinningToPriceScale)(e, i, this ._model()); this._pushUndoCommand(n), null !== o && this.setPriceScaleCurrency(i, o), null !== a && this.setPriceScaleUnit(i, a), this.endUndoMacro(), this .emitEvent("moveSource", [e]) } startScrollTime(e) { const t = this.timeScale(); this._initialTimeScrollState = { rightOffset: t.rightOffset(), barSpacing: t.barSpacing() }, this._initialTimeScrollPos = e, this.model().startScrollTime(e) } scrollTimeTo(e) { let t = !1; return null !== this._initialTimeScrollPos && null !== this ._initialTimeScrollState && Math.abs(e - this._initialTimeScrollPos) > 20 && (this._pushUndoCommand(new z.a(this.model(), this._initialTimeScrollState, "Scroll Time")), this._initialTimeScrollPos = null, this ._initialTimeScrollState = null, t = !0), this.model().scrollTimeTo(e), t } endScrollTime() { this.model().endScrollTime(), this._initialTimeScrollPos = null, this ._initialTimeScrollState = null } startScaleTime(e) { const t = this.timeScale(), i = { rightOffset: t.rightOffset(), barSpacing: t.barSpacing() }; this._pushUndoCommand(new z.a(this.model(), i, "Scale Time")), this.model() .startScaleTime(e) } scaleTimeTo(e) { this.model().scaleTimeTo(e) } endScaleTime() { this.model().endScaleTime() } resetTimeScale() { const e = this.timeScale(), t = { rightOffset: e.rightOffset(), barSpacing: e.barSpacing() }; this._pushUndoCommand(new z.a(this.model(), t, "Reset Time Scale")), this .model().resetTimeScale() } startScalePrice(e, t, i, s) { this._pushUndoCommand(new Ge.PriceScaleChangeUndoCommand(this.model(), e, t, t .state(), s)), this.model().startScalePrice(e, t, i) } scalePriceTo(e, t, i) { this.model().scalePriceTo(e, t, i) } endScalePrice(e, t) { this.model().endScalePrice(e, t) } resetPriceScale(e, t) { this._pushUndoCommand(new Ge.PriceScaleChangeUndoCommand(this.m_model, e, t, t .state())), this.model().resetPriceScale(e, t) } rearrangePanes(e, t) { const i = new U(this._model(), e, t); this._pushUndoCommand(i) } movePane(e, t) { const i = new U(this._model(), e, t); this._pushUndoCommand(i) } pasteSourceFromClip(e, t, i) { const r = t; if (!r || 0 === r.sources.length) return null; const n = e || Object(s.ensureNotNull)(this.model().paneForSource(this .mainSeries())); if (!r.sources.some(e => "drawing" !== e.type || null !== n .clipboardLineToolOwnerSource(e.source.id))) return null; this.beginUndoMacro("Paste " + r.title); let o = 0; const a = [], l = []; for (const t of r.sources) if ("drawing" === t.type && null !== n.clipboardLineToolOwnerSource(t.source .id)) { Object(et.b)(t.source.state.intervalsVisibilities, $.Interval.parse(this .model().mainSeries().interval())); const e = this.pasteLineTool(n, t); o < 5 && (Object(G.d)(e), o += 1), l.push(e), a.push(e) } else "study" === t.type && t.source && t.source.metaInfo && this .checkIfFeatureAvailable(new c.a(t.source.metaInfo)) && a.push(this .pasteStudy(t, i ? e : void 0)); return l.length && this.selectionMacro(e => { e.clearSelection(), l.forEach(t => { e.addSourceToSelection(t, null) }) }), this.endUndoMacro(), a } pasteLineTool(e, t, i, s) { const r = new Me(this.model(), t, e, i, s); this._pushUndoCommand(r); const n = r.source(); return r.needCopyToOtherCharts() && this.copyToOtherCharts([n]), this.selectionMacro(e => { e.clearSelection(), e.addSourceToSelection(n, null) }), n } pasteStudy(e, t) { const i = new Be(this.model(), e, null == t ? void 0 : t.id()); this._pushUndoCommand(i); const r = Object(s.ensureNotNull)(i.state()).id; return Object(s.ensureNotNull)(this._model().dataSourceForId(r)) } setPriceScaleCurrency(e, t) { const i = new Oe.a(e, t, this.chartWidget(), "Change currency"); this._pushUndoCommand(i) } setPriceScaleUnit(e, t) { const i = new Le.a(e, t, this.chartWidget(), "Change unit"); this._pushUndoCommand(i) } setSymbol(e, t) { e.symbol() !== t && this._pushUndoCommand(new Ee(e, t, this.chartWidget())) } copyToOtherCharts(e) { const t = this.mainSeries(), i = t.syncModel(), r = this.timeScale(); if (i) for (const n of e) { if (!n.isSynchronizable()) continue; const e = n.linkKey().value() || Object(xe.randomHash)(); n.linkKey().setValue(e); const o = n.state(!1), a = n.normalizedPoints(), l = n.properties().interval.value(), c = t.interval(); let h; if ($.Interval.isEqual(l, c)) h = a.map(e => { const t = Object(s.ensureNotNull)(r.timePointToIndex(e .time_t)) + e.offset; return { price: e.price, timeStamp: Object(s.ensureNotNull)(this.model() .externalTimeStamp(t)) } }); else { const e = i.createNewModelWithResolution(l); h = a.map(t => ({ price: t.price, timeStamp: 0 === t.offset ? t.time_t : e .projectTime(t.time_t, t.offset) })) } const u = { ...o, linkKey: e, points: h, linetool: n.getType(), model: this.model(), symbol: t.symbol(), finalState: { points: a, interval: l } }; n.isFixed() && (u.pointPositionPercents = n.calcPositionPercents()), Object(ce.copyLineTool)(u) } } addPaneStretchFactorUndoCommand(e, t, i, s) { const r = new Re(this.model(), e, t, i, s); this._pushUndoCommand(r) } moveSelectedToolsLeft() { return this._moveSelectedTools(2) } moveSelectedToolsUp() { return this._moveSelectedTools(0) } moveSelectedToolsRight() { return this._moveSelectedTools(3) } moveSelectedToolsDown() { return this._moveSelectedTools(1) } insertStudyWithoutCheck(e, t) { return this._insertStudy(e, t, {}, !1, void 0, void 0, void 0, void 0, void 0, null, void 0) } saveLineToolState(e, t) { this._pushUndoCommand(new w(this.m_model, [e], t)) } resetScales() { this.beginUndoMacro("Reset scales"), this.resetTimeScale(); for (const e of this.m_model.panes()) { for (const t of e.leftPriceScales()) this.resetPriceScale(e, t); for (const t of e.rightPriceScales()) this.resetPriceScale(e, t) } this.endUndoMacro(), this.m_model.recalculateAllPanes() } _mergeUnmergeSource(e, t) { this.beginUndoMacro(t.text()); const i = Object(s.ensureNotNull)(this._model().paneForSource(e)), r = new Set(i.sourcesByGroup().lineSources().filter(t => t.ownerSource() === e)); this._model().lineToolsGroupModel().groups().filter(e => { const t = e.lineTools().some(e => r.has(e)), i = e.lineTools().some(e => !r.has(e)); return t && i }).forEach(e => { this._pushUndoCommand(new S.a(this._model(), e, e.lineTools())) }), this._pushUndoCommand(t), this.endUndoMacro() } _insertStudy(e, t, i, r, n, o, a, l, c, h, u) { const d = "Insert " + e.description; this.beginUndoMacro(d); const p = new Fe(this.model(), e, t, i, r, n, o, a, l, c, h || null, d); this._pushUndoCommand(p); const _ = p.insertedStudy(); if (void 0 !== u) { const e = new We.SetPriceScaleModeCommand(u, Object(s.ensureNotNull)(_ .priceScale()), "", this.model()); this._pushUndoCommand(e) } return this.endUndoMacro(), _ } async _processSpecialLineToolsContents(e, t, i) { 0 } _insertAfterOrBefore(e, t, i, r) { const n = Object(s.ensureNotNull)(this._model().paneForSource(i)); if (t.some(e => Object(g.isLineTool)(e) && this._model().paneForSource(e) !== n)) throw new Error( "Cannot insert line tool after target on another pane"); this.beginUndoMacro(e), t.forEach(e => { Object(s.ensureNotNull)(this.model().paneForSource(e)) !== n && this .mergeToPane(e, n) }); const o = r(); this._pushUndoCommand(o), this.emitEvent("changeZOrder", [t]), this .endUndoMacro() } _sendBackOrBringForward(e, t, i) { const r = new Map; t.forEach(e => { const t = Object(s.ensureNotNull)(this._model().paneForSource(e)), i = r.get(t) || []; i.push(e), r.set(t, i) }), this.beginUndoMacro(e), r.forEach((e, t) => { this._pushUndoCommand(i(t, e)) }), this.endUndoMacro(), this.emitEvent("changeZOrder", [t]) } _moveSelectedTools(e) { const t = this.model().selection().lineDataSources(); if (0 === t.length) return !1; if (Object(ce.lockDrawings)().value()) return !0; const i = this.timeScale().visibleBarsStrictRange(); if (null === i) return !1; const s = function(e) { const t = new Map; for (const i of e) { const e = i.ownerSource(); if (null === e) continue; let s = t.get(e); if (void 0 === s) { const i = e.priceScale(), r = e.priceStep(), n = e.firstValue(); if (null === i || null === r || null === n) continue; const o = i.priceRange(); if (null === o) continue; s = { sources: [], priceScale: i, priceStep: r, startPrice: o.minValue(), firstValue: n }, t.set(e, s) } s.sources.push(i) } return t }(t); if (0 === s.size) return !1; this.beginUndoMacro(window.t("Move Drawing(s)")); const n = i.firstBar(), o = this.timeScale().indexToCoordinate(n), a = n + (3 === e ? 1 : 2 === e ? -1 : 0), l = this.timeScale().indexToCoordinate(a); return ce.isDirectionalMovementActive.setValue(!0), s.forEach(t => { const { startPrice: i, priceStep: s, priceScale: c, firstValue: h } = t, u = i + (0 === e ? s : 1 === e ? -s : 0), d = c .priceToCoordinate(i, h), p = c.priceToCoordinate(u, h), _ = { logical: { index: n, price: i }, screen: new r.Point(o, d) }, m = { logical: { index: a, price: u }, screen: new r.Point(l, p) }; this.startMovingSources(t.sources, _, null), this.moveSources(m), this.endMovingSource(!1) }), ce.isDirectionalMovementActive.setValue(!1), this.endUndoMacro(), !0 } _restoreStudyFactoryDefaults(e) { const t = new Qe(this.m_model, e.properties()); this._pushUndoCommand(t) } _restoreLineToolFactoryDefaults(e) { const t = "Load default drawing template"; this.beginUndoMacro(t), this.saveLineToolState(e, t); const i = new Qe(this.m_model, e.properties(), t); this._pushUndoCommand(i), this.saveLineToolState(e, t), this.endUndoMacro(), this.model().updateSource(e) } } }, opke: function(e, t) { e.exports = '' }, p1SQ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolHorzLinePriceAxisView", (function() { return r })); var s = i("KcY8"); class r extends s.a { constructor(e) { super(), this._source = e } _updateRendererData(e, t, i) { e.visible = !1; const s = this._source.points(), r = this._source.priceScale(); if (0 === s.length || null === r || r.isEmpty()) return; const n = s[0]; if (!isFinite(n.price)) return; const o = this._source.ownerSource(), a = null !== o ? o.firstValue() : null; if (null === a) return; const l = this._source.properties().linecolor.value(); i.background = l, i.textColor = this.generateTextColor(l), i.coordinate = r .priceToCoordinate(n.price, a), e.text = r.formatPrice(n.price, a), e .visible = !0 } } }, pJOz: function(e, t, i) { "use strict"; i.r(t), i.d(t, "drawCircle", (function() { return h })), i.d(t, "drawArrow", (function() { return u })), i.d(t, "TrendLineRenderer", (function() { return d })); var s = i("Eyy1"), r = i("GEp6"), n = i("a7Ha"), o = i("VdBB"), a = i("jFln"), l = i("Zp/P"), c = i("gAom"); function h(e, t, i, s, r) { t.save(), t.fillStyle = "#000000", t.beginPath(), t.arc(e.x * r, e.y * r, i * r, 0, 2 * Math .PI, !1), t.fill(), s.strokeWidth && (t.lineWidth = s.strokeWidth, t.stroke()), t .restore() } function u(e, t, i, s, r) { if (t.subtract(e).length() < 1) return; const n = Object(l.getArrowPoints)(e, t, s, !1); for (let e = 0; e < n.length; ++e) { const t = n[e][0], s = n[e][1]; Object(a.drawLine)(i, t.x * r, t.y * r, s.x * r, s.y * r) } } class d { constructor() { this._data = null, this._hittest = new o.HitTestResult(o.HitTestResult.MOVEPOINT) } setData(e) { this._data = e } setHitTest(e) { this._hittest = e } draw(e, t) { const i = this._data; if (null === i) return; if ("points" in i && i.points.length < 2) return; if ("floatPoints" in i && i.floatPoints.length < 2) return; const s = t.pixelRatio; e.lineCap = "butt", e.strokeStyle = i.color, e.lineWidth = Math.max(1, Math.floor(i .linewidth * s)), Object(a.setLineStyle)(e, i.linestyle); const r = "floatPoints" in i ? i.floatPoints : i.points, n = r[0], o = r[1]; let l = []; i.overlayLineEndings ? l = [n.clone(), o.clone()] : this._drawEnds(e, [n, o], i .linewidth, s); const h = this._extendAndClipLineSegment(n, o, t); null !== h && i.linewidth > 0 && (h[0].x === h[1].x ? Object(c.drawVerticalLine)(e, Math.round(h[0].x * s), h[0].y * s, h[1].y * s) : h[0].y === h[1].y ? Object(c.drawHorizontalLine)(e, Math.round(h[0].y * s), h[0].x * s, h[1].x * s) : Object(a.drawLine)(e, h[0].x * s, h[0].y * s, h[1].x * s, h[1].y * s)), i.overlayLineEndings && this._drawEnds(e, l, i.linewidth, s) } hitTest(e, t) { const i = this._data; if (null === i) return null; if ("points" in i && i.points.length < 2) return null; if ("floatPoints" in i && i.floatPoints.length < 2) return null; const s = Object(l.interactionTolerance)().line, n = "floatPoints" in i ? i.floatPoints : i.points, o = n[0], a = n[1], c = this._extendAndClipLineSegment(o, a, t); if (null !== c) { if (Object(r.distanceToSegment)(c[0], c[1], e).distance <= s) return this ._hittest } return null } _extendAndClipLineSegment(e, t, i) { const r = Object(s.ensureNotNull)(this._data); return Object(l.extendAndClipLineSegment)(e, t, i.cssWidth, i.cssHeight, r .extendleft, r.extendright) } _drawEnds(e, t, i, r) { const o = t[0], a = t[1], l = Object(s.ensureNotNull)(this._data); switch (l.leftend) { case n.LineEnd.Arrow: u(a, o, e, i, r); break; case n.LineEnd.Circle: h(o, e, i, Object(s.ensureDefined)(l.endstyle), r) } switch (l.rightend) { case n.LineEnd.Arrow: u(o, a, e, i, r); break; case n.LineEnd.Circle: h(a, e, i, Object(s.ensureDefined)(l.endstyle), r) } } } }, pKDv: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolABCD", (function() { return a })); var s = i("Eyy1"), r = i("Ocx9"), n = i("Ss5c"), o = i("j3hX"); class a extends n.LineDataSource { constructor(e, t) { const s = t || a.createProperties(); super(e, s), i.e("lt-pane-views").then(i.bind(null, "bFMU")).then(t => { this._setPaneViews([new t.ABCDPaneView(this, e)]) }) } pointsCount() { return 4 } name() { return "ABCD Pattern" } properties() { return super.properties() } static createProperties(e) { const t = new r.DefaultProperty("linetoolabcd", e); return a._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "aMeN")).then( e => e.PatternWithoutBackgroundDefinitionsViewModel) } static _configureProperties(e) { n.LineDataSource._configureProperties(e), e.addChild("linesColors", new o .LineToolColorsProperty([Object(s.ensureDefined)(e.child("color"))])), e .addChild("textsColors", new o.LineToolColorsProperty([Object(s .ensureDefined)(e.child("textcolor"))])) } } }, pOzK: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SetPriceScaleModeCommand", (function() { return n })); var s = i("Ocx9"), r = i("RDU5"); class n extends r.UndoCommand { constructor(e, t, i, s) { super(i), this._newMode = e, this._priceScaleId = t.id(), this._model = s, this ._oldMode = t.mode() } redo() { this._applyMode(this._newMode) } undo() { this._applyMode(this._oldMode) } _applyMode(e) { const t = this._findPriceScaleById(); null !== t && (Object(s.saveDefaultProperties)(!0), t.setMode(e), Object(s .saveDefaultProperties)(!1), this._model && (this._model .recalculateAllPanes(), this._model.lightUpdate())) } _findPriceScaleById() { const e = this._model.panes(); for (let t = 0; t < e.length; t++) { const i = e[t].getPriceScaleById(this._priceScaleId); if (null !== i) return i } return null } } }, pPtI: function(e, t, i) { "use strict"; i.r(t), i.d(t, "normalizeIntervalString", (function() { return _ })), i.d(t, "isAvailable", (function() { return m })), i.d(t, "setLastUsedResolution", (function() { return f })), i.d(t, "getRangeResolution", (function() { return g })), i.d(t, "getTimeBasedResolution", (function() { return b })), i.d(t, "getDefaultResolution", (function() { return v })), i.d(t, "getResolutionByChartStyle", (function() { return S })), i.d(t, "getServerInterval", (function() { return y })), i.d(t, "isResolutionMultiplierValid", (function() { return w })), i.d(t, "getMaxResolutionValue", (function() { return C })), i.d(t, "getResolutionsFromSettings", (function() { return x })), i.d(t, "convertResolutionsFromSettings", (function() { return T })), i.d(t, "mergeResolutions", (function() { return I })), i.d(t, "sortResolutions", (function() { return M })), i.d(t, "getCustomResolutions", (function() { return A })), i.d(t, "getTranslatedResolution", (function() { return E })), i.d(t, "getTranslatedResolutionModel", (function() { return k })), i.d(t, "isSecondsEnabled", (function() { return V })), i.d(t, "isTicksEnabled", (function() { return B })); i("bSeV"), i("YFKU"); var s = i("LxhU"), r = i("n5al"), n = i("Vdly"), o = i("PT1i"), a = i("L6rT"), l = i("ogJP"), c = i("Kxc7"), h = i.n(c); const u = { [s.ResolutionKind.Ticks]: 1, [s.ResolutionKind.Seconds]: 60, [s.ResolutionKind.Minutes]: 1440, [s.SpecialResolutionKind.Hours]: 24, [s.ResolutionKind.Days]: 365, [s.ResolutionKind.Weeks]: 52, [s.ResolutionKind.Months]: 12, [s.ResolutionKind.Range]: 1e6, [s.ResolutionKind.Invalid]: NaN }, d = { [s.ResolutionKind.Ticks]: 0, [s.ResolutionKind.Seconds]: 1, [s.ResolutionKind.Minutes]: 2, [s.SpecialResolutionKind.Hours]: 3, [s.ResolutionKind.Days]: 4, [s.ResolutionKind.Weeks]: 5, [s.ResolutionKind.Months]: 6, [s.ResolutionKind.Range]: 7, [s.ResolutionKind.Invalid]: 8 }, p = { [s.ResolutionKind.Invalid]: "", [s.ResolutionKind.Ticks]: window.t("T", { context: "interval_short" }), [s.ResolutionKind.Seconds]: window.t("s", { context: "interval_short" }), [s.ResolutionKind.Minutes]: window.t("m", { context: "interval_short" }), [s.SpecialResolutionKind.Hours]: window.t("h", { context: "interval_short" }), [s.ResolutionKind.Days]: window.t("D", { context: "interval_short" }), [s.ResolutionKind.Weeks]: window.t("W", { context: "interval_short" }), [s.ResolutionKind.Months]: window.t("M", { context: "interval_short" }), [s.ResolutionKind.Range]: window.t("R", { context: "interval_short" }) }; function _(e) { return s.Interval.parse(e).value() } function m(e) { const t = s.Interval.parse(e); if (!V() && t.isSeconds()) return !1; if (!B() && t.isTicks()) return !1; const i = t.value(), r = o.linking.supportedResolutions.value(); return void 0 !== r ? void 0 !== r.find(e => _(e) === i) : t.isSeconds() ? Boolean(o.linking .seconds.value()) : t.isTicks() ? Boolean(o.linking.ticks.value()) : t .isIntraday() ? Boolean(o.linking.intraday.value()) : t.isDWM() } function f(e) { s.Interval.isValid(e) && (s.Interval.isRange(e) ? n.setValue( "chart.lastUsedRangeResolution", e) : n.setValue( "chart.lastUsedTimeBasedResolution", e)) } function g(e) { const t = n.getValue("chart.lastUsedRangeResolution"); if (void 0 !== t && s.Interval.isRange(t)) return t; let i = "100R"; for (const t of e) { const e = s.Interval.parse(t); if (e.isRange()) { const t = e.value(); if ("100R" === t) return t; i = t } } return i } function b(e) { const t = n.getValue("chart.lastUsedTimeBasedResolution"); if (void 0 !== t && s.Interval.isTimeBased(t)) return t; let i = "1D"; for (const t of e) { const e = s.Interval.parse(t); if (e.isTimeBased()) { const t = e.value(); if ("1D" === t) return t; i = t } } return i } function v(e) { return e ? "100R" : "1D" } function S(e, t, i) { const n = r.isRangeStyle(e), o = s.Interval.isRange(t); return !n && o ? b(i) : n && !o ? g(i) : t } function y(e) { return s.Interval.isRange(e) ? "1" : e } function w(e) { const t = s.Interval.parse(e), i = P(t.kind()), r = t.multiplier(); return t.isValid() && r <= i } function P(e) { const t = u[e]; return Number.isNaN(t) ? 1 : t } function C(e) { return P(s.Interval.kind(e)) } function x(e) { const t = T(n.getJSON(e, [])); return Object(a.uniq)(t.filter(w).map(_)) } function T(e) { return Array.isArray(e) ? e : Object.keys(e).map(s.Interval.normalize).filter(l.notNull) } function I(...e) { let t = [].concat(...e); return t = Object(a.uniq)(t.filter(w).map(_)), M(t) } function M(e) { return e.sort(L) } function O(e) { const t = s.Interval.parse(e), i = t.multiplier() || 1; return t.isMinuteHours() ? [s.SpecialResolutionKind.Hours, i / 60] : [t.kind(), i] } function L(e, t) { const [i, s] = O(e), [r, n] = O(t); return i !== r ? d[i] - d[r] : s - n } function A() { return [] } function E(e) { const { multiplier: t, shortKind: i } = k(e); return `${t}${i}` } function k(e, t) { const i = s.Interval.parse(e); let r = i.multiplier(), n = i.kind(); if (!i.isValid()) { if (t) return null; throw new TypeError("Can't translate invalid interval") } return i.isMinuteHours() && (r = Math.floor(r / 60), n = s.SpecialResolutionKind.Hours), { multiplier: r.toString(), shortKind: D(n), hint: `${r} ${D(n, r)}`, mayOmitMultiplier: i.isDWM() && 1 === r, mayOmitShortKind: i.isMinutes() && !i.isMinuteHours() } } function D(e, t) { if (!t) return p[e]; switch (e) { case s.ResolutionKind.Ticks: return window.t("tick", { plural: "ticks", count: t }); case s.ResolutionKind.Days: return window.t("day", { plural: "days", count: t }); case s.ResolutionKind.Weeks: return window.t("week", { plural: "weeks", count: t }); case s.ResolutionKind.Months: return window.t("month", { plural: "months", count: t }); case s.ResolutionKind.Seconds: return window.t("second", { plural: "seconds", count: t }); case s.ResolutionKind.Minutes: return window.t("minute", { plural: "minutes", count: t }); case s.SpecialResolutionKind.Hours: return window.t("hour", { plural: "hours", count: t }); case s.ResolutionKind.Range: return window.t("range", { plural: "ranges", count: t }); default: return e } } function V() { return h.a.enabled("seconds_resolution") } function B() { return h.a.enabled("tick_resolution") } }, "pQ+n": function(e, t, i) { "use strict"; function s(e, t) { const i = new Set, s = t => { e.children(t, !1).forEach(e => { i.has(e) || (i.add(e), s(e)) }) }; return t.forEach(s), t.filter(e => !i.has(e)).map(t => function e(t, i) { let s = []; const r = t.children(i, !1); for (let i = 0; i < r.length; i++) s = s.concat(e(t, r[i])); return s.push(i), s }(e, t)).reduce((e, t) => e.concat(t), []) } i.d(t, "a", (function() { return s })) }, pZDF: function(e, t, i) { "use strict"; i.r(t), i.d(t, "getStudyInputsInfo", (function() { return r })); var s = i("YFKU"); function r(e) { return void 0 === e.inputs ? [] : e.inputs.map(e => ({ ...e, id: e.id, localizedName: void 0 !== e.name ? Object(s.t)(e.name, { context: "input" }) : "" })) } }, pvsv: function(e, t, i) { "use strict"; function s(e, t) { Promise.all([i.e("react"), i.e(1), i.e(3), i.e("moment"), i.e(81), i.e(0), i.e(2), i.e( "symbol-info-dialog-impl")]).then(i.t.bind(null, "1Z/g", 7)).then(i => { i.showSymbolInfoDialog(e, t) }) } i.r(t), i.d(t, "showSymbolInfoDialog", (function() { return s })) }, qE4g: function(e, t, i) { "use strict"; i.r(t); var s = i("hbEN"), r = i("aO4+"), n = i("f6yo"), o = i("HGP3"), a = i("Eyy1"), l = i("YFKU"), c = i("Kxc7"), h = i("oV8k"), u = i("VdBB"), d = i("9uLv"), p = i("Tmoa"), _ = i("//lZ"), m = i("gAom"), f = i("ikwP"), g = i("l7y7"), b = i("zDbI"), v = i("u+0B"); i("Oy0l"); const S = c.enabled("adaptive_logo"), y = c.enabled("small_no_display"), w = c.enabled("38914"), P = "Ch{0}ar{1}t{2}by{3}{4}".format("", "", " ", " ", "TradingView"), C = "po{0}wer{1}ed{2}by{3}{4}".format("", "", " ", " ", "TradingView"), x = "by{3}{4}".format("", "", " ", " ", "TradingView"), T = w ? x : C, I = navigator.userAgent.toLowerCase().indexOf("chrome") > -1 && -1 === navigator.userAgent .toLowerCase().indexOf("edge"), M = window.urlParams || {}; window.initData; M.no_referral_id && enable(M.referral_id || "", "aggressive"); Object(l.t)("By TradingView"), Object(l.t)("{symbol} financials by TradingView"), Object(l.t)( "More features on tradingview.com"), Object(l.t)("powered by"); const O = Object(l.t)(P), L = Object(l.t)(T); function A(e) { return "px EuclidCircular" === e ? .1 : 0 } class E extends h.a { constructor(e, t, i, r) { super(e, t), this._canvasWidth = 0, this._paneHeight = 0, this._left = 13, this ._bottom = 16, this._layout = "site_branding", this._needToShow = !0, this._showBranding = !1, this._customLogoSrc = "", this._customLogoLink = "", this._cubicBezier = new d.a(.4, .01, .22, 1), this._openAnimation = null, this._closeAnimation = null, this._powBy = null, this._custom = null, this._mainSeries = this._model.mainSeries(), this._showAllowance = i, this ._showForPro = Boolean(r), this._checkLayout(), "widget_custom_branding" !== this._layout && "fundamental_custom_branding" !== this._layout || (this ._left = 8, this._bottom = 5); const n = () => { this._needToShow ? this._showBranding = !0 : this._showBranding = !1 }; this._resizeHandlerDelayed = Object(s.default)(n, 200), n(), window .addEventListener("resize", this._resizeHandlerDelayed), this ._monitorCanvas = Object(f.createDisconnectedBoundCanvas)(document, new f .Size(0, 0)), this._monitorCanvas.subscribeCanvasConfigured(() => { this._init() }), this._model.isSnapshot() ? this._init() : (this._mainSeries.dataEvents() .symbolResolved().subscribe(this, this._init), null !== this._mainSeries .symbolInfo() && this._init()), this._renderer = { draw: this.draw.bind(this), hitTest: this.hitTest.bind(this) } } destroy() { window.removeEventListener("resize", this._resizeHandlerDelayed), this ._mainSeries.dataEvents().symbolResolved().unsubscribeAll(this), this ._powBy && this._powBy.destroy() } paneViews(e) { if (window.TradingView.printing) return []; if (!this._showAllowance()) return []; if ("site_branding" === this._layout && !this._showForPro && window.user && window.user.is_pro) return []; const t = c.enabled("move_logo_to_main_pane"); return t && e.isMainPane() || !t && e.isLast() || e.isMaximized() ? [{ renderer: this.renderer.bind(this) }] : [] } labelPaneViews(e) { return [] } priceAxisViews(e, t) { return [] } updateAllViews() {} updateViewsForPane(e) {} priceScale() { return null } renderer(e, t) { return this._paneHeight = e, this._canvasWidth = t, this._renderer } hasContextMenu() { return !1 } onClickOutside() { this._hasAnimation() && this._startCloseAnimation() } hitTest(e) { return !this._showBranding || c.enabled("logo_without_link") ? null : this ._powBy && "widget_custom_no_powered_branding" !== this._layout && "fundamental_custom_no_powered_branding" !== this._layout && (this._powBy .hitTest(e) || this._custom && this._custom.hitTest(e)) ? new u .HitTestResult(u.HitTestResult.CUSTOM, { hideCrosshairLinesOnHover: !0, clickHandler: () => { this._openLink() }, tapHandler: () => { this._hasAnimation() ? this ._toggleOpenAnimatedOrOpenLink() : this._openLink() }, mouseEnterHandler: () => { this._hasAnimation() && this._startOpenAnimation() }, mouseLeaveHandler: () => { this._hasAnimation() && this._startCloseAnimation() } }) : null } tvUrl() { let e = new URL("https://www.tradingview.com/"); if (this._customLogoLink) return this._customLogoLink; if ("library_branding" === this._layout || "library_custom_branding" === this ._layout) { let t; switch (!0) { case c.enabled("charting_library"): t = "library"; break; case c.enabled("trading_terminal"): t = "trading-terminal" } return e.searchParams.append("utm_source", window.location.origin), e .searchParams.append("utm_medium", "library"), t && e.searchParams .append("utm_campaign", t), e.toString() } return e.toString() } draw(e, t) { if (!this._showBranding) return; let i = 0; M.utm = !0, Object(f.drawScaled)(e, t.pixelRatio, () => { this._powBy && this._powBy.show && (i = this._powBy.height, e.save(), e.translate(this._left, this._paneHeight - this ._bottom - i), this._powBy.draw(e, t, this ._canvasWidth), e.restore()), this._custom && this ._custom .show && (e.save(), e.translate(this._left, this._paneHeight - this._bottom - i - this._custom.height), this._custom .draw(e, t), e.restore()) }) } _init() { const e = this._mainSeries.symbolInfo(); this._powBy && this._powBy.destroy(), this._powBy = new F(this._layout, (null == e ? void 0 : e.name) || "", this._model, () => this._model .fullUpdate()), this._custom = new W(this._layout, this._customLogoSrc, () => this._model.fullUpdate()), this._openAnimation = null, this ._closeAnimation = null } _checkLayout() { if (c.enabled("widget")) 0; else if (c.enabled("charting_library") || c.enabled("trading_terminal")) { const e = JSON.parse(M.logo) || {}; e.image ? (this._customLogoSrc = e.image, this._customLogoLink = e.link, this._needToShow = c.enabled("widget_logo"), c.enabled( "link_to_tradingview") ? this._layout = "library_custom_branding" : this._layout = "library_custom_no_powered_branding") : (this._layout = "library_branding", this._needToShow = c.enabled("widget_logo")) } else this._layout = "site_branding" } _startOpenAnimation() { null === this._openAnimation && (null !== this._closeAnimation && (this ._closeAnimation.stop(), this._closeAnimation = null), this ._openAnimation = Object(_.doAnimate)({ from: this._currentStateForAnimation(), to: this._openedStateForAnimation(), duration: 200, easing: this._cubicBezier.easingFunc, onStep: this._animatedDrawStep.bind(this) })) } _startCloseAnimation() { null === this._closeAnimation && (null !== this._openAnimation && (this ._openAnimation.stop(), this._openAnimation = null), this ._closeAnimation = Object(_.doAnimate)({ from: this._currentStateForAnimation(), to: this._closedStateForAnimation(), duration: 200, easing: this._cubicBezier.easingFunc, onStep: this._animatedDrawStep.bind(this) })) } _currentStateForAnimation() { return Object(a.ensureNotNull)(this._powBy).width } _closedStateForAnimation() { return Object(a.ensureNotNull)(this._powBy).minimizedAnimationWidth() } _openedStateForAnimation() { return Object(a.ensureNotNull)(this._powBy).maximizedAnimationWidth() } _animatedDrawStep(e, t) { Object(a.ensureNotNull)(this._powBy).animatedDrawStep(e, t), this._model .lightUpdate() } _hasAnimation() { return null !== this._powBy && this._powBy.hasAnimation() } _openLink() { if ("site_branding" === this._layout) return !1; c.enabled("widget"); return Object(a.ensureNotNull)(window.open(this.tvUrl(), "_blank")).opener = null, !0 } _toggleOpenAnimatedOrOpenLink() { null !== this._openAnimation && this._openAnimation.completed() ? this ._openLink() || this._startCloseAnimation() : this._startOpenAnimation() } } function k(e) { return !S || e > 500 } const D = { customBrandingTradingViewText: o.colorsPalette["color-brand"], customBrandingText: o.colorsPalette["color-cold-gray-850"], background: o.colorsPalette["color-cold-gray-900"], shadow: Object(p.generateColor)(o.colorsPalette["color-white"], 91), text: o.colorsPalette["color-white"], staticTextBackground: Object(p.generateColor)(o.colorsPalette["color-cold-gray-800"], 20), logo: o.colorsPalette["color-white"] }, V = { customBrandingTradingViewText: o.colorsPalette["color-brand"], customBrandingText: o.colorsPalette["color-cold-gray-850"], background: o.colorsPalette["color-white"], shadow: Object(p.generateColor)(o.colorsPalette["color-black"], 91), text: o.colorsPalette["color-cold-gray-900"], staticTextBackground: Object(p.generateColor)(o.colorsPalette["color-white"], 20), logo: o.colorsPalette["color-cold-gray-900"] }; const B = {}; function R(e, t) { const i = B[e]; if (void 0 !== i) return i.image || null; const s = {}; return B[e] = s, function(e) { return new Promise(t => { const i = g.replace(/fill="#[\da-f]{6}"/i, `fill="${e}"`), s = new Image; s.onload = () => { s.onload = null, t(s) }, s.src = URL.createObjectURL(new Blob([i], { type: "image/svg+xml" })) }) }(e).then(e => { s.image = e, t() }), null } function N(e) { const { a: t, d: i, e: s, f: n } = e; return new r.Point(s / t, n / i) } class j { constructor() { this._originPoint = null } hitTest(e) { const t = this._getHitTestBox(); if (t) return Object(n.pointInBox)(e, t) } _getHitTestBox() { const e = this._originPoint; if (e) { const { x: t, y: i } = e; return Object(r.box)(e, new r.Point(t + this.width, i + this.height)) } } } class F extends j { constructor(e, t, i, s) { if (super(), this.show = !0, this.borderRadius = 0, this._needDisplayImage = !1, this._imageWidth = 22, this._imageHeight = 11, this._animatedWidth = 32, this ._font = "px " + b.CHART_FONT_FAMILY, this._txt = "TradingView", this ._textWidth = 0, this._maximizedAnimationTextWidth = 0, this._textWidthCache = new v.TextWidthCache, this._pixelRatio = 1, this._model = i, this._layout = e, this._symbol = t, this.showAnimatedBranding = c.enabled("show_animated_logo") || "widget_branding" === this._layout, this._fontSize = this.showAnimatedBranding ? 11 : 14, this.showAnimatedBranding || "widget_custom_branding" !== this ._layout && "fundamental_custom_branding" !== this._layout || (this._fontSize = 12), this.width = 32, this.height = this._fontSize + 2, this ._onReadyCallback = s, this._init(), document.fonts && document.fonts.check && document.fonts.load) { document.fonts.check(this._fontSize + "px EuclidCircular") ? this._font = "px EuclidCircular" : document.fonts.load(this._fontSize + "px EuclidCircular", this._txt).then(() => { this._font = "px EuclidCircular", this._recalculateMetrics() }) } this._recalculateMetrics() } destroy() { this._model.properties().paneProperties.background.unsubscribeAll(this), this._model .onChartThemeLoaded().unsubscribeAll(this) } hasAnimation() { return this.showAnimatedBranding } minimizedAnimationWidth() { return 32 } maximizedAnimationWidth() { return this._maximizedAnimationTextWidth + 32 - 3 } animatedDrawStep(e, t) { this._animatedWidth = t } draw(e, t, i) { t.pixelRatio !== this._pixelRatio && (this._textWidthCache.reset(), this ._pixelRatio = t.pixelRatio); const s = this._colors; if (this.showAnimatedBranding) this._needDisplayImage && null !== this ._getLogoImage(s.logo) && (e.save(), e.translate(-Math.ceil((32 - this ._imageWidth) / 2), Math.floor((32 - this._imageHeight) / 2)), this ._originPoint = N(e.getTransform()), this.borderRadius = 16, this ._drawFillRectWithRoundedCorner(e, -.5, 0, this._animatedWidth, 32, this .borderRadius), this._drawLogoImage(e, Math.round((32 - this ._imageWidth) / 2), Math.round((32 - this._imageHeight) / 2) + 0), this ._animatedWidth > 32 && (e.translate(Math.round(32), Math.round(this ._fontSize * A(this._font))), this._drawFillTextCropWidth(e, this._animatedWidth - 32)), e.restore(), this.width = this._animatedWidth); else if ("widget_custom_branding" === this._layout || "fundamental_custom_branding" === this._layout) { e.font = this._fontSize + this._font; const t = e.measureText(this._txt).width + 2; this.width = t + e.measureText("TradingView").width + 2, this._originPoint = N(e .getTransform()), e.save(), e.globalAlpha = .7, e.fillStyle = this ._colors.customBrandingText, e.fillText(this._txt, 0, 12), e.fillStyle = this._colors.customBrandingTradingViewText, e.fillText("TradingView", t, 12), e.restore() } else if (function(e) { return !y || e > 480 }(i)) if (this._needDisplayImage && null !== this._getLogoImage(s.logo)) { e.save(), e.translate(-Math.ceil((32 - this._imageWidth) / 2), Math.floor(( 32 - this._imageHeight) / 2)), this._originPoint = N(e .getTransform()), this.borderRadius = 16, this._drawBgCircle(e), e .drawImage(Object(a.ensureNotNull)(this._getLogoImage(s.logo)), Math .round((32 - this._imageWidth) / 2), Math.round((32 - this ._imageHeight) / 2) + 0); const t = k(i); t && (e.translate(37, Math.round(this._fontSize * A(this._font))), this ._drawTextStroke(e), this._drawTextFill(e)), e.restore(), this .width = 32, t && (this.width += this._maximizedAnimationTextWidth) } else { const t = k(i); t && (e.save(), e.translate(I ? -.5 : 0, -.5), this._drawTextStroke(e), this ._drawTextFill(e), e.restore()), t && (this.width = this ._maximizedAnimationTextWidth) } else this.width = 0 } _init() { this._checkLayout(), this.show && (this.height = this._needDisplayImage ? 32 : this ._fontSize + 2, this._updateColors(), this._model.properties() .paneProperties.background.subscribe(this, this._updateColors), this._model .onChartThemeLoaded().subscribe(this, this._updateColors)) } _recalculateMetrics() { const e = Object(f.createDisconnectedBoundCanvas)(document, new f.Size(0, 0)), t = Object(f.getPretransformedContext2D)(e, !0); t.font = this._fontSize + this._font, this._textWidth = Math.ceil(t.measureText(this ._txt).width) + 2; let i = this._textWidth + 8; i % 2 == 0 && (i += 1), this._maximizedAnimationTextWidth = i, this._textWidthCache .reset() } _updateColors() { this._colors = this._model.isDark() ? D : V } _getLogoImage(e) { return R(e, this._onReadyCallback) } _checkLayout() { switch (this._layout) { case "widget_branding": case "widget_referral_branding": case "widget_custom_branding": case "fundamental_branding": case "fundamental_custom_branding": case "library_custom_branding": case "library_branding": case "site_branding": this.show = !0; break; case "widget_custom_no_powered_branding": case "fundamental_custom_no_powered_branding": case "library_custom_no_powered_branding": this.show = !1 } switch (this._layout) { case "library_branding": this._needDisplayImage = !0, this._txt = O; break; case "library_custom_branding": this._txt = L } } _drawTextStroke(e) { e.save(), e.textBaseline = "middle", e.textAlign = "start", e.font = this ._fontSize + this._font, e.strokeStyle = this._colors.staticTextBackground, e .lineWidth = 4, e.lineJoin = "round", e.strokeText(this._txt, 0, 16 + this ._textWidthCache.yMidCorrection(e, this._txt)), e.restore() } _drawTextFill(e) { e.save(), e.textBaseline = "middle", e.textAlign = "start", e.font = this ._fontSize + this._font, e.fillStyle = this._colors.text, e.fillText(this._txt, 0, 16 + this._textWidthCache.yMidCorrection(e, this ._txt)), e.restore() } _drawFillTextCropWidth(e, t) { e.save(), e.beginPath(), e.rect(0, 0, t, this.height), e.clip(), this._drawTextFill( e), e.restore() } _drawBgCircle(e) { const t = this.borderRadius, i = 2 * Math.PI; e.save(), e.beginPath(), e.fillStyle = this._colors.shadow, e.arc(t, t, t + 1, 0, i), e.fill(), e.closePath(), e.restore(), e.save(), e.beginPath(), e .fillStyle = this._colors.background, e.arc(t, t, t, 0, i, !1), e.fill(), e.closePath(), e .restore() } _drawFillRectWithRoundedCorner(e, t, i, s, r, n) { e.save(), Object(m.drawRoundRect)(e, t - 1, i - 1, s + 2, r + 2, n), e.fillStyle = this._colors.shadow, e.fill(), e.closePath(), e.restore(), e.save(), Object(m .drawRoundRect)(e, t, i, s, r, n), e.fillStyle = this._colors.background, e .fill(), e.closePath(), e.restore() } _drawLogoImage(e, t, i) { e.drawImage(Object(a.ensureNotNull)(this._getLogoImage(this._colors.logo)), t, i) } } class W extends j { constructor(e, t, i) { super(), this.show = !1, this.width = 0, this.height = 0, this._ready = !1, this ._layout = e, this._src = t, this._onReadyCallback = i, this._checkLayout(); const s = new Image; this._img = s, this.show && (s.addEventListener("load", () => { this.width = Math.round(s.width), this.height = Math.round(s .height), this._ready = !0, this._onReadyCallback && this ._onReadyCallback() }), s.crossOrigin = "anonymous", s.src = this._src) } draw(e, t) { this._ready && (e.drawImage(this._img, -.5, -.5, this.width, this.height), this ._originPoint = N(e.getTransform())) } _checkLayout() { switch (this._layout) { case "widget_custom_branding": case "widget_custom_no_powered_branding": case "fundamental_custom_branding": case "fundamental_custom_no_powered_branding": case "library_custom_branding": case "library_custom_no_powered_branding": this.show = !0; break; case "site_branding": case "widget_branding": case "widget_referral_branding": case "fundamental_branding": case "library_branding": this.show = !1 } } } function H(e, t) { function i(t) { const i = e.getAll(); if (1 === i.length) return !0; const s = i[0].hasModel() && i[0].model(); return s && s.model() === t } e.addCustomSource("branding", (e, s) => new E(e, s, i.bind(null, s), t)) } i.d(t, "addBrandingSource", (function() { return H })) }, qHEz: function(e, t, i) { "use strict"; function s(e, t) { const i = e.files && e.files.length > 0; if (!i && t && t.eventPhase > 0) return r(t, e), Promise.resolve(); if (!i) { let t = !1; const i = i => { i.stopImmediatePropagation(), r(i, e), t = !0 }; try { document.addEventListener("copy", i, !0), document.execCommand("copy") } finally { document.removeEventListener("copy", i, !0) } if (t) return Promise.resolve() } return async function(e) { if (!navigator.clipboard || !navigator.clipboard.write || !window.ClipboardItem) throw new DOMException("ClipboardApi is not supported", "NotSupportedError"); const t = {}; for (const i of e.files || []) t[i.type] = i; e.text && (t["text/plain"] = e.text); e.html && (t["text/html"] = e.html); return navigator.clipboard.write([new window.ClipboardItem(t)]) }(e) } function r(e, t) { e.preventDefault(); const i = e.clipboardData; t.text && i.setData("text/plain", t.text), t.html && i.setData("text/html", t.html) } async function n(e, t) { if ("text/plain" === t && !navigator.clipboard.write) { const t = await e; return navigator.clipboard.writeText(await t.text()) } if (!navigator.clipboard || !navigator.clipboard.write || !window.ClipboardItem) throw new DOMException("ClipboardApi is not supported", "NotSupportedError"); let i = null; try { i = new window.ClipboardItem({ [t]: e }) } catch (s) { i = new window.ClipboardItem({ [t]: await e }) } if (i) return navigator.clipboard.write([i]); throw new Error("ClipboardApi is not supported") } i.d(t, "a", (function() { return s })), i.d(t, "b", (function() { return n })) }, qJq3: function(e, t, i) { "use strict"; (function(e, s, r) { TradingView.DEFAULT_BAR_COUNT = 300, TradingView.TIME_PLOT = 0, TradingView.OPEN_PLOT = 1, TradingView.HIGH_PLOT = 2, TradingView.LOW_PLOT = 3, TradingView.CLOSE_PLOT = 4, TradingView.ADT_PLOT = 6, TradingView.STYLE_PLOT = 7; var n = i("Eyy1").assert, o = i("Eyy1").ensureNotNull, a = i("lUQk").SeriesBase, l = i("x0JF"), c = l.SeriesAreaPaneView, h = l.SeriesLinePaneView, u = l.SeriesHollowCandlesPaneView, d = l.SeriesCandlesPaneView, p = l.SeriesBarsPaneView, _ = l.SeriesHeikenAshiPaneView, m = l.SeriesBaselinePaneView, f = i("9Jkk").SeriesHiLoPaneView, g = i("biIa").SeriesWaterlinePaneView, b = i("Kxc7"), v = i("ZJKN").BarsRange, S = i("38az").SeriesBarColorer, y = i("XPit").SeriesData, w = i("k9/m"), P = w.PlotRowSearchMode, C = w.mergeMinMax, x = i("okVO").SyncModel, T = i("JWMC").trackEvent, I = i("txPx").getLogger("Chart.Series"), M = i("dfhE"), O = i("n5al"), L = i("pPtI"), A = L.getServerInterval, E = L.getResolutionByChartStyle, k = i("LxhU").Interval, D = i("z+Sa").SeriesHorizontalBaseLinePaneView, V = i("Z8aO").SeriesPriceLinePaneView, B = i("FIi8").deepExtend, R = i("5fI3").encodeExtendedSymbolOrGetSimpleSymbolString, N = i("FQhm"), j = i("YWnQ").permissionDenied, F = !b.enabled("hide_series_legend_item"), W = i("uDHo").TIMEFRAMETYPE, H = i("H0vP").InvalidationMask, U = i("n5al").isSingleValueBasedStyle; class z extends a { constructor(t, s, r, n) { var o = i("OK+B"); s.removeProperty("currencyId"), super(t, s, r, n), this ._symbolIntervalChanged = new e, this._intervalChanged = new e, this .requestingIntradayWhenNotSupported = new e, this .requestingResolutionWhenNotSupported = new e, this ._onInReplayStateChanged = new e, this ._replayExitedDueUnsupportedInterval = new e, this ._replayExitedDueUnavailableForUserInterval = new e, this ._onTimeFrameApplied = new e, this.m_model = t, this._chartApi = t ._chartApi, this.m_data = null, this.createPaneView(), this._syncModel = null, this._replaySubscriber = null, this ._isReplayResolutionAvailableForUser = null, this._haStyle = { studyId: O.chartStyleStudyId(z.STYLE_HEIKEN_ASHI, !0) }, this._renkoStyle = { studyId: O.chartStyleStudyId(z.STYLE_RENKO, !0) }, this._pbStyle = { studyId: O.chartStyleStudyId(z.STYLE_PB, !0) }, this._kagiStyle = { studyId: O.chartStyleStudyId(z.STYLE_KAGI, !0) }, this._pnfStyle = { studyId: O.chartStyleStudyId(z.STYLE_PNF, !0) }, this._rangeStyle = { studyId: O.chartStyleStudyId(z.STYLE_RANGE, !0) }, this._properties.addExclusion && (this._properties.addExclusion( "visible"), this._properties.addExclusion("currencyId")), this ._predictBars = 0, this._futureBarsPaneView = null, this._properties .showInDataWindow.listeners().subscribe(t, o.prototype.fullUpdate), this .properties().minTick.listeners().subscribe(this, z.prototype ._recreateFormatter); var a = this; this.properties().minTick.listeners().subscribe(null, (function() { a.m_model.fullUpdate() })), this._priceLineView = null, this._baseHorizontalLineView = new D( this), this._gotoDateResultCleared = !1, this._gotoDateView = null, this.bindStyleChange(), this.bindJapChartsInputs(), this ._createIsDWMProperty(), this._symbolIntervalChanged.subscribe(this, this.checkInterval), this.properties().showCountdown.listeners() .subscribe(this, z.prototype._onChangeShowCountdown), this ._onChangeShowCountdown(this.properties().showCountdown), this ._recreatePriceFormattingDependencies(), this.properties().lineStyle .priceSource.listeners().subscribe(this, this._updateBarFunction), this .properties().areaStyle.priceSource.listeners().subscribe(this, this ._updateBarFunction), this.properties().baselineStyle.priceSource .listeners().subscribe(this, this._updateBarFunction), this ._updateBarFunction() } isLoading() { return this._loading } isSymbolInvalid() { return this._status === z.STATUS_INVALID_SYMBOL } styleStudyInfos() { return { haStyle: this._haStyle, renkoStyle: this._renkoStyle, pbStyle: this._pbStyle, kagiStyle: this._kagiStyle, pnfStyle: this._pnfStyle, rangeStyle: this._rangeStyle } } styleStudyInfo(e) { return this.styleStudyInfos()[e] } priceLineColor(e) { return this.properties().priceLineColor.value() || e } serverTimeOffset() { return this._chartApi.serverTimeOffset() } _onChangeShowCountdown(e) { var t = this; e.value() ? this._countdownUpdateTimer = this.m_model.setInterval(( function() { t._priceAxisView.updateCountdown() }), 500) : (this.m_model.clearInterval(this._countdownUpdateTimer), delete this._countdownUpdateTimer) } lastValueData(e, t, i) { var s = { noData: !0 }; if (this.m_model.timeScale().isEmpty() || this.priceScale().isEmpty() || this.data().isEmpty()) return s; var r, n, o = this.m_model.timeScale().visibleBarsStrictRange(); if (null === o) return s; if (t) { var a = this.data().bars().last(); if (null === a) return s; r = a.value, n = a.index } else { var l = this.data().bars().search(o.lastBar(), P.NearestLeft); if (null === l) return s; r = this.data().bars().valueAt(l.index), n = l.index } var c = { noData: !1 }, h = void 0 !== e ? r[e] : this._barFunction(r); i && (c.price = h); var u = this.firstValue(); c.text = this.priceScale().formatPrice(h, u), c.formattedPriceAbsolute = this.priceScale().formatPriceAbsolute(h), c.formattedPricePercentage = this.priceScale().formatPricePercentage(h, u, !0); var d = this.barColorer().barStyle(n, !1); return c.color = d.barColor, c.floatCoordinate = this.priceScale() .priceToCoordinate(h, u), c.coordinate = c.floatCoordinate, c.index = n, c } _createIsDWMProperty() { this._isDWMProperty = new s(this.isDWM()), this._onRestarted.subscribe(this, (function() { this._isDWMProperty.setValue(this.isDWM()) })) } isDWMProperty() { return this._isDWMProperty } model() { return this.m_model } fixLastBar(e) { 0 } clearData() { n(null === this.m_data, "Cannot clear loaded data"), this._seriesSource .clearData() } data() { return this.m_data || this._seriesSource.data() } isPulse() { return this._symbolInfo && this._symbolInfo.resolutions.length > 0 } onSymbolIntervalChanged() { return this._symbolIntervalChanged } onIntervalChanged() { return this._intervalChanged } status() { return this._status } createPaneView() { this._paneView = null, this._projectionBarsPaneView = null, this ._waterlineView = null, this._priceLineView = this.hasClosePrice() ? new V(this) : null; var e = this._properties.style.value(); switch (e) { case z.STYLE_BARS: this._paneView = new p(this, this.m_model); break; case z.STYLE_CANDLES: this._paneView = new d(this, this.m_model); break; case z.STYLE_LINE: this._paneView = new h(this, this.m_model); break; case z.STYLE_AREA: this._paneView = new c(this, this.m_model); break; case z.STYLE_HEIKEN_ASHI: this._paneView = new _(this, this.m_model); break; case z.STYLE_HOLLOW_CANDLES: this._paneView = new u(this, this.m_model); break; case z.STYLE_BASELINE: this._paneView = new m(this, this.m_model), this._waterlineView = new g(this); break; case z.STYLE_HILO: this._paneView = new f(this, this.m_model) } if (null === this._paneView) throw Error("Unknown chart style assigned: " + e) } _clearStylePlot(e, t) { if (0 !== e.size()) { var i = t || o(e.firstIndex()), s = o(e.lastIndex()) + 1; e.range(i, s).each((function(e, t) { t[TradingView.STYLE_PLOT] = null })) } } invalidateBarStylesCache(e) { I.logDebug("Invalidate style cache starting from " + e), this ._clearStylePlot(this.bars(), e), this._clearStylePlot(this.nsBars()) } invalidateBarColorerCache() { delete this._barColorerCache, this.invalidateBarStylesCache() } barColorer() { if (this._barColorerCache) return this._barColorerCache; for (var e = null, t = this.m_model.dataSources().length - 1; t >= 0; t--) { var i = this.m_model.dataSources()[t]; if (i.metaInfo && TradingView.isInherited(i.constructor, TradingView .Study) && i.hasBarColorer() && i.properties().visible .value()) { var s = i.barColorer(); null === e ? e = s : e.pushBackBarColorer(s) } } return null === e ? e = new S(this) : e.pushBackBarColorer(new S(this)), this._barColorerCache = e, this._barColorerCache } properties() { return this._properties } _barsState(e) { var t = e.state(); return t.data.forEach((function(e) { e.value.splice(7, 1) })), t } state(e) { var t = this === this.m_model.mainSeries() ? "MainSeries" : TradingView .className(this.constructor); const i = this.obsoleteZOrder(); var s = { type: t, id: this.id(), state: this.properties().state(), zorder: i, haStyle: this._haStyle, renkoStyle: this._renkoStyle, pbStyle: this._pbStyle, kagiStyle: this._kagiStyle, pnfStyle: this._pnfStyle, rangeStyle: this._rangeStyle }; return this._symbolInfo && this._symbolInfo.ticker && (s.state.symbol = this ._symbolInfo.ticker), e && (s.bars = this._barsState(this.bars()), s .nsBars = this._barsState(this.nsBars()), s.symbolInfo = this ._symbolInfo, s.rtPrice = this.data().lastProjectionPrice), s .boxSize = this.data().boxSize, s.reversalAmount = this.data() .reversalAmount, s } restoreState(e, t) { t && this._setStatus(z.STATUS_SNAPSHOT), this._properties.mergeAndFire(e .state), this._properties.hasChild("esdBreaksStyle") && this ._properties.removeProperty("esdBreaksStyle"), this._prevChartStyle = this.properties().style.value(), this.createPaneView(), t && this .restoreData(e.bars, e.nsBars, e.symbolInfo, e.rtPrice, e.boxSize, e .reversalAmount) } hasStateForAlert() { return !1 } stateForAlert() { throw new Error("Not implemented") } idForAlert() { return a.prototype.idForAlert.call(this) } restoreData(e, t, i, s, r, n) { this._status = z.STATUS_SNAPSHOT, this.m_data = new y, this.m_data.m_bars .restoreState(e), this.m_data.m_nsBars.restoreState(t), this .updateSymbolInfo(i, !1), this.m_data.lastProjectionPrice = s, this.m_data.boxSize = r, r || (this .properties().style.value() === z.STYLE_PNF ? this.m_data.boxSize = this.properties().pnfStyle.inputs.boxSize.value() : this .properties().style.value() === z.STYLE_RENKO && (this.m_data .boxSize = this.properties().renkoStyle.inputs.boxSize.value()) ), this.m_data.reversalAmount = n, n || this.properties().style .value() === z.STYLE_KAGI && (this.m_data.reversalAmount = this .properties().kagiStyle.inputs.reversalAmount.value()), this ._loading = !1 } seriesSource() { return this._seriesSource } _onSymbolResolved(e) { this._seriesErrorMessage = null, this.updateSymbolInfo(e, !1), this.m_model .updateSource(this), this.m_model.realignLineTools(), TradingView .onWidget() || (T("Symbol", e.listed_exchange, e.name), T("Symbol Type", e.type, e.listed_exchange)); var t = this.symbolInfo().minmov / this.symbolInfo().pricescale, i = this.properties(); i.style.value() === z.STYLE_RENKO && i.renkoStyle.inputs.boxSize.value() < t ? i.renkoStyle.inputs.merge({ boxSize: t }) : i.style.value() === z.STYLE_PNF && i.pnfStyle.inputs.boxSize .value() < t ? i.pnfStyle.inputs.merge({ boxSize: t }) : i.style.value() === z.STYLE_KAGI && i.kagiStyle.inputs .reversalAmount.value() < t && i.kagiStyle.inputs.merge({ reversalAmount: t }) } _onSymbolError(e) { this._setStatus(z.STATUS_INVALID_SYMBOL), this._loading = !1, this ._properties.shortName.setValue(this._properties.symbol.value()), this .m_model.clearAllStudies(), this.updateAllViews(), this.m_model .updateSource(this), e !== j && this.m_model.resetTimeScale(), this .m_model.realignLineTools() } _onSeriesTimeFrame(e, t, i, s, r) { var n = this.m_model.timeScale(), o = U(this.style()) ? e + .5 : e, a = t; if (void 0 === r) null !== i && i.type !== W.PeriodBack || (a += n .defaultRightOffsetProperty().value()); else if (r.applyDefaultRightMargin) a += n.defaultRightOffsetProperty() .value(); else if (r.percentRightMargin) { var l = t - o + 1, c = Math.max(0, Math.min(.99, r.percentRightMargin / 100)); a += c * l / (1 - c) } this.m_model.setTimeViewport(o, a) } _onSeriesError(e) { this._loading = !1; var t = e.error; if (e.ctx) { var i = {}; Object.entries(e.ctx).forEach((function(e, t) { i[e] = t.toString() })), t = t.format(i) } b.enabled("charting_library_debug_mode") && I.logNormal("Error reason: " + t), this._seriesErrorMessage = t; const s = "unknown_symbol" !== t ? z.STATUS_ERROR : b.enabled( "no_bars_status") && this._symbolInfo ? z.STATUS_NO_BARS : z .STATUS_INVALID_SYMBOL; this._setStatus(s), this._seriesLoaded = !0, this._enablePriceRangeReady() } _onSeriesCompleted(e, t) { if (this._setSymbolIntervalDelay) { if (this._willSymbolIntervalCurrencyChanged()) return void I.logNormal( "command comes during symbol/interval changing"); I.logNormal( "series_completed comes when symbol interval delay present but symbol/interval should not be changed" ) } this._loading = !1, this._seriesErrorMessage = null; var i = e; switch ("pulsed" === i && (i = "delayed"), i) { case "streaming": this._setStatus(z.STATUS_READY); break; case "endofday": this._setStatus(z.STATUS_EOD); break; case "delayed": this._setStatus(z.STATUS_DELAYED); break; case "pulsed": this._setStatus(z.STATUS_PULSE); break; case "replay": this._setStatus(z.STATUS_REPLAY) } i.match(/delayed_streaming/) && this._setStatus(z.STATUS_DELAYED_STREAMING); var s = this.m_model.paneForSource(this); s.recalculatePriceScale(this.priceScale()); var r = H.full(); null !== this.m_model.appliedTimeFrame().value() && r .lockVisibleTimeRangeOnResize(), this.m_model.invalidate(r), this .model().recalcVisibleRangeStudies(!0), this.model() .recalcStudyBasedLineTools(), !this.m_priceScale.isLockScale() || this .model().timeScale().isEmpty() || this._seriesLoaded || (this.model() .timeScale()._correctOffset(), this.model().timeScale() .correctBarSpacing(), this.model().resetPriceScale(s, this .priceScale())), this._seriesLoaded = !0, this ._enablePriceRangeReady() } _onBarReceived(e) { this.model().recalcVisibleRangeStudies(!0) } disconnect() { this._seriesSource.stop(), this.m_symbol = void 0, this._predictBars = 0, this._status = z.STATUS_OFFLINE } isStarted() { return this._seriesSource.isStarted() } restart() { if (this._status !== z.STATUS_SNAPSHOT) { this._loading = !0, this._onRestarted.fire(), this._setStatus(z .STATUS_RESOLVING), this.updateSymbolInfo(null, !0); var e = this._properties.interval.value(); this._checkIntervalWillChanged(e) && this._notifyIntervalChanged(e); var t = null; this._pendingTimeRange && (t = this._pendingTimeRange, delete this ._pendingTimeRange), this._onBeforeModifySeries(this .getSymbolString(), e), this._onTimeFrameApplied.fire(t), e = A( e), this.m_data = null, this._seriesSource.modifySeries(this ._getResolvingSymbolObject(), e, t), this._seriesSource .isStarted() || this._seriesSource.start(), this.m_symbol = this ._properties.symbol.value(), this._currency = this._properties .currencyId.value(), this._unit = this._properties.unitId.value(), this.m_interval = this._properties.interval.value() } } hasDelayedSymbolIntervalChange() { return !!this._setSymbolIntervalDelay } setSymbolIntervalCurrencyDelayed() { this._willSymbolIntervalCurrencyChanged() && (this ._setSymbolIntervalDelay && (I.logNormal( "Clear timeout to change symbol/interval #" + this ._setSymbolIntervalDelay), clearTimeout(this ._setSymbolIntervalDelay)), this._setSymbolIntervalDelay = setTimeout(function() { const e = this._properties; I.logNormal("Timeout #" + this._setSymbolIntervalDelay + ' fired, new symbol will be "' + e.symbol.value() + '"'), delete this._setSymbolIntervalDelay, this ._setSymbolInterval(e.symbol.value(), e.interval .value(), e.currencyId.value(), e.unitId.value()) }.bind(this), 30), I.logNormal("Started timeout #" + this ._setSymbolIntervalDelay + ' to change symbol/interval from "' + this.m_symbol + '" to "' + this._properties.symbol.value() + '"' )) } rerequestData() { this._setSymbolInterval(this.m_symbol, this.m_interval, this._currency, this ._unit, !0) } _notifyIntervalChanged(e) { var t = { timeframe: this._pendingTimeRange }; this._intervalChanged.fire(e, t), this._pendingTimeRange = t.timeframe } _setSymbolInterval(e, t, i, s, r) { this.clearGotoDateResult(), k.isRange(t) && this._properties.rangeStyle .inputs.range.setValue(k.parse(t).multiplier()); var n = this._checkSymbolWillChanged(e), o = this._checkIntervalWillChanged(t), a = this._checkCurrencyWillChanged(i), l = this._checkUnitWillChanged(s); if (!(n || o || a || l || r)) return this.m_model.realignLineTools(), void this.m_model.updateLineTools(); if (this._syncModel = null, this.m_symbol = e, this.m_interval = t, this ._currency = i, this._unit = s, this._status !== z.STATUS_SNAPSHOT && (!this ._seriesSource.isStarted() || n || a || l) && this.updateSymbolInfo( null, !n && (a || l)), this.m_model.realignLineTools(), this ._status !== z.STATUS_SNAPSHOT) { this._loading = !0, this._setStatus(z.STATUS_RESOLVING), this ._symbolIntervalChanged.fire(), o && this._notifyIntervalChanged( this.m_interval), this._onRestarted.fire(), this ._seriesLoaded = !1, this._lineStyleLastPriceCirclePaneView .stopAnimation(); var c = null; this._pendingTimeRange && (c = this._pendingTimeRange, delete this ._pendingTimeRange), this._onTimeFrameApplied.fire(c), this ._onBeforeModifySeries(this.getSymbolString(), t), this.m_data = null, this._seriesSource.modifySeries(this ._getResolvingSymbolObject(), A(t), c, r), this._seriesSource .isStarted() || (this._predictBars = 0, this._seriesSource.start()), (n || a || l) && this.disablePriceRangeReady() } } setDefaultTimeframe(e) { this._pendingTimeRange = e } symbol() { return this.properties().symbol.value() } bars() { return this.data().m_bars } nsBars() { return this.data().m_nsBars } hl2(e) { return (this.high(e) + this.low(e)) / 2 } hlc3(e) { return (this.high(e) + this.low(e) + this.close(e)) / 3 } ohlc4(e) { return (this.open(e) + this.high(e) + this.low(e) + this.close(e)) / 4 } priceRange(e, t) { if (!TradingView.isInteger(e)) return I.logDebug( "Series.priceRange: incorrect startBar"), null; if (!TradingView.isInteger(t)) return I.logDebug( "Series.priceRange: incorrect endBar"), null; if (this.data().isEmpty()) return null; if (this.m_priceScale.isLockScale()) { var i = this._model.mainSeriesScaleRatio(); if (null !== i) { var s = this.priceScale().internalHeight() / (this.model() .timeScale().barSpacing() / i), n = this.data().search(t, P.NearestLeft), o = (n.value[TradingView.HIGH_PLOT] + n.value[TradingView .LOW_PLOT]) / 2; return new r(o - .5 * s, o + .5 * s) } } var a = this.priceSource(); if (null !== a) var l = this.data().bars().minMaxOnRangeCached(e, t, [{ name: a, offset: 0 }]), c = this.data().nsBars().minMaxOnRangeCached(e, t, [{ name: a, offset: 0 }]); else l = this.data().bars().minMaxOnRangeCached(e, t, [{ name: "low", offset: 0 }, { name: "high", offset: 0 }]), c = this.data().nsBars().minMaxOnRange(e, t, [{ name: "low", offset: 0 }, { name: "high", offset: 0 }]); var h = null !== (l = C(l, c)) ? l.min === l.max ? new r(l.min - .5, l.max + .5) : new r(l.min, l.max) : new r(-.5, .5); return this.priceScale().isLog() ? new r(this.priceScale().priceToLogical(h .minValue()), this.priceScale().priceToLogical(h.maxValue())) : h } nearestData(e, t) { if (TradingView.isInteger(e)) { var i = this.data().search(e, t); return null !== i ? i : void 0 } I.logDebug("Series.nearestData: incorrect logicalPoint") } nearestIndex(e, t) { var i = this.nearestData(e, t); return i ? i.index : void 0 } paneViews() { if (!this.properties().visible.value()) return null; var e = [this._baseHorizontalLineView, this._paneView]; return this._futureBarsPaneView && e.push(this._futureBarsPaneView), this ._projectionBarsPaneView && e.push(this._projectionBarsPaneView), null !== this._waterlineView && e.push(this._waterlineView), null !== this._priceLineView && e.push(this._priceLineView), null !== this ._gotoDateView && e.push(this._gotoDateView), e.push(...this ._highLowAvgPaneViews), e } dataWindowView() { return this._dataWindowView } legendView() { return this._legendView } statusView() { return F ? this._statusView : null } marketStatusModel() { return this._marketStatusModel } dataUpdatedModeModel() { return this._dataUpdatedModeModel } dataProblemModel() { return this._dataProblemModel } purgeSymbolInfo() { this._symbolInfo = null } updateSymbolInfo(e, t) { if (this._prevSymbolInfo = t ? this._symbolInfo : null, this._symbolInfo = e, e) { this._properties.shortName.setValue(e.name); var i = O.extractSymbolNameFromSymbolInfo(e, this.m_symbol); i && this._properties.symbol.setValue(i), this._currency = O .symbolCurrency(e), this._properties.currencyId.setValue(this ._currency), this._unit = O.symbolUnit(e), this._properties .unitId.setValue(this._unit), this._updateSessionIdProxyProperty(!0) } this._base = e ? e.pricescale / e.minmov : 100, this._pointValue = e && e .pointvalue || 1, this._recreatePriceFormattingDependencies(), this ._statusView.update(), this.priceScale().updateFormatter(); var s = this._getSymbolForApi(); this._quotesProvider.setQuotesSessionSymbol(s), this.checkInterval() } updateAllViews() { this._paneView.update(), this._dataWindowView.update(), this._legendView .update(), this._statusView.update(), this._highLowAvgPaneViews.forEach( e => e.update()), this._labelPaneViews.forEach(e => e.update()), this._priceAxisViews.forEach(e => e.update()), this._priceLineAxisViews .forEach(e => e.update()), this._futureBarsPaneView && this ._futureBarsPaneView.update(), this._projectionBarsPaneView && this ._projectionBarsPaneView.update(), null !== this._waterlineView && this ._waterlineView.update(), null !== this._priceLineView && this ._priceLineView.update(), null !== this._gotoDateView && this ._gotoDateView.update(), this._baseHorizontalLineView.update(); var e = this._model.activeStrategySource().value(); null !== e && e.updateAllViews(), this._lineStyleLastPriceCirclePaneView .update() } requestMoreData(e) { if ((this._status === z.STATUS_READY || this._status === z.STATUS_PULSE || this._status === z.STATUS_DELAYED || this._status === z .STATUS_DELAYED_STREAMING || this._status === z.STATUS_EOD || this ._status === z.STATUS_REPLAY) && !this.m_model.timeScale() .isEmpty()) { var t = this.m_model.timeScale().visibleBarsStrictRange(); if (null !== t && 0 !== this.bars().size()) { var i = t.lastBar() - o(this.data().last()).index; if (this._predictBars < i && (this._predictBars = i, this ._seriesSource.requestMoreTickmarks(i)), !this._endOfData) { var s = o(this.bars().firstIndex()), r = e || s - t.firstBar(); r <= 0 || (Number.isFinite(r) ? (this._endOfData = !0, this ._loading = !0, this._seriesSource.requestMoreData( r), this._setStatus(z.STATUS_LOADING)) : I .logWarn("requestMoreData: invalid bar count: " + r + ", visible bars: [" + t.firstBar() + ", " + t .lastBar() + "], last index: " + o(this.data() .last()).index + ", predicted bars: " + this ._predictBars + ", required bars:" + e)) } } } } bindStyleChange() { var e = this; Object.keys(z.STYLE_SHORT_NAMES).map((function(e) { return z.STYLE_SHORT_NAMES[e] + "Style" })).forEach((function(t) { e._properties[t].listeners().subscribe(e, z.prototype .invalidateBarStylesCache) })) } bindJapChartsInputs() { this._properties.style.listeners().subscribe(this, this .onChartStyleChanged), this._properties.renkoStyle.inputs.boxSize .listeners().subscribe(this, this.onInputChanged), this._properties.renkoStyle.inputs.style.listeners().subscribe(this, this.onInputChanged), this._properties.renkoStyle.inputs.atrLength .listeners().subscribe(this, this.onInputChanged), this._properties .renkoStyle.inputs.wicks.listeners().subscribe(this, this .onInputChanged), this._properties.renkoStyle.inputs.sources .listeners().subscribe(this, this.onInputChanged), this._properties .pbStyle.inputs.lb.listeners().subscribe(this, this.onInputChanged), this._properties.kagiStyle.inputs.reversalAmount.listeners().subscribe( this, this.onInputChanged), this._properties.kagiStyle.inputs.style .listeners().subscribe(this, this.onInputChanged), this._properties .kagiStyle.inputs.atrLength.listeners().subscribe(this, this .onInputChanged), this._properties.pnfStyle.inputs.boxSize .listeners().subscribe(this, this.onInputChanged), this._properties .pnfStyle.inputs.reversalAmount.listeners().subscribe(this, this .onInputChanged), this._properties.pnfStyle.inputs.sources .listeners().subscribe(this, this.onInputChanged), this._properties .pnfStyle.inputs.style.listeners().subscribe(this, this.onInputChanged), this._properties.pnfStyle.inputs.atrLength.listeners().subscribe(this, this.onInputChanged), this._properties.pnfStyle.inputs .oneStepBackBuilding.listeners().subscribe(this, this.onInputChanged), this._properties.rangeStyle.inputs.phantomBars.listeners().subscribe( this, this.onInputChanged) } createDividendsAdjustmentProperty() { throw new Error("Not implemented") } dividendsAdjustmentProperty() { return null } setChartStyleWithIntervalIfNeeded(e, t) { var i = t; void 0 === t && (i = E(e, this._properties.interval.value(), this._model .defaultResolutions())), k.isEqual(i, this._properties.interval .value()) || this._properties.interval.setValue(i), this._properties .style.setValue(e) } isNeedRestart(e) { return this._status !== z.STATUS_SNAPSHOT && (void 0 === e && (e = this .properties().style.value()), !O.isRangeStyle(this ._prevChartStyle) && !O.isRangeStyle(e) && !(this ._prevChartStyle === e || !O.isRequiringRestartSeriesStyles(this ._prevChartStyle) && !O.isRequiringRestartSeriesStyles(e))) } applyPreferences(e) { var t = B({}, e); this.m_priceScale.setMode({ autoScale: t.priceAxisProperties.autoScale, percentage: t.priceAxisProperties.percentage, log: t.priceAxisProperties.log, lockScale: t.priceAxisProperties.lockScale }), this.setChartStyleWithIntervalIfNeeded(t.style), delete t.style, delete t.interval, this._properties.mergePreferences(t), this ._properties.saveDefaults(), this.createPaneView(), this .invalidateBarStylesCache() } priceSource() { var e = null; switch (this._properties.style.value()) { case z.STYLE_LINE: e = this._properties.lineStyle.priceSource.value(); break; case z.STYLE_AREA: e = this._properties.areaStyle.priceSource.value(); break; case z.STYLE_BASELINE: e = this._properties.baselineStyle.priceSource.value() } return e } isRangeBasedStyle() { return O.isRangeBasedStyle(this.style()) } onInputChanged() { this.restart() } getSymbolString() { return R(this._getSymbolObject()) } _getResolvingSymbolObject() { return this._getSymbolObject() } getStyleShortName() { var e = this._properties.style.value(); if (z.STYLE_SHORT_NAMES.hasOwnProperty(e)) return z.STYLE_SHORT_NAMES[e]; throw new Error("Missed short name for style " + e) } getStyleProperties() { return this._properties[this.getStyleShortName() + "Style"] } getInputsProperties() { return this.getStyleProperties().inputs || new s } getInputsInfoProperties() { return this.getStyleProperties().inputInfo || new s } getRealVisibleRange() { var e = this.model().timeScale().visibleBarsStrictRange(); if (null === e) return null; var t = this.data().search(e.firstBar(), P.NearestRight), i = this.data().search(e.lastBar(), P.NearestLeft); return null === t || null === i ? null : new v(t.index, i.index) } firstValue() { var e = this.firstBar(); return null === e ? null : this._barFunction(e) } firstBar() { var e = this.model().timeScale().visibleBarsStrictRange(); if (null === e) return null; var t = e.firstBar(), i = this.data().search(t, P.NearestRight); return null !== i ? i.value : null } isSpread() { return null !== this._symbolInfo && "spread" === this._symbolInfo.type } getSymbolName() { return this._symbolInfo ? this._symbolInfo.name : "" } loadDataTo(e) { var t = this._properties.interval.value(); this._onTimeFrameApplied.fire(e), this._seriesSource.modifySeries(this ._getResolvingSymbolObject(), A(t), e) } checkInterval() { if (this._symbolInfo && (k.isIntraday(this.interval()) && !this._symbolInfo .has_intraday && this.requestingIntradayWhenNotSupported.fire(), this._symbolInfo.hasOwnProperty("supported_resolutions"))) { var e = k.normalize(this._properties.interval.value()); - 1 === this ._symbolInfo.supported_resolutions.indexOf(e) && this .requestingResolutionWhenNotSupported.fire(this._symbolInfo .supported_resolutions[0]) } } priceScale() { return this.m_priceScale } setPriceScale(e) { this.m_priceScale !== e && (this._priceScaleAboutToBeChanged.fire(), this .m_priceScale = e, this._properties.removeProperty( "priceAxisProperties"), this._properties.addChild( "priceAxisProperties", e.properties()), this._properties .priceAxisProperties.childChanged(), N.emit("series_event", "price_scale_changed"), this._priceScaleChanged.fire(e)) } setGotoDateResult(e) { this._gotoDateResultCleared = !1, i.e("series-pane-views").then(i.t.bind( null, "+weX", 7)).then(({ GotoDateView: t }) => { this._gotoDateResultCleared || (this._gotoDateView = new t(this, e), this.m_model.updateSource(this)) }) } clearGotoDateResult(e) { this._gotoDateView = null, this._gotoDateResultCleared = !0 } syncModel() { if (!this._syncModel) { var e = this.symbolInfo(), t = this.interval(); if (!e || !t) return null; this._syncModel = new x(e, t) } return this._syncModel } getSourceIcon() { return { type: "loadSvg", svgId: "series." + this.properties().style.value() } } isStyleSupported(e) { return !0 } isIntervalSupported(e) { return !0 } isStyleSupportedForReplay(e) { return O.isTimeBasedStyle(e) } isInReplay() { return null !== this._replaySubscriber } onTimeFrameApplied() { return this._onTimeFrameApplied } onInReplayStateChanged() { throw new Error("Not implemented") } replayExitedDueUnsupportedInterval() { throw new Error("Not implemented") } replayExitedDueUnavailableForUserInterval() { throw new Error("Not implemented") } switchToReplay(e, t) { throw new Error("Not implemented") } switchToRealtime() { throw new Error("Not implemented") } _removeReplaySubscriber() { throw new Error("Not implemented") } _onBeforeModifySeries(e, t) { 0 } _getTelemetryAdditionalData(e, t) { t = void 0 === t || t; var i = { symbol: this.actualSymbol() }; return t && (i.resolution = this.interval()), void 0 !== e && (i.reason = e), i } _sendTelemetryReport(e, t, i) { void 0 === i && (i = this._getTelemetryAdditionalData()); var s = Object.assign(t, { additional: i }); (void 0).sendChartReport(e, s) } _sendTelemetryCounter(e, t) { this._sendTelemetryReport(e, { count: 1 }, t) } destroy() { this._replayExitedDueUnsupportedInterval.destroy(), this ._replayExitedDueUnavailableForUserInterval.destroy(), this ._quotesProvider.quotesUpdate().unsubscribeAll(this), this ._quotesProvider.destroy(), this.clearGotoDateResult(), this._legendView .destroy(), this._marketStatusModel.destroy(), null !== this ._dataUpdatedModeModel && this._dataUpdatedModeModel.destroy(), this ._dataProblemModel.destroy(), this._paneView && this._paneView .destroy && this._paneView.destroy(), this._onTimeFrameApplied .destroy(), this._seriesSource.destroy(), super.destroy() } dataEvents() { return this._seriesSource.dataEvents() } moveData(e) { return this._seriesSource.moveData(e) } } Object.assign(z, M), TradingView.Series = z, t.Series = z }).call(this, i("aIyQ"), i("tc+8"), i("Qb4w").PriceRange) }, qXYw: function(e, t, i) { "use strict"; i.r(t); var s = i("n5al"), r = i("ivNn"), n = i("YFKU"), o = i("qFKp"), a = i("Tmoa"), l = i("Ialn"), c = i("GH0z"), h = i("6I19"), u = i("k9/m"), d = i("CW80"), p = i("mMWL"), _ = i("7qT/"), m = i("38az"), f = i("xCUR"); const g = o.CheckMobile.any(), b = g && !0, v = new c.PercentageFormatter, S = Object(n.t)("n/a"), y = `${S} (${S}%)`; i.d(t, "OverlayLegendValuesProvider", (function() { return w })); class w extends class { constructor(e, t) { this._study = e, this._model = t, this._emptyValues = [{ title: Object(n.t)("Open"), visible: !1, value: "", index: 0, id: "" }, { title: Object(n.t)("High"), visible: !1, value: "", index: 1, id: "" }, { title: Object(n.t)("Low"), visible: !1, value: "", index: 2, id: "" }, { title: Object(n.t)("Close"), visible: !1, value: "", index: 3, id: "" }, { title: "", visible: !1, value: "", index: 4, id: "" }, { title: "", visible: !1, value: "", index: 5, id: "" }, { title: Object(n.t)("Change"), visible: !1, value: "", index: 6, id: "" }] } getItems() { return this._emptyValues } getValues(e) { const t = this._emptyValues.map(e => ({ ...e })); if (this._model.timeScale().isEmpty()) return t; if (0 === this._study.data().size()) return t; const i = this._showLastPriceAndChangeOnly(); if (Object(r.isNumber)(e) || (i ? e = this._study.data().lastIndex() : (e = this ._model.crossHairSource().appliedIndex(), Object(r.isNumber)(e) || (e = this._study.data().lastIndex()))), null === e || !Object(r.isNumber)(e)) return t; const s = this._study.data().search(e, u.PlotRowSearchMode.NearestLeft, 1), n = Object(h.c)(this._model.paneForSource(this._study)); if (null === s || null === n) return t; const o = s.index, c = s.value, d = c[1], p = c[2], _ = c[3], g = c[4]; if (null == d || null == p || null == _ || null == g) return t; t[0].value = S, t[1].value = S, t[2].value = S, t[3].value = S, t[6].value = y; for (const e of t) e.visible = !i; const w = t[4]; w.visible = !1; const { values: P } = this._changesData(g, d, o, i), C = Object(f.a)(this._study); if (Object(f.b)(this._study)) t[6].value = ""; else if (void 0 !== P) { const e = this._study.formatter(); t[6].value = Object(l.forceLTRStr)( `${e.format(P.change, !0)} (${v.format(P.percentChange, !0)})`) } i ? (t[5].value = C(g), t[5].visible = !0, t[6].visible = !0) : (t[0].value = C(d), t[1].value = C(p), t[2].value = C(_), t[3].value = C(g), w.value = C(this ._study.barFunction()(c)), t[5].visible = !1); let x = null; if (i && !b) x = void 0 === P || P.change >= 0 ? m.SeriesBarColorer.upColor(this ._study.properties()) : m.SeriesBarColorer.downColor(this._study .properties()); else { const e = this._study.barColorer().barStyle(o, !1), t = null != e.barBorderColor ? e.barBorderColor : e.barColor; x = Object(h.b)(n, t) } x = Object(a.resetTransparency)(Object(h.b)(n, x)); for (const e of t) e.color = x; return t } _showLastPriceAndChangeOnly() { return g && (null === this._model.crossHairSource().pane || Object(d.isLineToolName) (p.tool.value()) || null !== this._model.lineBeingEdited()) } _changesData(e, t, i, s) { var r; if (s && !b) { const e = this._study.quotes(); if (null !== e) return { values: { change: e.change, percentChange: e.change_percent }, priceDirection: { basedOnCurrentBar: e.change >= 0 ? 0 : 1, basedOnPrevClose: e.change >= 0 ? 0 : 1 } } } else { const s = this._study.data().search(i - 1, u.PlotRowSearchMode.NearestLeft, 1), n = null !== (r = null == s ? void 0 : s.value[4]) && void 0 !== r ? r : null; if (null !== n) return { values: { change: e - n, percentChange: Object(_.a)(n, e) }, priceDirection: { basedOnCurrentBar: e >= t ? 0 : 1, basedOnPrevClose: e >= n ? 0 : 1 } } } return { priceDirection: { basedOnCurrentBar: e >= t ? 0 : 1, basedOnPrevClose: e >= t ? 0 : 1 } } } } { constructor(e, t) { super(e, t), this._showBarChange = t.properties().paneProperties.legendProperties .showBarChange, this._showSeriesOHLC = t.properties().paneProperties .legendProperties.showSeriesOHLC, this._seriesStyle = e.properties().childs() .style } getValues(e) { const t = super.getValues(e); if (!this._showLastPriceAndChangeOnly()) { const e = Object(s.isPriceSourceStyle)(this._seriesStyle.value()), i = this._showSeriesOHLC.value(), r = i && !e, n = i && e; t[0].visible = r, t[1].visible = r, t[2].visible = r, t[3].visible = r, t[6] .visible = this._showBarChange.value(), t[4].visible = n } return t } } }, qcGP: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty, n = i("mMWL"); class o extends s { constructor(e, t) { super(e, t || o.createProperties()), this._priceAxisViews.push(this .createPriceAxisView(3)), i.e("lt-pane-views").then(i.t.bind(null, "9FRF", 7)).then(({ ParallelChannelPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } calculatePriceDiff() { var e = this.points(); if (3 === e.length) { var t = e[0], i = e[1], s = e[2], r = this._findPriceOffset(t, i, s); null !== r && isFinite(r) && (this._priceOffset = r) } } _findPriceOffset(e, t, i) { var s = this.priceScale(); if (null === s || e.index === t.index) return null; if (s.isLog()) { var r = this._model.timeScale(); if (r.isEmpty()) return null; var n = this.ownerSource().firstValue(), o = r.indexToCoordinate(e.index), a = r.indexToCoordinate(t.index), l = s.priceToCoordinate(e.price, n), c = s.priceToCoordinate(t.price, n), h = l + (m = (c - l) / (a - o)) * (r.indexToCoordinate(i.index) - o), u = s.priceToCoordinate(i.price, n) - h, d = (n = this.ownerSource().firstValue(), .5 * (l + c)), p = s.coordinateToPrice(d, n), _ = d + u; return s.coordinateToPrice(_, n) - p } var m = (t.price - e.price) / (t.index - e.index), f = e.price + m * (i.index - e.index); return i.price - f } setLastPoint(e, t) { t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this .points()[0]), super.setLastPoint(e), this.calculatePriceDiff() } restorePoints(e, t, i) { super.restorePoints(e, t, i), e && e.length >= 3 && (this._priceOffset = e[2] .price - e[0].price) } setPoint(e, t, i) { if (i && i.shift()) switch (e) { case 0: case 1: this._snapPoint45Degree(t, this._points[1 - e]); break; case 2: case 3: this._snapPoint45Degree(t, { index: this._points[3 - e].index, price: this._points[3 - e].price + this._priceOffset }) } var s = !1; switch (e) { case 0: case 1: super.setPoint(e, t, i); break; case 2: case 3: this._points[e - 2].index = t.index, this._points[e - 2].price = t.price - this._priceOffset; break; case 4: this._points[2] = t, this.calculatePriceDiff(), s = !0; break; case 5: var r = this._findPriceOffset(this._points[0], this._points[1], t); null !== r && isFinite(r) && (this._points[0].price += r, this._points[1] .price += r, this._priceOffset -= r, s = !0) } if (e % 2 == 0 && this._correctThirdPoint(), s && this.linkKey().value()) { for (var o = [], a = 0; a < this._points.length; a++) o.push(this._points[a] .price); n.changeLineStyle({ model: this._model, linkKey: this.linkKey().value(), state: { prices: o } }) } } restoreExternalState(e) { if ((e = Object.assign({}, e)).prices) if (this.isActualSymbol()) { for (var t = 0; t < e.prices.length; t++) this._points[t].price = e.prices[ t]; this._priceOffset = this._points[2].price - this._points[0].price } else this._priceOffset = void 0; delete e.prices, super.restoreExternalState(e) } onData(e) { super.onData(e), this._updateThirdPointAndPriceOffset() } setPoints(e) { super.setPoints(e), this.calculatePriceDiff() } getPoint(e) { if (e < 2) return s.prototype.getPoint.call(this, e); var t = null; switch (e) { case 2: case 3: var i = this.points(); i.length === this.pointsCount() && (t = { index: i[e - 2].index, price: i[e - 2].price + this._priceOffset }) } return t } pointsCount() { return 3 } name() { return "Parallel Channel" } hasEditableCoordinates() { return !1 } addPoint(e, t) { var i = this.points().length; t && t.shift() && 2 === i && this._snapPoint45Degree(e, this.points()[0]); var r = s.prototype.addPoint.call(this, e, t); return this._updateThirdPointAndPriceOffset(), r } cloneData(e) { this._priceOffset = e._priceOffset } restoreData(e) { e.priceOffset && (this._priceOffset = e.priceOffset) } state(e) { var t = s.prototype.state.call(this, e); return t.priceOffset = this._priceOffset, t } canHasAlert() { return !0 } axisPoints() { var e = this.points(); return e.length < 2 ? [] : (e[2] = { index: e[0].index, price: e[0].price + this._priceOffset }, e.push({ index: e[1].index, price: e[1].price + this._priceOffset }), e) } _getAlertPlots() { var e = [].concat(this._points).splice(0, 2); function t(e, t) { return e.index <= t.index ? [e, t] : [t, e] } var i, s, r, n, o = t((e = e.concat([{ price: e[0].price + this._priceOffset, time: e[0].time, index: e[0].index }, { price: e[1].price + this._priceOffset, time: e[1].time, index: e[1].index }]))[0], e[1]), a = t(e[2], e[3]); this._priceOffset < 0 ? (s = a, i = o) : (s = o, i = a); var l = this.properties().extendLeft.value(), c = this.properties().extendRight.value(); return e[0].index <= e[1].index ? (r = l, n = c) : (r = c, n = l), [this ._linePointsToAlertPlot(i, "Upper", r, n), this._linePointsToAlertPlot(s, "Lower", r, n) ] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "VkdP"))) .ParallelChannelDefinitionsViewModel } _updateThirdPointAndPriceOffset() { this._points.length === this.pointsCount() && (void 0 === this._priceOffset && this .calculatePriceDiff(), this._correctThirdPoint()) } _correctThirdPoint() { var e = this._points[0]; this._points[2].index = e.index, this._points[2].price = e.price + this._priceOffset } static createProperties(e) { var t = new r("linetoolparallelchannel", e); return o._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolParallelChannel = o }, qckB: function(e, t) { e.exports = '' }, qgcf: function(e, t, i) { "use strict"; i.r(t), i.d(t, "calculateLabelPosition", (function() { return p })), i.d(t, "wordWrap", (function() { return f })), i.d(t, "TextRenderer", (function() { return M })); var s = i("aO4+"), r = i("Eyy1"), n = i("f6yo"), o = i("Ialn"), a = i("VdBB"), l = i("gAom"), c = i("jFln"), h = i("ogJP"), u = i("ikwP"), d = i("8Uy/"); function p(e, t, i, r, n) { const o = .5 * (t.x + i.x); let a = i.y; return t.y > i.y ? (a -= e.height / 2 + r.y, a = Math.max(e.height / 2, a)) : (a += e .height / 2 + r.y, a = Math.min(n - e.height / 2, a)), new s.Point(o, a) } let _; function m() { const e = document.createElement("canvas"); e.width = 0, e.height = 0, _ = Object(r.ensureNotNull)(e.getContext("2d")) } function f(e, t, i) { _ || m(), i = Object(h.isString)(i) ? parseInt(i) : i, e += ""; const s = !Object(h.isNumber)(i) || !isFinite(i) || i <= 0 ? e.split( /[^\S' '\r\n]*(?:\r\n|\r|\n|$)/) : e.split(/[^\S\r\n]*(?:\r\n|\r|\n|$)/); if (s[s.length - 1] || s.pop(), !Object(h.isNumber)(i) || !isFinite(i) || i <= 0) return s; _.font = t; const r = []; for (let e = 0; e < s.length; e++) { const t = s[e], n = _.measureText(t).width; if (n <= i) { r.push(t); continue } const o = t.split(/([-)\]},.!?:;])|(\s+)/); let a = 0; for (; o.length;) { let e = ~~(i / n * (o.length + 2) / 3); if (e <= 0 || _.measureText(o.slice(0, 3 * e - 1).join("")).width <= i) for (; _.measureText(o.slice(0, 3 * (e + 1) - 1).join("")).width <= i;) e++; else for (; e > 0 && _.measureText(o.slice(0, 3 * --e - 1).join("")).width > i;); if (e > 0) r.push(o.slice(0, 3 * e - 1).join("")), o.splice(0, 3 * e); else { const e = o[0] + (o[1] || ""); if (a = 1 === a ? 1 : ~~(i / _.measureText(e).width * e.length), _.measureText(e .substr(0, a)).width <= i) for (; _.measureText(e.substr(0, a + 1)).width <= i;) a++; else for (; a > 1 && _.measureText(e.substr(0, --a)).width > i;); a < 1 && (a = 1), r.push(e.substr(0, a)), o[0] = e.substr(a), o[1] = "" } if (_.measureText(o.join("")).width <= i) { r.push(o.join("")); break } } } return r } function g(e, t, i) { if (0 === i) return e.clone(); const r = (e.x - t.x) * Math.cos(i) - (e.y - t.y) * Math.sin(i) + t.x, n = (e.x - t.x) * Math.sin(i) + (e.y - t.y) * Math.cos(i) + t.y; return new s.Point(r, n) } function b(e, t) { return t + 2 * P(e) + 2 * y(e) } function v(e, t) { return x(e) * t + C(e) * (t - 1) + 2 * w(e) + 2 * S(e) } function S(e) { return void 0 !== e.boxPaddingVert ? e.boxPaddingVert * I(e) : void 0 !== e.boxPadding ? e .boxPadding * I(e) : x(e) / 3 } function y(e) { return void 0 !== e.boxPaddingHorz ? e.boxPaddingHorz * I(e) : void 0 !== e.boxPadding ? e .boxPadding * I(e) : x(e) / 3 } function w(e) { return (e.backgroundVertInflate || 0) * I(e) } function P(e) { return (e.backgroundHorzInflate || 0) * I(e) } function C(e) { return (e.padding || 0) * I(e) } function x(e) { return Math.ceil(T(e) * I(e)) } function T(e) { return e.fontsize || e.fontSize || 30 } function I(e) { const t = Math.min(1, Math.max(.2, Math.min(e.scaleX || 1, e.scaleY || 1))); if (1 === t) return t; const i = T(e); return Math.ceil(t * i) / i } class M { constructor(e, t) { this._data = null, this._internalData = null, this._boxSize = null, this ._linesInfo = null, this._fontInfo = null, this._hittest = t || new a .HitTestResult(a.HitTestResult.MOVEPOINT, { areaName: a.AreaName.Text }), void 0 !== e && this.setData(e) } setData(e) { e.horzTextAlign || (e.horzTextAlign = e.horzAlign), function(e, t) { if (null === e || null === t) return null === e == (null === t); if (void 0 === e.points != (void 0 === t.points)) return !1; if (void 0 !== e.points && void 0 !== t.points) { if (e.points.length !== t.points.length) return !1; for (let r = 0; r < e.points.length; ++r) if (i = e.points[r], s = t.points[r], i.x !== s.x || i.y !== s.y) return !1 } var i, s; return e.text === t.text && e.vertAlign === t.vertAlign && e.horzAlign === t .horzAlign && e.horzTextAlign === t.horzTextAlign && e.font === t .font && e.offsetX === t.offsetX && e.offsetY === t.offsetY && e .bold === t.bold && e.italic === t.italic && e.fontsize === t .fontsize && e.fontSize === t.fontSize && e.backgroundRoundRect === t .backgroundRoundRect && e.forceTextAlign === t.forceTextAlign && e .wordWrapWidth === t.wordWrapWidth && e.forceCalculateMaxLineWidth === t .forceCalculateMaxLineWidth && e.padding === t.padding && e.scaleY === t .scaleY && e.scaleX === t.scaleX && e.highlightBorder === t .highlightBorder && e.backgroundHorzInflate === t .backgroundHorzInflate && e.backgroundVertInflate === t .backgroundVertInflate && e.boxPadding === t.boxPadding && e .boxPaddingVert === t.boxPaddingVert && e.boxPaddingHorz === t .boxPaddingHorz && e.angle === t.angle && e.maxHeight === t.maxHeight }(this._data, e) ? this._data = e : (this._data = e, this._internalData = null, this._boxSize = null, this._linesInfo = null, this._fontInfo = null) } hitTest(e) { if (null === this._data || void 0 === this._data.points || 0 === this._data.points .length) return null; const t = this._data.angle || 0, { boxLeft: i, boxTop: r, boxWidth: o, boxHeight: a } = this._getInternalData(), l = this._getRotationPoint(), c = [g(new s.Point(i, r), l, t), g(new s.Point(i + o, r), l, t), g(new s.Point( i + o, r + a), l, t), g(new s.Point(i, r + a), l, t)]; return Object(n.pointInPolygon)(e, c) ? this._hittest : null } doesIntersectWithBox(e) { return null !== this._data && void 0 !== this._data.points && 0 !== this._data .points.length && Object(n.pointInBox)(this._data.points[0], e) } measure() { if (null === this._data) return { width: 0, height: 0 }; const e = this._getBoxSize(); return { width: e.boxWidth, height: e.boxHeight } } rect() { if (null === this._data) return { x: 0, y: 0, width: 0, height: 0 }; const e = this._getInternalData(); return { x: e.boxLeft, y: e.boxTop, width: e.boxWidth, height: e.boxHeight } } setPoints(e, t) { Object(r.ensureNotNull)(this._data).points = e, this._hittest = t || new a .HitTestResult(a.HitTestResult.MOVEPOINT) } fontStyle(e) { return null === this._data ? "" : this._getFontInfo().fontStyle } wordWrap(e, t, i) { return f(e, i || this.fontStyle(), t) } draw(e, t) { if (null === this._data || void 0 === this._data.points || 0 === this._data.points .length) return; const i = t.pixelRatio, s = this._getInternalData(), r = this._getRotationPoint().scaled(i); e.save(), e.translate(r.x, r.y), e.rotate(this._data.angle || 0), e.translate(-r.x, -r.y); const n = this._getFontInfo().fontSize; e.textBaseline = s.textBaseLine, e.textAlign = s.textAlign, e.font = this .fontStyle(); const { scaledLeft: o, scaledRight: a, scaledTop: h, scaledBottom: p } = function(e, t) { const i = Math.round(e.boxLeft * t), s = Math.round(e.boxTop * t); return { scaledLeft: i, scaledRight: i + Math.round(e.boxWidth * t), scaledTop: s, scaledBottom: s + Math.round(e.boxHeight * t) } }(s, i); if (this._data.backgroundColor || this._data.borderColor || this._data .highlightBorder && this._data.wordWrapWidth) { const t = this._data.borderWidth || Math.max(n / 12, 1), s = Math.round(t * i), r = s / 2; if (this._data.backgroundRoundRect) this._data.backgroundColor && (Object(l .drawRoundRect)(e, o, h, a - o, p - h, this._data .backgroundRoundRect * i), e.fillStyle = this._data.backgroundColor, e.fill()), this._data.borderColor && (Object(l.drawRoundRect)(e, o - r, h - r, a - o + s, p - h + s, this._data.backgroundRoundRect * i + s ), e.strokeStyle = this._data.borderColor, e.lineWidth = s, e .stroke()); else if (this._data.backgroundColor && (e.fillStyle = this._data .backgroundColor, e.fillRect(o, h, a - o, p - h)), this._data .borderColor || this._data.highlightBorder) { let t; this._data.borderColor ? (e.strokeStyle = this._data.borderColor, t = s) : ( e.strokeStyle = this._data.color, Object(c.setLineStyle)(e, d .LINESTYLE_DASHED), t = Math.max(1, Math.floor(i))), e .lineWidth = t, e.beginPath(), e.moveTo(o - t / 2, h - t / 2), e.lineTo( o - t / 2, p + t / 2), e.lineTo(a + t / 2, p + t / 2), e.lineTo(a + t / 2, h - t / 2), e.lineTo(o - t / 2, h - t / 2), e.stroke() } } e.fillStyle = this._data.color; const _ = (o + Math.round(s.textStart * i)) / i, m = .05 * n; let f = (h + Math.round((s.textTop + m) * i)) / i; const g = C(this._data), b = this._getLinesInfo(); for (const t of b.lines) Object(u.drawScaled)(e, i, () => e.fillText(t, _, f)), f += n + g; e.restore() } _getLinesMaxWidth(e) { if (_ || m(), _.textBaseline = "alphabetic", _.font = this.fontStyle(), null !== this._data && this._data.wordWrapWidth && !this._data.forceCalculateMaxLineWidth ) return this._data.wordWrapWidth * I(this._data); let t = 0; for (const i of e) t = Math.max(t, _.measureText(i).width); return t } _getInternalData() { if (null !== this._internalData) return this._internalData; const e = Object(r.ensureNotNull)(this._data), t = this._getBoxSize(), i = t.boxWidth, s = t.boxHeight, n = Object(r.ensureDefined)(e.points)[0]; let a = n.y; switch (e.vertAlign) { case "bottom": a -= s + e.offsetY; break; case "middle": a -= s / 2; break; case "top": a += e.offsetY } let l = n.x; const c = y(e), h = S(e), u = P(e) + c; let d; const p = a + (w(e) + h) + x(e) / 2; let _; switch (e.horzAlign) { case "left": l += e.offsetX; break; case "center": l -= i / 2; break; case "right": l -= i + e.offsetX } switch (Object(r.ensureDefined)(e.horzTextAlign)) { case "left": _ = "start", d = l + u, Object(o.isRtl)() && (e.forceTextAlign ? _ = "left" : (d = l + i - u, _ = "right")); break; case "center": _ = "center", d = l + i / 2; break; case "right": _ = "end", d = l + i - u, Object(o.isRtl)() && e.forceTextAlign && (_ = "right") } return this._internalData = { boxLeft: l, boxTop: a, boxWidth: i, boxHeight: s, textStart: d - l, textTop: p - a, textAlign: _, textBaseLine: "middle" }, this._internalData } _getLinesInfo() { if (null === this._linesInfo) { const e = Object(r.ensureNotNull)(this._data); let t = this.wordWrap(e.text, e.wordWrapWidth); if (void 0 !== e.maxHeight) { const i = function(e) { const t = Object(r.ensureDefined)(e.maxHeight), i = x(e), s = C(e); return Math.floor((t + s) / (i + s)) }(e); t.length > i && (t = t.slice(0, i)) } this._linesInfo = { linesMaxWidth: this._getLinesMaxWidth(t), lines: t } } return this._linesInfo } _getFontInfo() { if (null === this._fontInfo) { const e = Object(r.ensureNotNull)(this._data), t = x(e), i = (e.bold ? "bold " : "") + (e.italic ? "italic " : "") + t + "px " + e .font; this._fontInfo = { fontStyle: i, fontSize: t } } return this._fontInfo } _getBoxSize() { if (null === this._boxSize) { const e = this._getLinesInfo(), t = Object(r.ensureNotNull)(this._data); this._boxSize = { boxWidth: b(t, e.linesMaxWidth), boxHeight: v(t, e.lines.length) } } return this._boxSize } _getRotationPoint() { const { boxLeft: e, boxTop: t, boxWidth: i, boxHeight: n } = this._getInternalData(), { horzAlign: o, vertAlign: a } = Object(r.ensureNotNull)(this._data); let l, c; switch (o) { case "center": l = e + i / 2; break; case "left": l = e; break; case "right": l = e + i } switch (a) { case "middle": c = t + n / 2; break; case "top": c = t; break; case "bottom": c = t + n } return new s.Point(l, c) } } }, qySK: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return u })), i.d(t, "a", (function() { return d })); var s = i("Eyy1"), r = i("JmuD"), n = i("KG+6"), o = i("fFKx"), a = i("SqfW"), l = i("5vwb"), c = i("7Fue"), h = i("xWfy"); function u(e) { if (!Object(r.isObject)(e)) throw new Error( "Graphics commands should be wrapped in an object"); if (Object(r.hasProperty)(e, "create"), Object(r.hasProperty)(e, "erase")) { const t = e.erase; Object(s.assert)(Array.isArray(t), "Collection of erase commands should be array"); for (const e of t) { if (!Object(r.isObject)(e) || !Object(r.hasProperty)(e, "action")) throw new Error( "Command should be an object with 'action' property"); Object(s.assert)("all" === e.action || "one" === e.action, "Erase command action should be 'all' or 'one'") } } return e } class d { constructor() { this._indexes = [], this._horizlines = new Map, this._vertlines = new Map, this ._lines = new Map, this._hlines = new Map, this._textmarks = new Map, this ._shapemarks = new Map, this._backgrounds = new Map, this._polygons = new Map, this._trendchannels = new Map, this._hhists = new Map, this._dwglabels = new Map, this._dwgboxes = new Map, this._dwglines = new Map, this._dwgtables = new Map, this._dwgtablecells = new Map, this._hhistsByTimePointIndex = new Map } horizlines() { return this._horizlines } vertlines() { return this._vertlines } lines() { return this._lines } hlines() { return this._hlines } textmarks() { return this._textmarks } shapemarks() { return this._shapemarks } backgrounds() { return this._backgrounds } polygons() { return this._polygons } trendchannels() { return this._trendchannels } hhists() { return this._hhists } dwglabels() { return this._dwglabels } dwglines() { return this._dwglines } dwgboxes() { return this._dwgboxes } dwgtables() { return this._dwgtables } dwgtablecells() { return this._dwgtablecells } hhistsByTimePointIndex() { return this._hhistsByTimePointIndex } clear() { this._indexes = [], this._clearPrimitives() } extract() { const e = e => e.extract(), t = { indexes: this._indexes, horizlines: _(this._horizlines, e), vertlines: _(this._vertlines, e), lines: _(this._lines, e), hlines: _(this._hlines, e), textmarks: _(this._textmarks, e), shapemarks: _(this._shapemarks, e), backgrounds: _(this._backgrounds, e), polygons: _(this._polygons, e), trendchannels: _(this._trendchannels, e), hhists: _(this._hhists, e), dwglabels: _(this._dwglabels, e), dwglines: _(this._dwglines, e), dwgboxes: _(this._dwgboxes, e), dwgtables: _(this._dwgtables, e), dwgtablecells: _(this._dwgtablecells, e) }; return this._hhistsByTimePointIndex = new Map, new h.a("data", t) } replaceIndexesTo(e) { this._indexes = e; const t = e => e.replaceIndexesTo(this._indexes); this._horizlines.forEach(t), this._vertlines.forEach(t), this._lines.forEach(t), this._hlines.forEach(t), this._textmarks.forEach(t), this._shapemarks.forEach( t), this._backgrounds.forEach(t), this._polygons.forEach(t), this ._trendchannels .forEach(t), this._hhists.forEach(t), this._dwglabels.forEach(t), this._dwgboxes .forEach(t), this._dwglines.forEach(t), this._dwgtables.forEach(t), this ._dwgtablecells.forEach(t), this._hhistsByTimePointIndex = Object(c.b)(this ._hhists) } processCommands(e, t) { void 0 !== e.erase && this._processEraseCommands(e.erase), void 0 !== e.create && this._processCreateCommands(e.create, t) } _processCreateCommands(e, t) { for (const i in e) { if (!e.hasOwnProperty(i)) continue; const r = i; switch (Object(s.assert)(r in t, `There is a '${r}' in study response, but it doesn't present in graphics info!` ), r) { case "hhists": m(this._hhists, e[r], t[r], this._indexes, n.d); break; case "horizlines": m(this._horizlines, e[r], t[r], this._indexes, o.b); break; case "vertlines": m(this._vertlines, e[r], t[r], this._indexes, a.b); break; case "polygons": m(this._polygons, e[r], t[r], this._indexes, l.b) } } this._hhistsByTimePointIndex = Object(c.b)(this._hhists) } _processEraseCommands(e) { for (const t of e) if ("all" === t.action) this._clearPrimitives(); else { const e = e => e.deleteById(t.id); switch (t.type) { case "horizlines": this._horizlines.forEach(e); break; case "vertlines": this._vertlines.forEach(e); break; case "lines": this._lines.forEach(e); break; case "hlines": this._hlines.forEach(e); break; case "textmarks": this._textmarks.forEach(e); break; case "shapemarks": this._shapemarks.forEach(e); break; case "backgrounds": this._backgrounds.forEach(e); break; case "polygons": this._polygons.forEach(e); break; case "trendchannels": this._trendchannels.forEach(e); break; case "hhists": this._hhists.forEach(e); break; case "dwglabels": this._dwglabels.forEach(e); break; case "dwglines": this._dwglines.forEach(e); break; case "dwgboxes": this._dwgboxes.forEach(e); break; case "dwgtables": this._dwgtables.forEach(e); break; case "dwgtablecells": this._dwgtablecells.forEach(e) } } this._hhistsByTimePointIndex = Object(c.b)(this._hhists) } _clearPrimitives() { this._horizlines.clear(), this._vertlines.clear(), this._lines.clear(), this._hlines .clear(), this._textmarks.clear(), this._shapemarks.clear(), this._backgrounds .clear(), this._polygons.clear(), this._trendchannels.clear(), this._hhists .clear(), this._dwglabels.clear(), this._dwgboxes.clear(), this._dwglines .clear(), this._dwgtables.clear(), this._dwgtablecells.clear(), this._hhistsByTimePointIndex = new Map } } class p { constructor(e, t) { this._primitivesDataById = new Map, this._primitiveById = new Map, this ._materializePrimitive = e, this._indexes = t } forEach(e, t) { this._primitiveById.forEach(i => { e.call(t, i, i, this) }) } has(e) { let t = !1; return this._primitiveById.forEach(i => { t = t || i === e }), t } get size() { return this._primitiveById.size } [Symbol.iterator]() { throw new Error("Not implemented") } entries() { throw new Error("Not implemented") } keys() { throw new Error("Not implemented") } values() { throw new Error("Not implemented") } hasId(e) { return this._primitiveById.has(e) } addData(e) { this._primitivesDataById.set(e.id, e), this._tryMaterialize(e) } deleteById(e) { this._primitiveById.delete(e), this._primitivesDataById.delete(e) } clear() { this._primitivesDataById.clear(), this._primitiveById.clear() } replaceIndexesTo(e) { this._indexes = e, this._primitiveById.clear(), this._primitivesDataById.forEach( this._tryMaterialize, this) } extract() { const e = new Set(this._primitivesDataById.values()); return this._primitivesDataById = new Map, this._primitiveById.clear(), e } _tryMaterialize(e) { const t = this._materializePrimitive(e, this._indexes); null !== t && (Object(s.assert)(!this._primitiveById.has(e.id), "primitive with specified id should not exist"), this._primitiveById .set(e.id, t)) } } function _(e, t) { const i = new Map; return e.forEach((e, s) => i.set(s, t(e))), i } function m(e, t, i, r, n) { if (void 0 !== t) for (const o of t) { const t = o.styleId; void 0 !== i && Object(s.assert)(t in i, "Every style used by graphics primitive should be declared in study metainfo" ); let a = e.get(t); void 0 === a && (a = new p(n, r), e.set(t, a)), o.data.forEach(a.addData.bind(a)) } } }, rCHB: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "LineToolPitchforkStyle", (function() { return s })), function(e) { e[e.Original = 0] = "Original", e[e.Schiff = 1] = "Schiff", e[e.Inside = 2] = "Inside", e[e.Schiff2 = 3] = "Schiff2" }(s || (s = {})) }, rL76: function(e, t, i) { e.exports = { labelwidth: "19px", labelheight: "19px", bordersize: "2px", bottommargin: "5px", gearheight: "15px", gearwidth: "15px", "price-axis-stub": "price-axis-stub-1DJMiIgd", wrapper: "wrapper-1DJMiIgd", label: "label-1DJMiIgd", symbol: "symbol-1DJMiIgd", gear: "gear-1DJMiIgd", "fixed-gear": "fixed-gear-1DJMiIgd", "fixed-symbol": "fixed-symbol-1DJMiIgd" } }, rQHv: function(e, t, i) { "use strict"; var s = i("IiTo"), r = {}; e.exports = function(e, t, i) { var n, o, a = {}, l = r[i] || "out_of_session", c = !1, h = i, u = t, d = null; function p() { var e = {}; e.symbolname = h, e.status = "ok", e.values = {}, e.values.current_session = l, r[ h] = l, TradingView.ChartapiMessagerInstances[u].onQuotesData([u].concat([ e])) } function _() { if (n) if (o) l = "out_of_session"; else { var e = s.isTradingNow((new Date).getTime(), n) ? "market" : "out_of_session"; e !== l && (l = e, p()) } } return e(i, null, (function(e) { c || function(e) { n = new s.SessionInfo(e.timezone, e.session, e.session_holidays, e.corrections), o = e.expired, d = setInterval(_, 6e4), _(), p() }(e) }), (function() {})), a.stop = function() { c = !0, d && clearInterval(d) }, a.marketStatus = function() { return l }, a } }, rWtV: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("Eyy1"), r = i("Y7w9"); class n { constructor() { this._histPos = -1, this._hist = new Float64Array(2e3), this._times = new Float64Array(2e3) } addHist(e) { if (this._histPos >= 0) { const t = this._times[this._histPos]; Object(s.assert)(t <= e, "History order violation"), this._histPos += t === e ? 0 : 1 } else this._histPos += 1; if (this._histPos === this._hist.length) { const e = new Float64Array(2 * this._hist.length); e.set(this._hist), this._hist = e; const t = new Float64Array(this._hist.length); t.set(this._times), this._times = t } this._hist[this._histPos] = NaN, this._times[this._histPos] = e } removeLastIfNaN() { Number.isNaN(this.get(0)) && (this._histPos -= 1) } get(e) { Object(s.assert)(0 === e); const t = this._histPos - e; return this._hist[t] } getLeftOrEqual(e) { const t = Object(r.upperbound)(this._times, e, (e, t) => e < t, 0, this._histPos + 1); return 0 === t ? NaN : this._hist[t - 1] } set(e) { this._hist[this._histPos] = e } indexOf(e) { throw new Error("Not implemented") } } }, rY0k: function(e, t, i) { "use strict"; var s = i("xDuj").translatedIntervalString, r = i("hOqT").getTranslatedSymbolDescription, n = i("zDbI").CHART_FONT_FAMILY, o = i("di4O"), a = o.watermarkProperty, l = o.restoreWatermarkPropertyDefaults, c = i("ikwP").drawScaled, h = i("wZIs").applyDefaultsOverrides, u = i("wZIs").applyPropertiesOverrides; t.Watermark = function(e, t) { var i = {}, o = a(); function d(e, t) { var s = e.font; return i.hasOwnProperty(s) || (i[s] = {}), i[s].hasOwnProperty(t) || (i[s][t] = e .measureText(t).width), i[s][t] } h(o, void 0, !1, "symbolWatermarkProperties"), o.listeners().subscribe(this, ( function() { e.updateSource(this) })), this.destroy = function() { o.listeners().unsubscribeAll(this) }, this.properties = function() { return o }, this.restorePropertiesDefaults = function() { l() }, this.applyOverrides = function(e) { u(o, void 0, !1, e, "symbolWatermarkProperties") }; var p = { renderer: function(e, i) { return { draw: function(a, l) { c(a, l.pixelRatio, (function() { var l = t.symbolInfo(); a.fillStyle = o.color.value(); var c, h = l.name; /QUANDL/.test(l.exchange) && ((c = h.split( /\//)).length && (h = c[c .length - 1])); for (var u = { description: l.description, short_description: l .short_description, pro_name: l.pro_name, short_name: l.name, local_description: l .local_description, language: l.language }, p = [{ text: h ? h + ", " + s(t .interval()) : "", font: "96px " + n, lineHeight: 117, vertOffset: 0 }, { text: r(u) || "", font: "48px " + n, lineHeight: 58, vertOffset: 5 }], _ = 0, m = 0; m < p.length; m++) { if ((b = p[m]).text) { a.font = b.font; var f = d(a, b.text); b.zoom = f > i ? i / f : 1, _ += b .lineHeight * b.zoom } } var g = Math.max((e - _) / 2, 0); for (m = 0; m < p.length; m++) { var b; (b = p[m]).text && (a.save(), a .translate(i / 2, g), a .textBaseline = "top", a .textAlign = "center", a.font = b.font, a.scale(b.zoom, b.zoom), a.fillText(b.text, 0, b .vertOffset), a.restore(), g += b.lineHeight * b.zoom) } })) } } }, update: function() {} }; this.paneViews = function() { return t.symbolInfo() && o.visibility.value() ? [p] : [] } } }, ri5u: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ChartLoadThemeUndoCommand", (function() { return d })); var s = i("FIi8"), r = i("Ocx9"), n = i("wZIs"), o = i("RDU5"); function a(e) { const { visible: t, ...i } = e; return i } function l(e) { const { visible: t, ...i } = e; return i } function c(e) { const { visible: t, style: i, symbol: s, interval: r, sessionId: n, highLowAvgPrice: o, showCountdown: c, bidAsk: h, prePostMarket: u, ...d } = e; return { bidAsk: a(h), prePostMarket: l(u), ...d } } function h(e) { const { scaleSeriesOnly: t, showSeriesLastValue: i, showStudyLastValue: s, showSymbolLabels: r, showBidAskLabels: n, showPrePostMarketPriceLabel: o, showStudyPlotLabels: a, showFundamentalNameLabel: l, showFundamentalLastValue: c, seriesLastValueMode: h, ...u } = e; return u } function u(e) { const { topMargin: t, bottomMargin: i, ...s } = e; return s } class d extends o.UndoCommand { constructor(e, t, i) { var r, o, a; super("Apply Chart Theme"), this._model = e, this._newSessionProps = t .sessions || Object(n.factoryDefaults)("sessions"), ["candleStyle", "hollowCandleStyle", "haStyle" ].forEach(e => { t.mainSourceProperties[e].wickUpColor = t.mainSourceProperties[e] .wickUpColor || t.mainSourceProperties[e].wickColor, t .mainSourceProperties[e].wickDownColor = t.mainSourceProperties[ e].wickDownColor || t.mainSourceProperties[e].wickColor }), t.chartProperties = null !== (r = t.chartProperties) && void 0 !== r ? r : { paneProperties: void 0, scalesProperties: void 0 }, t.chartProperties.paneProperties.vertGridProperties = null !== (o = t .chartProperties.paneProperties.vertGridProperties) && void 0 !== o ? o : t.chartProperties.paneProperties.gridProperties, t.chartProperties .paneProperties.horzGridProperties = null !== (a = t.chartProperties .paneProperties.horzGridProperties) && void 0 !== a ? a : t .chartProperties.paneProperties.gridProperties, t.chartProperties .paneProperties.legendProperties = this._model.properties().state() .paneProperties.legendProperties; const l = Object(n.factoryDefaults)("chartproperties"), d = Object(s.deepExtend)({}, l, t.chartProperties); this._newChartProps = { paneProperties: u(d.paneProperties), scalesProperties: h(d.scalesProperties) }, e.timeScale().preserveBarSpacing() && delete this._newChartProps .scalesProperties.barSpacing; const p = Object(n.factoryDefaults)("chartproperties.mainSeriesProperties"), _ = Object(s.deepExtend)({}, p, t.mainSourceProperties); this._newSeriesProps = i ? _ : c(_); const m = e.properties().state(); this._oldChartProps = { paneProperties: u(m.paneProperties), scalesProperties: h(m.scalesProperties) }, this._oldSeriesProps = c(e.mainSeries().properties().state()), this ._oldSessionProps = this._model.sessions().properties().state() } undo() { this._merge(this._oldChartProps, this._oldSeriesProps, this._oldSessionProps), this._model.mainSeries().onChartStyleChanged(), this._model.updateScales(), this._model.chartThemeLoaded() } redo() { this._merge(this._newChartProps, this._newSeriesProps, this._newSessionProps), this._model.mainSeries().onChartStyleChanged(), this._model.updateScales(), this._model.chartThemeLoaded() } _merge(e, t, i) { var s, n, o, a; const l = this._model; Object(r.saveDefaultProperties)(!0), e && (l.properties().paneProperties .mergeAndFire(e.paneProperties), l.properties().scalesProperties .mergeAndFire(e.scalesProperties)), l.mainSeries().priceScale() .setMode({ autoScale: null === (s = t.priceAxisProperties) || void 0 === s ? void 0 : s.autoScale, percentage: null === (n = t.priceAxisProperties) || void 0 === n ? void 0 : n.percentage, log: null === (o = t.priceAxisProperties) || void 0 === o ? void 0 : o.log, lockScale: null === (a = t.priceAxisProperties) || void 0 === a ? void 0 : a.lockScale }), l.mainSeries().properties().mergeAndFire(t), l.mainSeries().properties() .saveDefaults(), l.mainSeries().createPaneView(), l.mainSeries().invalidateBarStylesCache(), l.recalculateAllPanes(), l.fullUpdate(), l.properties().saveDefaults(), l .sessions().restoreState({ properties: i }, !1), Object(r.saveDefaultProperties)(!1) } } }, s1Gx: function(e, t, i) { "use strict"; i.r(t), i.d(t, "specialZOrderBase", (function() { return s })), i.d(t, "sortSourcesPreOrdered", (function() { return r })), i.d(t, "sortSources", (function() { return n })); const s = 1e7, r = { ChartEventsSource: s + 1, Dividends: s + 2, Splits: s + 3, Earnings: s + 4, LineToolOrder: s + 5, LineToolPosition: s + 6, LineToolExecution: s + 7, AlertLabel: s + 8 }; function n(e) { return [...e].sort((e, t) => e.zorder() - t.zorder()) } }, s9sR: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SetResolutionUndoCommand", (function() { return o })); var s = i("RDU5"), r = i("LxhU"), n = i("n5al"); class o extends s.UndoCommand { constructor(e, t, i, s) { super(s), this._property = e, this._value = t, this._prevValue = e.value(), this ._chartWidget = i } redo() { this._chartWidget.screen.show(), this._property.setValue(this._value), this ._handleResolution(this._value) } undo() { this._chartWidget.screen.show(), this._property.setValue(this._prevValue), this ._handleResolution(this._prevValue) } _handleResolution(e) { const t = this._chartWidget.model().mainSeries().properties(), i = t.style.value(), s = Object(n.isRangeStyle)(i), o = r.Interval.isRange(e); !s && o ? t.style.setValue(11) : s && !o && t.style.setValue(Object(n .getLastUsedStyle)()) } } }, sDZI: function(e, t, i) { "use strict"; i.r(t), i.d(t, "sessionsPreferencesDefault", (function() { return r })); var s = i("HGP3"); const r = { graphics: { backgrounds: { outOfSession: { color: s.colorsPalette["color-tv-blue-500"], transparency: 92, visible: !1 }, preMarket: { color: "#FF9800", transparency: 92, visible: !1 }, postMarket: { color: s.colorsPalette["color-tv-blue-500"], transparency: 92, visible: !1 } }, vertlines: { sessBreaks: { color: "#4985e7", style: 2, visible: !1, width: 1 } } } } }, sEk5: function(e, t, i) { "use strict"; var s = i("fTGZ").BarsMarksContainer, r = i("mMWL"), n = i("CCPt").UserDefinedBarsMarksTooltip; e.exports = class extends s { constructor(e) { super(e), this.toolname = "UserDefinedBarsMarks"; var t = this; r.hideMarksOnBars().subscribe(this, (function() { t._properties.visible.setValue(!r.hideMarksOnBars().value()) })) } _initialize(e) { this._properties.visible.setValue(!0) } userEditEnabled() { return !1 } _plateViewData(e) { var t = { text: e.text }; return "object" == typeof e.color && (t.theme = "user_defined_theme", t .overridedTheme = {}, t.overridedTheme.border = e.color.border, t .overridedTheme.background = e.color.background), t } onClicked(e) { var t = e.id; this._marks[t].onClicked() } clearMarks() { super.clearMarks(), this.onNeedRepaint.fire() } _getData(e) { var t = this._model.mainSeries().symbolInfo(); if (t) { var i = this.roundRange(this._rangeDifference(e)), s = this, r = this._model.mainSeries().properties().interval.value(); ChartApiInstance.getMarks(t, i.start, i.end, (function(t) { t.forEach((function(e) { s._marks[e.id] = e }), s), s._loadedRange = s._rangeUnion(e, s ._loadedRange), s.onNeedRepaint.fire() }), r) } } _createTooltip() { return new n } updatePlateData(e, t) { return t.barWidth = this.barWidth(), t.text = e.text, t.tooltipMargin = -1 * Math.max(e.minSize / 2, .4 * this.barWidth()), t } hasContextMenu() { return !1 } calcIsActualCurrency() { this._isActualCurrency = !0 } calcIsActualUnit() { this._isActualUnit = !0 } } }, sJA2: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ThemesApi", (function() { return n })); var s = i("EsvI"), r = i("oiZD"); class n { constructor(e) { this._opts = e } isStdTheme() { const e = this._opts.chartWidgetCollection.getAll().every(e => Object(s.isStdTheme)( Object(s.extractThemeFromModel)(e.model()))); return Promise.resolve(e) } async setStdTheme(e, t = !0, i) { await Object(s.loadTheme)(e, !0, !1, this._opts.chartWidgetCollection, t, i) } setStdThemeForLayout(e, t = !0) { Object(r.setTheme)(e), t && Object(s.syncTheme)() } getCurrentThemeName() { return Object(s.getCurrentTheme)().name } } }, sQaR: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })); var s = i("hY0g"), r = i.n(s); class n { constructor() { this._container = document.createElement("div"), this._visibility = new r.a(!1) } visible() { return this._visibility.readonly() } _setVisibility(e) { this._visibility.setValue(e) } } }, t2ex: function(e, t, i) { "use strict"; var s = i("5rJj"), r = i("Ss5c").LineDataSource, n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends r { constructor(e, t) { super(e, t || l.createProperties()), this.version = l.version, this._properties ._stateVersion = 1, i.e("lt-pane-views").then(i.t.bind(null, "R7Bt", 7)).then(({ FibRetracementPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 2 } name() { return "Fib Retracement" } migrateVersion(e, t, i) { 1 === e && this.properties().extendLines.setValue(!0) } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "17v9"))) .FibDrawingsWith24LevelsDefinitionsViewModel } static createProperties(e) { var t = new s("linetoolfibretracement", e, !1, { range: [1, 24], names: ["coeff", "color", "visible"] }); return l._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e); for (var t = [e.child("trendline").child("linewidth"), e.child("levelsStyle").child( "linewidth")], i = [e.child("trendline").child("color")], s = 1; s <= l .LevelsCount; s++) i.push(e.child("level" + s).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } fibLevelsBasedOnLogScale() { return this.properties().fibLevelsBasedOnLogScale.value() && this.priceScale() .isLog() } } l.version = 2, l.LevelsCount = 24, t.LineToolFibRetracement = l }, tDUI: function(e, t, i) { "use strict"; (function(e) { var s = i("Eyy1").ensureNotNull, r = i("Ss5c").LineDataSource, n = i("gMtF").LineToolRiskRewardPriceAxisView, o = i("mMWL"), a = i("Ocx9").DefaultProperty, l = i("zXvd").NumericFormatter, c = i("wGNx").RiskRewardPointIndex, h = i("H007"), u = h.RiskRewordEntryPriceProperty, d = h.RiskRewordStopPriceProperty, p = h.RiskRewardTargetPriceProperty, _ = i("ogJP").isNumber, m = i("k9/m").PlotRowSearchMode; class f extends r { constructor(t, s) { var r = s; if (super(t, r), !s.stopLevel && !s.profitLevel) { var o = t.timeScale().visibleBarsStrictRange(), a = o.firstBar(), h = o.lastBar(), _ = t.mainSeries().priceRange(a, h), m = t.mainSeries().priceScale(); if (m.isLog()) { var g = m.logicalToPrice(_.minValue()), b = m.logicalToPrice(_.maxValue()); _ = new e(g, b) } if (_ && !_.isEmpty()) { var v = Math.round(.2 * _.length() * t.mainSeries().base()); r.merge({ stopLevel: v, profitLevel: v }) } } var S = this; r.stopLevel.listeners().subscribe(this, this.recalculate), r.stopLevel .listeners().subscribe(null, (function() { S.properties().stopPrice._listeners.fire(S.properties() .stopPrice) })), r.profitLevel.listeners().subscribe(this, this.recalculate), r .profitLevel.listeners().subscribe(null, (function() { S.properties().targetPrice._listeners.fire(S.properties() .targetPrice) })), r.addChild("entryPrice", new u(this)), r.addChild("stopPrice", new d(this)), r.addChild("targetPrice", new p(this)), r.addProperty( "riskSize", 0), r.addProperty("qty", 0), r.addProperty( "amountTarget", r.accountSize.value()), r.addProperty("amountStop", r.accountSize.value()), this._riskInPercentsFormatter = new l(2), this._riskInMoneyFormatter = new l, r.risk.subscribe(this, this ._recalculateRiskSize), r.accountSize.subscribe(this, this ._recalculateRiskSize), r.riskDisplayMode.subscribe(this, this ._recalculateRisk), r.riskDisplayMode.subscribe(this, this ._recalculateRiskSize), r.entryPrice.subscribe(this, this ._recalculateRiskSize), r.stopPrice.subscribe(this, this ._recalculateRiskSize), r.profitLevel.subscribe(this, this ._recalculateRiskSize), r.profitLevel.subscribe(this, this .syncPriceLevels.bind(this)), r.stopLevel.subscribe(this, this ._recalculateRiskSize), r.stopLevel.subscribe(this, this .syncPriceLevels.bind(this)), r.qty.subscribe(this, this ._recalculateRiskSize), this.pointAdded().subscribe(this, e => { switch (e) { case c.Entry: case c.Close: this._recalculateRiskSize() } }), this.pointChanged().subscribe(this, e => { switch (e) { case c.Entry: case c.Close: this._recalculateRiskSize() } }), "percents" === r.riskDisplayMode.value() && r.risk.value() > 100 && r.riskDisplayMode.setValueSilently("money"), this ._syncStateExclusions = ["points", "entryPrice", "stopPrice", "targetPrice", "stopLevel", "profitLevel", "riskSize", "qty", "amountTarget", "amountStop", "risk", "accountSize" ], this.version = f.version, this._entryPriceAxisView = new n(this, { colorProperty: r.linecolor, priceProperty: r.entryPrice }), this._stopPriceAxisView = new n(this, { colorProperty: r.stopBackground, priceProperty: r.stopPrice }), this._profitPriceAxisView = new n(this, { colorProperty: r.profitBackground, priceProperty: r.targetPrice }), i.e("lt-pane-views").then(i.t.bind(null, "u+oH", 7)).then(({ RiskRewardPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } riskFormatter(e) { return "percents" === e ? this._riskInPercentsFormatter : this ._riskInMoneyFormatter } getRiskStep(e) { return "percents" === e ? .01 : 1 } _roundValue(e) { return parseFloat(e.toFixed(2)) } hasEditableCoordinates() { return !1 } _recalculateRisk() { var e = this.properties(), t = e.riskDisplayMode.value(), i = e.riskSize.value(), s = e.accountSize.value(), r = e.risk.value(); r = "percents" === t ? this._roundValue(i / s * 100) : this._roundValue(s / 100 * r), this._riskInChange = !0, e.risk.setValue(this.riskFormatter(t).format(r)), this._riskInChange = ! 1 } _recalculateRiskSize() { if (!this._riskInChange) { var e = this.properties(), t = e.risk.value(), i = e.riskDisplayMode.value(), s = e.accountSize.value(); "percents" === i ? e.riskSize.setValue(t / 100 * s) : t > s ? (e.risk .setValue(s), e.riskSize.setValue(s)) : e.riskSize.setValue(t) } } lastBarData() { var e = this._model.mainSeries().bars().firstIndex(), t = this._model.mainSeries().bars().lastIndex(); if (null === e || null === t || isNaN(e) || isNaN(t)) return null; var i = this.points(); if (4 === i.length) { var s = i[c.ActualClose]; return s.index < e ? null : { closePrice: s.price, index: Math.min(t, s.index) } } var r = i[c.Close]; if (r.index < e) return null; var n = Math.min(t, r.index), o = this._model.mainSeries().bars().search(n, m.NearestLeft); return null === o ? null : { closePrice: o.value[TradingView.CLOSE_PLOT], index: o.index } } migrateVersion(e, t, i) { if (1 === e && this._points.length >= 1) { var s = []; if (s.push(this._points[0]), n = { price: (n = this._points[0]).price, index: this._getClosePointIndex(n.index) }, s.push(n), this._points[1] && s.push(this._points[1]), this ._points[2] && s.push(this._points[2]), this._points = s, this ._timePoint.length >= 1) { var r = [], n = this._timePoint[0]; r.push(n); var o = { price: n.price, time_t: n.time_t, offset: this._getClosePointIndex(n.offset) }; r.push(o), this._timePoint[1] && s.push(this._points[1]), this ._timePoint[2] && s.push(this._points[2]), this._timePoint = r } } } checkAlert() { this.recalculate() } priceAxisViews(e, t) { return this.isSourceHidden() || t !== this.priceScale() || this._model .paneForSource(this) !== e ? null : [this._entryPriceAxisView, this ._stopPriceAxisView, this._profitPriceAxisView ] } updateAllViews() { this.isActualSymbol() && this._properties.visible.value() && (o .hideAllDrawings().value() && this.userEditEnabled() || (super .updateAllViews(), this._entryPriceAxisView.update(), this ._stopPriceAxisView.update(), this._profitPriceAxisView.update() )) } restoreExternalState(e) { (e = Object.assign({}, e), this.isActualSymbol()) || _(e.entryPrice) && ( this._timePoint[0].price = e.entryPrice, delete e.entryPrice); this.properties().merge(e) } _changeEntryPoint(e) { var t = this.properties().stopPrice.value(), i = this.properties().targetPrice.value(), s = 1 / this._model.mainSeries().base(), r = Math.min(t, i) + s, n = Math.max(t, i) - s; e.price = Math.max(r, Math.min(n, this._roundPrice(e.price))), super .setPoint(0, e), this.properties().stopPrice.setValue(t), this .properties().targetPrice.setValue(i) } setPoint(e, t, i) { if (this.isActualSymbol()) { switch (this._muteSyncLineStyle(), e) { case 0: this._changeEntryPoint(t); break; case 2: this.properties().stopPrice.setValue(this.preparseStopPrice(t .price)); break; case 3: this.properties().targetPrice.setValue(this.preparseProfitPrice( t.price)); break; case 1: t.price = this._roundPrice(t.price), super.setPoint(1, t), this .recalculate() } this._unmuteSyncLineStyleWithoutApplyingChanges(), this .syncPriceLevels() } } getPoint(e) { switch (e) { case 0: return this._points[0]; case 1: return { index: this._points[1].index, price: this._points[0].price }; case 2: return { index: this._points[0].index, price: this.stopPrice() }; case 3: return { index: this._points[0].index, price: this.profitPrice() } } return null } setPoints(e) { this._muteSyncLineStyle(), super.setPoints(e), this.recalculate(), this ._unmuteSyncLineStyleWithoutApplyingChanges(), this.syncPriceLevels() } syncPriceLevels() { if (this.linkKey().value()) { var e = this.properties(), t = { entryPrice: e.entryPrice.value(), stopLevel: e.stopLevel.value(), profitLevel: e.profitLevel.value() }; o.changeLineStyle({ linkKey: this.linkKey().value(), state: t, model: this._model }) } } pointsCount() { return 1 } name() { return "Risk/Reward" } addPoint(e) { e.price = this._roundPrice(e.price), super.addPoint(e, null, !0); var t = { price: e.price, index: this._getClosePointIndex(e.index) }; super._addPointIntenal(t, null, !0); var i = this.calculateActualEntry(e, t); i && (super._addPointIntenal(i, null, !0), (t = this.findClosePoint(i, t)) && super._addPointIntenal(t, null, !0)); return this._lastPoint = null, this.normalizePoints(), this .createServerPoints(), !0 } setOwnerSource(e) { super.setOwnerSource(e), this._model.mainSeries().symbolInfo() && (this ._recalculateAmount(), this._recalculateQty()) } _roundPrice(e) { var t = this._model.mainSeries().base(); return Math.round(e * t) / t } recalculate() { if (0 !== this.points().length) { var e = this.properties().targetPrice.value(), t = this.properties().stopPrice.value(), i = [this._points[0], this._points[1]], s = this.calculateActualEntry(this.points()[0], this.points()[1]); if (s) { i.push(s); var r = this.findClosePoint(s, this.points()[1]); r && i.push(r) } this._points = i, e !== this.properties().targetPrice.value() && this .properties().targetPrice._listeners.fire(this.properties() .targetPrice), t !== this.properties().stopPrice.value() && this .properties().stopPrice._listeners.fire(this.properties().stopPrice) } } start() { super.start(), this.recalculate() } startMoving(e, t, i) { e.logical.price = this._roundPrice(e.logical.price), super.startMoving(e, t, i) } move(e, t, i) { e.logical.price = this._roundPrice(e.logical.price), super.move(e, t, i), this.recalculate(), this._entryPriceAxisView.update() } _correctPoints(e) { return !!this.isActualSymbol() && r.prototype._correctPoints.call(this, [e[ 0], e[1]]) } entryPrice() { return this.points()[0].price } findClosePoint(e, t) { for (var i = this._model.mainSeries().bars(), r = s(i.firstIndex()), n = Math.max(e.index, r), o = s(i.lastIndex()), a = Math.min(o, t .index), l = n; l <= a; l++) { var c = i.valueAt(l); if (null !== c) { var h = this.checkStopPrice(c); if (null != h) return { index: l, price: h } } } return null } calculateActualEntry(e, t) { var i = this._model.mainSeries().bars(); if (i.isEmpty()) return null; for (var r = s(i.firstIndex()), n = Math.max(e.index, r), o = e.price, a = s(i.lastIndex()), l = Math.min(a, t.index), c = n; c <= l; c++) { var h = i.valueAt(c); if (null !== h && h[TradingView.HIGH_PLOT] >= o && h[TradingView .LOW_PLOT] <= o) return { index: c, price: o } } return null } axisPoints() { if (!this._points[c.ActualEntry]) return []; var e = this._points[c.ActualEntry], t = null; if (4 === this._points.length) t = this._points[c.ActualClose]; else { var i = this.lastBarData(); if (!i) return []; t = { index: i.index, price: i.closePrice } } return [e, t] } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "RYNR"))).RiskRewardDefinitionsViewModel } template() { var e = this.properties(), t = r.prototype.template.call(this); return t.stopLevel = e.stopLevel.value(), t.profitLevel = e.profitLevel .value(), t } _applyTemplateImpl(e) { delete e.targetPrice, delete e.stopPrice, delete e.entryPrice, super ._applyTemplateImpl(e); var t = this.properties(); void 0 !== e.stopLevel && t.stopLevel.setValue(e.stopLevel), void 0 !== e .profitLevel && t.profitLevel.setValue(e.profitLevel) } getOrderTemplate() { return null } _propertiesStateExclusions() { return ["entryPrice", "stopPrice", "targetPrice"] } static _configureProperties(e) { r._configureProperties(e), e.addExclusion("stopLevel"), e.addExclusion( "profitLevel"), e.addExclusion("stopPrice"), e.addExclusion( "targetPrice"), e.addExclusion("entryPrice") } _getClosePointIndex(e) { var t = this._model.timeScale(), i = Math.round(t.width() / t.barSpacing()); return e + Math.max(3, Math.round(.15 * i)) } } f.version = 2; class g extends f { constructor(e, t) { super(e, t || g.createProperties()); var i = this.properties(); i.entryPrice.subscribe(this, this._recalculateQty), i.stopPrice.subscribe( this, this._recalculateQty), i.riskSize.subscribe(this, this ._recalculateQty), i.entryPrice.subscribe(this, this ._recalculateAmount), i.profitLevel.subscribe(this, this ._recalculateAmount), i.stopLevel.subscribe(this, this ._recalculateAmount), i.accountSize.subscribe(this, this ._recalculateAmount), i.riskSize.subscribe(this, this ._recalculateAmount), i.qty.subscribe(this, this._recalculateAmount) } _recalculateQty() { if (0 !== this.points().length) { var e = this.properties(), t = e.entryPrice.value(), i = e.stopPrice.value(), s = e.riskSize.value(), r = this._model.mainSeries().pointValue(), n = s / (Math.abs(i - t) * r); e.qty.setValue(n) } } _recalculateAmount() { if (0 !== this.points().length) { var e = this.properties(), t = e.accountSize.value(), i = e.entryPrice.value(), s = e.qty.value(), r = e.stopPrice.value(), n = e.targetPrice.value(), o = this._model.mainSeries().pointValue(), a = this._roundValue(t + (i - n) * s * o), l = this._roundValue(t - (r - i) * s * o); e.amountTarget.setValue(a), e.amountStop.setValue(l) } } name() { return "Risk/Reward short" } stopPrice() { return this.entryPrice() + this.properties().stopLevel.value() / this._model .mainSeries().base() } profitPrice() { return this.entryPrice() - this.properties().profitLevel.value() / this ._model.mainSeries().base() } calculatePL(e) { return this.entryPrice() - e } preparseStopPrice(e) { e = this._roundPrice(e); var t = this.entryPrice() + 1 / this._model.mainSeries().base(); return Math.max(e, t) } preparseProfitPrice(e) { e = this._roundPrice(e); var t = this.entryPrice() - 1 / this._model.mainSeries().base(); return Math.min(e, t) } checkStopPrice(e) { var t = this.stopPrice(), i = this.profitPrice(); return e[TradingView.HIGH_PLOT] >= t ? this.stopPrice() : e[TradingView .LOW_PLOT] <= i ? this.profitPrice() : null } _orderSide() { throw new Error("not supported") } static createProperties(e) { var t = new a("linetoolriskrewardshort", e); return g._configureProperties(t), t } static _configureProperties(e) { f._configureProperties(e) } } class b extends f { constructor(e, t) { super(e, t || b.createProperties()); var i = this.properties(); i.entryPrice.subscribe(this, this._recalculateQty), i.stopPrice.subscribe( this, this._recalculateQty), i.riskSize.subscribe(this, this._recalculateQty), i.entryPrice .subscribe(this, this._recalculateAmount), i.profitLevel.subscribe(this, this._recalculateAmount), i.stopLevel.subscribe(this, this ._recalculateAmount), i.accountSize.subscribe(this, this ._recalculateAmount), i.riskSize.subscribe(this, this ._recalculateAmount), i.qty.subscribe(this, this._recalculateAmount) } _recalculateQty() { if (0 !== this.points().length) { var e = this.properties(), t = e.entryPrice.value(), i = e.stopPrice.value(), s = e.riskSize.value(), r = this._model.mainSeries().pointValue(), n = s / (Math.abs(t - i) * r); e.qty.setValue(n) } } _recalculateAmount() { if (0 !== this.points().length) { var e = this.properties(), t = e.accountSize.value(), i = e.entryPrice.value(), s = e.qty.value(), r = e.stopPrice.value(), n = e.targetPrice.value(), o = this._model.mainSeries().pointValue(), a = this._roundValue(t + (n - i) * s * o), l = this._roundValue(t - (i - r) * s * o); e.amountTarget.setValue(a), e.amountStop.setValue(l) } } stopPrice() { return this.entryPrice() - this.properties().stopLevel.value() / this._model .mainSeries().base() } profitPrice() { return this.entryPrice() + this.properties().profitLevel.value() / this ._model.mainSeries().base() } calculatePL(e) { return e - this.entryPrice() } preparseStopPrice(e) { e = this._roundPrice(e); var t = this.entryPrice() - 1 / this._model.mainSeries().base(); return Math.min(e, t) } preparseProfitPrice(e) { e = this._roundPrice(e); var t = this.entryPrice() + 1 / this._model.mainSeries().base(); return Math.max(e, t) } checkStopPrice(e) { var t = this.stopPrice(), i = this.profitPrice(); return e[TradingView.LOW_PLOT] <= t ? this.stopPrice() : e[TradingView .HIGH_PLOT] >= i ? this.profitPrice() : null } name() { return "Risk/Reward long" } _orderSide() { throw new Error("not supported") } static createProperties(e) { var t = new a("linetoolriskrewardlong", e); return b._configureProperties(t), t } static _configureProperties(e) { f._configureProperties(e) } } t.LineToolRiskRewardLong = b, t.LineToolRiskRewardShort = g }).call(this, i("Qb4w").PriceRange) }, tG6Q: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty; class n extends s { constructor(e, t) { super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "GS+0", 7)).then(({ LineToolCircleLinesPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 2 } name() { return "Cyclic Lines" } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "LX4V"))) .CyclicAndSineLinesPatternDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolcirclelines", e); return n._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolCircleLines = n }, tWVy: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return r })), i.d(t, "b", (function() { return n })); var s = i("aIyQ"); const r = new(i.n(s).a); function n() { r.fire() } }, "tc+8": function(e, t, i) { "use strict"; (function(t) { var s = i("ogJP").isFunction; function r(e) { if (this._listeners = new t, this._childs = [], this._muteChildChanges = !1, void 0 !== e) if (this.isPrimitiveType(e)) this._value = e; else for (var i in e) this.addProperty(i, e[i]) } r.prototype.merge = function(e, t) { var i = null; if (t) var s = (i = []).length; if (void 0 === e) return i; if (this.isPrimitiveType(e)) return t && this._value !== e && i.push(this), this ._value = e, i; if (Array.isArray(e)) for (var r = 0; r < e.length; r++) if (this[r]) { var n = this[r].merge(e[r], t); t && (i = i.concat(n)) } else this.addProperty(r, e[r]), t && i.push(this[r]); else for (var o in e) if (this[o]) { n = this[o].merge(e[o], t); t && void 0 !== n && (i = i.concat(n)) } else this.addProperty(o, e[o]), t && i.push(this[o]); return t && i.length > s && i.push(this), i }, r.prototype.mergeAndFire = function(e) { var t = this.merge(e, !0); this._muteChildChanges = !0, t.forEach((function(e) { e._muteChildChanges = !0 })), t.forEach((function(e) { e._muteChildChanges = !1, e.listeners().fire(e) })), this._muteChildChanges = !1, t.length > 0 && this.listeners().fire( this) }, r.prototype.state = function(e) { var t = s(this.value) ? this.value() : void 0; void 0 === t && (t = {}); for (var i = 0; i < this._childs.length; i++) { var r = this._childs[i]; if (!e || -1 === e.indexOf(r)) if (e) { for (var n = [], o = 0; o < e.length; o++) { var a = e[o]; a.startsWith(r + ".") && n.push(a.substr(r.length + 1)) } t[r] = this[r].state(n) } else t[r] = this[r].state() } return t }, r.prototype.clone = function(e) { return new r(this.state()) }, r.prototype.isPrimitiveType = function(e) { return null === e || (!!isNumber(e) || (!!new TradingView.TypeValidator(String) .check(e) || TradingView.isBoolean(e))) }, r.prototype.value = function() { return this._value }, r.prototype.listeners = function() { return this._listeners }, r.prototype.childCount = function() { return this._childs.length }, r.prototype.childNames = function() { return this._childs }, r.prototype.child = function(e) { return this[e] }, r.prototype.setValue = function(e, t) { (this._value !== e || t) && (this._value = e, this._listeners.fire(this)) }, r.prototype.setValueSilently = function(e) { this._value = e }, r.prototype.addProperty = function(e, t) { var i = new r(t); this[e] = i, this._childs.push(e), i.subscribe(this, this.childChanged) }, r.prototype.removeProperty = function(e) { this[e].unsubscribe(this, this.childChanged), delete this[e], this._childs = this._childs.filter((function(t) { return t !== e })) }, r.prototype.hasChild = function(e) { return this._childs.indexOf(e) >= 0 }, r.prototype.addChild = function(e, t) { this[e] && this[e].unsubscribe(this, this.childChanged), this[e] = t, -1 === this._childs.indexOf(e) && this._childs.push(e), t.subscribe(this, this .childChanged) }, r.prototype.childChanged = function(e, t) { this._muteChildChanges || this.listeners().fire(this) }, r.prototype.subscribe = function(e, t) { this.listeners().subscribe(e, t, !1) }, r.prototype.unsubscribe = function(e, t) { this.listeners().unsubscribe(e, t) }, r.prototype.unsubscribeAll = function(e) { this.listeners().unsubscribeAll(e) }, r.prototype.childs = function() { return this }, e.exports = r }).call(this, i("aIyQ")) }, teHb: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ratioStudyItem", (function() { return n })); var s = i("7dm8"); class r extends s.a { _doCalculation(e, t, i, s) { return e * t / (i * s) } } const n = { name: "Ratio", metainfo: { _metainfoVersion: 15, defaults: s.b, plots: s.d, styles: s.e, description: "Ratio", shortDescription: "Ratio", is_price_study: !1, inputs: s.c, id: "Ratio@tv-basicstudies-1" }, constructor: r } }, tqok: function(e, t, i) { "use strict"; i.r(t), i.d(t, "INVALID_TIME_POINT_INDEX", (function() { return s })); const s = -2e6 }, txPx: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LOGLEVEL", (function() { return n })), i.d(t, "getLogLevel", (function() { return _ })), i.d(t, "isHighRateEnabled", (function() { return m })), i.d(t, "setLogLevel", (function() { return f })), i.d(t, "getRawLogHistory", (function() { return g })), i.d(t, "serializeLogHistoryEntry", (function() { return b })), i.d(t, "getLogHistory", (function() { return v })), i.d(t, "getLogger", (function() { return y })), i.d(t, "loggingOn", (function() { return P })), i.d(t, "loggingOff", (function() { return C })); const s = "undefined" != typeof window ? window : {}; let r = !1; try { localStorage.getItem(""), r = !0 } catch (e) {} var n; ! 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" }(n || (n = {})); let o = 0; const a = []; let l = null, c = null, h = null, u = NaN, d = n.WARNING, p = !1; function _() { return d } function m() { return p } function f(e) { e = Math.max(n.ERROR, Math.min(n.DEBUG, e)), d = e, x() } function g(e, t) { let i = a.reduce((e, t) => e.concat(t), []); return i.sort((e, t) => e.id - t.id), void 0 !== t && (i = i.filter(e => e.subSystemId === t)), "number" == typeof e && (i = i.slice(-e)), i } function b(e) { return new Date(e.timestamp).toISOString() + ":" + e.subSystemId + ":" + e.message.replace( /"/g, "'") } function v(e, t) { return function(e, t) { let i, s = 0, r = 0; for (i = e.length - 1; i >= 1 && (s += 8 * (1 + encodeURIComponent(e[i]).length), !( i - 1 > 0 && (r = 8 * (1 + encodeURIComponent(e[i - 1]).length), s + r > t))); i--); return e.slice(i) }(g(e, t).map(b), 75497472) } function S(e, t, i, s) { if (t === c && s.id === h) return; const r = new Date; if (e <= n.NORMAL && function(e, t, i, s, r) { const n = { id: o, message: String(t), subSystemId: s, timestamp: Number(e) }; o += 1, i.push(n), void 0 !== r && i.length > r && i.splice(0, 1) }(r, t, i, s.id, s.maxCount), e <= d && (!s.highRate || m()) && (!l || s.id.match(l))) { const i = r.toISOString() + ":" + s.id + ":" + t; switch (e) { case n.DEBUG: console.debug(i); break; case n.INFO: case n.NORMAL: s.color ? console.log("%c" + i, "color: " + s.color) : console.log(i); break; case n.WARNING: console.warn(i); break; case n.ERROR: console.error(i) } c = t, h = s.id, u && clearTimeout(u), u = setTimeout(() => { c = null, h = null, u = NaN }, 1e3) } } function y(e, t = {}) { const i = []; a.push(i); const s = Object.assign(t, { id: e }); function r(e) { return t => S(e, t, i, s) } return { logDebug: r(n.DEBUG), logError: r(n.ERROR), logInfo: r(n.INFO), logNormal: r(n.NORMAL), logWarn: r(n.WARNING) } } const w = y("logger"), P = s.lon = (e, t) => { f(n.DEBUG), w.logNormal("Debug logging enabled"), p = Boolean(e), l = t || null, x() }, C = s.loff = () => { f(n.INFO), w.logInfo("Debug logging disabled") }; function x() { try { r && (localStorage.setItem("tv.logger.logHighRate", String(p)), localStorage.setItem( "tv.logger.loglevel", String(d))) } catch (e) { w.logWarn( `Cannot save logger state (level: ${d}, high-rate: ${p}) to localStorage: ${e.message}` ) } }! function() { p = !!r && "true" === localStorage.getItem("tv.logger.logHighRate"); let e = parseInt(r && localStorage.getItem("tv.logger.loglevel") || ""); Number.isNaN(e) && (e = n.WARNING), f(e), w.logNormal( `Init with settings - level: ${d}, high-rate: ${p}`) }(), s.performance && s.performance.now ? w.logNormal("Sync logger and perf times, now is " + s .performance.now()) : w.logWarn("Perf time is not available") }, "u+0B": function(e, t, i) { "use strict"; i.r(t), i.d(t, "TextWidthCache", (function() { return r })); const s = /[2-9]/g; class r { constructor(e = 50) { this._actualSize = 0, this._usageTick = 1, this._oldestTick = 1, this ._tick2Labels = {}, this._cache = {}, this._maxSize = e } reset() { this._actualSize = 0, this._cache = {}, this._usageTick = 1, this._oldestTick = 1, this._tick2Labels = {} } measureText(e, t, i) { return this._getMetrics(e, t, i).width } yMidCorrection(e, t, i) { const s = this._getMetrics(e, t, i); return ((s.actualBoundingBoxAscent || 0) - (s.actualBoundingBoxDescent || 0)) / 2 } _getMetrics(e, t, i) { const r = i || s, n = String(t).replace(r, "0"); if (this._cache[n]) return this._cache[n].metrics; if (this._actualSize === this._maxSize) { const e = this._tick2Labels[this._oldestTick]; delete this._tick2Labels[this._oldestTick], delete this._cache[e], this ._oldestTick++, this._actualSize-- } e.save(), e.textBaseline = "middle"; const o = e.measureText(n); return e.restore(), 0 === o.width && t.length || (this._cache[n] = { metrics: o, tick: this._usageTick }, this._tick2Labels[this._usageTick] = n, this._actualSize++, this ._usageTick++), o } } }, u0yd: function(e, t, i) { "use strict"; i.r(t), i.d(t, "PaneRendererArea", (function() { return a })); var s = i("Eyy1"), r = i("gyZD"), n = i("jFln"), o = i("Zp/P"); class a extends r.PaneRendererLine { constructor(e) { e.forceLineColor = !1, super(e) } draw(e, t) { var i; e.save(), e.scale(t.pixelRatio, t.pixelRatio); const r = this._data; if (0 === r.items.length) return; e.lineCap = "butt", e.strokeStyle = r.lineColor, e.lineWidth = r.lineWidth, Object(n.setLineStyle)(e, r.lineStyle), e.lineWidth = 1; let a = 0; for (; a < r.items.length && !Object(o.coordinateIsValid)(r.items[a].y);) a++; let l = r.items.length - 1; for (; l >= 0 && !Object(o.coordinateIsValid)(r.items[l].y);) l--; if (a > l) return; const c = {}, h = r.items; for (let e = a; e <= l; e++) { const t = h[e]; let i; if (i = t.style ? t.style.color : r.lineColor, e < l && h[e + 1].style) { const r = Object(s.ensureDefined)(h[e + 1].style).color; if (i !== r) { const e = c[r] || []; e.push(t), c[r] = e } } const n = c[i] || []; n.push(t), c[i] = n } for (const t of Object.keys(c)) { const s = c[t]; e.beginPath(); let n = 0; for (let o = 0; o < s.length; o++) s[o].style && (null === (i = s[o] .style) || void 0 === i ? void 0 : i.color) !== t && (e.moveTo(Math .round(s[n].x), r.bottom), this._walkLine(e, s.slice(n, o), !0, r.bottom), n = o); if (e.moveTo(Math.round(s[n].x), r.bottom), this._walkLine(e, s.slice(n, s .length), !0, r.bottom), e.closePath(), r.isSeries) { const t = e.createLinearGradient(0, 0, 0, r.bottom); t.addColorStop(0, r.color1), t.addColorStop(1, r.color2), e.fillStyle = t, r.simpleMode = !0 } else e.fillStyle = t; e.fill() } e.lineWidth = r.lineWidth, e.restore(), super.draw(e, t) } } }, uDHo: function(e, t, i) { "use strict"; var s, r; function n(e, t) { return "period-back" === e.type && "period-back" === t.type ? e.value === t.value : "time-range" === e.type && "time-range" === t.type && (e.from === t.from && e.to === t .to) } i.r(t), i.d(t, "Helpers", (function() { return s })), i.d(t, "TIMEFRAMETYPE", (function() { return r })), i.d(t, "areEqualTimeFrames", (function() { return n })), function(e) { e.extractErrorReason = function(e) { return e.params[1] } }(s || (s = {})), function(e) { e.PeriodBack = "period-back", e.TimeRange = "time-range" }(r || (r = {})) }, ufwo: function(e, t, i) { "use strict"; i.r(t), i.d(t, "rangesAreEqual", (function() { return n })); var s = i("uDHo"), r = i("LxhU"); function n(e, t) { return !!r.Interval.isEqual(e.res, t.res) && Object(s.areEqualTimeFrames)(e.val, t.val) } }, ulZB: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return n })), i.d(t, "b", (function() { return o })); var s = i("aIyQ"), r = i.n(s); class n { constructor(e, t, i, s, n) { this._onChange = new r.a, this._handleChange = () => { this._onChange.fire(this.get()) }, this._crossTabEvents = e, this._jsonKeyValueStore = t, this .CROSSTAB_EVENT_NAME = i, this.JSON_STORE_KEY = s, this.defaultStoreValue = this ._serialize(n), this._subscribe() } get() { const e = this._jsonKeyValueStore.getJSON(this.JSON_STORE_KEY, this .defaultStoreValue); return this._deserialize(e) } set(e, t) { const i = this._serialize(e); this._jsonKeyValueStore.setJSON(this.JSON_STORE_KEY, i, t), this._crossTabEvents .emit(this.CROSSTAB_EVENT_NAME), this._onChange.fire(e) } getOnChange() { return this._onChange } destroy() { this._unsubscribe(), this._onChange.destroy(), delete this._onChange } _subscribe() { this._crossTabEvents.on(this.CROSSTAB_EVENT_NAME, this._handleChange), this ._jsonKeyValueStore.onSync.subscribe(this, this._handleChange) } _unsubscribe() { this._crossTabEvents.off(this.CROSSTAB_EVENT_NAME, this._handleChange), this ._jsonKeyValueStore.onSync.unsubscribe(this, this._handleChange) } } class o extends n { _serialize(e) { return e } _deserialize(e) { return e } } }, v5F8: function(e, t, i) { "use strict"; var s = i("5rJj"), r = i("aDyP").LineToolPitchfork; class n extends r { constructor(e, t) { super(e, t || n.createProperties()) } name() { return "Modified Schiff Pitchfork" } static createProperties(e) { var t = new s("linetoolschiffpitchfork", e, !1, { range: [0, 8] }); return n._configureProperties(t), t } static _configureProperties(e) { r._configureProperties(e) } } t.LineToolSchiffPitchfork = n }, vAx0: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("VdBB").HitTestResult, n = i("Zy3/").CompositeRenderer, o = (i("LxhU").Interval, i("jCNj").utc_to_cal), a = i("jCNj").get_timezone, l = i("3t3b").dateFormatProperty, c = i("gQ5K").DateFormatter, h = i("z+cS").VerticalLineRenderer, u = i("Khfk").LollipopRenderer, d = i("u+0B").TextWidthCache; i("zDbI").CHART_FONT_FAMILY, window.t("Earnings"), window.t("Standardized"), window.t( "As reported"), window.t("Estimate"), window.t("Surprise"), window.t("Split"), window.t( "Dividends"), window.t("Net"), window.t("Gross"), window.t("Date"), window.t( "Period Ending"), window.t("Payment Date"); t.ESDPaneView = class { constructor(e, t, i) { this._lastClickedId = null, this._model = e, this._study = t, this ._lollipops = {}, this._lollipopsCounter = 0, this._invalidated = !0, this ._hideLollipops = !1, this.defaultStyle = null, this.hoveredStyle = null, this.activeStyle = null, this._hitTestHandler = i, this._renderer = new n, this._textWidthCache = new d, this._recreateStyles(e), this ._onPaneBgChangeBound = this.onPaneBgChange.bind(this), e.backgroundColor() .subscribe(this._onPaneBgChangeBound), e.mainSeries() .onSymbolIntervalChanged().subscribe(this, this._onSymbolOrIntervalChanged) } destroy() { this._model.backgroundColor().unsubscribe(this._onPaneBgChangeBound), this ._model.mainSeries().onSymbolIntervalChanged().unsubscribeAll(this) } onPaneBgChange() { this._recreateStyles(this._model) } onClickOutside(e) { if (null !== this._lastClickedId && e) { var t = null; if (e.touches && 1 === e.touches.length) { var i = e.target.getBoundingClientRect(), r = e.touches[0]; t = new s(r.clientX - i.left, r.clientY - i.top) } else t = new s(e.offsetX, e.offsetY); var n = this._renderer.hitTest(t); null !== n && n.data().activeItem === this._lollipops[this._lastClickedId] .itemIndex || this.clearLastClicked() } else this.clearLastClicked() } clearLastClicked() { void 0 !== this._lollipops[this._lastClickedId] && (this._lollipops[this ._lastClickedId].active = !1), this._lastClickedId = null } getLastClickedLollipopId() { return this._lastClickedId } _recreateStyles(e) { this._stylesCache = null } _setStackStudies() { this._stackStudies = [] } _getY() { for (var e = 0, t = this._model.panes(), i = t.length; i--;) { var s = t[i]; s.containsMainSeries() && (e += s.height()) } return e } update() { this._invalidated = !0 } updateImpl(e, t) { this._setStackStudies(); var i = this, s = this._study.data(), r = this._model.timeScale(), n = r.visibleBarsStrictRange(), o = this._model.mainSeries().bars(), a = this._study.priceScale(), l = this._model.mainSeries().firstBar(); if (a && !a.isEmpty() && !r.isEmpty() && l && s) { for (var c in this._hideLollipops = !1, this._lollipops) this._lollipops .hasOwnProperty(c) && (this._lollipops[c].visible = !1); var h = this._getY(), u = n.firstBar(), d = n.lastBar(); s.range(u, d).each((function(e, t) { for (var s = 0, n = 0; n < i._stackStudies.length; ++n) i ._stackStudies[n].data().contains(e) && ++s; e > u && e < d && i.addLollipop(h, o, r, a, e, t, s) })), this.afterUpdate(h, o, r, a), this._createRenderers(e, t) } } addLollipop(e, t, i, r, n, o, a) { var l = o[0], c = this._model.mainSeries().symbolInfo(); if (c) { var h = c.name, u = null, d = this._study.metaInfo().id + "_" + l + "_" + h, p = void 0 !== this._lollipops[d] ? this._lollipops[d].itemIndex : this ._lollipopsCounter++, _ = this._model.lastHittestData(), m = d === this.getLastClickedLollipopId(), f = this._model.hoveredSource() === this._study && null !== _ && _ .activeItem === p; if (f || m) { var g = t.valueAt(n); if (null !== g) { var b = g[TradingView.LOW_PLOT], v = this._model.mainSeries().firstValue(); u = r.priceToCoordinate(b, v) } } this._lollipops[d] = Object.assign({ id: d, itemIndex: p, visible: !0, basePoint: new s(i.indexToCoordinate(n), e), hovered: f, active: m, barY: u, stack: a }, this.extraData(o)) } } afterUpdate(e, t, i) {} extraData(e) { throw new Error("Not Implemented") } createTooltipContent(e, t) { throw new Error("Not Implemented") } showBarLine() { return !0 } getStyle(e) { var t = e.active ? "active" : e.hovered ? "hovered" : "default", i = t; if (e.stack && (i += "_stack:" + e.stack), "active" === i) return this .activeStyle; if ("hovered" === i) return this.hoveredStyle; if ("default" === i) return this.defaultStyle; if (this._stylesCache || (this._stylesCache = {}), !this._stylesCache[i]) { var s = TradingView.clone("active" === t ? this.activeStyle : "hovered" === t ? this.hoveredStyle : this.defaultStyle); e.stack && (s.lollipop.incHeight = 25 * e.stack), this._stylesCache[i] = s } return this._stylesCache[i] } hasTooltip(e) { return !0 } renderer(e, t) { return this._invalidated && (this.updateImpl(t, e), this._invalidated = !1), this._hideLollipops ? null : this._renderer } _createRenderers(e, t) { for (var i in this._renderer.clear(), this._lollipops) if (this._lollipops.hasOwnProperty(i)) { var r = this._lollipops[i]; if (r.visible) { var n = this.getStyle(r), o = { id: r.id, centerPoint: new s(r.basePoint.x, r.basePoint.y - n.lollipop .bottom - n.lollipop.height / 2 - (n.lollipop .incHeight || 0)), style: n.lollipop }, a = { activeItem: r.itemIndex, clickHandler: this._lollipopMouseClickHandler.bind(this, o), tapHandler: this._lollipopMouseClickHandler.bind(this, o) }; if (this._renderer.append(this._createRendererForLollipop(o, a)), (r .hovered || r.active) && this.hasTooltip(r) && r.barY && this.showBarLine()) { var l = { width: e, height: t, color: n.strokeStyle, linestyle: n.barLine.lineStyle, linewidth: n.lineWidth, x: r.basePoint.x, top: 0, bottom: r.basePoint.y - n.lollipop.bottom - n.lollipop .height }, c = new h; c.setData(l), this._renderer.insert(c) } } } } _createRendererForLollipop(e, t) { return new u(e, new r(r.CUSTOM, t), this._textWidthCache) } _lollipopMouseClickHandler(e, t) { t.preventDefault(); var i = e.id; if (this._lastClickedId = this._lastClickedId === i ? null : i, null !== this ._lastClickedId) { var r = e.style.width / 2, n = e.style.height / 2, o = new s(t.clientX - t.localX + e.centerPoint.x, t.clientY - t.localY + e.centerPoint.y), a = { target: t.target, left: o.x - r, top: o.y - n, right: o.x + r, bottom: o.x + n }; this._hitTestHandler(a, () => { var e = this._lollipops[i], t = this.createTooltipContent(e); return t ? [t] : null }) } } _formatDate(e) { let t = "Etc/UTC"; const i = this._model.mainSeries(); if (!i.isDWM() && (t = this._model.properties().timezone.value(), "exchange" === t)) { const e = i.symbolInfo(); t = e && e.timezone || "" } var s = a(t), r = o(s, e); return new c(l.value()).format(r) } _onSymbolOrIntervalChanged() { this._lollipops = {}, this._lollipopsCounter = 0, this._renderer.clear(), this .clearLastClicked() } } }, vIQA: function(e, t, i) { "use strict"; var s = i("ocLq"); i("2cgs"); var r = i("hyq/").pivotPointsStandardStudyItem, n = i("krs7").volumeProfileVisibleRangeStudyItem, o = i("+Qfv").volumeProfileFixedRangeVbPStudyItem, a = i("+Qfv").volumeProfileFixedRangeBSStudyItem, l = i("QCyK").spreadStudyItem, c = i("teHb").ratioStudyItem, h = i("+PIq").regressionTrendStudyItem; JSServer.studyLibrary = JSServer.studyLibrary.concat([{ name: "Compare", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !0, defaults: { styles: { compare: { linestyle: 0, linewidth: 2, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#9C27B0" } }, inputs: { source: "close", symbol: "" } }, plots: [{ id: "compare", type: "line" }], styles: { compare: { title: "Plot", histogramBase: 0 } }, description: "Compare", shortDescription: "Compare", is_price_study: !0, inputs: [{ defval: "close", id: "source", name: "Source", options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4" ], type: "text" }, { id: "symbol", name: "Symbol", type: "symbol", isHidden: !0 }], id: "Compare@tv-basicstudies-1", format: { type: "inherit" } }, constructor: function() { this.init = function(e, t) { this._context = e, this._context.new_sym(t(1), s.Std.period(this ._context)) }, this.main = function(e, t) { this._context = e; var i = this._context.new_unlimited_var(this._context.symbol .time); this._context.select_sym(1); var r = this._context.new_unlimited_var(this._context.symbol .time), n = s.Std[t(0)](this._context), o = this._context.new_unlimited_var(n); return this._context.select_sym(0), [o.adopt(r, i, 0)] } } }, { name: "Overlay", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !0, defaults: { styles: {}, inputs: { symbol: "" } }, plots: [{ id: "open", type: "line" }, { id: "high", type: "line" }, { id: "low", type: "line" }, { id: "close", type: "line" }], styles: { open: { title: "Open" }, high: { title: "High" }, low: { title: "Low" }, close: { title: "Close" } }, description: "Overlay", shortDescription: "Overlay", is_price_study: !1, inputs: [{ id: "symbol", name: "symbol", defval: "", type: "symbol", isHidden: !0 }], id: "Overlay@tv-basicstudies-1", format: { type: "price", precision: 4 } }, constructor: function() { this.init = function(e, t) { this._context = e, this._context.new_sym(t(0), s.Std.period(this ._context)) }, this.main = function(e, t) { this._context = e; var i = this._context.new_unlimited_var(this._context.symbol .time); this._context.select_sym(1); var r = this._context.new_unlimited_var(this._context.symbol .time), n = this._context.new_unlimited_var(s.Std.open(this ._context)), o = this._context.new_unlimited_var(s.Std.high(this ._context)), a = this._context.new_unlimited_var(s.Std.low(this ._context)), l = this._context.new_unlimited_var(s.Std.close(this ._context)); return this._context.select_sym(0), [n.adopt(r, i, 1), o.adopt( r, i, 1), a.adopt(r, i, 1), l.adopt(r, i, 1)] } } }, { name: "Volume", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { vol: { linestyle: 0, linewidth: 1, plottype: 5, trackPrice: !1, transparency: 50, visible: !0, color: "#000080" }, vol_ma: { linestyle: 0, linewidth: 1, plottype: 0, trackPrice: !1, transparency: 0, visible: !1, color: "#2196F3" } }, palettes: { volumePalette: { colors: { 0: { color: "#EF5350", width: 1, style: 0 }, 1: { color: "#26A69A", width: 1, style: 0 } } } }, inputs: { showMA: !1, length: 20, col_prev_close: !1 } }, plots: [{ id: "vol", type: "line" }, { id: "volumePalette", palette: "volumePalette", target: "vol", type: "colorer" }, { id: "vol_ma", type: "line" }], styles: { vol: { title: "Volume", histogramBase: 0 }, vol_ma: { title: "Volume MA", histogramBase: 0 } }, description: "Volume", shortDescription: "Volume", is_price_study: !1, palettes: { volumePalette: { colors: { 0: { name: "Falling" }, 1: { name: "Growing" } } } }, inputs: [{ id: "showMA", name: "show MA", defval: !1, type: "bool", isHidden: !0 }, { id: "length", name: "MA Length", defval: 20, type: "integer", min: 1, max: 2e3 }, { defval: !1, id: "col_prev_close", name: "Color based on previous close", type: "bool" }], id: "Volume@tv-basicstudies-1", format: { type: "volume" } }, constructor: function() { this.f_0 = function(e, t) { return s.Std.gt(e, t) ? 0 : 1 }, this.main = function(e, t) { this._context = e, this._input = t; var i = s.Std.volume(this._context), r = s.Std.volume(this._context), n = this._context.new_var(r), o = s.Std.sma(n, this._input(1), this._context), a = this._context.new_var(s.Std.close(this._context)); return [i, a.get(1) && this._input(2) ? this.f_0(a.get(1), s.Std .close(this._context)) : this.f_0(s.Std.open(this ._context), s.Std.close(this._context)), o] } } }, { name: "ZigZag", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 2, plottype: 0, trackPrice: !1, transparency: 0, visible: !0, color: "#2196F3" } }, inputs: { in_0: 5, in_1: 10 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", target: "plot_0", type: "dataoffset" }], styles: { plot_0: { title: "Plot", histogramBase: 0, joinPoints: !1 } }, description: "Zig Zag", shortDescription: "ZigZag", is_price_study: !0, classId: "ScriptWithDataOffset", inputs: [{ id: "in_0", name: "deviation", defval: 5, type: "float", min: .001, max: 100 }, { id: "in_1", name: "depth", defval: 10, type: "integer", min: 2, max: 1e3 }], id: "ZigZag@tv-basicstudies-1", format: { type: "inherit" } }, constructor: function() { this.main = function(e, t) { this._context = e, this._input = t; var i = this._input(0), r = this._input(1), n = i / 100, o = Math.ceil(r / 2); return [s.Std.zigzag(n, o, this._context), s.Std.zigzagbars(n, o, this._context)] } } }, { name: "Sessions", metainfo: { _metainfoVersion: 52, defaults: { graphics: { vertlines: { sessBreaks: { color: "#4985e7", style: 2, visible: !1, width: 1 } } }, linkedToSeries: !0 }, description: "Sessions", graphics: { vertlines: { sessBreaks: { name: "Session Break", halign: "left" } } }, id: "Sessions@tv-basicstudies-1", inputs: [], is_hidden_study: !0, is_price_study: !0, name: "Sessions@tv-basicstudies", palettes: {}, plots: [], shortDescription: "Sessions", format: { type: "inherit" } }, constructor: function() { function e(e, t) { return { id: e, index: e, extendBottom: !0, extendTop: !0 } } this.init = function() { this._times = [] }, this._getVerticalLineData = function(t) { return s.Std.selectSessionBreaks(t, this._times).map(e) }, this.main = function(e, t) { if (s.Std.isdwm(e)) return null; var i = s.Std.time(e); if (isNaN(i)) return null; var r = this._times.length; if (0 !== r && this._times[r - 1] === i || this._times.push(i), !e.symbol.isLastBar || !e.symbol.isNewBar) return null; var n = this._getVerticalLineData(e); return 0 === n.length ? null : { nonseries: !0, type: "study_graphics", data: { graphicsCmds: { create: { vertlines: [{ styleId: "sessBreaks", data: n }] }, erase: [{ action: "all" }] } } } } } }, { name: "SuperTrend", metainfo: { _metainfoVersion: 52, isTVScript: !1, isTVScriptStub: !1, is_hidden_study: !1, defaults: { styles: { plot_0: { linestyle: 0, linewidth: 3, plottype: 0, trackPrice: !1, transparency: 35, visible: !0, color: "#000080" }, plot_2: { linestyle: 0, linewidth: 3, plottype: "shape_arrow_up", trackPrice: !1, location: "BelowBar", transparency: 35, visible: !0, color: "#00FF00" }, plot_3: { linestyle: 0, linewidth: 3, plottype: "shape_arrow_down", trackPrice: !1, location: "AboveBar", transparency: 35, visible: !0, color: "#FF0000" } }, palettes: { palette_0: { colors: { 0: { color: "#008000", width: 3, style: 0 }, 1: { color: "#800000", width: 3, style: 0 } } } }, inputs: { in_0: 10, in_1: 3 } }, plots: [{ id: "plot_0", type: "line" }, { id: "plot_1", palette: "palette_0", target: "plot_0", type: "colorer" }, { id: "plot_2", type: "shapes" }, { id: "plot_3", type: "shapes" }], styles: { plot_0: { title: "SuperTrend", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_2: { title: "Up Arrow", histogramBase: 0, joinPoints: !1, isHidden: !1 }, plot_3: { title: "Down Arrow", histogramBase: 0, joinPoints: !1, isHidden: !1 } }, description: "SuperTrend", shortDescription: "SuperTrend", is_price_study: !0, palettes: { palette_0: { colors: { 0: { name: "Color 0" }, 1: { name: "Color 1" } }, valToIndex: { 0: 0, 1: 1 } } }, inputs: [{ id: "in_0", name: "Length", defval: 10, type: "integer", min: 1, max: 100 }, { id: "in_1", name: "Factor", defval: 3, type: "float", min: 1, max: 100 }], id: "SuperTrend@tv-basicstudies-1", scriptIdPart: "", name: "SuperTrend", isCustomIndicator: !0, format: { type: "inherit" } }, constructor: function() { this.f_0 = function() { var e = this._input(0), t = this._input(1), i = s.Std.atr(e, this._context), r = (e = s.Std.hl2(this._context) + i * t, i = s.Std.hl2( this._context) - i * t, this._context.new_var(s.Std .close(this._context))), n = (t = this._context.new_var(), s.Std.max(i, t.get(1))); return t.set(s.Std.gt(r.get(1), t.get(1)) ? n : i), i = this ._context.new_var(), n = s.Std.min(e, i.get(1)), i.set(s.Std .lt(r.get(1), i.get(1)) ? n : e), e = this._context .new_var(), r = s.Std.nz(e.get(1), 1), r = s.Std.lt(s.Std .close(this._context), t.get(1)) ? -1 : r, e.set(s.Std .gt(s.Std.close(this._context), i.get(1)) ? 1 : r), [t = s.Std.eq(e.get(0), 1) ? t.get(0) : i.get(0), s.Std.eq(e .get(0), 1) ? 0 : 1, 1 === e.get(0) && -1 === e.get( 1) ? 1 : NaN, -1 === e.get(0) && 1 === e.get(1) ? 1 : NaN ] }, this.main = function(e, t) { this._context = e, this._input = t; var i = this.f_0(); return [i[0], i[1], i[2], i[3]] } } }, r, n, o, a, l, c, h]) }, vPbs: function(e, t, i) { "use strict"; i.r(t), i.d(t, "CHART_WIDGET_COLLECTION_SERVICE", (function() { return r })), i.d(t, "chartWidgetCollectionService", (function() { return n })), i.d(t, "CollectionViewMode", (function() { return o })); var s = i("eqEH"); const r = { id: "ChartWidgetCollectionService" }; function n() { return Object(s.hasService)(r) ? Object(s.service)(r) : null } var o; ! function(e) { e.Multichart = "multichart", e.ForceFullscreen = "force-fullscreen" }(o || (o = {})) }, vTIA: function(e, t, i) { "use strict"; var s, r; i.r(t), i.d(t, "PositionPLDisplay", (function() { return s })), i.d(t, "TradingSourcesHorizontalAlignment", (function() { return r })), i.d(t, "tradingPreferencesDefault", (function() { return n })), i.d(t, "CustomSourceLayer", (function() { return o })), function(e) { e[e.Money = 0] = "Money", e[e.Pips = 1] = "Pips", e[e.Percentage = 2] = "Percentage" }(s || (s = {})), function(e) { e[e.Left = 0] = "Left", e[e.Center = 1] = "Center", e[e.Right = 2] = "Right" }(r || (r = {})); const n = { showPositions: !1, positionPL: { visibility: !1, display: s.Money }, showOrders: !1, showExecutions: !1, extendLeft: !1, lineLength: 0, horizontalAlignment: r.Left, lineWidth: 0, lineStyle: 0 }; var o; ! function(e) { e[e.Background = 0] = "Background", e[e.Foreground = 1] = "Foreground", e[e.Topmost = 2] = "Topmost" }(o || (o = {})) }, vaqD: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LoadingScreen", (function() { return o })); var s = i("Kxc7"), r = i("4vW/"), n = i("YWnQ"); class o { constructor(e, t) { this._showed = !1, this._cw = e, this._element = document.createElement("div"), this ._element.classList.add("chart-loading-screen"), this._shield = document .createElement("div"), this._shield.classList.add( "chart-loading-screen-shield"), this._element.appendChild(this._shield), t .appendChild(this._element), this._cw.withModel(this, this._connectToModel) } show() { this._cw.setInLoadingState(!0), this._showed || (this._showed = !0, this._show()) } hide() { this._cw.setInLoadingState(!1), this._showed && this._hide() } isShown() { return this._showed } _connectToModel() { const e = this._cw.model().mainSeries().dataEvents(); e.symbolError().subscribe(this, e => { e !== n.permissionDenied && this.hide() }), e.seriesError().subscribe(this, () => { Object(s.enabled)("hide_loading_screen_on_series_error") && this.hide() }), e.completed().subscribe(this, this.hide) } _show() { const e = this._cw.properties().childs().paneProperties.childs(); let t; if (e.backgroundType.value() === r.ColorType.Solid) t = e.background.value(); else { t = `linear-gradient(${e.backgroundGradientStartColor.value()},${e.backgroundGradientEndColor.value()})` } this._shield.style.background = t, this._element.classList.add("fade") } _hide() { this._showed = !1, this._element.classList.remove("fade") } } }, vq8G: function(e, t, i) { "use strict"; i.r(t), i.d(t, "SelectionRenderer", (function() { return o })); var s = i("VdBB"), r = i("//lt"), n = i("f6yo"); class o { constructor(e) { this._data = e || null } setData(e) { this._data = e } draw(e, t) { if (null === this._data || !this._data.visible) return; const i = t.pixelRatio; e.strokeStyle = void 0 !== this._data.color ? this._data.color : "#1E53E5", e .lineCap = "butt"; const s = Math.max(1, Math.floor(i)); e.lineWidth = s; const r = this._data.vertOffset || 0; for (let t = 0; t < this._data.points.length; ++t) { const o = this._data.points[t]; (n = o, Number.isFinite(n.x) && Number.isFinite(n.y)) && (e.fillStyle = this ._data.bgColors[t], this._drawMarker(e, o, r, s, i)) } var n } hitTest(e) { if (!this._data || !this._data.visible) return null; for (let t = 0; t < this._data.points.length; t++) { const i = this._data.points[t]; if (i.subtract(e).length() <= 5.5) { const e = void 0 !== this._data.pointsCursorType ? this._data .pointsCursorType[t] : r.PaneCursorType.Default; return new s.HitTestResult(this._data.hittestResult, { pointIndex: i.data, cursorType: e }) } } return null } doesIntersectWithBox(e) { return !!this._data && this._data.points.some(t => Object(n.pointInBox)(t, e)) } _drawMarker(e, t, i, s, r) { let n = Math.round(3.5 * r * 2); n % 2 != s % 2 && (n += 1); let o = Math.round(n + 2 * (.5 * s + .75 * r)); o % 2 != s % 2 && (o += 1); const a = Math.round(t.x * r), l = Math.round((t.y + i) * r), c = s % 2 / 2; e.beginPath(), e.arc(a + c, l + c, o / 2, 0, 2 * Math.PI, !0), e.closePath(), e .fill(), e.beginPath(), e.arc(a + c, l + c, n / 2, 0, 2 * Math.PI, !0), e .closePath(), e.stroke() } } }, vwKG: function(e, t, i) { "use strict"; i.r(t), i.d(t, "showTooManyStudiesNotice", (function() { return n })); var s = i("YFKU"), r = i("fZEr"); function n(e) { "number" != typeof e && (e = TradingView.STUDY_COUNT_LIMIT), Object(r.showWarning)({ title: Object(s.t)("Warning"), text: Object(s.t)( "Studies limit exceeded: {number} studies per layout.\nPlease, remove some studies." ).format({ number: e }) }) } }, w4Ji: function(e, t, i) { "use strict"; function s(e) { const t = new Map; return e.plots.forEach((e, i) => { t.set(e.id, e => e[i + 1]) }), t } function r(e, t) { return null == e[t] } i.r(t), i.d(t, "studyPlotFunctionMap", (function() { return s })), i.d(t, "studyEmptyPlotValuePredicate", (function() { return r })) }, w9cH: function(e, t, i) { "use strict"; function s(e) { if (e instanceof Error) return e.stack || e.message; try { return e.outerHTML.slice(0, 1024) } catch (e) {} try { if (void 0 !== e) return JSON.stringify(e).slice(0, 1024) } catch (e) {} return String(e) } function r() { window.__tv_js_errors || (window.__tv_js_errors = []), window.addEventListener("error", e => { const t = (new Date).toISOString(); window.__tv_js_errors.push( `${t} ${e.message || "JS error"}. ${e.filename || ""}, line ${e.lineno}, col ${e.colno}.\nError: ` + s(e.error)) }, !1), window.addEventListener("unhandledrejection", e => { const t = (new Date).toISOString(); window.__tv_js_errors.push(t + " Unhandled rejection.\nReason: " + s(e.reason)) }, !1), document.addEventListener("securitypolicyviolation", e => { var t, i; const r = (new Date).toISOString(), n = "report" === e.disposition ? "CSP report-only" : "CSP violation"; window.__tv_js_errors.push( `${r} ${n}: ${e.violatedDirective || e.effectiveDirective}. ${e.sourceFile || ""}, line ${null !== (t = e.lineno) && void 0 !== t ? t : e.lineNumber}, col ${null !== (i = e.colno) && void 0 !== i ? i : e.columnNumber}.\nBlocked URI: ${e.blockedURL || e.blockedURI}\nSample: ${e.sample}\nTarget: ` + s(e.target)) }, !1) } i.r(t), i.d(t, "install", (function() { return r })) }, wGNx: function(e, t, i) { "use strict"; var s; i.r(t), i.d(t, "RiskRewardPointIndex", (function() { return s })), function(e) { e[e.Entry = 0] = "Entry", e[e.Close = 1] = "Close", e[e.ActualEntry = 2] = "ActualEntry", e[e.ActualClose = 3] = "ActualClose" }(s || (s = {})) }, wOSo: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return a })); var s = i("IWXC"), r = i("aIyQ"), n = i.n(r), o = i("e3/o"); class a { constructor() { this._quotes = null, this._quoteSessionSymbol = null, this._quoteSessionClientId = "", this._quotesUpdate = new n.a, this._quoteSymbolChanged = new n.a } setQuotesSessionSymbol(e) { this._quoteSessionSymbol !== e && (this._quoteSessionClientId || (this ._quoteSessionClientId = "series-" + Object(o.guid)()), this ._unsubscribeQuoteSession(), this._quotes = null, e && (this ._quoteSessionSymbol = e, Object(s.getQuoteSessionInstance)("full") .subscribe(this._quoteSessionClientId, this._quoteSessionSymbol, this ._onUpdate.bind(this))), this._quoteSymbolChanged.fire()) } quotesUpdate() { return this._quotesUpdate } quoteSymbolChanged() { return this._quoteSymbolChanged } quotes() { return this._quotes } destroy() { this._unsubscribeQuoteSession() } _onUpdate(e, t) { this._quotes = e && e.values || null, t && t.values && this._quotesUpdate.fire(e, t) } _unsubscribeQuoteSession() { this._quoteSessionSymbol && (Object(s.getQuoteSessionInstance)("full").unsubscribe( this._quoteSessionClientId, this._quoteSessionSymbol), this ._quoteSessionSymbol = null, this._quotes = null) } } }, wVAQ: function(e, t, i) { "use strict"; i.r(t), i.d(t, "fetch", (function() { return r })); var s = i("txPx"); Object(s.getLogger)("Fetch"); function r(e, t, i = {}) { return window.fetch(e, t) } }, wYrq: function(e, t, i) { "use strict"; var s = i("Eyy1"), r = i("aO4+"), n = i("eJTA"), o = i("Kxc7"), a = i("Hr11"), l = i("ogJP"), c = i("Tmoa"), h = i("dOnf"); function u(e, t) { const i = new Map; return function(...s) { const r = "" + (t ? t.apply(null, s) : s[0]); if (!i.has(r)) { const t = e.apply(this, s); return i.set(r, t), t } return i.get(r) } } var d = i("VdBB"), p = i("u0yd"), _ = i("Zy3/"), m = i("gyZD"), f = i("Zp8I"), g = i("k9/m"), b = i("o2pV"), v = i("vq8G"), S = i("i6cO"), y = i("Zp/P"); class w { constructor(e) { this._data = e } draw(e, t) { const i = this._data, s = t.pixelRatio, r = Math.max(1, Math.floor(s)) % 2 ? .5 : 0, n = i.vertOffset || 0, o = i.lineColor || i.color, a = i.lineWidth || i.height / 2; let c = "", h = !1; for (const t of i.items) { const i = t.x, u = t.y + n; if (Object(l.isNaN)(i) || Object(l.isNaN)(u)) continue; let d, p; null != t.style ? (d = t.style.color, p = t.style.width) : (d = o, p = a), d !== c && (c = d, h && e.fill(), e.beginPath(), e.fillStyle = d); const _ = Math.round(i * s) + r, m = Math.round(u * s) + r, f = Math.round(p * s) + r; e.moveTo(_ + f, m), e.arc(_, m, f, 0, 2 * Math.PI, !1), h = !0 } h && e.fill() } hitTest(e) { const t = this._data, i = t.lineWidth || t.height / 2, s = t.vertOffset || 0, n = Object(y.interactionTolerance)().series + i; for (const o of t.items) { if (!o) continue; if (new r.Point(o.x, o.y + s).subtract(e).length() + i <= n) return new d .HitTestResult(d.HitTestResult.REGULAR) } return null } } class P { constructor(e) { this._data = null, this._precalculatedCache = [], this.setData(e) } setData(e) { this._data = e, this._precalculatedCache = [] } draw(e, t) { if (null === this._data || 0 === this._data.items.length) return; const i = t.pixelRatio; this._precalculatedCache.length || this._fillPrecalculatedCache(i); const s = Math.max(1, Math.floor(i)), r = Math.round(this._data.histogramBase * i) - Math.floor(s / 2), n = r + s, o = this._data.lineColor; for (let t = 0; t < this._data.items.length; t++) { const a = this._data.items[t], l = this._precalculatedCache[t], c = Math.round(a.y * i), h = a.style ? a.style.color : o; let u, d; e.fillStyle = h, c <= r ? (u = c, d = n) : (u = r, d = c - Math.floor(s / 2) + s), e.fillRect(l.left, u, l.right - l.left + 1, d - u) } } hitTest(e) { if (null === this._data) return null; const t = .5 * this._data.barSpacing, i = e.x - t, s = e.x + t; for (const t of this._data.items) { const r = t.x; if (r >= i && r <= s) { const i = t.y; if (e.y >= Math.min(i, this._data.histogramBase) && e.y <= Math.max(i, this ._data.histogramBase)) return new d.HitTestResult(d.HitTestResult .REGULAR) } } return null } _fillPrecalculatedCache(e) { if (null === this._data || 0 === this._data.items.length) return void(this ._precalculatedCache = []); const t = Math.ceil(this._data.barSpacing * e) <= 1 ? 0 : Math.max(1, Math.floor( e)), i = Math.round(this._data.barSpacing * e) - t; this._precalculatedCache = new Array(this._data.items.length); for (let t = 0; t < this._data.items.length; t++) { const s = this._data.items[t], r = Math.round(s.x * e); let n, o; if (i % 2) { const e = (i - 1) / 2; n = r - e, o = r + e } else { const e = i / 2; n = r - e, o = r + e - 1 } this._precalculatedCache[t] = { left: n, right: o, roundedCenter: r, center: s.x * e, time: s.timePointIndex } } for (let e = 1; e < this._data.items.length; e++) { const i = this._precalculatedCache[e], s = this._precalculatedCache[e - 1]; i.time === s.time + 1 && (i.left - s.right !== t + 1 && (s.roundedCenter > s .center ? s.right = i.left - t - 1 : i.left = s.right + t + 1)) } let s = Math.ceil(this._data.barSpacing * e); for (let e = 0; e < this._data.items.length; e++) { const t = this._precalculatedCache[e]; t.right < t.left && (t.right = t.left); const i = t.right - t.left + 1; s = Math.min(i, s) } if (t > 0 && s < 4) for (let e = 0; e < this._data.items.length; e++) { const t = this._precalculatedCache[e]; t.right - t.left + 1 > s && (t.roundedCenter > t.center ? t.right -= 1 : t .left += 1) } } } var C = i("GEp6"); class x { constructor(e) { this._data = e } draw(e, t) { var i, s, r, n; const o = t.pixelRatio; let a = "", c = !1; for (const t of this._data.items) { if (Object(l.isNaN)(t.x) || Object(l.isNaN)(t.y)) continue; const h = null !== (s = null === (i = t.style) || void 0 === i ? void 0 : i .color) && void 0 !== s ? s : this._data.lineColor, u = Math.max(1, Math.floor((null !== (n = null === (r = t.style) || void 0 === r ? void 0 : r.width) && void 0 !== n ? n : this ._data.lineWidth) * o)); h !== a && (a = h, c && e.fill(), e.beginPath(), e.fillStyle = h); let d = 3 * u; d % 2 != u % 2 && (d += 1); const p = Math.round(Math.round(t.x * o) - d / 2), _ = Math.round(Math.round(t.y * o) - d / 2), m = p + Math.floor(d / 2 - u / 2), f = _ + Math.floor(d / 2 - u / 2); e.rect(p, f, d, u), e.rect(m, _, u, d), c = !0 } c && e.fill() } hitTest(e) { const t = Object(y.interactionTolerance)().series + this._data.lineWidth / 2; let i, s, n, o; for (let a = 1; a < this._data.items.length; ++a) { i = this._data.items[a - 1], s = this._data.items[a], n = i.x, o = s.x; if (Object(C.distanceToSegment)(new r.Point(n, i.y), new r.Point(o, s.y), new r .Point(e.x, e.y)).distance <= t) return new d.HitTestResult(d .HitTestResult.REGULAR) } return null } } class T { constructor(e) { this._data = e } draw(e, t) { if (0 === this._data.items.length) return; const i = t.pixelRatio; e.fillStyle = this._data.lineColor; const s = Math.max(1, Math.floor(this._data.lineWidth * i)), r = s / 2, n = Math.max(1, Math.floor(i)), o = Math.round(this._data.histogramBase * i) - Math.floor(n / 2), a = o + n; for (const t of this._data.items) { let l = s, c = r; t.style ? (e.fillStyle = t.style.color, l = Math.max(1, Math.floor(t.style .width * i)), c = l / 2) : e.fillStyle = this._data.lineColor; const h = l % 2 ? .5 : 0, u = Math.round(t.x * i) + h, d = Math.round(t.y * i); let p, _; d <= o ? (p = d, _ = a) : (p = o, _ = d - Math.floor(n / 2) + n), e.fillRect( Math.floor(u - c), p, l, _ - p) } } hitTest(e) { const t = Object(y.interactionTolerance)().series + this._data.lineWidth / 2, i = new Map; for (const n of this._data.items) { const o = n.x, a = n.y; let l = t; n.style && (i.has(n.style.width) ? l = Object(s.ensureDefined)(i.get(n.style .width)) : i.set(this._data.lineWidth, l)); if (Object(C.distanceToSegment)(new r.Point(o, a), new r.Point(o, this._data .histogramBase), new r.Point(e.x, e.y)).distance <= l) return new d .HitTestResult(d.HitTestResult.REGULAR) } return null } } var I = i("23IT"), M = i("UAFa"); i.d(t, "a", (function() { return A })); const O = e => { const t = Object(n.rgbToHsl)(Object(n.parseRgb)(e)), i = t[0] + .05; return t[0] = i - Math.floor(i), Object(n.rgbToHexString)(Object(n.hslToRgb)(t)) }, L = u(O); class A { constructor(e, t, i, s) { this._histogramBase = null, this._items = [], this._selectionData = null, this ._lineColor = "", this._lineWidth = 1, this._color1 = "", this._color2 = "", this._invalidated = !1, this._isMarkersEnabled = o.enabled( "source_selection_markers"), this._study = e, this._series = t, this ._model = i, this._plotName = s, this._plotIndex = e.metaInfo().plots.findIndex( e => e.id === s), this._colorProvider = Object(M .createStudyPlotColorProvider)(e.metaInfo(), e.properties(), s), this ._selectionIndexer = new b.SelectionIndexes(i.timeScale()) } items() { return this._items } update() { this._invalidated = !0 } renderer() { const e = this._study.properties().styles[this._plotName]; if (!e.visible.value()) return null; if (!this._study.priceScale()) return null; this._invalidated && (this._updateImpl(), this._invalidated = !1); const t = {}; t.barSpacing = this._model.timeScale().barSpacing(), t.items = this._items, t.histogramBase = this._histogramBase ? this._histogramBase : Object(s .ensureNotNull)(this._study.priceScale()).height(), t.lineIndex = 0, t .lineStyle = e.linestyle.value(), t.lineColor = this._lineColor, t.lineWidth = this._lineWidth, t.lineWidth = Object(l.isNumber)(t.lineWidth) ? t.lineWidth : 1, t.color1 = this._color1, t.color2 = this._color2, t.bottom = t.histogramBase, t.simpleMode = this._colorProvider.singleColor(); const i = new _.CompositeRenderer, r = !!e.joinPoints && e.joinPoints.value(); switch (e.plottype.value()) { case I.LineStudyPlotStyle.Line: case I.LineStudyPlotStyle.LineWithBreaks: i.append(new m.PaneRendererLine(t)); break; case I.LineStudyPlotStyle.Area: case I.LineStudyPlotStyle.AreaWithBreaks: i.append(new p.PaneRendererArea(t)); break; case I.LineStudyPlotStyle.Histogram: i.append(new T(t)); break; case I.LineStudyPlotStyle.Columns: i.append(new P(t)); break; case I.LineStudyPlotStyle.Cross: if (i.append(new x(t)), r) { const e = Object(h.deepCopy)(t); e.lineWidth = 1, e.forceLineWidth = !0, i.append(new m.PaneRendererLine( e)) } break; case I.LineStudyPlotStyle.Circles: if (i.append(new w(t)), r) { const e = Object(h.deepCopy)(t); e.lineWidth = 1, e.ignorePaletteLineWidth = !0, i.append(new m .PaneRendererLine(e)) } break; case I.LineStudyPlotStyle.StepLine: case I.LineStudyPlotStyle.StepLineWithDiamonds: { t.decoration = e.plottype.value() === I.LineStudyPlotStyle .StepLineWithDiamonds ? f.StepLineDecoration.Diamonds : f .StepLineDecoration.None; const s = new f.PaneRendererStepLine; s.setData(t), i.append(s); break } default: i.append(new m.PaneRendererLine(t)) } return this._model.selection().isSelected(this._study) && this._isMarkersEnabled && this._selectionData && i.append(new v.SelectionRenderer(this._selectionData)), i } _getTranspValue() { const e = this._study.properties(), t = e.styles[this._plotName]; let i = 0; const s = this._study.metaInfo(); return "Volume@tv-basicstudies" === s.id && s.version <= 46 && "transparency" in e ? (i = e.transparency.value(), i = Object(l.isNumber)(i) ? i : 0, i) : (t .transparency && (i = t.transparency.value(), i = Object(l.isNumber)(i) ? i : 0), i) } _updateImpl() { var e, t, i, n, o; this._histogramBase = null, this._items = []; const l = this._study.priceScale(); if (this._model.timeScale().isEmpty() || null === l || l.isEmpty()) return; const h = this._model.timeScale().visibleBarsStrictRange(); if (null === h) return; let u = null !== (e = this._series.nearestIndex(h.firstBar() - 1, g .PlotRowSearchMode.NearestLeft)) && void 0 !== e ? e : this._series.bars() .firstIndex(), p = null !== (t = this._series.nearestIndex(h.lastBar() + 1, g.PlotRowSearchMode .NearestRight)) && void 0 !== t ? t : this._series.bars().lastIndex(); if (null === u || null === p) return; const _ = this._study.offset(this._plotName); _ > 0 ? (u -= _, p += _) : (u += _, p -= _); const m = this._study.getMinFirstBarIndexForPlot(this._plotName); if (m > p) return; u = Math.max(m, u); const f = this._study.properties().styles[this._plotName], b = f.plottype.value(), v = [I.LineStudyPlotStyle.Line, I.LineStudyPlotStyle.Area, I.LineStudyPlotStyle .Circles, I.LineStudyPlotStyle.Cross ].indexOf(b) >= 0, y = this._study.data(), w = this._study.firstValue(); if (null === w) return; const P = y.rangeIterator(u, p), C = this._study.priceScale(); if (null === C) return; const x = Object(a.clamp)(this._getTranspValue(), 0, 100), T = new Map, M = (e, t) => { let i = T.get(e); void 0 === i && (i = new Map, T.set(e, i)); let s = i.get(t); if (void 0 === s) { const r = !this._plotName || "vol" !== this._plotName; s = Object(c.generateColor)(e, t, r), i.set(t, s) } return s }; let A = NaN, E = NaN; const k = Object(S.createEmptyStyle)(); for (; P.hasNext();) { const e = P.next(); let t = e.index; const o = e.value; t += _, t = Math.floor(t); let a = o[this._plotIndex + 1]; const l = null == a; if (a = l ? NaN : a, v && l) { E = a; continue } const h = new r.Point(t, Object(s.ensure)(a)); h.timePointIndex = t, h.valIsNotSameAsPrev = a !== E; if (this._colorProvider.isColorDefined() && (h.style = { color: M(f.color.value(), 100), width: f.linewidth.value(), style: f.linestyle.value() }, null != a)) { const e = this._colorProvider.getPlotPointStyle(o, k), t = e.colors[S.ColorerType.Main]; void 0 !== t && (h.style.color = Object(c.isHexColor)(t) ? M(t, x) : t), h .style.width = null !== (i = e.lineWidth) && void 0 !== i ? i : h.style .width, h.style.style = null !== (n = e.lineStyle) && void 0 !== n ? n : h.style.style } v || isNaN(A) || A === t - 1 || this._items.push(new r.Point(t - 1, NaN)), A = t, E = a, this._items.push(h) } if (C.pointsArrayToCoordinates(this._items, w), this._model.timeScale() .timedValuesToCoordinates(this._items), f.histogramBase && (this ._histogramBase = C.priceToCoordinate(f.histogramBase.value(), w)), this ._model.selection().isSelected(this._study)) { const e = this._selectionIndexer.indexes(); this._selectionData = { points: [], bgColors: [], visible: !0, hittestResult: d.HitTestResult.REGULAR, barSpacing: this._model.timeScale().barSpacing() }; const t = Object(s.ensureNotNull)(this._model.paneForSource(this._study)) .height(); for (let i = 0; i < e.length; i++) { let s = e[i]; const n = this._study.data().valueAt(s); if (s += _, null === n) continue; const o = n[this._plotIndex + 1]; if (null == o) continue; const a = this._model.timeScale().indexToCoordinate(Math.floor(s)), l = C.priceToCoordinate(o, w); this._selectionData.points.push(new r.Point(a, l)), this._selectionData .bgColors.push(this._model.backgroundColorAtYPercentFromTop(l / t)) } } else this._selectionIndexer.clear(); const D = f; this._lineColor = Object(c.generateColor)(D.color.value(), x), this._lineWidth = D .linewidth.value(); let V = D.color.value(); const B = this._colorProvider.getDefaultPlotPointStyle(); B && (V = B.colors[S.ColorerType.Main], this._lineWidth = null !== (o = B .lineWidth) && void 0 !== o ? o : this._lineWidth, this._lineColor = V ? Object(c.generateColor)(V, x) : this._lineColor), this._color2 = Object(c .generateColor)(V, x); const R = this._study.metaInfo().isRGB ? O(V) : L(V); this._color1 = Object(c.generateColor)(R, x) } } }, wZIs: function(e, t, i) { "use strict"; var s = i("vTIA").PositionPLDisplay; const { getHexColorByName: r } = i("HGP3"), { generateColor: n } = i("Tmoa"); var o = i("vTIA").TradingSourcesHorizontalAlignment, a = i("dfhE"), l = i("rCHB").LineToolPitchforkStyle, c = i("Ye2/").LineToolBarsPatternMode, h = i("23IT").LineStudyPlotStyle, u = i("8OdW"), d = i("oXaB").PriceAxisLastValueMode, p = i("XXdw").StoriesTimeLineItemType, _ = i("4o++").MagnetMode, m = i("a7Ha").LineEnd, f = i("4vW/").ColorType, g = i("bKFv").StatsPosition, b = i("sDZI").sessionsPreferencesDefault, v = i("txPx").getLogger("Chart.Defaults"), S = i("zDbI").CHART_FONT_FAMILY; const y = r("color-tv-blue-500"); var w = function(e) { var t = function(e, t) { return { color: e, visible: t } }, i = function(e, t, i) { return { coeff: e, color: t, visible: i } }, r = function(e, t, i, s, r) { return { coeff: e, color: t, visible: i, linestyle: void 0 === s ? CanvasEx.LINESTYLE_SOLID : s, linewidth: void 0 === r ? 1 : r } }, v = function(e, t, i) { return { color: e, width: i, visible: t } }, w = function(e, t, i, s, r) { return { color: e, visible: t, width: i, x: s, y: r } }, P = function(e, t, i, s, r, n) { return { coeff1: e, coeff2: t, color: i, visible: s, linestyle: void 0 === r ? CanvasEx.LINESTYLE_SOLID : r, linewidth: void 0 === n ? 1 : n } }; if (void 0 === TradingView.defaultProperties) { var T; switch (window.locale) { case "ar_AE": T = "Asia/Dubai"; break; case "au": T = "Australia/Sydney"; break; case "br": T = "America/Sao_Paulo"; break; case "ca": T = "America/Toronto"; break; case "de_DE": case "it": T = "Europe/Berlin"; break; case "es": T = "Europe/Madrid"; break; case "fa_IR": T = "Asia/Tehran"; break; case "fr": case "sv_SE": T = "Europe/Paris"; break; case "he_IL": case "tr": T = "Europe/Athens"; break; case "hu_HU": case "pl": T = "Europe/Warsaw"; break; case "id": case "th_TH": case "vi_VN": T = "Asia/Bangkok"; break; case "in": T = "Asia/Kolkata"; break; case "ja": case "kr": T = "Asia/Tokyo"; break; case "ms_MY": T = "Asia/Singapore"; break; case "ru": T = "Europe/Moscow"; break; case "uk": T = "Europe/London"; break; case "zh_CN": case "zh_TW": T = "Asia/Shanghai"; break; default: T = "Etc/UTC" } TradingView.defaultProperties = { chartproperties: { timezone: T, priceScaleSelectionStrategyName: "auto", dataWindowProperties: { background: "rgba( 255, 254, 206, 0.2)", border: "rgba( 96, 96, 144, 1)", font: "Verdana", fontBold: !1, fontItalic: !1, fontSize: 10, transparency: 80, visible: !0 }, paneProperties: { backgroundType: f.Solid, background: "#ffffff", backgroundGradientStartColor: "#ffffff", backgroundGradientEndColor: "#ffffff", vertGridProperties: { color: "rgba(42, 46, 57, 0.06)", style: CanvasEx.LINESTYLE_SOLID }, horzGridProperties: { color: "rgba(42, 46, 57, 0.06)", style: CanvasEx.LINESTYLE_SOLID }, crossHairProperties: { color: "#9598A1", style: CanvasEx.LINESTYLE_DASHED, transparency: 0, width: 1 }, topMargin: 10, bottomMargin: 8, axisProperties: { autoScale: !0, autoScaleDisabled: !1, lockScale: !1, percentage: !1, percentageDisabled: !1, indexedTo100: !1, log: !1, logDisabled: !1, alignLabels: !0, isInverted: !1 }, legendProperties: { showStudyArguments: !0, showStudyTitles: !0, showStudyValues: !0, showSeriesTitle: !0, showSeriesOHLC: !0, showLegend: !0, showBarChange: !0, showBackground: !0, backgroundTransparency: 50, wrapText: !1 } }, scalesProperties: { backgroundColor: "#ffffff", lineColor: "rgba(42, 46, 57, 0.14)", textColor: "#131722", fontSize: 12, scaleSeriesOnly: !1, showSeriesLastValue: !0, seriesLastValueMode: d.LastValueAccordingToScale, showSeriesPrevCloseValue: !1, showStudyLastValue: !1, showSymbolLabels: !1, showStudyPlotLabels: !1, showBidAskLabels: !1, showPrePostMarketPriceLabel: !0, showFundamentalNameLabel: !1, showFundamentalLastValue: !1, barSpacing: u.DEFAULT_BAR_SPACING, showCurrency: !0, showUnit: !0 }, mainSeriesProperties: { style: a.STYLE_CANDLES, esdShowDividends: !0, esdShowSplits: !0, esdShowEarnings: !0, esdShowBreaks: !1, esdFlagSize: 2, showCountdown: !0, bidAsk: { visible: !1, lineStyle: CanvasEx.LINESTYLE_DOTTED, lineWidth: 1, bidLineColor: y, askLineColor: "#EF5350" }, prePostMarket: { visible: !0, lineStyle: CanvasEx.LINESTYLE_DOTTED, lineWidth: 1, preMarketColor: "#fb8c00", postMarketColor: y }, highLowAvgPrice: { highLowPriceLinesVisible: !1, highLowPriceLabelsVisible: !1, averageClosePriceLineVisible: !1, averageClosePriceLabelVisible: !1 }, showInDataWindow: !0, visible: !0, showPriceLine: !0, priceLineWidth: 1, priceLineColor: "", baseLineColor: "#B2B5BE", showPrevClosePriceLine: !1, prevClosePriceLineWidth: 1, prevClosePriceLineColor: "rgba( 85, 85, 85, 1)", minTick: "default", dividendsAdjustment: void 0, sessionId: "regular", sessVis: !1, statusViewStyle: { fontSize: 16, showExchange: !0, showInterval: !0, symbolTextSource: "description" }, candleStyle: { upColor: "#26a69a", downColor: "#ef5350", drawWick: !0, drawBorder: !0, borderColor: "#378658", borderUpColor: "#26a69a", borderDownColor: "#ef5350", wickColor: "#737375", wickUpColor: "#26a69a", wickDownColor: "#ef5350", barColorsOnPrevClose: !1, drawBody: !0 }, hollowCandleStyle: { upColor: "#26a69a", downColor: "#ef5350", drawWick: !0, drawBorder: !0, borderColor: "rgba( 55, 134, 88, 1)", borderUpColor: "#26a69a", borderDownColor: "#ef5350", wickColor: "rgba( 115, 115, 117, 1)", wickUpColor: "#26a69a", wickDownColor: "#ef5350", drawBody: !0 }, haStyle: { upColor: "#26a69a", downColor: "#ef5350", drawWick: !0, drawBorder: !0, borderColor: "rgba( 55, 134, 88, 1)", borderUpColor: "#26a69a", borderDownColor: "#ef5350", wickColor: "rgba( 115, 115, 117, 1)", wickUpColor: "#26a69a", wickDownColor: "#ef5350", showRealLastPrice: !1, barColorsOnPrevClose: !1, inputs: {}, inputInfo: {}, drawBody: !0 }, barStyle: { upColor: "#26a69a", downColor: "#ef5350", barColorsOnPrevClose: !1, dontDrawOpen: !1, thinBars: !0 }, hiloStyle: { color: y, showBorders: !0, borderColor: y, showLabels: !0, labelColor: y, fontSize: 7, drawBody: !0 }, lineStyle: { color: y, linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 2, priceSource: "close", styleType: a.STYLE_LINE_TYPE_SIMPLE }, areaStyle: { color1: n(y, 72), color2: y, linecolor: y, linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 2, priceSource: "close", transparency: 100 }, priceAxisProperties: { autoScale: !0, autoScaleDisabled: !1, lockScale: !1, percentage: !1, percentageDisabled: !1, indexedTo100: !1, log: !1, logDisabled: !1, isInverted: !1, alignLabels: !0 }, renkoStyle: { upColor: "#26a69a", downColor: "#ef5350", borderUpColor: "#26a69a", borderDownColor: "#ef5350", upColorProjection: "rgba( 169, 220, 195, 1)", downColorProjection: "rgba( 245, 166, 174, 1)", borderUpColorProjection: "rgba( 169, 220, 195, 1)", borderDownColorProjection: "rgba( 245, 166, 174, 1)", wickUpColor: "#26a69a", wickDownColor: "#ef5350", inputs: { source: "close", sources: "Close", boxSize: 3, style: "ATR", atrLength: 14, wicks: !0 }, inputInfo: { source: { name: "source" }, sources: { name: "Source" }, boxSize: { name: "Box size" }, style: { name: "Style" }, atrLength: { name: "ATR length" }, wicks: { name: "Wicks" } } }, pbStyle: { upColor: "#26a69a", downColor: "#ef5350", borderUpColor: "#26a69a", borderDownColor: "#ef5350", upColorProjection: "rgba( 169, 220, 195, 1)", downColorProjection: "rgba( 245, 166, 174, 1)", borderUpColorProjection: "rgba( 169, 220, 195, 1)", borderDownColorProjection: "rgba( 245, 166, 174, 1)", inputs: { source: "close", lb: 3 }, inputInfo: { source: { name: "Source" }, lb: { name: "Number of line" } } }, kagiStyle: { upColor: "#26a69a", downColor: "#ef5350", upColorProjection: "rgba( 169, 220, 195, 1)", downColorProjection: "rgba( 245, 166, 174, 1)", inputs: { source: "close", style: "ATR", atrLength: 14, reversalAmount: 1 }, inputInfo: { source: { name: "Source" }, style: { name: "Style" }, atrLength: { name: "ATR length" }, reversalAmount: { name: "Reversal amount" } } }, pnfStyle: { upColor: "#26a69a", downColor: "#ef5350", upColorProjection: "rgba( 169, 220, 195, 1)", downColorProjection: "rgba( 245, 166, 174, 1)", inputs: { sources: "Close", reversalAmount: 3, boxSize: 1, style: "ATR", atrLength: 14, oneStepBackBuilding: !1 }, inputInfo: { sources: { name: "Source" }, boxSize: { name: "Box size" }, reversalAmount: { name: "Reversal amount" }, style: { name: "Style" }, atrLength: { name: "ATR length" }, oneStepBackBuilding: { name: "One step back building" } } }, baselineStyle: { baselineColor: "rgba( 117, 134, 150, 1)", topFillColor1: "rgba( 38, 166, 154, 0.28)", topFillColor2: "rgba( 38, 166, 154, 0.05)", bottomFillColor1: "rgba( 239, 83, 80, 0.05)", bottomFillColor2: "rgba( 239, 83, 80, 0.28)", topLineColor: "rgba( 38, 166, 154, 1)", bottomLineColor: "rgba( 239, 83, 80, 1)", topLineWidth: 2, bottomLineWidth: 2, priceSource: "close", transparency: 50, baseLevelPercentage: 50 }, rangeStyle: { upColor: "#26a69a", downColor: "#ef5350", thinBars: !0, upColorProjection: "rgba( 169, 220, 195, 1)", downColorProjection: "rgba( 245, 166, 174, 1)", inputs: { range: 10, phantomBars: !1 }, inputInfo: { range: { name: "Range" }, phantomBars: { name: "Phantom bars" } } } }, chartEventsSourceProperties: { visible: !0, futureOnly: !0, breaks: { color: "rgba(85, 85, 85, 1)", visible: !1, style: CanvasEx.LINESTYLE_DASHED, width: 1 } }, tradingProperties: { showPositions: !0, positionPL: { visibility: !0, display: s.Money }, showOrders: !0, showExecutions: !0, horizontalAlignment: o.Left, extendLeft: !0, lineLength: 5, lineWidth: 1, lineStyle: CanvasEx.LINESTYLE_SOLID }, editorFontsList: ["Verdana", "Courier New", "Times New Roman", "Arial"], volumePaneSize: "large" }, sessions: b, drawings: { magnet: !1, magnetMode: _.WeakMagnet, stayInDrawingMode: !1, drawOnAllCharts: !0 }, linetoolorder: { extendLeft: "inherit", lineLength: "inherit", lineColor: "rgba( 255, 0, 0, 1)", lineActiveBuyColor: "rgb(64,148,232)", lineInactiveBuyColor: "rgba(64,148,232,.5)", lineActiveSellColor: "rgb(231,86,86)", lineInactiveSellColor: "rgba(231,86,86,.5)", lineStyle: "inherit", lineWidth: "inherit", bodyBorderActiveBuyColor: "rgb(64,148,232)", bodyBorderInactiveBuyColor: "rgba(64,148,232,.5)", bodyBorderActiveSellColor: "rgb(231,86,86)", bodyBorderInactiveSellColor: "rgba(231,86,86,.5)", bodyBackgroundColor: "rgba( 255, 255, 255, 0.75)", bodyBackgroundTransparency: 25, bodyTextInactiveLimitColor: "rgba(38,140,2,.5)", bodyTextActiveLimitColor: "rgb(38,140,2)", bodyTextInactiveStopColor: "rgba(231,86,86,.5)", bodyTextActiveStopColor: "rgb(231,86,86)", bodyTextInactiveBuyColor: "rgba(64,148,232,.5)", bodyTextActiveBuyColor: "rgb(64,148,232)", bodyTextInactiveSellColor: "rgba(231,86,86,.5)", bodyTextActiveSellColor: "rgb(231,86,86)", bodyFontFamily: "Verdana", bodyFontSize: 9, bodyFontBold: !0, bodyFontItalic: !1, quantityBorderActiveBuyColor: "rgb(64,148,232)", quantityBorderInactiveBuyColor: "rgba(64,148,232,.5)", quantityBorderActiveSellColor: "rgb(231,86,86)", quantityBorderInactiveSellColor: "rgba(231,86,86,.5)", quantityBackgroundInactiveBuyColor: "rgba(64,148,232,.5)", quantityBackgroundActiveBuyColor: "rgb(64,148,232)", quantityBackgroundInactiveSellColor: "rgba(231,86,86,.5)", quantityBackgroundActiveSellColor: "rgb(231,86,86)", quantityTextColor: "rgba( 255, 255, 255, 1)", quantityTextTransparency: 0, quantityFontFamily: "Verdana", quantityFontSize: 9, quantityFontBold: !0, quantityFontItalic: !1, cancelButtonBorderActiveBuyColor: "rgb(64,148,232)", cancelButtonBorderInactiveBuyColor: "rgba(64,148,232,.5)", cancelButtonBorderActiveSellColor: "rgb(231,86,86)", cancelButtonBorderInactiveSellColor: "rgba(231,86,86,.5)", cancelButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)", cancelButtonBackgroundTransparency: 25, cancelButtonIconActiveBuyColor: "rgb(64,148,232)", cancelButtonIconInactiveBuyColor: "rgba(64,148,232,.5)", cancelButtonIconActiveSellColor: "rgb(231,86,86)", cancelButtonIconInactiveSellColor: "rgba(231,86,86,.5)", tooltip: "", modifyTooltip: "", cancelTooltip: "" }, linetoolposition: { extendLeft: "inherit", lineLength: "inherit", lineBuyColor: "rgb(64,148,232)", lineSellColor: "rgb(231,86,86)", lineStyle: "inherit", lineWidth: "inherit", bodyBorderBuyColor: "rgb(64,148,232)", bodyBorderSellColor: "rgb(231,86,86)", bodyBackgroundColor: "rgba( 255, 255, 255, 0.75)", bodyBackgroundTransparency: 25, bodyTextPositiveColor: "rgb(38,140,2)", bodyTextNeutralColor: "rgb(100,100,100)", bodyTextNegativeColor: "rgb(231,86,86)", bodyFontFamily: "Verdana", bodyFontSize: 9, bodyFontBold: !0, bodyFontItalic: !1, quantityBorderBuyColor: "rgb(64,148,232)", quantityBorderSellColor: "rgb(231,86,86)", quantityBackgroundBuyColor: "rgb(64,148,232)", quantityBackgroundSellColor: "rgb(231,86,86)", quantityTextColor: "rgba( 255, 255, 255, 1)", quantityTextTransparency: 0, quantityFontFamily: "Verdana", quantityFontSize: 9, quantityFontBold: !0, quantityFontItalic: !1, reverseButtonBorderBuyColor: "rgb(64,148,232)", reverseButtonBorderSellColor: "rgb(231,86,86)", reverseButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)", reverseButtonBackgroundTransparency: 25, reverseButtonIconBuyColor: "rgb(64,148,232)", reverseButtonIconSellColor: "rgb(231,86,86)", closeButtonBorderBuyColor: "rgb(64,148,232)", closeButtonBorderSellColor: "rgb(231,86,86)", closeButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)", closeButtonBackgroundTransparency: 25, closeButtonIconBuyColor: "rgb(64,148,232)", closeButtonIconSellColor: "rgb(231,86,86)", tooltip: "", protectTooltip: "", closeTooltip: "", reverseTooltip: "" }, linetoolexecution: { direction: "buy", arrowHeight: 8, arrowSpacing: 1, arrowBuyColor: "#4094e8", arrowSellColor: "#e75656", text: "", textColor: "rgba( 0, 0, 0, 1)", textTransparency: 0, fontFamily: "Verdana", fontSize: 10, fontBold: !1, fontItalic: !1, tooltip: "" }, linetoolicon: { color: y, size: 40, icon: 61720, angle: .5 * Math.PI, scale: 1 }, linetoolimage: { transparency: 0, cssWidth: 0, cssHeight: 0, angle: 0 }, linetoolbezierquadro: { linecolor: y, linewidth: 1, fillBackground: !1, backgroundColor: n(y, 80), transparency: 50, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Normal }, linetoolbeziercubic: { linecolor: "#00bcd4", linewidth: 1, fillBackground: !1, backgroundColor: "rgba(0, 188, 212, 0.2)", transparency: 50, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Normal }, linetooltrendline: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Normal, showLabel: !1, horzLabelsAlign: "center", vertLabelsAlign: "bottom", font: "Verdana", textcolor: y, fontsize: 14, bold: !1, italic: !1, alwaysShowStats: !1, showMiddlePoint: !1, showPriceRange: !1, showBarsRange: !1, showDateTimeRange: !1, showDistance: !1, showAngle: !1, statsPosition: g.Right }, linetoolinfoline: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Normal, font: "Verdana", showLabel: !1, horzLabelsAlign: "center", vertLabelsAlign: "bottom", textcolor: y, fontsize: 14, bold: !1, italic: !1, alwaysShowStats: !0, showMiddlePoint: !1, showPriceRange: !0, showBarsRange: !0, showDateTimeRange: !0, showDistance: !0, showAngle: !0, statsPosition: g.Center }, linetooltimecycles: { linecolor: "rgba(21, 153, 128, 1)", linewidth: 1, fillBackground: !0, backgroundColor: "rgba(106, 168, 79, 0.5)", transparency: 50, linestyle: CanvasEx.LINESTYLE_SOLID }, linetoolsineline: { linecolor: "rgba( 21, 153, 128, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, linetooltrendangle: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, font: "Verdana", textcolor: y, fontsize: 12, bold: !1, italic: !1, alwaysShowStats: !1, showMiddlePoint: !1, showPriceRange: !1, showBarsRange: !1, extendRight: !1, extendLeft: !1, statsPosition: g.Right }, linetooldisjointangle: { linecolor: "rgba(0, 150, 136, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, fillBackground: !0, backgroundColor: "rgba(0, 150, 136, 0.2)", transparency: 20, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Normal, font: "Verdana", textcolor: "rgba(0, 150, 136, 1)", fontsize: 12, bold: !1, italic: !1, showPrices: !1, showPriceRange: !1, showDateTimeRange: !1, showBarsRange: !1 }, linetoolflatbottom: { linecolor: "rgba(171, 71, 188, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, fillBackground: !0, backgroundColor: "rgba(171, 71, 188, 0.2)", transparency: 20, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Normal, font: "Verdana", textcolor: "rgba(171, 71, 188, 1)", fontsize: 12, bold: !1, italic: !1, showPrices: !1, showPriceRange: !1, showDateTimeRange: !1, showBarsRange: !1 }, linetoolfibspiral: { counterclockwise: !1, linecolor: "rgba(0, 150, 136, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, linetooldaterange: { linecolor: y, linewidth: 1, font: S, textcolor: "rgba( 255, 255, 255, 1)", fontsize: 12, fillLabelBackground: !0, labelBackgroundColor: n(y, 10), fillBackground: !0, backgroundColor: n(y, 80), backgroundTransparency: 60, drawBorder: !1, borderColor: n(y, 10), extendTop: !1, extendBottom: !1 }, linetoolpricerange: { linecolor: y, linewidth: 1, font: S, textcolor: "rgba( 255, 255, 255, 1)", fontsize: 12, fillLabelBackground: !0, labelBackgroundColor: n(y, 10), fillBackground: !0, backgroundColor: n(y, 80), backgroundTransparency: 60, drawBorder: !1, borderColor: n(y, 10), extendLeft: !1, extendRight: !1 }, linetooldateandpricerange: { linecolor: y, linewidth: 1, font: S, textcolor: "rgba( 255, 255, 255, 1)", fontsize: 12, fillLabelBackground: !0, labelBackgroundColor: n(y, 10), fillBackground: !0, backgroundColor: n(y, 80), backgroundTransparency: 60, borderWidth: 1, drawBorder: !1, borderColor: y }, linetoolriskrewardshort: { linecolor: "rgba(120, 123, 134, 1)", linewidth: 1, font: "Verdana", textcolor: "rgba(255, 255, 255, 1)", fontsize: 12, fillLabelBackground: !0, labelBackgroundColor: "rgba( 88, 88, 88, 1)", fillBackground: !0, stopBackground: "rgba(244, 67, 54, 0.2)", profitBackground: "rgba(0, 150, 136, 0.2)", stopBackgroundTransparency: 80, profitBackgroundTransparency: 80, drawBorder: !1, borderColor: "rgba( 102, 123, 139, 1)", compact: !1, riskDisplayMode: "percents", accountSize: 1e3, lotSize: 1, risk: 25, alwaysShowStats: !1, showPriceLabels: !0 }, linetoolriskrewardlong: { linecolor: "rgba(120, 123, 134, 1)", linewidth: 1, font: "Verdana", textcolor: "rgba(255, 255, 255, 1)", fontsize: 12, fillLabelBackground: !0, labelBackgroundColor: "rgba( 88, 88, 88, 1)", fillBackground: !0, stopBackground: "rgba(244, 67, 54, 0.2)", profitBackground: "rgba(0, 150, 136, 0.2)", stopBackgroundTransparency: 80, profitBackgroundTransparency: 80, drawBorder: !1, borderColor: "rgba( 102, 123, 139, 1)", compact: !1, riskDisplayMode: "percents", accountSize: 1e3, lotSize: 1, risk: 25, alwaysShowStats: !1, showPriceLabels: !0 }, linetoolarrow: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !1, leftEnd: m.Normal, rightEnd: m.Arrow, font: "Verdana", showLabel: !1, horzLabelsAlign: "center", vertLabelsAlign: "bottom", textcolor: y, fontsize: 14, bold: !1, italic: !1, alwaysShowStats: !1, showMiddlePoint: !1, showPriceRange: !1, showBarsRange: !1, showDateTimeRange: !1, showDistance: !1, showAngle: !1, statsPosition: g.Right }, linetoolray: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !0, leftEnd: m.Normal, rightEnd: m.Normal, font: "Verdana", showLabel: !1, horzLabelsAlign: "center", vertLabelsAlign: "bottom", textcolor: y, fontsize: 14, bold: !1, italic: !1, alwaysShowStats: !1, showMiddlePoint: !1, showPriceRange: !1, showBarsRange: !1, showDateTimeRange: !1, showDistance: !1, showAngle: !1, statsPosition: g.Right }, linetoolextended: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !0, extendRight: !0, leftEnd: m.Normal, rightEnd: m.Normal, font: "Verdana", showLabel: !1, horzLabelsAlign: "center", vertLabelsAlign: "bottom", textcolor: y, fontsize: 14, bold: !1, italic: !1, alwaysShowStats: !1, showMiddlePoint: !1, showPriceRange: !1, showBarsRange: !1, showDateTimeRange: !1, showDistance: !1, showAngle: !1, statsPosition: g.Right }, linetoolhorzline: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, showPrice: !0, showLabel: !1, font: "Verdana", textcolor: y, fontsize: 12, bold: !1, italic: !1, horzLabelsAlign: "center", vertLabelsAlign: "top" }, linetoolhorzray: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, showPrice: !0, showLabel: !1, font: "Verdana", textcolor: y, fontsize: 12, bold: !1, italic: !1, horzLabelsAlign: "center", vertLabelsAlign: "top" }, linetoolvertline: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLine: !0, showTime: !0, showLabel: !1, horzLabelsAlign: "right", vertLabelsAlign: "top", font: "Verdana", textcolor: y, textOrientation: "vertical", fontsize: 14, bold: !1, italic: !1 }, linetoolcrossline: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, showPrice: !0, showTime: !0 }, linetoolcirclelines: { trendline: { visible: !0, color: "rgba( 128, 128, 128, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, linecolor: "rgba( 128, 204, 219, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, linetoolfibtimezone: { horzLabelsAlign: "right", vertLabelsAlign: "bottom", baselinecolor: "rgba( 128, 128, 128, 1)", linecolor: "rgba( 0, 85, 219, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, showLabels: !0, font: S, fillBackground: !1, transparency: 80, trendline: { visible: !0, color: "rgba( 128, 128, 128, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, level1: r(0, "rgba(120, 123, 134, 1)", !0), level2: r(1, y, !0), level3: r(2, y, !0), level4: r(3, y, !0), level5: r(5, y, !0), level6: r(8, y, !0), level7: r(13, y, !0), level8: r(21, y, !0), level9: r(34, y, !0), level10: r(55, y, !0), level11: r(89, y, !0) }, linetooltext: { color: y, font: "Verdana", fontsize: 14, fillBackground: !1, backgroundColor: "rgba( 91, 133, 191, 0.3)", backgroundTransparency: 70, drawBorder: !1, borderColor: "rgba( 102, 123, 139, 1)", bold: !1, italic: !1, fixedSize: !0, wordWrap: !1, wordWrapWidth: 200 }, linetooltextabsolute: { color: y, font: "Verdana", fontsize: 14, fillBackground: !1, backgroundColor: "rgba( 155, 190, 213, 0.3)", backgroundTransparency: 70, drawBorder: !1, borderColor: "rgba( 102, 123, 139, 1)", bold: !1, italic: !1, fixedSize: !1, wordWrap: !1, wordWrapWidth: 200 }, linetoolballoon: { color: "#ffffff", backgroundColor: "rgba(156, 39, 176, 0.7)", borderColor: "rgba(156, 39, 176, 0.0)", fontsize: 14, transparency: 30 }, linetoolbrush: { linecolor: "#00bcd4", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, smooth: 5, fillBackground: !1, backgroundColor: "rgba(0, 188, 212, 0.5)", transparency: 50, leftEnd: m.Normal, rightEnd: m.Normal }, linetoolhighlighter: { linecolor: "rgba(236, 64, 122, 0.15)", smooth: 5, transparency: 85 }, linetoolpolyline: { linecolor: "#7e57c2", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, fillBackground: !0, backgroundColor: "rgba(126, 87, 194, 0.2)", transparency: 50, filled: !1 }, linetoolsignpost: { itemType: p.Emoji, emoji: "🙂", showImage: !1, plateColor: y, fontSize: 12, bold: !1, italic: !1 }, linetoolpath: { lineColor: y, lineWidth: 2, lineStyle: CanvasEx.LINESTYLE_SOLID, leftEnd: m.Normal, rightEnd: m.Arrow }, linetoolarrowmarkleft: { color: y, arrowColor: y, fontsize: 14, font: S, bold: !1, italic: !1, showLabel: !0 }, linetoolarrowmarkup: { color: "#009688", arrowColor: "#009688", fontsize: 14, font: S, bold: !1, italic: !1, showLabel: !0 }, linetoolarrowmarkright: { color: y, arrowColor: y, fontsize: 14, font: S, bold: !1, italic: !1, showLabel: !0 }, linetoolarrowmarkdown: { color: "#E53935", arrowColor: "#E53935", fontsize: 14, font: S, bold: !1, italic: !1, showLabel: !0 }, linetoolflagmark: { flagColor: y }, linetoolnote: { markerColor: y, textColor: "#ffffff", backgroundColor: n(y, 30), backgroundTransparency: 0, borderColor: y, font: "Verdana", fontSize: 14, bold: !1, italic: !1, fixedSize: !0 }, linetoolnoteabsolute: { markerColor: y, textColor: "#ffffff", backgroundColor: n(y, 30), backgroundTransparency: 0, borderColor: y, font: "Verdana", fontSize: 14, bold: !1, italic: !1, fixedSize: !0 }, linetoolpricelabel: { color: "#ffffff", backgroundColor: y, borderColor: y, fontWeight: "bold", fontsize: 14, font: S, transparency: 0 }, linetoolpricenote: { showLabel: !1, horzLabelsAlign: "center", vertLabelsAlign: "bottom", textColor: y, fontSize: 14, bold: !1, italic: !1, lineColor: y, priceLabelBackgroundColor: y, priceLabelBorderColor: y, priceLabelTextColor: "#ffffff", priceLabelFontSize: 12, priceLabelBold: !1, priceLabelItalic: !1 }, linetoolarrowmarker: { backgroundColor: "#1E53E5", textColor: "#1E53E5", font: S, bold: !0, italic: !1, fontsize: 16, showLabel: !0 }, linetoolrectangle: { color: "#9c27b0", fillBackground: !0, backgroundColor: "rgba(156, 39, 176, 0.2)", linewidth: 1, transparency: 50, showLabel: !1, horzLabelsAlign: "left", vertLabelsAlign: "bottom", textColor: "#9c27b0", fontSize: 14, bold: !1, italic: !1, extendLeft: !1, extendRight: !1 }, linetoolrotatedrectangle: { color: "#4caf50", fillBackground: !0, backgroundColor: "rgba(76, 175, 80, 0.2)", transparency: 50, linewidth: 1 }, linetoolellipse: { color: "#e91e63", fillBackground: !0, backgroundColor: "rgba(233, 30, 99, 0.2)", transparency: 50, linewidth: 1 }, linetoolarc: { color: "#ab47bc", fillBackground: !0, backgroundColor: "rgba(171, 71, 188, 0.2)", transparency: 50, linewidth: 1 }, linetoolprediction: { linecolor: y, linewidth: 1, sourceBackColor: y, sourceTextColor: "rgba(255, 255, 255, 1)", sourceStrokeColor: y, targetStrokeColor: y, targetBackColor: y, targetTextColor: "rgba(255, 255, 255, 1)", successBackground: "rgba(76, 175, 80, 1)", successTextColor: "rgba(255, 255, 255, 1)", failureBackground: "rgba(244, 67, 54, 1)", failureTextColor: "rgba(255, 255, 255, 1)", intermediateBackColor: "rgba(234, 210, 137, 1)", intermediateTextColor: "rgba(109, 77, 34, 1)", transparency: 10, centersColor: "rgba( 32, 32, 32, 1)" }, linetooltriangle: { color: "#f57c00", fillBackground: !0, backgroundColor: "rgba(245, 124, 0, 0.2)", transparency: 50, linewidth: 1 }, linetoolcallout: { color: "#ffffff", backgroundColor: "rgba(0, 151, 167, 0.7)", transparency: 50, linewidth: 1, fontsize: 14, font: "Verdana", bordercolor: "rgba(0, 151, 167, 1)", bold: !1, italic: !1, wordWrap: !1, wordWrapWidth: 200 }, linetoolparallelchannel: { linecolor: y, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, extendLeft: !1, extendRight: !1, fillBackground: !0, backgroundColor: n(y, 80), transparency: 20, showMidline: !0, midlinecolor: y, midlinewidth: 1, midlinestyle: CanvasEx.LINESTYLE_DASHED }, linetoolelliottimpulse: { degree: 7, showWave: !0, color: "rgba( 61, 133, 198, 1)", linewidth: 1 }, linetoolelliotttriangle: { degree: 7, showWave: !0, color: "rgba( 255, 152, 0, 1)", linewidth: 1 }, linetoolelliotttriplecombo: { degree: 7, showWave: !0, color: "rgba( 106, 168, 79, 1)", linewidth: 1 }, linetoolelliottcorrection: { degree: 7, showWave: !0, color: "rgba( 61, 133, 198, 1)", linewidth: 1 }, linetoolelliottdoublecombo: { degree: 7, showWave: !0, color: "rgba( 106, 168, 79, 1)", linewidth: 1 }, linetoolbarspattern: { color: y, mode: c.Bars, mirrored: !1, flipped: !1 }, linetoolghostfeed: { averageHL: 20, variance: 50, candleStyle: { upColor: "rgba(178, 223, 219, 1)", downColor: "rgba(239, 154, 154, 1)", drawWick: !0, drawBorder: !0, borderColor: "#378658", borderUpColor: "rgba(0, 150, 136, 1)", borderDownColor: "rgba(244, 67, 54, 1)", wickColor: "rgba(120, 123, 134, 1)" }, transparency: 50 }, study: { inputs: {}, styles: {}, palettes: {}, bands: {}, area: {}, graphics: {}, showInDataWindow: !0, visible: !0, showStudyArguments: !0, precision: "default" }, linetoolpitchfork: { fillBackground: !0, transparency: 80, style: l.Original, median: { visible: !0, color: "rgba(244, 67, 54, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, extendLines: !1, level0: r(.25, "rgba(255, 183, 77, 1)", !1), level1: r(.382, "rgba(129, 199, 132, 1)", !1), level2: r(.5, "rgba(76, 175, 80, 1)", !0), level3: r(.618, "rgba(0, 150, 136, 1)", !1), level4: r(.75, "rgba(100, 181, 246, 1)", !1), level5: r(1, y, !0), level6: r(1.5, "rgba(156, 39, 176, 1)", !1), level7: r(1.75, "rgba(233, 30, 99, 1)", !1), level8: r(2, "rgba(229, 115, 115, 1)", !1) }, linetoolpitchfan: { fillBackground: !0, transparency: 80, median: { visible: !0, color: "rgba(244, 67, 54, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, level0: r(.25, "rgba(255, 183, 77, 1)", !1), level1: r(.382, "rgba(129, 199, 132, 1)", !1), level2: r(.5, "rgba(76, 175, 80, 1)", !0), level3: r(.618, "rgba(0, 150, 136, 1)", !1), level4: r(.75, "rgba(100, 181, 246, 1)", !1), level5: r(1, y, !0), level6: r(1.5, "rgba(156, 39, 176, 1)", !1), level7: r(1.75, "rgba(233, 30, 99, 1)", !1), level8: r(2, "rgba(229, 115, 115, 1)", !1) }, linetoolgannfan: { showLabels: !0, font: "Verdana", fillBackground: !0, transparency: 80, level1: P(1, 8, "rgba(255, 183, 77, 1)", !0), level2: P(1, 4, "rgba(129, 199, 132, 1)", !0), level3: P(1, 3, "rgba(76, 175, 80, 1)", !0), level4: P(1, 2, "rgba(0, 150, 136, 1)", !0), level5: P(1, 1, "rgba(100, 181, 246, 1)", !0), level6: P(2, 1, y, !0), level7: P(3, 1, "rgba(156, 39, 176, 1)", !0), level8: P(4, 1, "rgba(233, 30, 99, 1)", !0), level9: P(8, 1, "rgba(229, 115, 115, 1)", !0) }, linetoolganncomplex: { fillBackground: !1, arcsBackground: { fillBackground: !0, transparency: 80 }, reverse: !1, scaleRatio: "", showLabels: !0, labelsStyle: { font: S, fontSize: 12, bold: !1, italic: !1 }, levels: [v("rgba(120, 123, 134, 1)", !0, 1), v("rgba(255, 152, 0, 1)", ! 0, 1), v("rgba(129, 199, 132, 1)", !0, 1), v( "rgba(76, 175, 80, 1)", !0, 1), v("rgba(0, 150, 136, 1)", ! 0, 1), v("rgba(120, 123, 134, 1)", !0, 1)], fanlines: [w("rgba(179, 157, 219, 1)", !1, 1, 8, 1), w( "rgba(244, 67, 54, 1)", !1, 1, 5, 1), w( "rgba(120, 123, 134, 1)", !1, 1, 4, 1), w( "rgba(255, 152, 0, 1)", !1, 1, 3, 1), w( "rgba(129, 199, 132, 1)", !0, 1, 2, 1), w( "rgba(76, 175, 80, 1)", !0, 1, 1, 1), w( "rgba(0, 150, 136, 1)", !0, 1, 1, 2), w( "rgba(0, 150, 136, 1)", !1, 1, 1, 3), w(y, !1, 1, 1, 4), w( "rgba(149, 117, 205, 1)", !1, 1, 1, 5), w( "rgba(179, 157, 219, 1)", !1, 1, 1, 8)], arcs: [w("rgba(255, 152, 0, 1)", !0, 1, 1, 0), w("rgba(255, 152, 0, 1)", !0, 1, 1, 1), w("rgba(255, 152, 0, 1)", !0, 1, 1.5, 0), w( "rgba(129, 199, 132, 1)", !0, 1, 2, 0), w( "rgba(129, 199, 132, 1)", !0, 1, 2, 1), w( "rgba(76, 175, 80, 1)", !0, 1, 3, 0), w( "rgba(76, 175, 80, 1)", !0, 1, 3, 1), w( "rgba(0, 150, 136, 1)", !0, 1, 4, 0), w( "rgba(0, 150, 136, 1)", !0, 1, 4, 1), w(y, !0, 1, 5, 0), w( y, !0, 1, 5, 1)] }, linetoolgannfixed: { fillBackground: !1, arcsBackground: { fillBackground: !0, transparency: 80 }, reverse: !1, levels: [v("rgba(120, 123, 134, 1)", !0, 1), v("rgba(255, 152, 0, 1)", ! 0, 1), v("rgba(129, 199, 132, 1)", !0, 1), v( "rgba(76, 175, 80, 1)", !0, 1), v("rgba(0, 150, 136, 1)", ! 0, 1), v("rgba(120, 123, 134, 1)", !0, 1)], fanlines: [w("rgba(179, 157, 219, 1)", !1, 1, 8, 1), w( "rgba(244, 67, 54, 1)", !1, 1, 5, 1), w( "rgba(120, 123, 134, 1)", !1, 1, 4, 1), w( "rgba(255, 152, 0, 1)", !1, 1, 3, 1), w( "rgba(129, 199, 132, 1)", !0, 1, 2, 1), w( "rgba(76, 175, 80, 1)", !0, 1, 1, 1), w( "rgba(0, 150, 136, 1)", !0, 1, 1, 2), w( "rgba(0, 150, 136, 1)", !1, 1, 1, 3), w(y, !1, 1, 1, 4), w( "rgba(149, 117, 205, 1)", !1, 1, 1, 5), w( "rgba(179, 157, 219, 1)", !1, 1, 1, 8)], arcs: [w("rgba(255, 152, 0, 1)", !0, 1, 1, 0), w("rgba(255, 152, 0, 1)", !0, 1, 1, 1), w("rgba(255, 152, 0, 1)", !0, 1, 1.5, 0), w( "rgba(129, 199, 132, 1)", !0, 1, 2, 0), w( "rgba(129, 199, 132, 1)", !0, 1, 2, 1), w( "rgba(76, 175, 80, 1)", !0, 1, 3, 0), w( "rgba(76, 175, 80, 1)", !0, 1, 3, 1), w( "rgba(0, 150, 136, 1)", !0, 1, 4, 0), w( "rgba(0, 150, 136, 1)", !0, 1, 4, 1), w(y, !0, 1, 5, 0), w( y, !0, 1, 5, 1)] }, linetoolgannsquare: { color: "rgba( 21, 56, 153, 0.8)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, font: S, showTopLabels: !0, showBottomLabels: !0, showLeftLabels: !0, showRightLabels: !0, fillHorzBackground: !0, horzTransparency: 80, fillVertBackground: !0, vertTransparency: 80, reverse: !1, fans: t("rgba(149, 152, 161, 1)", !1), hlevel1: i(0, "rgba(120, 123, 134, 1)", !0), hlevel2: i(.25, "rgba(245, 124, 0, 1)", !0), hlevel3: i(.382, "rgba(129, 199, 132, 1)", !0), hlevel4: i(.5, "rgba(76, 175, 80, 1)", !0), hlevel5: i(.618, "rgba(0, 150, 136, 1)", !0), hlevel6: i(.75, y, !0), hlevel7: i(1, "rgba(120, 123, 134, 1)", !0), vlevel1: i(0, "rgba(120, 123, 134, 1)", !0), vlevel2: i(.25, "rgba(245, 124, 0, 1)", !0), vlevel3: i(.382, "rgba(129, 199, 132, 1)", !0), vlevel4: i(.5, "rgba(76, 175, 80, 1)", !0), vlevel5: i(.618, "rgba(0, 150, 136, 1)", !0), vlevel6: i(.75, y, !0), vlevel7: i(1, "rgba(120, 123, 134, 1)", !0) }, linetoolfibspeedresistancefan: { fillBackground: !0, transparency: 80, grid: { color: "rgba( 21, 56, 153, 0.8)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, visible: !0 }, linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, font: S, showTopLabels: !0, showBottomLabels: !0, showLeftLabels: !0, showRightLabels: !0, reverse: !1, hlevel1: i(0, "rgba(120, 123, 134, 1)", !0), hlevel2: i(.25, "rgba(245, 124, 0, 1)", !0), hlevel3: i(.382, "rgba(129, 199, 132, 1)", !0), hlevel4: i(.5, "rgba(76, 175, 80, 1)", !0), hlevel5: i(.618, "rgba(0, 150, 136, 1)", !0), hlevel6: i(.75, y, !0), hlevel7: i(1, "rgba(120, 123, 134, 1)", !0), vlevel1: i(0, "rgba(120, 123, 134, 1)", !0), vlevel2: i(.25, "rgba(245, 124, 0, 1)", !0), vlevel3: i(.382, "rgba(129, 199, 132, 1)", !0), vlevel4: i(.5, "rgba(76, 175, 80, 1)", !0), vlevel5: i(.618, "rgba(0, 150, 136, 1)", !0), vlevel6: i(.75, y, !0), vlevel7: i(1, "rgba(120, 123, 134, 1)", !0) }, linetoolfibretracement: { showCoeffs: !0, showPrices: !0, font: S, fillBackground: !0, transparency: 80, extendLines: !1, extendLinesLeft: !1, horzLabelsAlign: "left", vertLabelsAlign: "bottom", reverse: !1, coeffsAsPercents: !1, fibLevelsBasedOnLogScale: !1, trendline: { visible: !0, color: "rgba(120, 123, 134, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, levelsStyle: { linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, level1: i(0, "rgba(120, 123, 134, 1)", !0), level2: i(.236, "rgba(244, 67, 54, 1)", !0), level3: i(.382, "rgba(129, 199, 132, 1)", !0), level4: i(.5, "rgba(76, 175, 80, 1)", !0), level5: i(.618, "rgba(0, 150, 136, 1)", !0), level6: i(.786, "rgba(100, 181, 246, 1)", !0), level7: i(1, "rgba(120, 123, 134, 1)", !0), level8: i(1.618, y, !0), level9: i(2.618, "rgba(244, 67, 54, 1)", !0), level10: i(3.618, "rgba(156, 39, 176, 1)", !0), level11: i(4.236, "rgba(233, 30, 99, 1)", !0), level12: i(1.272, "rgba(129, 199, 132, 1)", !1), level13: i(1.414, "rgba(244, 67, 54, 1)", !1), level16: i(2, "rgba(0, 150, 136, 1)", !1), level14: i(2.272, "rgba(129, 199, 132, 1)", !1), level15: i(2.414, "rgba(76, 175, 80, 1)", !1), level17: i(3, "rgba(100, 181, 246, 1)", !1), level18: i(3.272, "rgba(120, 123, 134, 1)", !1), level19: i(3.414, y, !1), level20: i(4, "rgba( 204, 40, 40, 1)", !1), level21: i(4.272, "rgba(156, 39, 176, 1)", !1), level22: i(4.414, "rgba(233, 30, 99, 1)", !1), level23: i(4.618, "rgba(129, 199, 132, 1)", !1), level24: i(4.764, "rgba(0, 150, 136, 1)", !1) }, linetoolfibchannel: { showCoeffs: !0, showPrices: !0, font: S, fillBackground: !0, transparency: 80, extendLeft: !1, extendRight: !1, horzLabelsAlign: "left", vertLabelsAlign: "middle", coeffsAsPercents: !1, levelsStyle: { linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, level1: i(0, "rgba(120, 123, 134, 1)", !0), level2: i(.236, "rgba(244, 67, 54, 1)", !0), level3: i(.382, "rgba(129, 199, 132, 1)", !0), level4: i(.5, "rgba(76, 175, 80, 1)", !0), level5: i(.618, "rgba(0, 150, 136, 1)", !0), level6: i(.786, "rgba(100, 181, 246, 1)", !0), level7: i(1, "rgba(120, 123, 134, 1)", !0), level8: i(1.618, y, !0), level9: i(2.618, "rgba(244, 67, 54, 1)", !0), level10: i(3.618, "rgba(156, 39, 176, 1)", !0), level11: i(4.236, "rgba(233, 30, 99, 1)", !0), level12: i(1.272, "rgba(129, 199, 132, 1)", !1), level13: i(1.414, "rgba(244, 67, 54, 1)", !1), level16: i(2, "rgba(0, 150, 136, 1)", !1), level14: i(2.272, "rgba(129, 199, 132, 1)", !1), level15: i(2.414, "rgba(76, 175, 80, 1)", !1), level17: i(3, "rgba(100, 181, 246, 1)", !1), level18: i(3.272, "rgba(120, 123, 134, 1)", !1), level19: i(3.414, y, !1), level20: i(4, "rgba( 204, 40, 40, 1)", !1), level21: i(4.272, "rgba(156, 39, 176, 1)", !1), level22: i(4.414, "rgba(233, 30, 99, 1)", !1), level23: i(4.618, "rgba(129, 199, 132, 1)", !1), level24: i(4.764, "rgba(0, 150, 136, 1)", !1) }, linetoolprojection: { showCoeffs: !0, font: "Verdana", fillBackground: !0, transparency: 80, color1: n(y, 80), color2: "rgba(156, 39, 176, 0.2)", linewidth: 1, trendline: { visible: !0, color: "rgba(149, 152, 161, 1)", linestyle: CanvasEx.LINESTYLE_SOLID }, level1: r(1, "rgba( 128, 128, 128, 1)", !0) }, linetool5pointspattern: { color: y, textcolor: "rgba( 255, 255, 255, 1)", fillBackground: !0, backgroundColor: y, font: "Verdana", fontsize: 12, bold: !1, italic: !1, transparency: 85, linewidth: 1 }, linetoolcypherpattern: { color: y, textcolor: "#FFFFFF", fillBackground: !0, backgroundColor: y, font: "Verdana", fontsize: 12, bold: !1, italic: !1, transparency: 85, linewidth: 1 }, linetooltrianglepattern: { color: "#673AB7", textcolor: "#FFFFFF", fillBackground: !0, backgroundColor: "#673AB7", font: "Verdana", fontsize: 12, bold: !1, italic: !1, transparency: 85, linewidth: 1 }, linetoolabcd: { color: "#009688", textcolor: "rgba( 255, 255, 255, 1)", font: "Verdana", fontsize: 12, bold: !1, italic: !1, linewidth: 1 }, linetoolthreedrivers: { color: "#673AB7", textcolor: "rgba( 255, 255, 255, 1)", fillBackground: !0, backgroundColor: "rgba( 149, 40, 204, 0.5)", font: "Verdana", fontsize: 12, bold: !1, italic: !1, transparency: 50, linewidth: 1 }, linetoolheadandshoulders: { color: "#009688", textcolor: "rgba( 255, 255, 255, 1)", fillBackground: !0, backgroundColor: "#009688", font: "Verdana", fontsize: 12, bold: !1, italic: !1, transparency: 85, linewidth: 1 }, linetoolfibwedge: { showCoeffs: !0, font: S, fillBackground: !0, transparency: 80, trendline: { visible: !0, color: "rgba( 128, 128, 128, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, level1: r(.236, "rgba(244, 67, 54, 1)", !0), level2: r(.382, "rgba(129, 199, 132, 1)", !0), level3: r(.5, "rgba(76, 175, 80, 1)", !0), level4: r(.618, "rgba(0, 150, 136, 1)", !0), level5: r(.786, "rgba(100, 181, 246, 1)", !0), level6: r(1, "rgba(120, 123, 134, 1)", !0), level7: r(1.618, y, !1), level8: r(2.618, "rgba(244, 67, 54, 1)", !1), level9: r(3.618, "rgba(103, 58, 183, 1)", !1), level10: r(4.236, "rgba(233, 30, 99, 1)", !1), level11: r(4.618, "rgba(233, 30, 99, 1)", !1) }, linetoolfibcircles: { showCoeffs: !0, font: S, fillBackground: !0, transparency: 80, coeffsAsPercents: !1, trendline: { visible: !0, color: "rgba(120, 123, 134, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, level1: r(.236, "rgba(244, 67, 54, 1)", !0), level2: r(.382, "rgba(129, 199, 132, 1)", !0), level3: r(.5, "rgba(76, 175, 80, 1)", !0), level4: r(.618, "rgba(0, 150, 136, 1)", !0), level5: r(.786, "rgba(100, 181, 246, 1)", !0), level6: r(1, "rgba(120, 123, 134, 1)", !0), level7: r(1.618, y, !0), level8: r(2.618, "rgba(244, 67, 54, 1)", !0), level9: r(3.618, "rgba(103, 58, 183, 1)", !0), level10: r(4.236, "rgba(233, 30, 99, 1)", !0), level11: r(4.618, "rgba(233, 30, 99, 1)", !0) }, linetoolfibspeedresistancearcs: { showCoeffs: !0, font: S, fillBackground: !0, transparency: 80, fullCircles: !1, trendline: { visible: !0, color: "rgba(120, 123, 134, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, level1: r(.236, "rgba(244, 67, 54, 1)", !0), level2: r(.382, "rgba(129, 199, 132, 1)", !0), level3: r(.5, "rgba(76, 175, 80, 1)", !0), level4: r(.618, "rgba(0, 150, 136, 1)", !0), level5: r(.786, "rgba(100, 181, 246, 1)", !0), level6: r(1, "rgba(120, 123, 134, 1)", !0), level7: r(1.618, y, !0), level8: r(2.618, "rgba(244, 67, 54, 1)", !0), level9: r(3.618, "rgba(103, 58, 183, 1)", !0), level10: r(4.236, "rgba(233, 30, 99, 1)", !0), level11: r(4.618, "rgba(233, 30, 99, 1)", !0) }, linetooltrendbasedfibextension: { showCoeffs: !0, showPrices: !0, font: S, fillBackground: !0, transparency: 80, extendLines: !1, extendLinesLeft: !1, horzLabelsAlign: "left", vertLabelsAlign: "bottom", reverse: !1, coeffsAsPercents: !1, fibLevelsBasedOnLogScale: !1, trendline: { visible: !0, color: "rgba(120, 123, 134, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, levelsStyle: { linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, level1: i(0, "rgba(120, 123, 134, 1)", !0), level2: i(.236, "rgba(244, 67, 54, 1)", !0), level3: i(.382, "rgba(129, 199, 132, 1)", !0), level4: i(.5, "rgba(76, 175, 80, 1)", !0), level5: i(.618, "rgba(0, 150, 136, 1)", !0), level6: i(.786, "rgba(100, 181, 246, 1)", !0), level7: i(1, "rgba(120, 123, 134, 1)", !0), level8: i(1.618, y, !0), level9: i(2.618, "rgba(244, 67, 54, 1)", !0), level10: i(3.618, "rgba(156, 39, 176, 1)", !0), level11: i(4.236, "rgba(233, 30, 99, 1)", !0), level12: i(1.272, "rgba(129, 199, 132, 1)", !1), level13: i(1.414, "rgba(244, 67, 54, 1)", !1), level16: i(2, "rgba(0, 150, 136, 1)", !1), level14: i(2.272, "rgba(129, 199, 132, 1)", !1), level15: i(2.414, "rgba(76, 175, 80, 1)", !1), level17: i(3, "rgba(100, 181, 246, 1)", !1), level18: i(3.272, "rgba(120, 123, 134, 1)", !1), level19: i(3.414, y, !1), level20: i(4, "rgba( 204, 40, 40, 1)", !1), level21: i(4.272, "rgba(156, 39, 176, 1)", !1), level22: i(4.414, "rgba(233, 30, 99, 1)", !1), level23: i(4.618, "rgba(129, 199, 132, 1)", !1), level24: i(4.764, "rgba(0, 150, 136, 1)", !1) }, linetooltrendbasedfibtime: { showCoeffs: !0, font: "Verdana", fillBackground: !0, transparency: 80, horzLabelsAlign: "right", vertLabelsAlign: "bottom", trendline: { visible: !0, color: "rgba(120, 123, 134, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_DASHED }, level1: r(0, "rgba(120, 123, 134, 1)", !0), level2: r(.382, "rgba(244, 67, 54, 1)", !0), level3: r(.5, "rgba(129, 199, 132, 1)", !1), level4: r(.618, "rgba(76, 175, 80, 1)", !0), level5: r(1, "rgba(0, 150, 136, 1)", !0), level6: r(1.382, "rgba(100, 181, 246, 1)", !0), level7: r(1.618, "rgba(120, 123, 134, 1)", !0), level8: r(2, y, !0), level9: r(2.382, "rgba(244, 67, 54, 1)", !0), level10: r(2.618, "rgba(156, 39, 176, 1)", !0), level11: r(3, "rgba(233, 30, 99, 1)", !0) }, linetoolschiffpitchfork: { fillBackground: !0, transparency: 80, style: l.Schiff, median: { visible: !0, color: "rgba(244, 67, 54, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, extendLines: !1, level0: r(.25, "rgba(255, 183, 77, 1)", !1), level1: r(.382, "rgba(129, 199, 132, 1)", !1), level2: r(.5, "rgba(76, 175, 80, 1)", !0), level3: r(.618, "rgba(0, 150, 136, 1)", !1), level4: r(.75, "rgba(100, 181, 246, 1)", !1), level5: r(1, y, !0), level6: r(1.5, "rgba(156, 39, 176, 1)", !1), level7: r(1.75, "rgba(233, 30, 99, 1)", !1), level8: r(2, "rgba(229, 115, 115, 1)", !1) }, linetoolschiffpitchfork2: { fillBackground: !0, transparency: 80, style: l.Schiff2, median: { visible: !0, color: "rgba(244, 67, 54, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, extendLines: !1, level0: r(.25, "rgba(255, 183, 77, 1)", !1), level1: r(.382, "rgba(129, 199, 132, 1)", !1), level2: r(.5, "rgba(76, 175, 80, 1)", !0), level3: r(.618, "rgba(0, 150, 136, 1)", !1), level4: r(.75, "rgba(100, 181, 246, 1)", !1), level5: r(1, y, !0), level6: r(1.5, "rgba(156, 39, 176, 1)", !1), level7: r(1.75, "rgba(233, 30, 99, 1)", !1), level8: r(2, "rgba(229, 115, 115, 1)", !1) }, linetoolinsidepitchfork: { fillBackground: !0, transparency: 80, style: l.Inside, median: { visible: !0, color: "rgba(244, 67, 54, 1)", linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID }, extendLines: !1, level0: r(.25, "rgba(255, 183, 77, 1)", !1), level1: r(.382, "rgba(129, 199, 132, 1)", !1), level2: r(.5, "rgba(76, 175, 80, 1)", !0), level3: r(.618, "rgba(0, 150, 136, 1)", !1), level4: r(.75, "rgba(100, 181, 246, 1)", !1), level5: r(1, y, !0), level6: r(1.5, "rgba(156, 39, 176, 1)", !1), level7: r(1.75, "rgba(233, 30, 99, 1)", !1), level8: r(2, "rgba(229, 115, 115, 1)", !1) }, linetoolregressiontrend: { linewidth: 1, linestyle: CanvasEx.LINESTYLE_SOLID, styles: { upLine: { visible: !0, color: n(y, 70), linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1 }, downLine: { visible: !0, color: n(y, 70), linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1 }, baseLine: { visible: !0, color: "rgba(244, 67, 54, 0.3)", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1 }, extendLines: !1, showPearsons: !0, transparency: 70 } } }, C(TradingView.defaultProperties.chartproperties), x() } if (void 0 === TradingView.defaultProperties["study_MA@tv-basicstudies"] && (TradingView .defaultProperties["study_MA@tv-basicstudies"] = { description: "Moving Average", shortDescription: "MA", inputs: { length: 9, source: "close" }, styles: { MovAvg: { visible: !0, color: y, linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1, plottype: h.Line, histogramBase: 0, title: "MA" } } }), void 0 === TradingView.defaultProperties[ "study_PivotPointsHighLow@tv-basicstudies"] && (TradingView.defaultProperties[ "study_PivotPointsHighLow@tv-basicstudies"] = { font: "Arial", fontsize: 10, borderColor: y, backColor: "#E3EFFD", textColor: "#131722" }), void 0 === TradingView.defaultProperties[ "study_PivotPointsStandard@tv-basicstudies"]) { TradingView.defaultProperties["study_PivotPointsStandard@tv-basicstudies"] = { _hardCodedDefaultsVersion: 1, font: "Arial", fontsize: 11, levelsStyle: { showLabels: !0, visibility: { P: !0, "S1/R1": !0, "S2/R2": !0, "S3/R3": !0, "S4/R4": !0, "S5/R5": !0 }, colors: { P: "#FB8C00", "S1/R1": "#FB8C00", "S2/R2": "#FB8C00", "S3/R3": "#FB8C00", "S4/R4": "#FB8C00", "S5/R5": "#FB8C00" }, widths: { P: 1, "S1/R1": 1, "S2/R2": 1, "S3/R3": 1, "S4/R4": 1, "S5/R5": 1 } } } } if (void 0 === TradingView.defaultProperties["study_ZigZag@tv-basicstudies"] && ( TradingView.defaultProperties["study_ZigZag@tv-basicstudies"] = { color: y, linewidth: 2 }), void 0 === TradingView.defaultProperties[ "study_ElliottWave@tv-basicstudies"] && (TradingView.defaultProperties[ "study_ElliottWave@tv-basicstudies"] = { inputs: {}, level0: t("rgba( 255, 0, 0, 1)", !1), level1: t("rgba( 0, 128, 0, 1)", !1), level2: t("rgba( 0, 0, 255, 1)", !1), level3: t("rgba( 255, 0, 255, 1)", !1), level4: t("rgba( 0, 128, 255, 1)", !0), level5: t("rgba( 255, 0, 0, 1)", !0), level6: t("rgba( 0, 128, 0, 1)", !0), level7: t("rgba( 0, 0, 255, 1)", !0), level8: t("rgba( 255, 0, 255, 1)", !0) }), void 0 === TradingView.defaultProperties[ "study_LinearRegression@tv-basicstudies"] && (TradingView.defaultProperties[ "study_LinearRegression@tv-basicstudies"] = { styles: { upLine: { visible: !0, color: n(y, 70), linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1 }, downLine: { visible: !0, color: n(y, 70), linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1 }, baseLine: { visible: !0, color: "rgba(244, 67, 54, 0.3)", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1 }, extendLines: !0, showPearsons: !0, backgroundColor: "rgba( 153, 21, 21, 0.3)", transparency: 70 } }), void 0 === TradingView.defaultProperties["study_Compare@tv-basicstudies"] && ( TradingView.defaultProperties["study_Compare@tv-basicstudies"] = { minTick: "default" }), void 0 === TradingView.defaultProperties["study_Overlay@tv-basicstudies"]) { TradingView.defaultProperties["study_Overlay@tv-basicstudies"] = { style: a.STYLE_LINE, allowExtendTimeScale: !1, showPriceLine: !1, minTick: "default", candleStyle: { upColor: "rgba( 107, 165, 131, 1)", downColor: "rgba( 215, 84, 66, 1)", drawWick: !0, drawBorder: !0, drawBody: !0, borderColor: "rgba( 55, 134, 88, 1)", borderUpColor: "rgba( 34, 84, 55, 1)", borderDownColor: "rgba( 91, 26, 19, 1)", wickColor: "rgba( 115, 115, 117, 1)", wickUpColor: "rgba( 115, 115, 117, 1)", wickDownColor: "rgba( 115, 115, 117, 1)", barColorsOnPrevClose: !1 }, hollowCandleStyle: { upColor: "rgba( 107, 165, 131, 1)", downColor: "rgba( 215, 84, 66, 1)", drawWick: !0, drawBorder: !0, drawBody: !0, borderColor: "rgba( 55, 134, 88, 1)", borderUpColor: "rgba( 34, 84, 55, 1)", borderDownColor: "rgba( 91, 26, 19, 1)", wickColor: "rgba( 115, 115, 117, 1)", wickUpColor: "rgba( 115, 115, 117, 1)", wickDownColor: "rgba( 115, 115, 117, 1)", barColorsOnPrevClose: !1 }, barStyle: { upColor: "rgba( 107, 165, 131, 1)", downColor: "rgba( 215, 84, 66, 1)", barColorsOnPrevClose: !1, dontDrawOpen: !1, thinBars: !0 }, lineStyle: { color: "#FF6D00", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 2, priceSource: "close", styleType: a.STYLE_LINE_TYPE_SIMPLE }, areaStyle: { color1: y, color2: y, linecolor: y, linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 2, priceSource: "close", transparency: 95 }, baselineStyle: { baselineColor: "rgba( 117, 134, 150, 1)", topFillColor1: "rgba( 83, 185, 135, 0.05)", topFillColor2: "rgba( 83, 185, 135, 0.05)", bottomFillColor1: "rgba( 235, 77, 92, 0.05)", bottomFillColor2: "rgba( 235, 77, 92, 0.05)", topLineColor: "rgba( 83, 185, 135, 1)", bottomLineColor: "rgba( 235, 77, 92, 1)", topLineWidth: 2, bottomLineWidth: 2, priceSource: "close", transparency: 50, baseLevelPercentage: 50 }, styles: { open: { visible: !0, color: "rgba( 255, 0, 0, 1)", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1, plottype: h.Line, histogramBase: 0 }, high: { visible: !0, color: "rgba( 255, 0, 0, 1)", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1, plottype: h.Line, histogramBase: 0 }, low: { visible: !0, color: "rgba( 255, 0, 0, 1)", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1, plottype: h.Line, histogramBase: 0 }, close: { visible: !0, color: "rgba( 255, 0, 0, 1)", linestyle: CanvasEx.LINESTYLE_SOLID, linewidth: 1, plottype: h.Line, histogramBase: 0 } } } } for (var I = e.split("."), M = TradingView.defaultProperties, O = 0; O < I.length; O++) M && (M = M[I[O]]); return null != M ? TradingView.clone(M) : {} }; function P(e, t, i, s, r) { if (s) for (var n in s) { var o = n.split("."), a = c(o[0]), l = void 0 !== r && r === o[0]; 0 !== o.length && l && (a = c((o = o.slice(1))[0])), 0 !== o.length && e .hasOwnProperty(a) ? h(e, o, s[n]) || u(n) : l && u(n) } function c(e) { return t && t[e] ? t[e] : e } function h(e, t, i, s) { var r = c(t[0]); return !!e.hasOwnProperty(r) && (t.length > 1 ? h(e[r], t.slice(1), i) : (e[r] && e[r] .setValue ? e[r].setValue(i) : e[r] = i, !0)) } function u(e) { i || v.logWarn("Path `" + e + "` does not exist.") } } function C(e, t, i, s) { window.__defaultsOverrides && P(e, t, i, window.__defaultsOverrides, s) } function x() { var e = /^linetool.+/; Object.keys(TradingView.defaultProperties).forEach((function(t) { e.test(t) && C(TradingView.defaultProperties[t], null, !1, t) })) } function T(e, t) { return t ? function(e, t) { var i = w(e); if (!window._UNIT_TESTS) { var s = TradingView.clone(TVSettings.getJSON(e, null)); if (function(e) { var t = new Set(["linetoolregressiontrend"]); return e.startsWith("study_") || t.has(e) }(e) && s && function(e) { if (!e) return !1; e = e.toString(); var t = new RegExp("\\d+").exec(e); return null !== t && t[0] === e }(s.version)) { var r = s.inputs, n = t.updateStudyInputs(s.id, s.version, "last", r, null); s.inputs = n; var o = t.updateStudyState(s, s); s = o } TradingView.merge(i, s) } return i }(e, t) : function(e) { var t = w(e); if (!window._UNIT_TESTS) { var i = TradingView.clone(TVSettings.getJSON(e, null)); i && TradingView.merge(t, i) } return t }(e) } T.create = function(e, t) { if (t) { var i = w(e); TradingView.defaultProperties[e] = Object.assign(t, i) } }, T.remove = function(e) { TradingView.defaultProperties[e] = void 0 }, TradingView.saveDefaults = function(e, t) { TVSettings.setJSON(e, t) }, TradingView.factoryDefaults = w, window.applyDefaultOverridesToLinetools = x, window .applyDefaultsOverrides = C, window.applyPropertiesOverrides = P, window.defaults = T, t .applyDefaultOverridesToLinetools = x, t.applyDefaultsOverrides = C, t .applyPropertiesOverrides = P, t.defaults = T, t.factoryDefaults = w, t.saveDefaults = TradingView.saveDefaults }, wamh: function(e, t, i) { "use strict"; i.r(t), i.d(t, "ChangeToolBarsThemeUndoCommand", (function() { return o })); var s = i("EsvI"), r = i("oiZD"), n = i("RDU5"); class o extends n.UndoCommand { constructor(e, t, i = !0) { super("Apply Toolbars Theme"), this._prevThemeName = e, this._themeName = t, this._syncState = i } undo() { Object(s.isStdThemeName)(this._prevThemeName) && (Object(r.setTheme)(this ._prevThemeName), this._syncState && Object(s.syncTheme)()) } redo() { Object(s.isStdThemeName)(this._themeName.toLowerCase()) && (Object(r.setTheme)( this._themeName.toLowerCase()), this._syncState && Object(s .syncTheme)()) } } }, wi9r: function(e, t, i) { "use strict"; (function(e) { var t = i("e3/o").randomHash; function s(e) { this._chartApi = e, this._sessionid = "qs_" + t(), this._sessionstarted = !1 } s.prototype.destroy = function() { this._sessionstarted && (this._chartApi.quoteDeleteSession(this._sessionid), this._sessionid = null, this._sessionstarted = !1) }, s.prototype.connected = function() { return this._chartApi.connected() }, s.prototype.connect = function(e) { this._globalHandler = e, this._chartApi.createSession(this._sessionid, this), this._chartApi.connect() }, s.prototype.disconnect = function() { this._chartApi.disconnect() }, s.prototype.quoteAddSymbols = function(e, t) { e = [].concat(e), t && t.forcePermission && (e = e.concat({ flags: ["force_permission"] })), this._chartApi.quoteAddSymbols(this._sessionid, e) }, s.prototype.quoteRemoveSymbols = function(e) { this._chartApi.quoteRemoveSymbols(this._sessionid, e) }, s.prototype.quoteFastSymbols = function(e) { this._chartApi.quoteFastSymbols(this._sessionid, e) }, s.prototype.quoteSetFields = function(e) { this._chartApi.quoteSetFields(this._sessionid, e) }, s.prototype.onMessage = function(e) { switch (e.method) { case "connected": this._sessionstarted || (this._chartApi.quoteCreateSession(this ._sessionid), this._sessionstarted = !0); break; case "disconnected": this._sessionstarted = !1 } this._globalHandler(e) }, s.prototype.quoteHibernateAll = function(e) { this._chartApi.quoteHibernateAll(this._sessionid) }, TradingView.QuoteSession = s, e && e.exports && (e.exports = s) }).call(this, i("YuTi")(e)) }, wiuq: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolArrowMarker", (function() { return a })); var s = i("Ss5c"), r = i("Ocx9"), n = i("tc+8"), o = i.n(n); class a extends s.LineDataSource { constructor(e, t) { super(e, t || a.createProperties()), i.e("lt-pane-views").then(i.bind(null, "Qa6j")).then(({ ArrowMarkerPaneView: e }) => { this._setPaneViews([new e(this, this.model())]) }) } pointsCount() { return 2 } name() { return "Trend Line" } static createProperties(e) { const t = new r.DefaultProperty("linetoolarrowmarker", e); return a._configureProperties(t), t } _getPropertyDefinitionsViewModelClass() { return Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "FxV7")).then( e => e.ArrowMarkerDefinitionsViewModel) } static _configureProperties(e) { s.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild( "text", new o.a("")), e.addExclusion("text") } } }, wjVR: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("txPx"); function n(e, t) { const i = Object.create(Object.getPrototypeOf(e)); for (const s of t) Object.prototype.hasOwnProperty.call(e, s) && (i[s] = e[s]); return i } var o = i("qFKp"), a = i("jofe"), l = i("FQhm"), c = i("sQaR"); let h; class u extends c.a { constructor() { super(), this._dialog = null, this._subscribe = e => { this._setVisibility(e) } } show() { this._load().then(e => e.show()) } hide() { var e; null === (e = this._dialog) || void 0 === e || e.hide() } static getInstance() { return h || (h = new u), h } _load() { return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e( 22), i.e(24), i.e(41), i.e(51), i.e(63), i.e(74), i.e(0), i.e( 2), i .e(5), i.e(7), i.e(10), i.e(15), i.e(20), i.e(38), i.e(47), i.e(56), i.e("object-tree-dialog") ]).then(i.bind(null, "xNz2")).then(e => { var t, i; return null === (t = this._dialog) || void 0 === t || t.hide(), null === (i = this._dialog) || void 0 === i || i.visible() .unsubscribe(this._subscribe), this._dialog = new e .ObjectTreeDialogRenderer, this._dialog.visible().subscribe(this ._subscribe), this._dialog }) } } var d = i("ogJP"), p = i("dDSx"); var _ = i("CW80"), m = i("3ClC"), f = i("H0vP"), g = i("mkn5"), b = i("eJTA"), v = i("Hr11"), S = i("S8xo"), y = i("ikwP"); i("bc0y"); class w { constructor(e, t, i) { this._handleEl = null, this._startY = 0, this._deltaY = 0, this._totalHeight = 0, this._totalStretch = 0, this._prevStretchA = 0, this._minPaneHeight = 0, this ._maxPaneHeight = 0, this._pixelStretchFactor = 0, this._colorCache = { lineColor: "", backgroundColor: "", color: "" }, this._chart = e, this._paneA = e.paneWidgets()[t], this._paneB = e .paneWidgets()[i], this._row = document.createElement("tr"), this._cell = document.createElement("td"), this._row.appendChild(this._cell), this._cell .classList.add("pane-separator"), this._cell.setAttribute("colspan", "3"), this ._cell.style.background = this._color(), this.adjustSize(), this._cell .addEventListener("click", () => {}); const s = document.createElement("div"); s.classList.add("handle"), this._cell.appendChild(s), this._mouseEventHandler = new S.MouseEventHandler(s, this, { treatVertTouchDragAsPageScroll: !1, treatHorzTouchDragAsPageScroll: !0 }), this._handleEl = s } destroy() { this._mouseEventHandler.destroy(), this._row.parentElement && this._row .parentElement.removeChild(this._row) } getElement() { return this._row } hide() { this._row.classList.add("js-hidden") } show() { this._row.classList.remove("js-hidden") } adjustSize() { this._row.style.height = w.height() + "px" } mouseDownEvent(e) { this._mouseDownOrTouchStartEvent(e) } touchStartEvent(e) { this._mouseDownOrTouchStartEvent(e) } pressedMouseMoveEvent(e) { this._pressedMouseOrTouchMoveEvent(e) } touchMoveEvent(e) { this._pressedMouseOrTouchMoveEvent(e) } mouseUpEvent(e) { this._mouseUpOrTouchEndEvent(e) } touchEndEvent(e) { this._mouseUpOrTouchEndEvent(e) } update() { this._cell.style.background = this._color().toString() } paint() {} image() { const e = this._paneA.leftPriceAxisesContainer().getWidth(), t = this._paneA.width(), i = this._paneA.rightPriceAxisesContainer().getWidth(), s = this._color(), r = Object(y.createDisconnectedCanvas)(document, new y.Size(e, 1)), n = Object(y.getPrescaledContext2D)(r); n.fillStyle = s, n.fillRect(0, 0, e, 1); const o = Object(y.createDisconnectedCanvas)(document, new y.Size(t, 1)), a = Object(y.getPrescaledContext2D)(o); a.fillStyle = s, a.fillRect(0, 0, t, 1); const l = Object(y.createDisconnectedCanvas)(document, new y.Size(i, 1)), c = Object(y.getPrescaledContext2D)(l); return c.fillStyle = s, c.fillRect(0, 0, i, 1), { type: "separator", leftAxis: { content: r.toDataURL(), canvas: r, contentWidth: e, contentHeight: 1 }, rightAxis: { content: l.toDataURL(), canvas: l, contentWidth: i, contentHeight: 1 }, content: o.toDataURL(), canvas: o, contentWidth: t, contentHeight: 1 } } static height() { const e = window.devicePixelRatio || 1; return e >= 1 ? 1 : 1 / e } _mouseDownOrTouchStartEvent(e) { this._startY = e.pageY, this._deltaY = 0, this._totalHeight = this._paneA.height() + this._paneB.height(), this._totalStretch = this._paneA.state().stretchFactor() + this._paneB.state().stretchFactor(), this._prevStretchA = this._paneA.state() .stretchFactor(), this._minPaneHeight = 30, this._maxPaneHeight = this ._totalHeight - this._minPaneHeight, this._pixelStretchFactor = this ._totalStretch / this._totalHeight, Object(s.ensureNotNull)(this._handleEl) .classList.add("i-active") } _pressedMouseOrTouchMoveEvent(e) { this._deltaY = e.pageY - this._startY; const t = this._paneA.height(), i = Object(v.clamp)(t + this._deltaY, this._minPaneHeight, this ._maxPaneHeight) * this._pixelStretchFactor, s = this._totalStretch - i; this._paneA.state().setStretchFactor(i), this._paneB.state().setStretchFactor(s), this._chart.adjustSize(), this._paneA.height() !== t && (this._startY = e .pageY), this._chart.model().model().fullUpdate() } _mouseUpOrTouchEndEvent(e) { this._chart.model().addPaneStretchFactorUndoCommand(this._paneA.state(), this._paneB .state(), this._prevStretchA, this._paneA.state().stretchFactor()), this ._startY = 0, this._deltaY = 0, this._totalHeight = 0, this._totalStretch = 0, this._minPaneHeight = 0, this._maxPaneHeight = 0, this._pixelStretchFactor = 0, Object(s.ensureNotNull)(this._handleEl).classList.remove("i-active") } _color() { const e = this._chart.properties().childs().scalesProperties.childs().lineColor .value(), t = this._chart.model().model().backgroundColor().value(); if (this._colorCache.lineColor !== e || this._colorCache.backgroundColor !== t) { const i = Object(b.parseRgba)(t), s = Object(b.parseRgba)(e), r = 0 === i[3] && 0 === s[3] ? "rgba(0,0,0,0)" : Object(b.rgbaToString)( Object(b.blendRgba)(i, s)); this._colorCache = { lineColor: e, backgroundColor: t, color: r } } return this._colorCache.color } } var P = i("mMWL"), C = i("KnF9"), x = i("VaSN"), T = i("aIyQ"), I = i.n(T), M = i("hY0g"), O = i.n(M), L = i("Tmoa"), A = i("EsvI"); const E = { moving: "wait_finishing", wait_finishing: "stop", stop: "moving" }; class k { constructor(e) { this._chartModel = null, this._currentDistance = 0, this._deferredFinishTimeout = 0, this._finishingTimeout = 0, this._moveType = "", this._startTime = 0, this ._state = "stop", this._movingTimeout = 0, this._chart = e, this._chart .withModel(this, () => { this._chartModel = this._chart.model() }) } destroy() { clearTimeout(this._movingTimeout) } move(e) { if (null !== this._chartModel && "stop" === this._state && this._chartModel .beginUndoMacro(1 === e ? "Move Left" : "Move Right"), this._state = E.stop, this._moveType = "animated", this._deferredFinishTimeout && (clearTimeout(this ._deferredFinishTimeout), this._deferredFinishTimeout = 0), this ._finishingTimeout && (clearTimeout(this._finishingTimeout), this ._finishingTimeout = 0), this._startTime = Date.now(), 0 === this ._movingTimeout) { const t = this._startTime, i = 10, s = () => { this.moveStep(t, 0, 50 * e, 1e3), this._movingTimeout = setTimeout(s, i) }; this._movingTimeout = setTimeout(s, i) } } moveStep(e, t, i, s) { if (null !== this._chartModel && !this._chartModel.timeScale().isEmpty()) { const r = Date.now(); r < e && (e = r); let n = (r - e) / s; (n > 1 || !isFinite(n)) && (n = 1); const o = 1 - Math.pow(1 - n, 3); return this._currentDistance = (i - t) * o + t, this._chartModel.scrollChart( this._currentDistance), n } } moveByBar(e) { if (null !== this._chartModel) { const t = this._chartModel.timeScale(); if (t.isEmpty()) return; if ("stop" === this._state && this._chartModel.beginUndoMacro(1 === e ? "Move Left" : "Move Right"), null !== t.visibleBarsStrictRange()) { const e = t.indexToCoordinate(t.visibleBarsStrictRange().lastBar()) + t .barSpacing() / 2; Math.abs(t.width() - e) > t.barSpacing() / 6 && this._chartModel .scrollChart(t.width() - e) } if (this._state = E.stop, this._moveType = "by_bar", this._startTime = Date .now(), !this._movingTimeout) { let t = 0, i = 150; const s = 400, r = () => { this._moveByBarStep(e), t++, i > 100 && (i -= t / 5 * 20), this ._movingTimeout = setTimeout(r, i) }; this._movingTimeout = setTimeout(r, s), this._moveByBarStep(e) } } } stopMove() { "by_bar" === this._moveType ? this.stopMoveByBar() : this._stopMove() } stopMoveByBar() { "moving" === this._state && (clearTimeout(this._movingTimeout), this ._movingTimeout = 0, this._state = E.wait_finishing, this._moveType = "", this._movingTimeout = 0, this._currentDistance = 0, null !== this ._chartModel && this._chartModel.endUndoMacro()) } _finishMove() { clearTimeout(this._movingTimeout), this._movingTimeout = 0, this ._deferredFinishTimeout = 0; const e = this._currentDistance, t = Date.now(), i = () => { const s = this.moveStep(t, e, 0, 700); s && s < 1 ? this._finishingTimeout = setTimeout(i, 10) : null !== this ._chartModel && (this._state = E.wait_finishing, this._moveType = "", this._movingTimeout = 0, this._currentDistance = 0, this._chartModel .endUndoMacro()) }; this._finishingTimeout = setTimeout(i, 10) } _stopMove() { "moving" === this._state && (this._state = E.moving, Date.now() - this._startTime < 200 ? this._deferredFinishTimeout = setTimeout(this._finishMove.bind(this), 200 - (Date.now() - this._startTime)) : this._finishMove()) } _moveByBarStep(e) { if (null !== this._chartModel) { if (this._chartModel.timeScale().isEmpty()) return; this._chartModel.scrollChartByBar(e) } } } var D = i("m/3z"), V = i("Kxc7"), B = i("nqXy"), R = i("n5al"), N = i("pPtI"); class j { constructor() { this._draggingSource = null, this._activeTouchPanes = new Set, this._scrollingPane = null, this._pinchingPane = null } onPaneDestroyed(e) { this._activeTouchPanes.delete(e), this._scrollingPane === e && (this ._scrollingPane = null), this._pinchingPane === e && (this._pinchingPane = null) } startTouch(e) { this._activeTouchPanes.add(e) } endTouch(e) { this._activeTouchPanes.delete(e) } hasTouchesOnOtherPanes(e) { return this._activeTouchPanes.size > 1 || 1 === this._activeTouchPanes.size && !this ._activeTouchPanes.has(e) } trySetDraggingSource(e, t) { return !this.hasTouchesOnOtherPanes(t) && (Object(s.assert)(null === this ._draggingSource || this._draggingSource === e), this._draggingSource = e, !0) } clearDraggingSource() { null !== this._draggingSource && (this._draggingSource = null) } draggingSource() { return this._draggingSource } setScrollingPane(e) { Object(s.assert)(null === e || null === this._scrollingPane), this._scrollingPane = e } scrollingPane() { return this._scrollingPane } setPinchingPane(e) { Object(s.assert)(null === e || null === this._pinchingPane), this._pinchingPane = e } pinchingPane() { return this._pinchingPane } } var F = i("JWMC"); i.d(t, "ChartWidgetBase", (function() { return G })); const W = Object(V.enabled)("chart_content_overrides_by_defaults"), H = Object(r.getLogger)("ChartWidget", { color: "#606" }), U = { addToWatchlistEnabled: !0, showFinancialsEnabled: !1, sourceSelectionEnabled: !0, propertyPagesEnabled: !0, paneContextMenuEnabled: !0, priceScaleContextMenuEnabled: !0, currencyConversionEnabled: !1, unitConversionEnabled: !1, goToDateEnabled: !1, marketStatusWidgetEnabled: !0, chartWarningWidgetEnabled: !0, dataProblemWidgetEnabled: !0, paneControlsEnabled: !0, isSymbolAvailable: e => Promise.resolve(!0), legendWidgetEnabled: !0, chartEventsEnabled: !0, esdEnabled: !1, croppedTickMarks: !0, countdownEnabled: !0, lastPriceAnimationEnabled: !0, useKineticScroll: o.CheckMobile.any(), indicatorsDialogShortcutEnabled: !0, handleScale: { mouseWheel: !0, pinch: !0, axisPressedMouseMove: { time: !0, price: !0 } }, handleScroll: { mouseWheel: !0, pressedMouseMove: !0, horzTouchDrag: !0, vertTouchDrag: !0 } }; function z(e, t, i, s = 0) { const r = t.mainSeries().syncModel(), n = e.mainSeries().syncModel(); let o = i; if (null !== r && null !== n) { const t = e.createSyncPoint(r, n); 0 !== s && (i = r.projectTime(i, s)), o = t.sourceTimeToTargetTime(i) } return e.timeScale().points().roughIndex(o, n && n.distance.bind(n)) } class G { constructor(e, t, i) { this.activePaneWidget = null, this._model = null, this._paneWidgets = [], this ._maximizedPaneWidget = null, this._timeAxisWidget = null, this ._paneSeparators = [], this._controlBarNavigation = null, this ._lineToolsSynchronizer = null, this._modelCreated = new I.a, this ._isDestroyed = !1, this._customLegendWidgetsFactoryMap = new Map, this ._backgroundTopTheme = new O.a("light"), this._backgroundBasedTheme = new O.a( "light"), this._backgroundBottomTheme = new O.a("light"), this ._lhsAxesWidth = 0, this._rhsAxesWidth = 0, this._lhsPriceAxisWidthChanged = new I.a, this._rhsPriceAxisWidthChanged = new I.a, this._mainDiv = null, this ._parent = null, this._elTooltipDiv = null, this._hotkeysListener = null, this ._mouseWheelHelper = null, this._onWheelBound = null, this._justActivated = !1, this._inited = !1, this ._containsData = !1, this._initialLoading = !1, this._defTimeframe = void 0, this._removeMaximizeHotkey = null, this._metaInfoRepository = null, this ._invalidationMask = null, this._drawPlanned = !1, this._drawRafId = 0, this ._inLoadingState = !1, this._timingsMeter = null, this._tagsChanged = new I.a, this._redraw = new I.a, this._isVisible = new O.a(!0), this._dataWindowWidget = null, this._updateThemedColorBound = this._updateThemedColor.bind(this), this ._saveChartService = null, this._objectTreeDialogController = null, this ._chartPaintedPromise = null, this._noExchangeSubscrptionWarning = null, this ._paneWidgetsSharedState = new j, this._brokerName = "", this._onZoom = new I.a, this._id = t, this._layoutId = i, this._options = Object(d.merge)(Object(d .clone)(U), e), this._options.customLegendWidgetFactories && (this ._customLegendWidgetsFactoryMap = this._options.customLegendWidgetFactories ), this._subscribeToDrawingState(), this.withModel(this, () => { const e = this.model().model(); e.backgroundTopColor().subscribe(this._updateThemedColorBound), e .backgroundColor().subscribe(this._updateThemedColorBound) }), this._scrollHelper = new k(this), this._objectTreeDialogController = u .getInstance() } destroy() { var e, t; null === (e = this._lineToolsSynchronizer) || void 0 === e || e.destroy(), null === (t = this._noExchangeSubscrptionWarning) || void 0 === t || t.destroy(), window .loginStateChange.unsubscribe(this, this._handleLoginStateChanged), null !== this._model && (this._model.model().backgroundTopColor().unsubscribe(this ._updateThemedColorBound), this._model.model().backgroundColor() .unsubscribe(this._updateThemedColorBound), this._model.destroy()), this ._customLegendWidgetsFactoryMap.clear(), this._scrollHelper.destroy(), this ._isDestroyed = !0 } model() { return Object(s.ensureNotNull)(this._model) } id() { return this._id } layoutId() { return this._layoutId } isVisible() { return this._isVisible.value() } setVisible(e) { this._isVisible.setValue(e) } getPriceAxisWidthChangedByName(e) { return "left" === e ? this._lhsPriceAxisWidthChanged : this ._rhsPriceAxisWidthChanged } getPriceAxisMaxWidthByName(e) { return "left" === e ? this._lhsAxesWidth : this._rhsAxesWidth } timeAxisHeight() { return null !== this._timeAxisWidget ? this._timeAxisWidget.size.h : 0 } withModel(e, t) { null !== this._model ? t.call(e) : this.modelCreated().subscribe(e, t, !0) } hasModel() { return null !== this._model } onZoom() { return this._onZoom } images(e) { window.TradingView.printing = !0; const t = this.model().selection().allSources(); this.model().selectionMacro(e => e.clearSelection()); const i = (t, i) => { t.paint(i, this.onWidget()); const s = { showCollapsedStudies: Boolean(null == e ? void 0 : e .showCollapsedStudies), status: null == e ? void 0 : e.status }; return t.getScreenshotData(s) }, s = []; if (null !== this._maximizedPaneWidget) { const e = this._paneWidgets.indexOf(this._maximizedPaneWidget); s.push(i(this._maximizedPaneWidget, f.InvalidationMask.light() .invalidateForPane(e))) } else for (let e = 0; e < this._paneWidgets.length; ++e) { const t = this._paneWidgets[e]; s.push(i(t, f.InvalidationMask.light().invalidateForPane(e))), e < this ._paneWidgets.length - 1 && s.push(this._paneSeparators[e].image()) } let r; this._timeAxisWidget && (this._timeAxisWidget.paint(f.InvalidationLevel.Light), r = this._timeAxisWidget.getScreenshotData()), window.TradingView.printing = !1, this.model().selectionMacro(e => { t.forEach(t => { e.addSourceToSelection(t) }) }), this.model().model().lightUpdate(); const n = this.mainSeriesQuotesAndMetainfo(); return { panes: s, timeAxis: r, colors: { text: this.properties().childs().scalesProperties.childs().textColor .value(), bg: this.properties().childs().paneProperties.childs().background.value(), scales: this.properties().childs().scalesProperties.childs().lineColor .value() }, meta: n.meta, ohlc: n.ohlc, quotes: n.quotes } } setSaveChartService(e) { this._saveChartService = e, null !== this._lineToolsSynchronizer && this ._lineToolsSynchronizer.setSaveChartService(e) } getSaveChartService() { return this._saveChartService } mainSeriesQuotesAndMetainfo() { let e, t, i; const s = this._model && this._model.mainSeries(); if (s) { const r = e => null == e ? "" : s.formatter().format(e, void 0, void 0, !0, ! 1) + "", n = e => null == e ? "" : e + ""; e = { resolution: s.interval(), symbol: s.symbol() }; const o = s.symbolInfo(); o && (e.symbol = o.full_name, e.description = o.description, e.exchange = o .exchange); const a = s.bars().last(); null !== a && (t = a.value.slice(1, 5).map(r)); const l = s.quotes(); l && (i = { change: r(l.change), changePercent: n(l.change_percent), last: r(l.last_price) }) } return { meta: e, ohlc: t, quotes: i } } updateCrossHairPositionIfNeeded() { if (this._model) { const e = P.tool.value(); if (this._model.model().setCurrentTool(e), Object(x.lastEventIsTouch)()) { const e = this._maximizedPaneWidget || this._paneWidgets[0]; if (e.hasState() && (this._isLineToolModeExceptBrush() || this .selectPointMode().value() || Object(P.toolIsMeasure)(P.tool .value()))) { const t = e.state(), i = .5 * this._model.model().timeScale().width(), s = .5 * t.defaultPriceScale().height(); this._model.model().setAndSaveCurrentPosition(i, s, t) } } this._model && Object(x.lastEventIsTouch)() && this._model.model() .crossHairSource().updateAllViews() } } trackingModePaneWidget() { if (!Object(x.lastEventIsTouch)()) return null; for (const e of this.paneWidgets()) if (e.trackingModeEnabled()) return e; return null } startTrackingMode() { if (Object(x.lastEventIsTouch)()) { this.exitTrackingMode(), this.updateCrossHairPositionIfNeeded(); const e = this._maximizedPaneWidget || this._paneWidgets[0], t = this.model().model().crossHairSource().currentPoint(); e.startTrackingMode(t, t) } } exitTrackingMode() { Object(x.lastEventIsTouch)() && this.paneWidgets().some(e => e .trackingModeEnabled()) && (this.paneWidgets().forEach(e => e .exitTrackingMode()), this.model().model().clearCurrentPosition()) } onToolChanged() { this.selectPointMode().value() && this.cancelRequestSelectPoint(), this .exitTrackingMode() } setInLoadingState(e) { this._inLoadingState = e } paint(e) { const t = null != e ? e : f.InvalidationMask.full(); t.validationActions().forEach(e => e()), this._paneWidgets.forEach((e, i) => { null !== this._maximizedPaneWidget && this._maximizedPaneWidget !== e || e.paint(t.invalidateForPane(i), !1) }), this._timeAxisWidget && this._timeAxisWidget.paint(t .invalidateForTimeScale()), this._redraw.fire() } GUIResetScales() { Object(F.trackEvent)("GUI", "Reset Scales"), null !== this._model && this._model.resetScales() } maximizedPaneWidget() { return this._maximizedPaneWidget } isMaximizedPane() { return null !== this._maximizedPaneWidget } unsetActivePaneWidget() { this.activePaneWidget = null } setActivePaneWidget(e) { this.activePaneWidget = e } onPaneWidgetDestroyed(e) { this.activePaneWidget === e && (this.activePaneWidget = null) } backgroundTopTheme() { return this._backgroundTopTheme.readonly() } backgroundBasedTheme() { return this._backgroundBasedTheme.readonly() } backgroundBottomTheme() { return this._backgroundBottomTheme.readonly() } lineToolsAndGroupsDTO() { return Object(s.ensureNotNull)(this._lineToolsSynchronizer).prepareDTO() } resetLineToolsInvalidated(e, t) { Object(s.ensureNotNull)(this._lineToolsSynchronizer).resetInvalidated(e, t) } applyLineToolUpdateNotification(e) { Object(s.ensureNotNull)(this._lineToolsSynchronizer) .applyLineToolUpdateNotification(e) } applyAlertIdByExternalSource(e, t) { var i; null === (i = this._lineToolsSynchronizer) || void 0 === i || i .applyAlertIdByExternalSource(e, t) } deleteAlertByExternalSource(e, t) { var i; null === (i = this._lineToolsSynchronizer) || void 0 === i || i .deleteAlertByExternalSource(e) } shouldBeSavedEvenIfHidden() { return this.model().model().shouldBeSavedEvenIfHidden() } showObjectsTreeDialog() { var e; null === (e = this._objectTreeDialogController) || void 0 === e || e.show() } addCustomWidgetToLegend(e, t) { this._customLegendWidgetsFactoryMap.set(e, t); for (const i of this.paneWidgets()) i.addCustomWidgetToLegend(e, t) } applyIndicatorsToAllChartsAvailable() { if (!this.chartWidgetCollection().applyIndicatorsToAllChartsAvailable()) return !1; for (const e of this.model().model().panes()) { if (e.sourcesByGroup().all().some(e => Object(m.isStudy)(e) && !Object(m .isESDStudy)(e))) return !0 } return !1 } restoreState(e, t, i) { this.adjustSize(); Object(s.ensureNotNull)(this._model).restoreState(this._content, t, i); this._setActions() } addCompareAsOverlay(e, t) { const i = this.model(); return Object(s.ensureDefined)(this._options.isSymbolAvailable)(e).then(s => { if (!s) return null; const r = i.createStudyInserter({ type: "java", studyId: "Overlay@tv-basicstudies" }); return r.setForceOverlay(!0), r.setPreferredPriceScale("as-series"), r .setTargetPriceScaleMode({ percentage: !0 }), void 0 !== t && r.setPropertiesState({ allowExtendTimeScale: t }), r.insert(async () => ({ symbol: e })) }) } scrollHelper() { return this._scrollHelper } adjustSize(e) { var t; let i = 0; const s = null === this._model ? null : this._model.model().priceScaleSlotsCount(), r = new Uint32Array(null === s ? 0 : s.left), n = new Uint32Array(null === s ? 0 : s.right), o = Object(y.getCanvasDevicePixelRatio)(document.body), a = (e, t) => e + t, c = (e, t) => { t.forEach((t, i) => { e[i] = Math.max(e[i], t) }) }; for (const e of this._paneWidgets) if (!this._maximizedPaneWidget || this._maximizedPaneWidget === e) { const t = e.leftPriceAxisesContainer().optimalWidths(), s = e.rightPriceAxisesContainer().optimalWidths(); c(r, t), c(n, s), i += e.stretchFactor() } let h = r.reduce(a, 0), u = n.reduce(a, 0); const d = this._width(), p = this._height(); let _ = Math.max(d - h - u, 0); if (_ <= 102) { h = 0, u = 0, _ = d; for (let e = 0; e < r.length; e++) r[e] = 0; for (let e = 0; e < n.length; e++) n[e] = 0 } for (const e of this._paneSeparators) e.adjustSize(); const m = this._paneSeparators.length, f = w.height(), g = this.isMaximizedPane() ? 0 : f * m, b = null !== this._timeAxisWidget ? this._timeAxisWidget.optimalHeight() : 0; let v = p - b >= 61 ? b : 0; v % 2 && (v += 1); const S = g + v, P = p < S ? 0 : p - S, C = P / i; let x = 0, T = !1; const I = null === (t = this._model) || void 0 === t ? void 0 : t.model(); for (let e = 0; e < this._paneWidgets.length; ++e) { const t = this._paneWidgets[e]; void 0 !== I && t.setState(I.panes()[e]); let i = 0; if (this.isMaximizedPane()) i = this._maximizedPaneWidget === t ? P : 0; else { let s = 0; s = e === this._paneWidgets.length - 1 ? Math.ceil((P - x) * o) / o : Math .round(t.stretchFactor() * C * o) / o, i = Math.max(s, 2), x += i } t.setPriceAxisSizes("left", i, r), t.setPriceAxisSizes("right", i, n), T = T || i !== t.height(), t.setSize(new y.Size(_, i)), I && t.state() && I .setPaneHeight(t.state(), i) } null !== this._timeAxisWidget && this._timeAxisWidget.setSizes(new y.Size(_, v), r, n), I && I.setWidth(_, e), this._controlBarNavigation && this ._controlBarNavigation.updatePosition(), this._lhsAxesWidth !== h && (this ._lhsAxesWidth = h, this._lhsPriceAxisWidthChanged.fire(h)), this ._rhsAxesWidth !== u && (this._rhsAxesWidth = u, this._rhsPriceAxisWidthChanged .fire(u)), T && l.emit("panes_height_changed") } setBroker(e) { var t; this._brokerName = e, null === (t = this._lineToolsSynchronizer) || void 0 === t || t.setBroker(e) } chartPainted() { return this._drawPlanned ? (null === this._chartPaintedPromise && (this ._chartPaintedPromise = Object(a.createDeferredPromise)()), this ._chartPaintedPromise.promise) : Promise.resolve() } setDataWindowWidget(e) { this._dataWindowWidget = e } removeDataWindowWidget() { this._dataWindowWidget = null } _createLineToolsSynchronizerIfNeeded() { 0 } _updateThemedColor() { const e = this.model().model(), t = e.backgroundColorAtYPercentFromTop(.5); let i = e.backgroundTopColor().value(), s = e.backgroundColor().value(); const r = Object(L.isColorDark)(t), n = Object(L.isColorDark)(i), o = Object(L.isColorDark)(s); this.widget().classList.toggle("chart-widget--themed-dark", r), this.widget() .classList.toggle("chart-widget--themed-light", !r), this.widget().classList .toggle("chart-widget__top--themed-dark", n), this.widget().classList.toggle( "chart-widget__top--themed-light", !n), this.widget().classList.toggle( "chart-widget__bottom--themed-dark", o), this.widget().classList.toggle( "chart-widget__bottom--themed-light", !o), this._backgroundTopTheme .setValue(n ? "dark" : "light"), this._backgroundBasedTheme.setValue(r ? "dark" : "light"), this._backgroundBottomTheme.setValue(o ? "dark" : "light"), i === s && Object(A.isStdThemedDefaultValue)( "chartProperties.paneProperties.background", i, this._backgroundBasedTheme .value()) && (i = null, s = null); for (const e of this._paneWidgets) e.updateThemedColors(i, s) } _isLineToolModeExceptBrush() { const e = P.tool.value(); return Object(_.isLineToolName)(e) && !Object(_.isLineDrawnWithPressedButton)(e) && !this.selectPointMode().value() } _cancelCreatingLine() { const e = Object(s.ensureNotNull)(this._model).model(), t = e.lineBeingCreated(); if (null !== t) { const i = Object(s.ensureNotNull)(e.paneForSource(t)); Object(s.ensureNotNull)(this.paneByState(i)).cancelCreatingLineTool() } const i = e.crossHairSource().measurePane(); if (null !== i) { Object(s.ensureNotNull)(this.paneByState(i)).cancelMeasuring() } } _makePaneWidgetsAndSeparators() { const e = this.model().model().panes(), t = e.length, i = this._paneWidgets.length; for (let e = t; e < i; e++) { Object(s.ensureDefined)(this._paneWidgets.pop()).destroy(); const e = this._paneSeparators.pop(); e && e.destroy() } const r = this._options.containsData; for (let s = i; s < t; s++) { const t = { contextMenuEnabled: this._options.paneContextMenuEnabled, currencyConversionEnabled: this._options.currencyConversionEnabled, unitConversionEnabled: this._options.unitConversionEnabled, handleScale: this._options.handleScale, handleScroll: this._options.handleScroll, priceScaleContextMenuEnabled: this._options .priceScaleContextMenuEnabled, legendWidgetEnabled: this._options.legendWidgetEnabled, sourceStatusesWidgetEnabled: !r, sourceStatusesWidget: this._options.sourceStatusesWidget, marketStatusWidgetEnabled: this._options.marketStatusWidgetEnabled && ! r, marketStatusWidget: this._options.marketStatusWidget, chartWarningWidgetEnabled: this._options.chartWarningWidgetEnabled && ! r, chartWarningWidget: this._options.chartWarningWidget, dataProblemWidgetEnabled: this._options.dataProblemWidgetEnabled && !r, legendWidget: this._options.legendWidget, propertyPagesEnabled: this._options.propertyPagesEnabled, sourceSelectionEnabled: this._options.sourceSelectionEnabled, controlsEnabled: this._options.paneControlsEnabled, croppedTickMarks: this._options.croppedTickMarks, countdownEnabled: this._options.countdownEnabled, customLegendWidgetFactories: new Map(this ._customLegendWidgetsFactoryMap), useKineticScroll: this._options.useKineticScroll }; void 0 !== this._options.paneContextMenu && (t.contextMenu = this._options .paneContextMenu), void 0 !== this._options.priceScaleContextMenu && (t .priceScaleContextMenu = this._options.priceScaleContextMenu); const i = new g.PaneWidget(this, e[s], t, this._paneWidgetsSharedState); if (this._paneWidgets.push(i), s > 0) { const e = new w(this, s - 1, s); this._paneSeparators.push(e), this._timeAxisWidget ? this._elMainTable .insertBefore(e.getElement(), this._timeAxisWidget.getElement()) : this ._elMainTable.appendChild(e.getElement()) } this._timeAxisWidget ? this._elMainTable.insertBefore(i.getElement(), this ._timeAxisWidget.getElement()) : this._elMainTable.appendChild(i .getElement()) } for (let i = 0; i < t; i++) { const t = e[i], s = this._paneWidgets[i]; s.hasState() && s.state() === t ? s.updatePriceAxisWidgets() : s.setState(t) } for (let e = t; e--;) this._paneWidgets[e].updateControls(); this._updateThemedColor() } _width() { return this._options.width.value() } _height() { return this._options.height.value() } _onMousewheel(e) { if (!this.model().model().zoomEnabled() || null === this._mouseWheelHelper) return; if (!Object(o.onWidget)() && parent && parent !== window && parent.IS_DEMO_PAGE) return; if (null === this._model) return; if (this.model().timeScale().isEmpty()) return; const t = this._mouseWheelHelper.processWheel(e), i = t.deltaX, r = -t.deltaY; if (0 !== i && this._options.handleScroll.mouseWheel || 0 !== r && this._options .handleScale.mouseWheel) { if (e.cancelable && e.preventDefault(), 0 !== r && this._options.handleScale .mouseWheel) { const t = Math.sign(r) * Math.min(1, Math.abs(r)), i = Object(s.ensureNotNull)(this._mainDiv).getBoundingClientRect(), n = e.clientX - this._lhsAxesWidth - i.left; if (!Number.isFinite(n) || !Number.isFinite(t)) return void H.logWarn( "Incorrect mouse wheel processing: scrollPosition: " + n + ", zoomScale: " + t); const o = new C.a(e).control(); this.model().model().zoomTime(n, t, !!o || void 0), this._onZoom.fire(o) } 0 !== i && this._options.handleScroll.mouseWheel && this.model().scrollChart(- 80 * i) } } _setElement(e) { if (this._mainDiv) { this._mainDiv.remove(); const e = document.createRange(); e.selectNodeContents(Object(s.ensureNotNull)(this._parent)), e.deleteContents() } this._controlBarNavigation && (this._controlBarNavigation.destroy(), this ._controlBarNavigation = null), null !== this._removeMaximizeHotkey && this ._removeMaximizeHotkey(), this._removeMaximizeHotkey = this._initMaximizeHotkey( e); const t = e.ownerDocument, r = t.createElement("div"); r.classList.add("chart-container-border"), e.insertBefore(r, e.firstChild), this ._parent = r; const n = t.createElement("div"); if (n.classList.add("chart-widget"), this._mainDiv = n, this._elTooltipDiv = t .createElement("div"), this._elTooltipDiv.className = "tooltip-wrapper", this ._mainDiv.appendChild(this._elTooltipDiv), this._elMainTable = t.createElement( "table"), this._elMainTable.className = "chart-markup-table", this ._elMainTable.setAttribute("cellpading", "0"), this._elMainTable.setAttribute( "cellspacing", "0"), this._mainDiv.appendChild(this._elMainTable), this ._hotkeysListener && this._hotkeysListener.destroy(), this._hotkeysListener = new D.a(this, this._mainDiv), (this._options.controlBarEnabled || Object(V .enabled)("control_bar")) && Promise.all([i.e("react"), i.e(72), i.e(7), i .e("chart-widget-gui") ]).then(i.bind(null, "TGRH")).then(e => { this._controlBarNavigation = new e.ControlBarNavigation(this, Object(s .ensureNotNull)(this._mainDiv), this._options.controlBar), this ._model && this.adjustSize() }), this._options.handleScale.mouseWheel || this._options.handleScroll .mouseWheel) { this._mouseWheelHelper = new B.a; const e = this._onMousewheel.bind(this); this._onWheelBound = e, this._mainDiv.addEventListener("wheel", e, { passive: !1 }) } this.resize(), this._justActivated = !1, this.withModel(this, () => { r.appendChild(n), n.addEventListener("mousedown", this ._beginRequestActive.bind(this)), n.addEventListener("mouseup", this._endRequestActive.bind(this)), n.addEventListener( "touchstart", this._beginRequestActive.bind(this)), n .addEventListener("touchmove", this._endRequestActive.bind(this)), n .addEventListener("touchend", this._endRequestActive.bind(this)), n .addEventListener("click", this._requestActive.bind(this)) }), this._inited && (null !== this._timeAxisWidget && (this._timeAxisWidget .destroy(), this._timeAxisWidget = null), this._paneWidgets.forEach( e => { e.destroy() }), this._paneWidgets.length = 0, this._paneSeparators.forEach(e => { e.destroy() }), this._paneSeparators.length = 0, this._update(f.InvalidationMask .full())) } _makeDefaultModel() { let e; if (this._content && this._content.timeScale.points) { const t = this._content.timeScale.points.items[0]; e = { startDate: t } } if (!Object(s.ensureNotNull)(this._metaInfoRepository).getInternalMetaInfoArray()) throw new Error("Cannot create chart model: studies metainfo is absent"); const t = () => { this._drawPlanned = !1, this._drawRafId = 0, this._inLoadingState || (this ._invalidationMask && (this._update(this._invalidationMask), this ._invalidationMask = null), null !== this ._chartPaintedPromise && (this._chartPaintedPromise.resolve(), this ._chartPaintedPromise = null)) }, i = () => { const i = { readOnly: this.readOnly(), isSnapshot: !!this._containsData, ...n(this._options, ["timeScale", "crossHair", "esdEnabled", "countdownEnabled", "lastPriceAnimationEnabled", "currencyConversionEnabled", "unitConversionEnabled", "watermarkEnabled", "shiftVisibleRangeOnNewBar" ]) }, r = function(e, t, i, s, r, n, o, a, l) { const c = new p.ChartUndoModel(e, t, i, s, r, n, o, a, l); return c.model().fullUpdate(), c }(this._chartSession, e => { if (!(e instanceof f.InvalidationMask)) throw new Error( "Invalid mask"); null !== this._invalidationMask ? this._invalidationMask.merge( e) : this._invalidationMask = e, this._drawPlanned || ( this._drawPlanned = !0, this._options.visible.when( () => { const e = !document.hidden, i = this.screen && this.screen.isShown(); null !== this._timingsMeter && e && !i && this ._timingsMeter.startWaitingDraw(); const r = Object(s.ensureNotNull)(Object(s .ensureNotNull)(this._parent) .ownerDocument.defaultView); this._drawRafId = r.requestAnimationFrame(t) })) }, this.properties(), e, Object(s.ensureNotNull)(this ._metaInfoRepository), this, this._options.undoHistory, this ._options.barsMarksContainersFactory, i); return this._createSessions(r.model()), r }; Object(V.enabled)("lean_chart_load") ? this._model = this._model || i() : this ._model = i(), this._createVolumeIfNeeded(); if (this._content) { let e = {}; W && this._initialLoading && (e = { symbol: this._defSymbol, interval: this._defInterval, style: this._defStyle }), this.restoreState(this._content, this._containsData, e), W && this ._defSymbol && this.model().model().recalculatePriceRangeOnce() } else this._setActions(); return this._createLineToolsSynchronizerIfNeeded(), (() => { const e = Object(s.ensureNotNull)(this._model); e.onTagsChanged().subscribe(this, () => this.onModelTagsChanged()), this ._initBackgroundColor(), this._updateGui(), this._modelCreated.fire( e), this._tagsChanged.fire(); const t = e.mainSeries(); this._defTimeframe && t.setDefaultTimeframe(this._defTimeframe), e .lineCancelled().subscribe(this, () => this.onLineCancelled()), t .dataEvents().symbolNotPermitted().subscribe(null, e => { t.properties().symbol.setValue(e) }), t.properties().style.unsubscribe(this, this ._onChartStyleChanged), t.properties().style.subscribe(this, this._onChartStyleChanged), t.dataEvents().completed() .subscribe(this, () => this._addPerfMark("SeriesCompleted"), !0), t .dataEvents().barReceived().subscribe(this, () => this._addPerfMark( "SeriesFirstDataReceived"), !0); this._options; t.dataEvents().chartTypeNotPermitted().subscribe(null, () => { t.properties().interval.setValue("D") }), t.dataEvents().intradaySpreadNotPermitted().subscribe(null, () => { t.properties().interval.setValue("D") }), t.dataEvents().customIntervalNotPermitted().subscribe(null, () => { t.properties().interval.setValue(Object(N .getDefaultResolution)(Object(R.isRangeStyle)(t .properties().style.value()))) }), t.dataEvents().intradayExchangeNotPermitted().subscribe( null, () => { t.properties().interval.setValue("D") }), t.requestingResolutionWhenNotSupported.subscribe(null, e => { t.properties().interval.setValue(e) }) })() } _handleLoginStateChanged() { 0 } _subscribeToDrawingState() { if (this._options.readOnly) return; Object(P.init)(); const e = (e, t) => { if (null === this._model) return; const i = this._model.model(); e.model !== i && t(i, this._model) }; P.createdLineTool.subscribe(null, t => { e(t, (e, i) => { const r = Object(s.ensureNotNull)(e.paneForSource(e .mainSeries())); let n, o = null; if (void 0 === t.pointPositionPercents) { if (o = z(e, t.model, t.point.timeStamp), null === o) return; n = t.point.price } else { const i = t.pointPositionPercents.x * e.timeScale() .width(), s = e.mainSeries().priceScale(), r = t.pointPositionPercents.y * s.height(), a = e.mainSeries().firstValue(); if (null === a) return; o = e.timeScale().coordinateToIndex(i), n = s .coordinateToPrice(r, a) } const a = { index: Object(s.ensureNotNull)(o), price: n }, l = i.createLineTool(r, a, t.linetool, t.properties, t .linkKey, e.mainSeries(), !0); null !== l && !Boolean(this.model().lineBeingCreated()) && t .finalState && l.restoreExternalPoints(t.finalState, { indexesChanged: !0, pricesChanged: !0 }) }) }), P.continuedLineTool.subscribe(null, t => { e(t, (e, i) => { const s = z(e, t.model, t.point.timeStamp); if (null === s) return; const r = { index: s, price: t.point.price }, n = e.lineBeingCreated(); if (null === n) return; i.continueExternalLine(r, null === t.envState ? void 0 : t .envState, !!t.finalState) && t.finalState && n .restoreExternalPoints(t.finalState, { indexesChanged: !0, pricesChanged: !0 }) }) }), P.cancelledLineTool.subscribe(null, t => { e(t, (e, t) => { e.cancelCreatingLine() }) }), P.beenSetLineToolLastPoint.subscribe(null, t => { e(t, (e, i) => { const s = e.lineBeingCreated(); if (null === s || s.linkKey().value() !== t.linkKey) return; const r = z(e, t.model, t.point.timeStamp); if (null === r) return; const n = { index: r, price: t.point.price }; s.setLastPoint(n), s.updateAllViews(), e.lightUpdate() }) }), P.startedMovingLineTool.subscribe(null, t => { e(t, (e, i) => { const s = t.linkKeys.map(_.lineToolByLinkKey.bind(null, e)) .filter(d.notNull); if (s.length) { const i = z(e, t.model, t.point.timeStamp); if (null === i) return; const r = { index: i, price: t.point.price }, n = void 0 !== t.itemIndex ? t.itemIndex : null; e.startMovingSources(s, { logical: r }, n, t.pointPositionPercents, null === t .envState ? void 0 : t.envState, !0) } }) }), P.movedLineTool.subscribe(null, t => { e(t, (e, i) => { if (!e.sourcesBeingMoved().filter(_.isLineTool).filter(e => (e => t.linkKeys.some(t => e.linkKey().value() === t))(e)).length) return; const s = z(e, t.model, t.point.timeStamp); if (null === s) return; const r = { index: s, price: t.point.price }; e.moveSources({ logical: r }, t.pointPositionPercents, null === t.envState ? void 0 : t.envState, !0) }) }), P.finishedMovingLineTool.subscribe(null, t => { e(t, (e, i) => { const s = e.sourcesBeingMoved().filter(_.isLineTool); if (0 === s.length) return; s.forEach(i => { const s = (e => { for (let i = 0; i < t.linkKeys .length; i++) if (t.linkKeys[i] === e .linkKey().value()) return { state: t.finalStates[i], changes: t.changes[i] }; return null })(i); e.endMovingSources(null !== s, !0), null !== s && (i.restoreExternalPoints(s.state, s .changes), s.state .pointPositionPercents && i .restorePositionPercents(s.state .pointPositionPercents)) }) }) }), P.startedChangingLineTool.subscribe(null, t => { e(t, (e, i) => { const s = Object(_.lineToolByLinkKey)(e, t.linkKey); if (null !== s) { const i = s.getPoint(t.pointIndex), r = i ? i.index : z(e, t.model, t.point.timeStamp); if (null === r) return; if (s.isActualSymbol() && s.isActualCurrency() && s .isActualUnit()) { const i = { index: r, price: t.point.price }; e.startChangingLinetool(s, i, t.pointIndex, null === t.envState ? void 0 : t.envState, !0) } } }) }), P.changedLineTool.subscribe(null, t => { e(t, (e, i) => { const r = e.lineBeingEdited(); if (null === r || r.linkKey().value() !== t.linkKey) return; let n = null; if (n = t.changes.indexesChanged ? z(e, t.model, t.point .timeStamp) : Object(s.ensureNotNull)(e .linePointBeingChanged()).index, null !== n && r .isActualSymbol() && r.isActualCurrency() && r .isActualUnit()) { const i = { index: n, price: t.point.price }; e.changeLinePoint(i, void 0, !0) } }) }), P.finishedChangingLineTool.subscribe(null, t => { e(t, (e, i) => { const s = Object(_.lineToolByLinkKey)(e, t.linkKey); null !== s && s.isActualSymbol() && s.isActualCurrency() && s.isActualUnit() && null !== e.lineBeingEdited() && e .endChangingLinetool(!!t.finalState, !0), null !== s && t.finalState && s.restoreExternalPoints(t.finalState, t .changes) }) }), P.removedLineTool.subscribe(null, t => { e(t, (e, i) => { const s = Object(_.lineToolByLinkKey)(e, t.linkKey), { withUndo: r } = t; if (null !== s) r ? i.removeSource(s, !1) : e.removeSource( s); else if (this._lineToolsSynchronizer) { const { sourceTitle: e, linkKey: s, symbol: n, lineToolState: o } = t; i.removeUnloadedLineTool(this._lineToolsSynchronizer, e, s, n, o, r) } }) }), P.finishedLineTool.subscribe(null, t => { e(t, (e, i) => { const s = Object(_.lineToolByLinkKey)(e, t.linkKey); null !== s && Object(_.isLineDrawnWithPressedButton)(s .toolname) && s.finish() }) }), P.changedLineStyle.subscribe(null, t => { e(t, (e, i) => { const s = Object(_.lineToolByLinkKey)(e, t.linkKey); null !== s && (s.restoreExternalState(t.state), s .propertiesChanged(!0)) }) }), P.restoredLineToolState.subscribe(null, t => { e(t, (e, i) => { const s = Object(_.lineToolByLinkKey)(e, t.linkKey); if (null !== s) { const i = { ...t.state }; i.indexes = t.state.points.map(i => ({ index: z(e, t.model, i.time_t), price: i.price })), e.restoreLineToolState(s, i) } }) }), P.restoredLineTool.subscribe(null, t => { e(t, (e, i) => { e.restoreSource(t.state.restorePane, t.state.paneIndex, t .state.paneState, t.state.sourceState, null) }) }), P.copiedLineTool.subscribe(null, t => { e(t, (e, i) => { const r = Object(s.ensureNotNull)(e.paneForSource(e .mainSeries())); let n; const o = Object(_.createLineToolProperties)(t.linetool, t .state); if (t.pointPositionPercents) { const e = { index: 0, price: 0 }; if (n = i.createLineTool(r, e, t.linetool, o, t.linkKey, void 0, !0), null === n) return; n.restorePositionPercents(Object(s.ensureDefined)(t .pointPositionPercents)) } else { const a = t.points.map(i => ({ index: Object(s.ensureNotNull)(z(e, t .model, i.timeStamp)), price: i.price })), l = a[0]; if (n = i.createLineTool(r, l, t.linetool, o, t.linkKey, void 0, !0), null === n) return; if (e.lineBeingCreated()) for (let e = 1; e < a.length; e++) e !== a.length - 1 || !Object(_.isLineDrawnWithPressedButton)(t .linetool) && "LineToolGhostFeed" !== t .linetool || n.finish(), i.continueCreatingLine( a[e], new C.a(void 0), e < a.length - 1, !0) } n.properties().interval.setValue(t.state.interval), n .restoreExternalState(t.state), n.restoreData && n .restoreData(t), n.propertiesChanged(!0), t .finalState && (n.calcIsActualSymbol(), n .restoreExternalPoints(t.finalState, { pricesChanged: !0, indexesChanged: !0 })) }) }) } } }, wptU: function(e, t, i) { "use strict"; i.r(t); i("e3/o"); const s = []; let r = null; function n(e) { for (let t = 0; t < s.length; t++) if (s[t].name === e) return t; return -1 } function o(e) { if (!r) for (let t = s.length - 1; t >= 0 && !0 !== s[t].func(e); t--); } window.addEventListener("keypress", o, !1); var a = i("h24c"), l = i("Kxc7"), c = i("JpbW"), h = i("6KAu"), u = i("FA0h"), d = i("JWMC"); i.d(t, "activateKeyPressHandler", (function() { return m })), i.d(t, "showDialog", (function() { return f })); let p = null; function _(e) { if (!Object(a.b)(e)) return !1; e.preventDefault(); const t = String.fromCharCode(e.charCode); return l.enabled("show_interval_dialog_on_key_press") && function(e) { return /[\d]/.test(e) }(t) ? Object(c.showChangeIntervalDialogAsync)({ initVal: t }) : l.enabled("symbol_search_hot_key") && (f({ defaultValue: t, selectSearchOnInit: !1, source: "keyboard" }), Object(d.trackEvent)("GUI", "SS", "hotkey")), !0 } function m() { Object(h.a)(), function(e, t) { const i = { name: e, func: t }, r = n(i.name); r > -1 && s.splice(r, 1), s.unshift(i) }("symbolEdit", _) } function f(e) { const t = p = Object(u.a)().then(i => { t === p && i.showDefaultSearchDialog(e) }); return t } }, ww0J: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return l })); var s = i("X0WL"), r = i("bmVy"); const n = { NONE: "Default" }, o = window.t("No volume data"), a = new Map; class l extends s.a { constructor(e, t) { super(t), this._source = e } getSplitTitle() { return this._source.titleInParts(!0, n, void 0, !1) } text() { return this._source.isActualInterval() ? this._source.isFailed() ? `${this._source.title(!0, n, void 0, !1)}: ${this.sourceStatusText()}` : `${this._source.title(!0, n, void 0, !1)} ${this.sourceStatusText()}` : this ._source.title(!0, n, void 0, !1) } sourceStatusText() { return Object(r.convertStudyStatusToString)(this._source.status(), !0) } sourceStatusSolutionId() { const e = this._source.status(); if (e.type === r.StudyStatusType.Error) return e.errorDescription.solution_id ? e.errorDescription.solution_id : function(e) { for (const t of Array.from(a.keys())) if (e.includes(t)) return a.get(t) }(e.errorDescription.error) } errorStatus() { if (!this._source.isActualInterval() || this._source.isSymbolInvalid()) return null; return this._source.status().type === r.StudyStatusType.Error ? { error: this.sourceStatusText(), solutionId: this.sourceStatusSolutionId(), title: this.sourceStatusTitle() } : null } sourceStatusTitle() { const e = this._source.status(); if (e.type === r.StudyStatusType.Error) return -1 !== e.errorDescription.error .toLowerCase().indexOf( "the data vendor doesn't provide volume data for this symbol.") ? o : void 0 } } }, x0JF: function(e, t, i) { "use strict"; var s = i("aO4+").Point, r = i("vq8G").SelectionRenderer, n = i("VdBB").HitTestResult, o = i("29fS").PaneRendererBars, a = i("gyZD").PaneRendererLine, l = i("Zp8I").PaneRendererStepLine, c = i("u0yd").PaneRendererArea, h = i("/hKg").PaneRendererCandles, u = i("M7/j").PaneRendererBaseline, d = i("Zy3/").CompositeRenderer, p = i("Tmoa"), _ = i("k9/m").PlotRowSearchMode, m = i("Kxc7"), f = i("Zp/P"), g = i("o2pV").SelectionIndexes; function b(e, t) { this.m_series = e, this.m_model = t, this.m_bars = [], this._invalidated = !0, this ._isMarkersEnabled = m.enabled("source_selection_markers"), this._selectionData = null, this._selectionIndexer = new g(t.timeScale()) } function v(e, t) { return void 0 !== e[TradingView.OPEN_PLOT] && void 0 !== e[TradingView.HIGH_PLOT] && void 0 !== e[TradingView.LOW_PLOT] && void 0 !== e[TradingView.CLOSE_PLOT] && (t.open = e[TradingView.OPEN_PLOT], t.high = e[TradingView.HIGH_PLOT], t.low = e[TradingView .LOW_PLOT], t.close = e[TradingView.CLOSE_PLOT], !0) } function S(e, t) { b.call(this, e, t) } function y(e, t) { b.call(this, e, t) } function w(e, t) { b.call(this, e, t) } function P(e, t) { b.call(this, e, t) } function C(e, t) { this.m_series = e, this.m_model = t, this.m_items = [], this._isMarkersEnabled = m.enabled( "source_selection_markers"), this._selectionIndexer = new g(t.timeScale()) } function x(e, t) { C.call(this, e, t), this._invaidated = !0 } function T(e, t) { C.call(this, e, t), this._invaidated = !0 } function I(e, t) { C.call(this, e, t), this._invaidated = !0, this._renderer = new u } b.prototype._series = function() { return this.m_series }, b.prototype._model = function() { return this.m_model }, b.prototype._bars = function() { return this.m_bars }, b.prototype.update = function() { this._invalidated = !0 }, b.prototype._updateImpl = function(e) { var t = this; if ((e = e || v, this.m_bars = [], !this.m_model.timeScale().isEmpty() && !this.m_series .priceScale().isEmpty()) && (null !== (a = this.m_model.timeScale() .visibleBarsStrictRange()) && 0 !== this.m_series.bars().size())) { for (var i = this.m_series.nearestIndex(a.firstBar(), _.NearestRight), r = this .m_series.nearestIndex(a.lastBar(), _.NearestLeft); i <= r; i++) { if (null !== this.m_series.bars().valueAt(i)) break } if (!(i > r)) { var o, a = this.m_series.bars().range(i, r), l = this.m_series.priceScale(), c = this.m_series.barColorer(), h = {}; if (a.each((function(i, s) { var r, n = {}; (n.time = Math.round(i), e(s, n)) && (h.value = s, r = s[ TradingView.STYLE_PLOT] ? s[TradingView.STYLE_PLOT] : c .barStyle(i, !1, h), s[TradingView.STYLE_PLOT] = r, h .previousValue = s, n.color = r.barColor, n.borderColor = r .barBorderColor, n.wickColor = r.barWickColor, n.hollow = r .isBarHollow, t.m_bars.push(n)) }), this), 0 !== this.m_bars.length && (o = this.m_series.firstValue(), l .barPricesToCoordinates(this.m_bars, o)), this.m_model.timeScale() .barIndexesToCoordinates(this.m_bars), this.m_model.selection().isSelected( this.m_series)) { var u = this._selectionIndexer.indexes(); this._selectionData = { points: [], bgColors: [], visible: !0 }; var d = this.m_model.paneForSource(this.m_series).height(); this._selectionData.hittestResult = n.REGULAR; for (var p = 0; p < u.length; p++) { var m = u[p], f = this.m_series.bars().valueAt(m); if (null !== f) { var g = .5 * (f[TradingView.OPEN_PLOT] + f[TradingView.CLOSE_PLOT]), b = this.m_model.timeScale().indexToCoordinate(m), S = this.m_series.priceScale().priceToCoordinate(g, o); this._selectionData.points.push(new s(b, S)), this._selectionData .bgColors.push(this.m_model.backgroundColorAtYPercentFromTop(S / d)) } } } else this._selectionIndexer.clear() } } }, b.prototype.items = function() { return this.m_bars }, inherit(S, b), S.prototype.renderer = function() { this._invalidated && (this._updateImpl(), this._invalidated = !1); var e = {}; e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(); var t = this.m_series.properties(); e.dontDrawOpen = t.barStyle.dontDrawOpen.value(), e.thinBars = t.style.value() === TradingView.Series.STYLE_RANGE ? t.rangeStyle.thinBars.value() : t.barStyle.thinBars .value(); var i = new d; return i.append(new o(e)), this.m_model.selection().isSelected(this.m_series) && this ._isMarkersEnabled && i.append(new r(this._selectionData)), i }, inherit(y, b), y.prototype.renderer = function() { this._invalidated && (this._updateImpl(), this._invalidated = !1); var e = {}; e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e .wickVisible = this.m_series.properties().candleStyle.drawWick.value(), e .bodyVisible = this.m_series.properties().candleStyle.drawBody.value(), e .borderVisible = this.m_series.properties().candleStyle.drawBorder.value(), e .borderColor = this.m_series.properties().candleStyle.borderColor.value(), e .wickColor = this.m_series.properties().candleStyle.wickColor.value(), e.barWidth = f.optimalBarWidth(e.barSpacing); var t = new d; return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this ._isMarkersEnabled && t.append(new r(this._selectionData)), t }, inherit(w, b), w.prototype.renderer = function() { this._invalidated && (this._updateImpl(), this._invalidated = !1); var e = {}; e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e .wickVisible = this.m_series.properties().haStyle.drawWick.value(), e.bodyVisible = this.m_series.properties().haStyle.drawBody.value(), e.borderVisible = this.m_series .properties().haStyle.drawBorder.value(), e.borderColor = this.m_series.properties() .haStyle.borderColor.value(), e.wickColor = this.m_series.properties().haStyle .wickColor.value(), e.barWidth = f.optimalBarWidth(e.barSpacing); var t = new d; return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this ._isMarkersEnabled && t.append(new r(this._selectionData)), t }, inherit(P, b), P.prototype.renderer = function() { this._invalidated && (this._updateImpl(), this._invalidated = !1); var e = {}; e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e .wickVisible = this.m_series.properties().hollowCandleStyle.drawWick.value(), e .bodyVisible = this.m_series.properties().hollowCandleStyle.drawBody.value(), e .borderVisible = this.m_series.properties().hollowCandleStyle.drawBorder.value(), e .borderColor = this.m_series.properties().hollowCandleStyle.borderColor.value(), e .wickColor = this.m_series.properties().hollowCandleStyle.wickColor.value(), e .barWidth = f.optimalBarWidth(e.barSpacing); var t = new d; return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this._isMarkersEnabled && t .append(new r(this._selectionData)), t }, C.prototype.update = function() { if (this.m_items = [], this.m_model.timeScale().isEmpty() || !this.m_series .priceScale() || this.m_series.priceScale().isEmpty()) return; const e = this.m_model.timeScale().visibleBarsStrictRange(); if (null === e) return; if (0 === this.m_series.bars().size()) return; var t = this.m_series.nearestIndex(e.firstBar() - 1, _.NearestLeft), i = this.m_series.nearestIndex(e.lastBar() + 1, _.NearestRight); const r = this.m_series.bars().range(t, i); var o = this.m_series.priceScale(), a = { color: this.m_series.properties().lineStyle.color.value() }, l = this.m_series.barFunction(); let c; if (r.each(function(t, i) { var r = l(i); if (null == r) return !1; void 0 === c && e.contains(t) && (c = r); var n = new s(t, r); return n.style = a, this.m_items.push(n), !1 }.bind(this)), o.pointsArrayToCoordinates(this.m_items, c), this.m_model.timeScale() .timedValuesToCoordinates(this.m_items), this.m_model.selection().isSelected(this .m_series)) { var h = this._selectionIndexer.indexes(); this._selectionData = { points: [], isDark: this.m_model.isDark(), bgColors: [], visible: !0 }; var u = this.m_model.paneForSource(this.m_series).height(); this._selectionData.hittestResult = n.REGULAR; for (var d = 0; d < h.length; d++) { var p = h[d], m = this.m_series.data().valueAt(p); if (null !== m) { var f = l(m), g = this.m_model.timeScale().indexToCoordinate(p), b = this.m_series.priceScale().priceToCoordinate(f, c); this._selectionData.points.push(new s(g, b)), this._selectionData.bgColors .push(this.m_model.backgroundColorAtYPercentFromTop(b / u)) } } } else this._selectionIndexer.clear() }, inherit(x, C), x.prototype.update = function() { this._invalidated = !0 }, x.prototype.renderer = function() { this._invalidated && (C.prototype.update.call(this), this._invalidated = !1); var e, t, i = this.m_series.properties().lineStyle, s = { barSpacing: this.m_model.timeScale().barSpacing(), items: this.m_items, lineColor: i.color.value(), lineStyle: i.linestyle.value(), withMarkers: i.styleType.value() === TradingView.Series.STYLE_LINE_TYPE_MARKERS, lineWidth: i.linewidth.value(), simpleMode: !0 }; return i.styleType.value() === TradingView.Series.STYLE_LINE_TYPE_STEP ? (e = new l) .setData(s) : e = new a(s), this.m_model.selection().isSelected(this.m_series) ? (( t = new d).append(e), this._isMarkersEnabled && t.append(new r(this ._selectionData))) : t = e, t }, inherit(T, C), T.prototype.update = function() { this._invalidated = !0 }, T.prototype.renderer = function() { this._invalidated && (C.prototype.update.call(this), this._invalidated = !1); var e = { simpleMode: !1 }; e.barSpacing = this.m_model.timeScale().barSpacing(), e.items = this.m_items, e .lineColor = this.m_series.properties().areaStyle.linecolor.value(), e.lineStyle = this.m_series.properties().areaStyle.linestyle.value(), e.lineWidth = this.m_series .properties().areaStyle.linewidth.value(); var t = this.m_series.properties().areaStyle.transparency.value(); e.isSeries = !0, e.color1 = p.generateColor(this.m_series.properties().areaStyle.color1 .value(), t), e.color2 = p.generateColor(this.m_series.properties().areaStyle .color2.value(), t), e.bottom = this.m_series.priceScale().height(); var i = new d; return i.append(new c(e)), this.m_model.selection().isSelected(this.m_series) && this ._isMarkersEnabled && i.append(new r(this._selectionData)), i }, inherit(I, C), I.prototype.update = function() { this._invalidated = !0 }, I.prototype._updateImpl = function() { C.prototype.update.call(this); var e = this.m_series.properties().baselineStyle, t = e.transparency.value(); this._topFillColor1 = p.generateColor(e.topFillColor1.value(), t), this._topFillColor2 = p.generateColor(e.topFillColor2.value(), t), this._bottomFillColor1 = p .generateColor(e.bottomFillColor1.value(), t), this._bottomFillColor2 = p .generateColor(e.bottomFillColor2.value(), t), this._topLineColor = e.topLineColor .value(), this._bottomLineColor = e.bottomLineColor.value(), this._topLineWidth = e .topLineWidth.value(), this._bottomLineWidth = e.bottomLineWidth.value(), this ._barSpacing = this.m_model.timeScale().barSpacing(), this._bottom = this.m_series .priceScale().height(), this._baseLevelCoordinate = Math.round(this._bottom * (Math .abs(100 - e.baseLevelPercentage.value()) / 100)) }, I.prototype.renderer = function() { this._invalidated && (this._updateImpl(), this._invalidated = !1), this._renderer .setData({ items: this.m_items, topFillColor1: this._topFillColor1, topFillColor2: this._topFillColor2, bottomFillColor1: this._bottomFillColor1, bottomFillColor2: this._bottomFillColor2, topLineColor: this._topLineColor, bottomLineColor: this._bottomLineColor, topLineWidth: this._topLineWidth, bottomLineWidth: this._bottomLineWidth, lineStyle: CanvasEx.LINESTYLE_SOLID, barSpacing: this._barSpacing, baseLevelCoordinate: this._baseLevelCoordinate, bottom: this._bottom }); var e = new d; return e.append(this._renderer), this.m_model.selection().isSelected(this.m_series) && e .append(new r(this._selectionData)), e }, t.SeriesBarsPaneView = S, t.SeriesCandlesPaneView = y, t.SeriesHollowCandlesPaneView = P, t.SeriesLinePaneView = x, t.SeriesAreaPaneView = T, t.SeriesHeikenAshiPaneView = w, t .SeriesBaselinePaneView = I, t.SeriesBarCandlesPaneView = b }, "x2L+": function(e, t, i) { "use strict"; i.d(t, "b", (function() { return o })), i.d(t, "a", (function() { return a })); var s = i("m/cY"), r = i("Vdly"); function n() { return r.getBool("Chart.ShowMarketOpenStatus", !0) } const o = Object(s.a)(n()); function a() { o.setValue(!0), r.remove("Chart.ShowMarketOpenStatus") } r.onSync.subscribe(null, () => o.setValue(n())), o.subscribe(null, () => r.setValue( "Chart.ShowMarketOpenStatus", o.value())) }, x5Tw: function(e, t, i) { "use strict"; i.r(t), i.d(t, "setupChartEventHint", (function() { return u })); var s = i("Eyy1"), r = i("YFKU"), n = i("Vdly"), o = i("mMWL"), a = i("e92V"), l = i("qFKp"), c = i("/3z9"), h = i("Kxc7"); function u(e, t = !1) { if (!h.enabled("popup_hints")) return; const u = e.getContainer(); let d = null, p = null; function _(e, t, r) { if (d) d.show(e, r ? void 0 : m.bind(null, t)); else { const n = o.tool.value(); Promise.all([i.e("react"), i.e(89), i.e("chart-event-hint")]).then(i.bind(null, "PN5r")).then(i => { d = new i.ChartEventHintRenderer(Object(s.ensureNotNull)(u)), n === o .tool.value() && d.show(e, r ? void 0 : m.bind(null, t)) }) } } function m(e) { n.setValue(e, !0, { forceFlush: !0 }), Object(s.ensureNotNull)(d).destroy(), null !== p && p(), d = null } o.tool.subscribe((function() { if (Boolean(n.getBool("hint.touchPainting"))) return; const e = o.tool.value(); Object(a.isStudyLineToolName)(e) && "LineToolRegressionTrend" !== e && !l .CheckMobile.any() ? _(Object(r.t)("Click to set a point"), "hint.touchPainting") : l.CheckMobile.any() && !Object(a .isLineDrawnWithPressedButton)(e) && Object(a.isLineToolName)(e) ? _(Object(r.t)( "Move the point to position the anchor then tap to place"), "hint.touchPainting") : d && d.hide() })), o.createdLineTool.subscribe(null, (function() { const e = o.tool.value(); "LineToolPath" !== e || Boolean(n.getBool( "hint.finishBuildPathByDblClick")) ? "LineToolPolyline" !== e || Boolean(n.getBool("hint.finishBuildPolylineByDblClick")) || _(Object(r .t)("Double-click to finish Polyline"), "hint.finishBuildPolylineByDblClick") : _(Object(r.t)( "Double-click to finish Path"), "hint.finishBuildPathByDblClick") })), o.finishedLineTool.subscribe(null, (function() { if (d) { const e = o.tool.value(); "LineToolPath" === e ? m("hint.finishBuildPathByDblClick") : "LineToolPolyline" === e && m("hint.finishBuildPolylineByDblClick") } })), t || l.CheckMobile.any() || Boolean(n.getBool("hint.startFocusedZoom")) || (p = function(e, t) { let i = !1; const s = r => { r ? (i && t(r), e.onZoom().unsubscribe(null, s)) : i || (t(r), i = !0) }; return e.onZoom().subscribe(null, s), () => e.onZoom().unsubscribe(null, s) }(e, (function(e) { if (Boolean(n.getBool("hint.startFocusedZoom"))) return; if (e) d && (p = null, m("hint.startFocusedZoom")); else { const e = c.isMacKeyboard ? "⌘" : "Ctrl"; _(Object(r.t)( "Press and hold {key} while zooming to maintain the chart position" ).format({ key: e }), "hint.startFocusedZoom") } }))) } }, x8jL: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("MY2c"), n = i("bOGh"), o = i("RDU5"); class a extends o.UndoCommand { constructor(e, t, i) { super(i), this._wv = e, this._newValue = t, this._oldValue = e.value() } redo() { this._wv.setValue(this._newValue) } undo() { this._wv.setValue(this._oldValue) } } var l = i("txPx"), c = i("aIyQ"), h = i.n(c); i.d(t, "createUndoHistory", (function() { return d })); const u = Object(l.getLogger)("Common.UndoHistory"); function d() { const e = [], t = new r.a, i = new r.a, o = new h.a; function l(s) { if (e.length > 0) e[e.length - 1].addCommand(s); else { i.clear(); const e = t.head(), r = e && e.text(); e && e.canMerge(s) ? e.merge(s) : t.push(s); const n = s.text(); "" !== n && n !== r && u.logNormal("DO: " + n) } s.executeOnPush() && s.redo(), e.length || o.fire(c()) } function c() { const e = t.head(), s = i.head(); return { enableUndo: !t.isEmpty(), undoText: void 0 === e ? void 0 : e.text(), enableRedo: !i.isEmpty(), redoText: void 0 === s ? void 0 : s.text() } } return { beginUndoMacro: function(t) { const i = new n.a(t); return e.push(i), i }, clearStack: function() { t.clear(), i.clear(), o.fire(c()) }, createUndoCheckpoint: function() { return { lastActualCommand: t.isEmpty() ? null : t.head() } }, endUndoMacro: function() { const t = Object(s.ensureDefined)(e.pop()); t.isEmpty() || l(t) }, pushUndoCommand: l, redo: function() { if (i.isEmpty()) return !1; const e = i.pop(); return !!e && (e.redo(), t.push(e), u.logNormal("REDO: " + e.text()), o.fire( c()), !0) }, redoStack: function() { return i }, setWatchedValue: function(e, t, i) { if (e.value() !== t) { const s = new a(e, t, i); l(s), s.redo() } }, undo: function() { if (t.isEmpty()) return !1; const e = t.pop(); return !!e && (e.undo(), i.push(e), u.logNormal("UNDO: " + e.text()), o.fire(c()), !0) }, undoStack: function() { return t }, undoToCheckpoint: function(e) { for (; !t.isEmpty() && e.lastActualCommand !== t.head();) t.pop().undo(); i.clear(), o.fire(c()) }, state: c, onChange: function() { return o } } } }, xCUR: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return n })), i.d(t, "a", (function() { return o })); var s = i("n5al"), r = i("/tGj"); function n(e) { const t = e.priceScale(); return !(null === t || !t.isPercentage()) && (!Object(r.isSymbolSource)(e) || Object(s .isPriceSourceStyle)(e.style())) } function o(e) { const t = e.priceScale(); if (n(e) && null !== t) return i => { var s; return t.formatPricePercentage(i, null !== (s = e.firstValue()) && void 0 !== s ? s : 100) }; const i = e.formatter(); return i.format.bind(i) } }, xDuj: function(e, t, i) { "use strict"; i.r(t), i.d(t, "translatedIntervalString", (function() { return r })); i("YFKU"); var s = i("pPtI"); function r(e) { const t = Object(s.getTranslatedResolutionModel)(e, !0); return null === t ? e : t.multiplier + (t.mayOmitShortKind ? "" : t.shortKind) } }, xWfy: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return c })), i.d(t, "b", (function() { return p })), i.d(t, "c", (function() { return _ })), i.d(t, "d", (function() { return m })); var s = i("tqok"), r = i("fFKx"), n = i("SqfW"), o = i("KG+6"), a = i("5vwb"), l = i("7Fue"); class c { constructor(e, t) { if (this._indexes = [], this._horizlines = new Map, this._vertlines = new Map, this ._lines = new Map, this._hlines = new Map, this._textmarks = new Map, this ._shapemarks = new Map, this._backgrounds = new Map, this._polygons = new Map, this._trendchannels = new Map, this._hhists = new Map, this._dwglabels = new Map, this._dwglines = new Map, this._dwgboxes = new Map, this._dwgtables = new Map, this._dwgtablecells = new Map, "data" === e) { const e = t; this._indexes = e.indexes, this._vertlines = h(e.vertlines, this._indexes, n.b), this._horizlines = h(e.horizlines, this._indexes, r.b), this._polygons = h(e .polygons, this._indexes, a.b), this._hhists = h(e.hhists, this ._indexes, o.d) } else if ("state" === e) { const e = t; this._indexes = e.indexes || [], this._vertlines = u(e.vertlines, this._indexes, n.b), this._horizlines = u(e.horizlines, this._indexes, r.b), this ._polygons = u(e.polygons, this._indexes, a.b), this._hhists = u(e.hhists, this._indexes, o.d) } this._hhistsByTimePointIndex = Object(l.b)(this._hhists) } horizlines() { return this._horizlines } vertlines() { return this._vertlines } lines() { return this._lines } hlines() { return this._hlines } textmarks() { return this._textmarks } shapemarks() { return this._shapemarks } backgrounds() { return this._backgrounds } polygons() { return this._polygons } trendchannels() { return this._trendchannels } hhists() { return this._hhists } dwglabels() { return this._dwglabels } dwglines() { return this._dwglines } dwgboxes() { return this._dwgboxes } dwgtables() { return this._dwgtables } dwgtablecells() { return this._dwgtablecells } hhistsByTimePointIndex() { return this._hhistsByTimePointIndex } } function h(e, t, i) { const s = new Map; return e.forEach((e, r) => { const n = s.get(r) || new Set; e.forEach(e => { const s = i(e, t); null !== s && n.add(s) }), s.set(r, n) }), s } function u(e, t, i) { const s = new Map; if (void 0 === e) return s; for (const r of e) { const e = r.styleId, n = s.get(e) || new Set; r.data.forEach(e => { const s = i(e, t); null !== s && n.add(s) }), s.set(e, n) } return s } function d(e, t, i, s) { const r = []; return e.forEach((e, n) => { e.forEach(e => { ! function(e, t, i) { let s = null; for (const i of e) i.styleId === t && (s = i); null === s && (s = { styleId: t, data: [] }, e.push(s)), s.data.push(i) }(r, n, s(e, t(e), i)) }) }), r.length > 0 ? r : void 0 } function p() { return new c } function _(e) { return new c("state", e) } function m(e) { const t = function(e) { const t = new Set; e.horizlines().forEach((e, i) => { e.forEach(e => { t.add(e.startIndex), t.add(e.endIndex) }) }), e.vertlines().forEach((e, i) => { e.forEach(e => { t.add(e.index) }) }), e.lines().forEach((e, i) => { e.forEach(e => { t.add(e.startIndex), t.add(e.endIndex) }) }), e.textmarks().forEach((e, i) => { e.forEach(e => { t.add(e.time) }) }), e.shapemarks().forEach((e, i) => { e.forEach(e => { t.add(e.time) }) }), e.backgrounds().forEach((e, i) => { e.forEach(e => { t.add(null !== e.start ? e.start : s .INVALID_TIME_POINT_INDEX), t.add(e.stop) }) }), e.polygons().forEach((e, i) => { e.forEach(e => { e.points.forEach(e => { t.add(e.index) }) }) }), e.trendchannels().forEach((e, i) => { e.forEach(e => { t.add(e.startIndex), t.add(e.endIndex) }) }), e.hhists().forEach((e, i) => { e.forEach(e => { t.add(e.firstBarTime), t.add(e.lastBarTime) }) }), e.dwglabels().forEach((e, i) => { e.forEach(e => { t.add(e.x) }) }), e.dwglines().forEach((e, i) => { e.forEach(e => { var i, r; t.add(null !== (i = e.x1) && void 0 !== i ? i : s .INVALID_TIME_POINT_INDEX), t.add(null !== (r = e .x2) && void 0 !== r ? r : s .INVALID_TIME_POINT_INDEX) }) }), e.dwgboxes().forEach((e, i) => { e.forEach(e => { var i, r; t.add(null !== (i = e.left) && void 0 !== i ? i : s .INVALID_TIME_POINT_INDEX), t.add(null !== (r = e .right) && void 0 !== r ? r : s .INVALID_TIME_POINT_INDEX) }) }); const i = Array.from(t); return i.sort((e, t) => e - t), i }(e), i = { indexes: t }; let l = 0; const c = () => ++l; return i.vertlines = d(e.vertlines(), c, t, n.a), i.horizlines = d(e.horizlines(), c, t, r .a), i.polygons = d(e.polygons(), c, t, a.a), i.hhists = d(e.hhists(), c, t, o.c), i } }, xdS3: function(e, t, i) {}, xnA2: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX").LineToolColorsProperty; class o extends s { constructor(e, t) { super(e, t || o.createProperties()), this.version = o.version, i.e("lt-pane-views") .then(i.t.bind(null, "CR3a", 7)).then(({ FibChannelPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return o.LevelsCount } migrateVersion(e, t, i) { i.properties.removeProperty("reverse") } pointsCount() { return 3 } name() { return "Fib Channel" } processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "17v9"))) .FibDrawingsWith24LevelsDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolfibchannel", e, !1, { range: [1, 24], names: ["coeff", "color", "visible"] }); return o._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); var t = []; for (let i = 1; i <= o.LevelsCount; i++) t.push(e.child("level" + i).child( "color")); e.addChild("linesColors", new n(t)), e.addExclusion("linesColors") } } o.LevelsCount = 24, o.version = 2, t.LineToolFibChannel = o }, xo8u: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return o })); var s = i("Eyy1"), r = i("RDU5"), n = i("n5al"); class o extends r.UndoCommand { constructor(e, t, i, r) { super(r), this._newSourcesCurrencies = new Map, this._oldSourcesCurrencies = new Map, this._showFade = !1, this._chartWidget = i; const o = i.model().mainSeries(); for (const i of e.seriesLikeSources()) { if (!i.isVisible()) continue; const e = t || Object(n.symbolOriginalCurrency)(Object(s.ensureNotNull)(i .symbolInfo())); this._newSourcesCurrencies.set(i.id(), e), this._oldSourcesCurrencies.set(i .id(), i.currency()), this._showFade = this._showFade || i === o && i.currency() !== e } } redo() { this._applyCurrencies(this._newSourcesCurrencies) } undo() { this._applyCurrencies(this._oldSourcesCurrencies) } _applyCurrencies(e) { this._showFade && this._chartWidget.screen.show(); const t = this._chartWidget.model().model(); e.forEach((e, i) => { Object(s.ensureNotNull)(t.dataSourceForId(i)).setCurrency(e) }), this._chartWidget.model().selectionMacro(e => { e.clearSelection() }) } } }, xrEm: function(e, t, i) {}, xt3Q: function(e, t, i) { "use strict"; i.r(t), i.d(t, "TradingViewApiBase", (function() { return s })); class s { constructor(e) { this._studyTemplatesDrawer = null; const { chartApiInstance: t, chartWidgetCollection: i, studyMarket: s, financialsDialog: r, saveChartService: n, loadChartService: o } = e; this._chartWidgetCollection = i, this._studyMarket = s, this._financialsDialog = r, this._saveChartService = n, this._loadChartLayoutDialog = o, this ._intervalsService = null } dialogs() { var e, t, i, s, r, n; return { Indicators: this._studyMarket, Financials: this._financialsDialog, Compare: this._chartWidgetCollection.getCompareDialogRenderer(), ObjectsTree: null, ChartProperties: this._chartWidgetCollection.getChartPropertiesDialogRenderer(), ChartLayoutSaveAs: null !== (t = null === (e = this._saveChartService) || void 0 === e ? void 0 : e.getSaveAsController()) && void 0 !== t ? t : null, ChartLayoutRename: null !== (s = null === (i = this._saveChartService) || void 0 === i ? void 0 : i.getRenameController()) && void 0 !== s ? s : null, ChartLayoutCreate: null !== (n = null === (r = this._saveChartService) || void 0 === r ? void 0 : r.getCreateController()) && void 0 !== n ? n : null, ChartLayoutLoad: this._loadChartLayoutDialog } } studyTemplatesDrawerApi() { throw new Error("not implemented") } intervalsService() { throw new Error("not implemented") } setBrokerName(e) { this._chartWidgetCollection.setBroker(e) } } }, "xz+e": function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("7KDR").Action, n = i("Ocx9").DefaultProperty, o = i("j3hX").LineToolColorsProperty, a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], l = [{ value: a[0], title: window.t("Supermillennium") }, { value: a[1], title: window.t("Millennium") }, { value: a[2], title: window.t("Submillennium") }, { value: a[3], title: window.t("Grand Supercycle") }, { value: a[4], title: window.t("Supercycle") }, { value: a[5], title: window.t("Cycle") }, { value: a[6], title: window.t("Primary") }, { value: a[7], title: window.t("Intermediate") }, { value: a[8], title: window.t("Minor", { context: "wave" }) }, { value: a[9], title: window.t("Minute", { context: "wave" }) }, { value: a[10], title: window.t("Minuette") }, { value: a[11], title: window.t("Subminuette") }, { value: a[12], title: window.t("Micro") }, { value: a[13], title: window.t("Submicro") }, { value: a[14], title: window.t("Minuscule") }]; class c extends s { constructor(e, t) { super(e, t || c.createProperties()), this.version = c.version, i.e("lt-pane-views") .then(i.t.bind(null, "Ht/7", 7)).then(({ ElliottLabelsPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } static migrateState(e) { var t = { 0: 11, 1: 10, 2: 9, 3: 8, 4: 7, 5: 6, 6: 5, 7: 4, 8: 3 }, i = { 0: 11, 1: 8 }; "LineToolElliottSubminuette" === e.type && (e.type = "LineToolElliottImpulse", e .state.degree = t[e.state.wavesize]), "LineToolElliottMinor" === e.type && ( e.type = "LineToolElliottImpulse", e.state.degree = t[e.state.wavesize]), "LineToolElliottCircle" === e.type && (e.type = "LineToolElliottImpulse", e .state.degree = t[e.state.wavesize]), "LineToolElliottMinorRetr" === e .type && (e.type = "LineToolElliottCorrection", e.state.degree = i[e.state .wavesize]), "LineToolElliottMajorRetr" === e.type && (e.type = "LineToolElliottCorrection", e.state.degree = i[e.state.wavesize]) } migrateVersion(e, t, i) { if (i.properties.hasChild("background") && i.properties.removeProperty( "background"), i.properties.hasChild("backgroundColor") && i.properties .removeProperty("backgroundColor"), i.properties.hasChild("showBackground") && i .properties.removeProperty("showBackground"), 1 === e) { var s = Object.assign({}, this._timePoint[0]); this._timePoint.unshift(s), this._points.length > 0 && (s = Object.assign({}, this._points[0]), this._points.unshift(s)) } } applyTemplate(e) { delete e.background, delete e.backgroundColor, delete e.showBackground, super .applyTemplate(e) } name() { return "Elliott Labels" } additionalActions(e) { var t = this; return [new r({ label: window.t("Degree"), subItems: a.map((function(i) { var s = l.filter((function(e) { return e.value === i }))[0]; return new r({ label: s.title, checkable: !0, checked: t.properties().degree .value() === i, onExecute: function() { e.setProperty(t.properties() .degree, i, "Change Elliott Degree") } }) })) })] } label(e) { var t = a.length - this.properties().degree.value() - 1, i = Math.floor(t / 3); return { group: i, bold: !!(i % 2), decoration: ["", "brackets", "circle"][t % 3], label: this.labelsGroup()[i][e] } } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "UHSU"))) .ElliottPatternDefinitionsViewModel } availableDegreesValues() { return l } static createProperties(e) { var t = new n("linetoolelliott", e); return c._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e), e.addChild("linesColors", new o([e.color])), e .addExclusion("linesColors") } } c.version = 4; class h extends c { pointsCount() { return 6 } static _configureProperties(e) { c._configureProperties(e) } } class u extends h { constructor(e, t) { super(e, t || u.createProperties()) } name() { return "Elliott Impulse Wave (12345)" } labelsGroup() { return u._labelsGroups } static createProperties(e) { var t = new n("linetoolelliottimpulse", e); return u._configureProperties(t), t } static _configureProperties(e) { h._configureProperties(e) } } u._labelsGroups = [ ["0", "1", "2", "3", "4", "5"], ["0", "i", "ii", "iii", "iv", "v"], ["0", "1", "2", "3", "4", "5"], ["0", "I", "II", "III", "IV", "V"], ["0", "1", "2", "3", "4", "5"] ]; class d extends h { constructor(e, t) { super(e, t || d.createProperties()) } name() { return "Elliott Triangle Wave (ABCDE)" } labelsGroup() { return d._labelsGroups } static createProperties(e) { var t = new n("linetoolelliotttriangle", e); return d._configureProperties(t), t } static _configureProperties(e) { h._configureProperties(e) } } d._labelsGroups = [ ["0", "A", "B", "C", "D", "E"], ["0", "a", "b", "c", "d", "e"], ["0", "A", "B", "C", "D", "E"], ["0", "a", "b", "c", "d", "e"], ["0", "A", "B", "C", "D", "E"] ]; class p extends h { constructor(e, t) { super(e, t || p.createProperties()) } name() { return "Elliott Triple Combo Wave (WXYXZ)" } labelsGroup() { return p._labelsGroups } static createProperties(e) { var t = new n("linetoolelliotttriplecombo", e); return p._configureProperties(t), t } static _configureProperties(e) { h._configureProperties(e) } } p._labelsGroups = [ ["0", "W", "X", "Y", "X", "Z"], ["0", "w", "x", "y", "x", "z"], ["0", "W", "X", "Y", "X", "Z"], ["0", "w", "x", "y", "x", "z"], ["0", "W", "X", "Y", "X", "Z"] ]; class _ extends c { pointsCount() { return 4 } static _configureProperties(e) { c._configureProperties(e) } } class m extends _ { constructor(e, t) { super(e, t || m.createProperties()) } name() { return "Elliott Correction Wave (ABC)" } labelsGroup() { return m._labelsGroups } static createProperties(e) { var t = new n("linetoolelliottcorrection", e); return m._configureProperties(t), t } static _configureProperties(e) { _._configureProperties(e) } } m._labelsGroups = [ ["0", "A", "B", "C"], ["0", "a", "b", "c"], ["0", "A", "B", "C"], ["0", "a", "b", "c"], ["0", "A", "B", "C"] ]; class f extends _ { constructor(e, t) { super(e, t || f.createProperties()) } name() { return "Elliott Double Combo Wave (WXY)" } labelsGroup() { return f._labelsGroups } static createProperties(e) { var t = new n("linetoolelliottdoublecombo", e); return f._configureProperties(t), t } static _configureProperties(e) { _._configureProperties(e) } } f._labelsGroups = [ ["0", "W", "X", "Y"], ["0", "w", "x", "y"], ["0", "W", "X", "Y"], ["0", "w", "x", "y"], ["0", "W", "X", "Y"] ], t.LineToolElliott = c, t.LineToolElliottImpulse = u, t.LineToolElliottTriangle = d, t .LineToolElliottTripleCombo = p, t.LineToolElliottCorrection = m, t .LineToolElliottDoubleCombo = f }, xzdg: function(e, t, i) { "use strict"; i.r(t); var s = i("Eyy1"), r = i("YFKU"), n = i("EsvI"), o = i("H0vP"), a = i("ikwP"), l = i("ogJP"), c = i("jFln"), h = i("u+0B"), u = i("XlJ7"), d = i("JWMC"), p = i("zDbI"), _ = i("CPmC"), m = i("gAom"), f = i("Hr11"), g = i("+cnz"), b = i("CxTi"); class v { constructor() { this._width = null, this._currencyInfo = null, this._unitInfo = null, this ._fontSize = 0, this._currencyAndUnitLabelsWrapper = document.createElement( "div"), this._currencyAndUnitLabelsWrapper.className = b[ "price-axis-currency-label-wrapper"], this._controlsContainer = document .createElement("table"), this._controlsContainer.className = b[ "price-axis-currency-label"], this._currencyAndUnitLabelsWrapper .appendChild(this._controlsContainer), this._currencyLabelTr = document .createElement("tr"), this._currencyLabelTr.className = b[ "price-axis-currency-label-dropdown"], this._currencyLabelTr.classList.add( "apply-common-tooltip"), Object(_.b)(this._currencyLabelTr, "text", e => this._currencyTooltipContent()); const e = document.createElement("td"); this._currencyText = document.createElement("span"), this._currencyText.className = b["price-axis-currency-label-text"], e.appendChild(this._currencyText), this._currencyLabelTr.appendChild(e); const t = document.createElement("td"); this._currencyArrowDown = document.createElement("span"), this._currencyArrowDown .className = b["price-axis-currency-label-arrow-down"], this._currencyArrowDown .innerHTML = g, t.appendChild(this._currencyArrowDown), this._currencyLabelTr .appendChild(t), this._unitLabelTr = document.createElement("tr"), this ._unitLabelTr.className = b["price-axis-currency-label-dropdown"], this ._unitLabelTr.classList.add("apply-common-tooltip"), Object(_.b)(this ._unitLabelTr, "text", e => this._unitTooltipContent()); const i = document.createElement("td"); this._unitText = document.createElement("span"), this._unitText.className = b[ "price-axis-currency-label-text"], i.appendChild(this._unitText), this ._unitLabelTr.appendChild(i); const s = document.createElement("td"); this._unitArrowDown = document.createElement("span"), this._unitArrowDown .className = b["price-axis-currency-label-arrow-down"], this._unitArrowDown .innerHTML = g, s.appendChild(this._unitArrowDown), this._unitLabelTr .appendChild(s), this._controlsContainer.appendChild(this._currencyLabelTr), this._controlsContainer.appendChild(this._unitLabelTr), this.hideCurrency(), this.hideUnit() } element() { return this._currencyAndUnitLabelsWrapper } currencyLabelElement() { return this._currencyLabelTr } unitLabelElement() { return this._unitLabelTr } isVisible() { return this.currencyLabelVisible() || this.unitLabelVisible() } width() { if (null !== this._width) return this._width; let e = 0; if (this.currencyLabelVisible()) { const t = this._currencyLabelTr.getBoundingClientRect(); e = Math.max(e, t.right - t.left + 1 + 8) } if (this.unitLabelVisible()) { const t = this._unitLabelTr.getBoundingClientRect(); e = Math.max(e, t.right - t.left + 1 + 8) } return this._width = e, e } drawLabel(e, t, i, s) { if (!this.isVisible()) return; const r = this.currencyLabelVisible() ? this._currencyText.textContent || "" : this ._unitText.textContent || "", n = this._unitText.textContent || ""; e.font = Object(u.makeFont)(this._fontSize, p.CHART_FONT_FAMILY); const o = new h.TextWidthCache, l = 2 * Number(b.css_value_currency_label_text_horizontal_padding) + Math.max(o .measureText(e, r), o.measureText(e, n)), c = o.yMidCorrection(e, r), d = o.yMidCorrection(e, n), _ = Math.round(t / 2 * i), g = Object(f.ceiledEven)(l * i / 2), v = this._controlsContainer.style, S = Math.round(this.labelTop() * i), y = Math.round(this.labelBottom() * i), w = y - S, P = Math.round(Number(b.css_value_currency_label_radius) * i); Object(m.drawRoundRect)(e, _ - g, S, 2 * g, w, P), e.fillStyle = v.backgroundColor, e.fill(); const C = Math.max(1, Math.floor(i)); e.lineWidth = C, e.strokeStyle = s ? b.css_value_border_color_dark : b .css_value_border_color_light, Object(m.drawRoundRect)(e, _ - g + C / 2, S + C / 2, 2 * g - C, w - C, P), e.stroke(); const x = S + (y - S - 1) / 2, T = this._isMultiLine(); T && Object(m.drawHorizontalLine)(e, Math.floor(x + C / 2), _ - g, _ + g); const I = this._oneLineHeight() / 2 * i, M = T ? Math.ceil(x - I) : x, O = Math.ceil(x + I); e.fillStyle = v.color, e.textBaseline = "middle", e.textAlign = "center", Object(a .drawScaled)(e, i, () => e.fillText(r, _ / i, (M + c) / i)), T && Object(a .drawScaled)(e, i, () => e.fillText(n, _ / i, (O + d) / i)) } showCurrency() { this._currencyLabelTr.classList.remove("js-hidden"), this._width = null, this ._updateMultiLine(), this._updateVisibility() } hideCurrency() { this._currencyLabelTr.classList.add("js-hidden"), this._width = null, this ._updateMultiLine(), this._updateVisibility() } showUnit() { this._unitLabelTr.classList.remove("js-hidden"), this._width = null, this ._updateMultiLine(), this._updateVisibility() } hideUnit() { this._unitLabelTr.classList.add("js-hidden"), this._width = null, this ._updateMultiLine(), this._updateVisibility() } currencyLabelVisible() { return !this._currencyLabelTr.classList.contains("js-hidden") } unitLabelVisible() { return !this._unitLabelTr.classList.contains("js-hidden") } setCurrencyInfo(e) { if (this._currencyInfo === e) return !1; this._currencyInfo = e; const t = null === e.selectedCurrency ? Object(r.t)("Mixed") : Object(s .ensureDefined)(e.displayedValues.get(e.selectedCurrency)); return this._currencyText.textContent !== t && (this._currencyText.textContent = t, this._width = null), this._currencyArrowDown.classList.contains( "js-hidden") !== e.readOnly && (this._currencyArrowDown.classList.toggle( "js-hidden", e.readOnly), this._currencyLabelTr.classList.toggle(b .readonly, e.readOnly), this._width = null), !0 } setUnitInfo(e) { if (null !== this._unitInfo && this._unitInfo.selectedUnit === e.selectedUnit && 0 === this._unitInfo.availableGroups.size == (0 === e.availableGroups.size) && this._unitInfo.originalUnits.size === e.originalUnits.size) return this ._unitInfo = e, !1; this._unitInfo = e; const t = null === e.selectedUnit ? Object(r.t)("Mixed") : Object(s.ensureDefined)(e .names.get(e.selectedUnit)); return this._unitText.textContent !== t && (this._unitText.textContent = t, this ._width = null), this._unitArrowDown.classList.contains("js-hidden") !== ( 0 === e.availableGroups.size) && (this._unitArrowDown.classList.toggle( "js-hidden", 0 === e.availableGroups.size), this._unitLabelTr.classList .toggle(b.readonly, 0 === e.availableGroups.size), this._width = null), !0 } updateColors(e, t) { const i = this._controlsContainer.style; i.background = e, i.color = t } currencyInfo() { return this._currencyInfo } unitInfo() { return this._unitInfo } setFontSize(e) { this._fontSize !== e && (this._fontSize = e, this._currencyLabelTr.style.fontSize = e + "px", this._unitLabelTr.style.fontSize = e + "px", this._width = null, this._setLineHeight(this._oneLineHeight())) } labelTop() { return Number(b.css_value_currency_label_top) } labelBottom() { const e = this.labelTop(), t = this._oneLineHeight(); let i = e + t; return this._isMultiLine() && (i += t + 1), i } _currencyTooltipContent() { const e = this._currencyInfo; return null === e ? "" : null === e.selectedCurrency ? Array.from(e.currencies).map( t => Object(s.ensureDefined)(e.displayedValues.get(t))).join(", ") : "" } _unitTooltipContent() { const e = this._unitInfo; return null === e ? "" : null === e.selectedUnit ? Array.from(e.units).map(t => Object(s.ensureDefined)(e.names.get(t))).join(", ") : e.descriptions.get(e .selectedUnit) || "" } _setLineHeight(e) { this._currencyLabelTr.style.lineHeight = e + "px", this._unitLabelTr.style .lineHeight = e + "px" } _updateMultiLine() { this._controlsContainer.classList.toggle(b.multiline, this._isMultiLine()) } _updateVisibility() { this._currencyAndUnitLabelsWrapper.classList.toggle("js-hidden", !this.isVisible()) } _oneLineHeight() { return 7 + this._fontSize } _isMultiLine() { return this.unitLabelVisible() && this.currencyLabelVisible() } } async function S(e, t, s) { const [r, n] = await Promise.all([Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i .e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i.e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i.e("currency-label-menu") ]).then(i.bind(null, "9agd")), t()]); return r.showUnitConversion(e, s, n) } var y = i("5VQP"); var w = i("3/8U"), P = i("nqXy"); i.d(t, "PriceAxisWidgetBase", (function() { return x })); const C = { contextMenuEnabled: !0, currencyConversionEnabled: !1, unitConversionEnabled: !1, countdownEnabled: !0, contextMenu: { general: !0, source: !0 }, pressedMouseMoveScale: !0, mouseWheelScale: !0, croppedTickMarks: !0 }; class x { constructor(e, t, i, s, r, n, o) { this._priceScale = null, this._widthCache = new h.TextWidthCache(500), this._color = null, this._fontSize = null, this._currencyFontSize = 0, this ._currencyLabelWidth = null, this._isVisible = !0, this._updateTimeout = null, this._currencyMenu = null, this._unitMenu = null, this._prevOptimalWidth = 0, this._size = new a.Size(-1, -1), this._currentCursorClassName = "", this ._mouseDown = !1, this._destroyed = !1, this._highlighted = !1, this ._mouseWheelHelper = null, this._dragScaleActive = !1, this._pane = e, this ._undoModel = t, this._properties = i, this._isLeft = "left" === s, this ._options = Object(l.merge)(Object(l.clone)(C), r), this ._rendererOptionsProvider = n, this._backgroundBasedTheme = o, this._cell = document.createElement("div"), this._cell.className = "price-axis", this._cell .style.width = "25px", this._cell.style.left = "0", this ._canvasConfiguredHandler = () => { this._undoModel.model().lightUpdate() }, this._canvasBinding = Object(a.createBoundCanvas)(this._cell, new a.Size(16, 16)), this._canvasBinding.subscribeCanvasConfigured(this ._canvasConfiguredHandler); const c = this._canvasBinding.canvas; c.style.position = "absolute", c.style.zIndex = "1", c.style.left = "0", c.style .top = "0", this._topCanvasConfiguredHandler = () => this._undoModel.model() .lightUpdate(), this._topCanvasBinding = Object(a.createBoundCanvas)(this._cell, new a.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this ._topCanvasConfiguredHandler); const u = this._topCanvasBinding.canvas; u.style.position = "absolute", u.style.zIndex = "2", u.style.left = "0", u.style .top = "0", this._options.currencyConversionEnabled || this._options .unitConversionEnabled ? (this._currencyLabel = new v, this._cell.appendChild( this._currencyLabel.element()), this._currencyLabel .currencyLabelElement().addEventListener("click", () => this ._showCurrenciesContextMenu()), this._currencyLabel.unitLabelElement() .addEventListener("click", () => this._showUnitsContextMenu())) : this ._currencyLabel = null, this._properties.childs().fontSize.subscribe(this, this ._onFontSizeChanged), this._options.mouseWheelScale && (this ._mouseWheelHelper = new P.a, this._cell.addEventListener("wheel", this ._onMousewheel.bind(this), { passive: !1 })) } getElement() { return this._cell } onOptimalWidthNeedToBeRecalculated(e) { const t = this.optimalWidth(); (this._prevOptimalWidth < t || e) && null === this._updateTimeout && (this ._updateTimeout = setTimeout(() => { this._undoModel.model().fullUpdate(), this._updateTimeout = null }, 100)), this._prevOptimalWidth = t } optimalWidth() { var e; if (!this.isVisible()) return 0; let t = 0; const i = this.rendererOptions(); if (this._pane.hasState()) { const i = Object(a.getContext2D)(this._canvasBinding.canvas); Object(c.setFont)(i, this.baseFont()); const s = this.backLabels(!0); for (let e = s.length; e--;) { if (!s[e].isAxisLabelVisible()) continue; const r = this._widthCache.measureText(i, s[e].text()); t = Math.max(t, r); const n = s[e].secondLineText(); n && (t = Math.max(t, this._widthCache.measureText(i, n))); const o = s[e].thirdLineText(); o && (t = Math.max(t, this._widthCache.measureText(i, o))) } const r = this.priceScale(), n = r.marks(); n.length > 0 && (t = Math.max(t, this._widthCache.measureText(i, n[0].label), this._widthCache.measureText(i, n[n.length - 1].label))); const o = (null === (e = r.mainSource()) || void 0 === e ? void 0 : e .firstValue()) || null; if (null !== o) { const e = r.coordinateToPrice(1, o), s = r.coordinateToPrice(this._size.h - 2, o); t = Math.max(t, this._widthCache.measureText(i, r.formatPrice(Math.floor( Math.min(e, s)) + .11111111111111, o)), this._widthCache .measureText(i, r.formatPrice(Math.ceil(Math.max(e, s)) - .11111111111111, o))) } } let r = 0; this._isCurrencyLabelVisible() && (null === this._currencyLabelWidth && (this ._currencyLabelWidth = Object(s.ensureNotNull)(this._currencyLabel) .width()), r = this._currencyLabelWidth); const n = t || 34; let o = Math.max(r, Math.ceil(i.borderSize + i.offsetSize + i.paddingInner + i .paddingOuter + n + 4)); return o += o % 2, o } backLabels(e) { const t = [], i = this._grouppedSources(), s = s => { for (const r of s) { if (!e && i.topLevelSources.has(r)) continue; const s = r.priceAxisViews(this._pane.state(), this.priceScale()); if (s) for (const e of s) t.push(e) } }; return s(i.sources), s(this._pane.state().customSources()), t } getImage() { const e = this._size, t = Object(a.createDisconnectedCanvas)(document, e); if (Object(a.getPrescaledContext2D)(t).drawImage(this._canvasBinding.canvas, 0, 0, e .w, e.h), null !== this._currencyLabel && this._currencyLabel.isVisible()) { const i = this._undoModel.model().isDark(); this._currencyLabel.drawLabel(Object(a.getContext2D)(t), e.w, Object(a .getCanvasDevicePixelRatio)(t), i) } return t } paint(e) { if (this._isVisible && e !== o.InvalidationLevel.None) { if (e > o.InvalidationLevel.Cursor) { const e = Object(a.getContext2D)(this._canvasBinding.canvas); this._alignLabels(), this._drawBackground(e, this._canvasBinding .pixelRatio), this._drawBorder(e, this._canvasBinding.pixelRatio), this ._pane.hasState() && (this._updateCurrencyLabel(), this._drawTickMarks( e, this._canvasBinding.pixelRatio), this._drawBackLabels(e, this ._canvasBinding.pixelRatio)) } if (this._pane.hasState()) { const e = Object(a.getContext2D)(this._topCanvasBinding.canvas), t = this._topCanvasBinding.pixelRatio; e.clearRect(0, 0, Math.ceil(this._size.w * t) + 1, Math.ceil(this._size.h * t) + 1), this._drawCrossHairLabel(e, t) } } } priceScale() { return Object(s.ensureNotNull)(this._priceScale) } setPriceScale(e) { this._priceScale !== e && (null !== this._priceScale && (this._priceScale .onMarksChanged().unsubscribe(this, this .onOptimalWidthNeedToBeRecalculated), this._priceScale.modeChanged() .unsubscribeAll(this)), this._priceScale = e, null !== e && (e .onMarksChanged().subscribe(this, this .onOptimalWidthNeedToBeRecalculated), e.modeChanged().subscribe( this, () => this.onOptimalWidthNeedToBeRecalculated(!0)))) } isVisible() { return this._isVisible } setVisible(e) { (e = !!e) !== this._isVisible && (this._cell.style.display = e ? "table-cell" : "none", this._isVisible = e) } destroy() { null !== this._currencyMenu && (this._currencyMenu.close(), this._currencyMenu = null), null !== this._unitMenu && (this._unitMenu.close(), this._unitMenu = null), this._topCanvasBinding.unsubscribeCanvasConfigured(this ._topCanvasConfiguredHandler), this._topCanvasBinding.destroy(), this ._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this ._canvasBinding.destroy(), null !== this._priceScale && (this._priceScale .onMarksChanged().unsubscribe(this, this .onOptimalWidthNeedToBeRecalculated), this._priceScale.modeChanged() .unsubscribeAll(this)), this._priceScale = null, this._updateTimeout && ( clearTimeout(this._updateTimeout), this._updateTimeout = null), this ._properties.childs().fontSize.unsubscribe(this, this._onFontSizeChanged), this ._destroyed = !0 } setHighlighted(e) { this._highlighted = e } backgroundColor() { return this._pane.state().model().backgroundColor().value() } backgroundTopColor() { return this._pane.state().model().backgroundTopColor().value() } lineColor() { return this._properties.childs().lineColor.value() } textColor() { return this._properties.childs().textColor.value() } fontSize() { return this._properties.childs().fontSize.value() } baseFont() { return Object(u.makeFont)(this.fontSize(), p.CHART_FONT_FAMILY, "") } rendererOptions() { let e = this._rendererOptionsProvider.options(); return this._color === e.color && this._fontSize === e.fontSize || (this._color = e .color), this._fontSize !== e.fontSize && (this._widthCache.reset(), this ._fontSize = e.fontSize, this._currencyLabelWidth = null, this ._currencyFontSize = 0, this._updateCurrencyLabelFont(), this .onOptimalWidthNeedToBeRecalculated()), e } mouseEnterEvent(e) { this._mouseEnterOrTouchStartEvent(e) } mouseMoveEvent(e) { this._mouseOrTouchMoveEvent(e) } mouseDownEvent(e) { this._mouseDownOrTouchStartEvent(e) } touchStartEvent(e) { this._mouseOrTouchMoveEvent(e), this._mouseEnterOrTouchStartEvent(e), this ._mouseDownOrTouchStartEvent(e) } pressedMouseMoveEvent(e) { this._pressedMouseOrTouchMoveEvent(e) } touchMoveEvent(e) { this._pressedMouseOrTouchMoveEvent(e) } mouseDownOutsideEvent() { if (this._dragScaleActive) { const e = this._pane.state(), t = this.priceScale(); this._mouseDown && (this._mouseDown = !1, this._undoModel.endScalePrice(e, t), this.restoreDefaultCursor()), this._dragScaleActive = !1 } } mouseUpEvent(e) { this._mouseUpOrTouchEndEvent(e) } touchEndEvent(e) { this._mouseLeaveOrTouchEndEvent(e), this._mouseUpOrTouchEndEvent(e) } mouseClickEvent(e) { this._mouseClickOrTapEvent(e) } tapEvent(e) { this._mouseClickOrTapEvent(e) } mouseLeaveEvent(e) { this._mouseLeaveOrTouchEndEvent(e) } mouseDoubleClickEvent(e) { this._mouseDoubleClickOrDoubleTapEvent(e) } doubleTapEvent(e) { this._mouseDoubleClickOrDoubleTapEvent(e) } contextMenuEvent(e) { this._contextMenuOrTouchContextMenuEvent(e) } touchContextMenuEvent(e) { this._contextMenuOrTouchContextMenuEvent(e) } reset() { const e = this._pane.state(), t = this.priceScale(); this._undoModel.resetPriceScale(e, t), this.onOptimalWidthNeedToBeRecalculated(!0) } sizeReady() { return this.getWidth() >= this.optimalWidth() && null === this._updateTimeout } _grouppedSources() { var e; const t = this._pane, i = t.state().model(), s = this._sameSideSources().slice(), r = t.state(), n = this.priceScale(), o = new Set, a = null !== (e = i.lineBeingEdited()) && void 0 !== e ? e : i .lineBeingCreated(); a && o.add(a); const l = i.customSourceBeingMoved(); null !== l && o.add(l), i.sourcesBeingMoved().forEach(e => o.add(e)), i.selection() .allSources().forEach(e => o.add(e)); const c = i.hoveredSource(); null !== c && o.add(c); if (n === r.defaultPriceScale()) { const e = this._pane.state().dataSources(); for (const t of e) r.isOverlay(t) && s.push(t) } return { sources: s, topLevelSources: o } } _isCurrencyLabelVisible() { return null !== this._currencyLabel && this._currencyLabel.isVisible() } _updateCurrencyLabel() { if (null !== this._currencyLabel) { if (this._options.currencyConversionEnabled) { const e = this.priceScale().currency(this._undoModel.model() .availableCurrencies()); null !== e && this._properties.childs().showCurrency.value() ? (this ._currencyLabel.showCurrency(), this._currencyLabel.updateColors( this.backgroundTopColor(), this.textColor()), this ._currencyLabel.setCurrencyInfo(e) && (this._currencyLabelWidth = null, this.onOptimalWidthNeedToBeRecalculated())) : this ._currencyLabel.hideCurrency() } if (this._options.unitConversionEnabled) { const e = this.priceScale().unit(this._undoModel.model().availableUnits()); null !== e && this._properties.childs().showUnit.value() ? (this ._currencyLabel.showUnit(), this._currencyLabel.updateColors(this .backgroundTopColor(), this.textColor()), this._currencyLabel .setUnitInfo(e) && (this._currencyLabelWidth = null, this .onOptimalWidthNeedToBeRecalculated())) : this._currencyLabel .hideUnit() } this._updateCurrencyLabelFont() } } _updateCurrencyLabelFont() { if (null === this._currencyLabel) return; const e = this.fontSize(); e !== this._currencyFontSize && (this._currencyLabel.setFontSize(e), this ._currencyFontSize = e, this._currencyLabelWidth = null, this .onOptimalWidthNeedToBeRecalculated()) } _alignLabels() { let e = this._size.h / 2; const t = [], i = this.priceScale(), s = i.orderedSources().slice(), r = this._pane.state(), n = this.rendererOptions(); if (i === r.defaultPriceScale()) { const e = r.priceDataSources(); for (let t = 0; t < e.length; t++) r.isOverlay(e[t]) && s.push(e[t]) } const o = i.mainSource(); for (const n of [s, r.customSources()]) for (let s = 0; s < n.length; ++s) { const a = n[s], l = a.priceAxisViews(r, i); if (l) { const i = l.filter(e => !e.ignoreAlignment() && e.isVisible()); if (!i.length) continue; t.push(...i), o === a && (e = i[0].floatCoordinate()) } } const a = t.filter(t => t.floatCoordinate() <= e), l = t.filter(t => t.floatCoordinate() > e); a.sort((e, t) => t.floatCoordinate() - e.floatCoordinate()), a.length > 0 && l .length > 0 && l.push(a[0]), l.sort((e, t) => e.floatCoordinate() - t .floatCoordinate()); for (const e of t) e.setFixedCoordinate(e.coordinate()); if (i.properties().childs().alignLabels.value()) { for (let e = 1; e < a.length; e++) { const t = a[e], i = a[e - 1], s = t.height(n), r = t.coordinate(), o = i.getFixedCoordinate(); r > o - s && t.setFixedCoordinate(o - s) } for (let e = 1; e < l.length; e++) { const t = l[e], i = l[e - 1], s = i.height(n), r = t.coordinate(), o = i.getFixedCoordinate(); r < o + s && t.setFixedCoordinate(o + s) } } } _drawTickMarks(e, t) { const i = this.priceScale().marks(); e.save(), Object(c.setFont)(e, this.baseFont()); const r = this.rendererOptions(), n = this._isLeft ? Math.floor((this._size.w - r.offsetSize) * t) : 0, o = this._isLeft ? Math.round(n - r.paddingInner * t) : Math.round(n + (r .offsetSize + r.paddingInner) * t), l = this.fontSize(), h = this._isCurrencyLabelVisible() ? Object(s.ensureNotNull)(this ._currencyLabel).labelBottom() : 0, u = i.map(t => { if (this._options.croppedTickMarks) return { visible: !0, yCorrection: this._widthCache.yMidCorrection(e, t.label) }; const i = t.coord - l / 2, s = t.coord + l / 2, r = !(s > this._size.h || i < h); return { visible: !(s > this._size.h || i < h), yCorrection: r ? this._widthCache.yMidCorrection(e, t.label) : 0 } }); e.fillStyle = this.textColor(), e.textAlign = this._isLeft ? "right" : "left", e .textBaseline = "middle", Object(a.drawScaled)(e, t, () => { for (let s = i.length; s--;) { if (!u[s].visible) continue; const r = i[s]; e.fillText(r.label, o / t, r.coord + u[s].yCorrection) } }), e.restore() } _hasAlertLabel() { return !1 } _showCurrenciesContextMenu() { if (null !== this._currencyMenu && this._currencyMenu.isOpened()) return void this ._currencyMenu.close(); Object(d.trackEvent)("GUI", "Currency conversion"); S(Object(r.t)("Currencies"), () => async function(e, t, s) { return (await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i .e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i .e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i .e("currency-label-menu") ]).then(i.bind(null, "aWqZ"))).currencyActions(e, t, s) }(this._undoModel, Object(s.ensureNotNull)(this._currencyLabel) .currencyInfo(), this.priceScale()), Object(s.ensureNotNull)(this ._currencyLabel).currencyLabelElement()).then(e => { this._destroyed ? e.close() : this._currencyMenu = e }) } _showUnitsContextMenu() { if (null !== this._unitMenu && this._unitMenu.isOpened()) return void this._unitMenu .close(); Object(d.trackEvent)("GUI", "Unit conversion"); S(Object(r.t)("Units"), () => async function(e, t, s) { return (await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i .e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i .e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i .e("currency-label-menu") ]).then(i.bind(null, "hpdS"))).unitActions(e, t, s) }(this._undoModel, Object(s.ensureNotNull)(this._currencyLabel) .unitInfo(), this.priceScale()), Object(s.ensureNotNull)(this ._currencyLabel).unitLabelElement()).then(e => { this._destroyed ? e.close() : this._unitMenu = e }) } _onFontSizeChanged() { this._currencyLabelWidth = null, this._currencyFontSize = 0, this ._updateCurrencyLabelFont(), this.onOptimalWidthNeedToBeRecalculated() } _mouseOrTouchMoveEvent(e) { if (!this._priceScale) return; this.dataSourceAtPoint(e.localX, e.localY) ? this._setCursorClassName("pointer") : this._setResizeCursor() } _mouseDownOrTouchStartEvent(e) { this._zoomAvailable() && this._options.pressedMouseMoveScale && (this._mouseDown = ! 0, this._undoModel.startScalePrice(this._pane.state(), this.priceScale(), e .localY), this._dragScaleActive = !0) } _mouseEnterOrTouchStartEvent(e) { this._setResizeCursor() } _pressedMouseOrTouchMoveEvent(e) { if (this._dragScaleActive) { const t = this.priceScale(); this._undoModel.scalePriceTo(this._pane.state(), t, e.localY) } } _mouseUpOrTouchEndEvent(e) { if (this._dragScaleActive) { const e = this.priceScale(); this._mouseDown = !1, this._undoModel.endScalePrice(this._pane.state(), e), this .restoreDefaultCursor(), this._dragScaleActive = !1 } } _mouseClickOrTapEvent(e) { const t = this.dataSourceAtPoint(e.localX, e.localY); t && this._undoModel.selectionMacro(e => { e.selection().isSelected(t) || (e.clearSelection(), e .addSourceToSelection(t)) }) } _mouseLeaveOrTouchEndEvent(e) { this._setCursorClassName("") } _mouseDoubleClickOrDoubleTapEvent(e) { const t = this.dataSourceAtPoint(e.localX, e.localY); t ? this._pane.processDoubleClickOnSource(t) : (this.reset(), Object(d.trackEvent)( "GUI", "Double click price scale")) } _contextMenuOrTouchContextMenuEvent(e) { if (this._options.contextMenuEnabled) { const t = this.dataSourceAtPoint(e.localX, e.localY); if (null !== t && this._options.contextMenu.source) { return void this._undoModel.model().selectionMacro(i => { i.selection().isSelected(t) || (i.clearSelection(), i .addSourceToSelection(t)), this._pane .showContextMenuForSelection(e) }) } this._options.contextMenu.general && y.ContextMenuManager.createMenu(this .getContextMenuActions(), { statName: "PriceScaleContextMenu" }).then(t => t.show(e)) } } _setResizeCursor() { const e = this.priceScale(); e.isPercentage() || e.isIndexedTo100() ? this._setCursorClassName("") : this ._zoomAvailable() && (this._options.pressedMouseMoveScale || this._options .mouseWheelScale) && this._setCursorClassName("ns-resize") } _setCursorClassName(e) { let t = ""; e && (t = "price-axis--cursor-" + e), this._currentCursorClassName !== t && (this ._currentCursorClassName && this._cell.classList.remove(this ._currentCursorClassName), t && this._cell.classList.add(t), this ._currentCursorClassName = t) } _zoomAvailable() { return !this.priceScale().isEmpty() && this._undoModel.model().zoomEnabled() } _onMousewheel(e) { if (!this._zoomAvailable() || !this._options.mouseWheelScale) return; const t = Object(s.ensureNotNull)(this._mouseWheelHelper).processWheel(e).deltaY; if (0 === t) return; e.cancelable && e.preventDefault(); const i = this._undoModel, r = this._pane.state(), n = this.priceScale(), o = this._cell.getBoundingClientRect(), a = e.clientY - o.top, l = a + 15 * t; i.startScalePrice(r, this.priceScale(), a, !0), i.scalePriceTo(r, n, l), i .endScalePrice(r, n), e.stopPropagation() } _drawCrossHairLabel(e, t) { var i, s; e.save(); const r = this._pane.state(), n = r.model(), o = this.priceScale(), a = [], l = this.priceScale() === r.defaultPriceScale(), c = null !== (i = n.lineBeingEdited()) && void 0 !== i ? i : n .lineBeingCreated(); if (c && (c.priceScale() === o || l && r.isOverlay(c))) { const e = c.priceAxisViews(r, o); e && e.length && a.push(e) } const h = n.customSourceBeingMoved(); this._addViewsOrMaxMin(null === h ? [] : [h], a), this._addViewsOrMaxMin(n .sourcesBeingMoved(), a), this._addViewsOrMaxMin(n.selection().allSources(), a); const u = n.hoveredSource(); if (u) { const e = r.customSources().includes(u) ? o : u.priceScale(); if (!n.selection().isSelected(u) && (this._isFromSameSide(e) || l && r .isOverlay(u))) { const e = null === (s = n.hoveredSource()) || void 0 === s ? void 0 : s .priceAxisViews(r, o); e && e.length && a.push(e) } } const d = n.crossHairSource().priceAxisViews(r, o); d && d.length && a.push(d); const p = this.rendererOptions(), _ = this._isLeft ? "right" : "left"; a.forEach(i => { i.forEach(i => { e.save(), i.renderer().draw(e, p, this._widthCache, this ._size.w, _, t), e.restore() }) }), e.restore() } _drawBackground(e, t) { const i = Math.ceil(this._size.w * t), s = Math.ceil(this._size.h * t), r = this.backgroundTopColor(), o = this.backgroundColor(); if (r === o ? Object(a.clearRect)(e, 0, 0, i + 1, s + 1, this.backgroundColor()) : Object(m.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, r, o), this._highlighted ) { e.globalAlpha = .5; const t = n.themes[this._backgroundBasedTheme.value()].getThemedColor( "color-price-axis-highlight"); Object(a.fillRect)(e, 0, 0, i + 1, s + 1, t), e.globalAlpha = 1 } const l = this._pane.state().model(), c = this.priceScale(), h = l.selection().lineDataSources().filter(e => e.priceScale() === c).reduce((e, t) => { const i = t.priceAxisPoints(); return 0 === i.length ? e : e.concat(i) }, []); h.length > 0 && this._hightlightBackground(e, h, this.priceScale().mainSource(), t); const u = l.crossHairSource(); u.startMeasurePoint() && this._hightlightBackground(e, u.measurePoints(), this .priceScale().mainSource(), t) } _drawBorder(e, t) { e.save(), e.fillStyle = this.lineColor(); const i = Math.max(1, Math.floor(this.rendererOptions().borderSize * t)), s = this._isLeft ? Math.floor(this._size.w * t) - i : 0; e.fillRect(s, 0, i, Math.ceil(this._size.h * t) + 1), e.restore() } _drawBackLabels(e, t) { e.save(); const i = this.backLabels(), s = this.rendererOptions(), r = this._isLeft ? "right" : "left"; for (const n of i) n.isAxisLabelVisible() && (e.save(), n.renderer().draw(e, s, this ._widthCache, this._size.w, r, t), e.restore()); e.restore() } _hightlightBackground(e, t, i, s) { if (!i) return; const r = i.firstValue(); if (null === r) return; let n = t[0].price, o = t[0].price; for (let e = 1; e < t.length; e++) n = Math.min(n, t[e].price), o = Math.max(o, t[e] .price); const l = this.priceScale(), c = Math.floor(l.priceToCoordinate(n, r) * s), h = Math.ceil(l.priceToCoordinate(o, r) * s); Object(a.fillRect)(e, Math.floor(s), c, Math.ceil((this._size.w - 1) * s) + 1, h - c, w.a) } _addViewsOrMaxMin(e, t) { const i = this._pane.state(), s = this.priceScale(); if (s !== i.defaultPriceScale() && (e = e.filter(e => i.isOverlay(e) || this ._isFromSameSide(e.priceScale()))), 0 !== e.length) if (1 === e.length) { const r = e[0].priceAxisViews(i, s); r && r.length && t.push(r) } else t.push(this._minMaxViews(e)) } _minMaxViews(e) { const t = this._pane.state(), i = this.priceScale(), s = []; let r = 1 / 0, n = -1 / 0, o = null, a = null; for (const s of e) { const e = s.priceAxisViews(t, i); if (e && e.length) for (let t = 0; t < e.length; t++) { const i = e[t], s = i.coordinate(); s >= n && (n = s, a = i), s <= r && (r = s, o = i) } } return a && s.push(a), o && s.push(o), s } _isFromSameSide(e) { return null !== e && (this._isLeft ? this._pane.state().leftPriceScales() : this ._pane.state().rightPriceScales()).includes(e) } _sameSideSources() { const e = this._pane.state().sourcesByGroup(); return this._isLeft ? e.leftPriceScalesSources() : e.rightPriceScalesSources() } } }, "y/Xm": function(e, t, i) { "use strict"; i.r(t), i.d(t, "StudyOverlayBase", (function() { return I })); var s = i("Eyy1"), r = i("qFKp"), n = i("txPx"), o = i("GVHu"), a = i("XPit"), l = i("n5al"), c = i("tc+8"), h = i.n(c), u = i("5fI3"), d = i("Kxc7"), p = i("wOSo"), _ = i("WkOR"), m = i("BZtw"), f = i("pPtI"), g = i("k9/m"), b = i("ogJP"), v = i("Qb4w"); const S = r.CheckMobile.any() && !1, y = d.enabled("uppercase_instrument_names"), w = d.enabled("study_overlay_compare_legend_option"), P = d.enabled("secondary_series_extend_time_scale"), C = d.enabled("hide_unresolved_symbols_in_legend"), x = Object(n.getLogger)("Chart.StudyOverlay"); function T(e, t) { return null == e[t] } class I extends o.Study { constructor(e, t, i, s) { t.hasChild("currencyId") || t.addChild("currencyId", new h.a(null)), t.hasChild( "unitId") || t.addChild("unitId", new h.a(null)), t.addExclusion( "currencyId"), t.addExclusion("unitId"), super(e, t, i, s), this ._seriesSource = null, this.m_data = new g.PlotList(Object(a .seriesPlotFunctionMap)(), T), this._quotesProvider = new p.a, S && this ._quotesProvider.quotesUpdate().subscribe(this, this._onQuotesUpdate); const r = this.properties().childs(); r.currencyId.subscribe(this, this._onCurrencyChanged), r.unitId.subscribe(this, this._onUnitChanged), r.allowExtendTimeScale.subscribe(this, this ._onAllowExtendTimeScaleChanged), this._onAllowExtendTimeScaleChanged(), r.style.subscribe(this, this._updateBarFunction), r.lineStyle.childs() .priceSource.subscribe(this, this._updateBarFunction), r.areaStyle.childs() .priceSource.subscribe(this, this._updateBarFunction), r.baselineStyle .childs().priceSource.subscribe(this, this._updateBarFunction), this ._updateBarFunction() } destroy() { super.destroy() } setSymbolCurrencyUnit(e, t, i) { this._setSymbolCurrencyUnitInternal(e, t, i) } symbol() { return this.properties().childs().inputs.childs().symbol.value() } setSymbol(e) { this.setSymbolCurrencyUnit(e) } symbolInfo() { if (!this._resolvedSymbols) return null; const e = this._properties.inputs.symbol.value(); if (!e) return null; let t; return t = this._resolvedSymbols[this._getSymbolForResolve(e)] || null, t } data() { return null === this._seriesSource ? super.data() : this._seriesSource.data() .bars() } symbolResolved() { return this.symbolsResolved() } symbolSameAsCurrent(e) { return Object(_.b)(e, this.symbol(), this.symbolInfo()) } priceSource() { switch (this._properties.style.value()) { case 2: return this._properties.lineStyle.priceSource.value(); case 3: return this._properties.areaStyle.priceSource.value(); case 10: return this._properties.baselineStyle.priceSource.value() } return null } barFunction() { return this._barFunction } quotes() { return this._quotesProvider.quotes() } currency() { return this._properties.currencyId.value() || null } setCurrency(e) { this.setSymbolCurrencyUnit(void 0, e) } isConvertedToOtherCurrency() { return Object(l.isConvertedToOtherCurrency)(this.symbolInfo()) } unit() { return this._properties.unitId.value() || null } setUnit(e) { this._properties.unitId.setValue(e) } isConvertedToOtherUnit() { return Object(l.isConvertedToOtherUnit)(this.symbolInfo()) } style() { return this.properties().childs().style.value() } symbolSource() { return this } state(e, t) { const i = super.state(e, t); return e && (Object(s.ensureDefined)(i.data).symbols = { ___snapshot: this.symbolInfo() || void 0 }), i } symbolTitle(e, t) { return this.title(!0, {}, !1, e) } title(e, t, i, s) { const r = this._titleInParts(e, t, i, s).join(", "); return y ? r.toUpperCase() : r } titleInParts(e, t, i, s) { const r = this._titleInParts(e, t, i, s).join(", "); return [y ? r.toUpperCase() : r] } isStarted() { return null === this._seriesSource ? super.isStarted() : this._seriesSource .isStarted() } sourceId() { return null === this._seriesSource ? super.sourceId() : Object(s.ensureNotNull)( this._seriesSource.instanceId()) } moveData(e) { null === this._seriesSource ? super.moveData(e) : this._seriesSource.moveData(e) } firstValue() { const e = this._model.timeScale().visibleBarsStrictRange(); if (null === e) return null; const t = e.firstBar(); if (0 === this.data().size()) return this._ownFirstValue; const i = this.data().search(t, g.PlotRowSearchMode.NearestRight, 1); return this._ownFirstValue = null !== i ? this._barFunction(i.value) : null, this._ownFirstValue } lastValueData(e, t, i) { const s = { noData: !0 }, r = this.priceScale(); if (this._model.timeScale().isEmpty() || null === r || r.isEmpty() || this .data().isEmpty()) return s; const n = this._model.timeScale().visibleBarsStrictRange(); if (null === n) return s; const o = this.properties().childs(); if (!o.visible.value()) return s; const a = this.nearestIndex(n.lastBar(), g.PlotRowSearchMode.NearestLeft, 1); if (void 0 === a) return s; const l = this.firstValue(); if (null === l) return s; const c = this._lastNonEmptyPlotRow(4), h = null !== c && n.contains(c.index), u = null !== c ? c.value : null, d = t || h ? u : this.data().valueAt(a); if (null === d) return s; const p = this._barFunction(d); if (!Object(b.isNumber)(p)) return s; const _ = r.priceToCoordinate(p, l); let m; switch (o.style.value()) { case 0: m = d[1] <= d[4] ? o.barStyle.childs().upColor.value() : o.barStyle .childs().downColor.value(); break; case 1: case 9: m = d[1] <= d[4] ? o.candleStyle.childs().upColor.value() : o .candleStyle.childs().downColor.value(); break; case 2: m = o.lineStyle.childs().color.value(); break; case 3: m = o.areaStyle.childs().color1.value(); break; case 10: { const e = o.baselineStyle.childs(); m = _ < Math.round(r.height() * (Math.abs(100 - e.baseLevelPercentage .value()) / 100)) ? e.topLineColor.value() : e.bottomLineColor .value(); break } default: throw new Error("Not supported overlay style") } const f = { noData: !1, text: r.formatPrice(p, l), formattedPriceAbsolute: r.formatPriceAbsolute(p), formattedPricePercentage: r.formatPricePercentage(p, l, !0), floatCoordinate: _, coordinate: _, color: m }; return i && (f.price = p), f } priceRange(e, t) { if (!Object(b.isInteger)(e)) return x.logDebug( "priceRange: incorrect startBar"), null; if (!Object(b.isInteger)(t)) return x.logDebug("priceRange: incorrect endBar"), null; if (0 === this.data().size()) return null; const i = this.priceSource(); let s; s = null !== i ? this.data().minMaxOnRangeCached(e, t, [{ name: i, offset: 0 }]) : this.data().minMaxOnRangeCached(e, t, [{ name: "low", offset: 0 }, { name: "high", offset: 0 }]); const r = null !== s ? new v.PriceRange(s.min, s.max) : null; return this._postProcessPriceRange(r) } bars() { return this.data() } open(e) { return Object(s.ensureNotNull)(this.bars().valueAt(e))[1] } high(e) { return Object(s.ensureNotNull)(this.bars().valueAt(e))[2] } low(e) { return Object(s.ensureNotNull)(this.bars().valueAt(e))[3] } close(e) { return Object(s.ensureNotNull)(this.bars().valueAt(e))[4] } hl2(e) { return (this.high(e) + this.low(e)) / 2 } hlc3(e) { return (this.high(e) + this.low(e) + this.close(e)) / 3 } ohlc4(e) { return (this.open(e) + this.high(e) + this.low(e) + this.close(e)) / 4 } _onCurrencyChanged() { this.isStarted() && this._tryChangeInputs(), this._currencyChanged.fire() } _onUnitChanged() { this.isStarted() && this._tryChangeInputs(), this._unitChanged.fire() } _getSymbolObject(e) { const t = super._getSymbolObject(e), i = this.currency(); null !== i && (t["currency-id"] = i); const s = this.unit(); return null !== s && (t["unit-id"] = s), t } _getSymbolForApi(e) { return Object(l.symbolForApi)(this._resolvedSymbolsByInput[e] || null, e) } _onSymbolResolved(e, t, i) { super._onSymbolResolved(e, t, i), this._recreatePriceFormattingDependencies(); const s = t === this.symbol() ? Object(l.extractSymbolNameFromSymbolInfo)(i, this.symbol()) : null, r = Object(l.symbolCurrency)(i), n = Object(l.symbolUnit)(i); this._setSymbolCurrencyUnitInternal(s || void 0, r, n, i), this.model() .realignLineTools(), S && this._setQuotesSymbol(this._getSymbolForApi(this .symbol())) } _changeInputsImpl(e, t) { super._changeInputsImpl(e, t), e.symbol !== t.symbol && this._model .realignLineTools() } _setQuotesSymbol(e) { const t = this.symbolInfo(), i = Object(l.extractSymbolNameFromSymbolInfo)(t, e); this._quotesProvider.setQuotesSessionSymbol(i) } _createStudyOnServer() { null === this._seriesSource ? super._createStudyOnServer() : this ._modifyStudyOnServer(Object(s.ensureDefined)(this._inputs)), this._model .realignLineTools() } _modifyStudyOnServer(e) { null === this._seriesSource ? super._modifyStudyOnServer(e) : (this ._seriesSource.modifySeries(Object(u.decodeExtendedSymbol)(e.symbol), Object(f.getServerInterval)(this._series.properties().interval .value())), this._seriesSource.isStarted() || this._seriesSource .start()) } _stopStudyOnServer() { null === this._seriesSource ? super._stopStudyOnServer() : this._seriesSource .stop() } _titleInParts(e, t, i, s) { const r = this.properties().childs().inputs.childs().symbol.value(), n = this.symbolInfo(); let o; if (n) { if (o = n.name, w) { const e = this._model.mainSeries().properties().statusViewStyle .symbolTextSource.value(); "description" === e ? o = n.description : "ticker-and-description" === e && (o = `${n.name}, ${n.description}`) } if (!s && n.exchange && 0 !== n.exchange.length) return [o, [n.exchange]] } else o = C ? "" : r; return [o] } _onAllowExtendTimeScaleChanged() { const e = this.isStarted(); if (e && this.stop(!0), P && this.properties().childs().allowExtendTimeScale .value()) { this._seriesSource = new m.a(this._model.chartApi(), "st_o_"); const e = this._seriesSource.dataEvents(); e.seriesError().subscribe(this, e => { this._onStudyError(this._convertSeriesErrorToStudy(e)) }), e.loading().subscribe(this, this._onStudyLoading), e.completed() .subscribe(this, (e, t) => { this._onStudyCompleted(t) }), e.dataUpdated().subscribe(this, () => { this._studyModified = !1; const e = this._model.paneForSource(this); this._model.recalculatePane(e), this._updateSources(), this .priceRangeReady() || this._enablePriceRangeReady() }) } else { if (null !== this._seriesSource) { const e = this._seriesSource.dataEvents(); e.seriesError().unsubscribeAll(this), e.loading().unsubscribeAll(this), e.completed().unsubscribeAll(this), e.dataUpdated().unsubscribeAll( this), this._seriesSource.destroy() } this._seriesSource = null } e && this.start(!0) } _convertSeriesErrorToStudy(e) { return { error: e.error, ctx: e.ctx, solution_id: e.solution_id } } _setSymbolCurrencyUnitInternal(e, t, i, s) { const r = this.properties().childs(), n = r.inputs.childs().symbol.value(), o = r.currencyId.value(), a = r.unitId.value(); if (void 0 !== e && e !== n && r.inputs.childs().symbol.setValueSilently(e), void 0 !== t && t !== o && r.currencyId.setValueSilently(t), void 0 !== i && i !== a && r.unitId.setValueSilently(i), s) this._resolvedSymbolsByInput[ this.symbol()] = s, this._resolvedSymbols[this._getSymbolForResolve(this .symbol())] = s; else { const e = this.symbolInfo(); null !== e && (r.currencyId.setValueSilently(Object(l.symbolCurrency)(e)), r .unitId.setValueSilently(Object(l.symbolUnit)(e))) } r.inputs.childs().symbol.value() !== n && r.inputs.childs().symbol.listeners() .fire(r.inputs.childs().symbol), r.currencyId.value() !== o && r.currencyId .listeners().fire(r.currencyId), r.unitId.value() !== a && r.unitId .listeners().fire(r.unitId) } _updateBarFunction() { var e; const t = null !== (e = this.priceSource()) && void 0 !== e ? e : "close"; this._barFunction = Object(a.barFunction)(t) } } }, yMne: function(e, t, i) { "use strict"; i.d(t, "b", (function() { return r })), i.d(t, "a", (function() { return n })); var s = i("J2xC"); const r = parseInt(s["css-value-header-toolbar-height"]), n = 3 }, yUly: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX"), o = n.LineToolWidthsProperty, a = n.LineToolColorsProperty; class l extends s { constructor(e, t) { super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views") .then(i.t.bind(null, "SvjA", 7)).then(({ TrendBasedFibTimePaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } levelsCount() { return l.LevelsCount } pointsCount() { return 3 } name() { return "Trend-Based Fib Time" } migrateVersion(e, t, i) {} processErase(e, t) { var i = "level" + t, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "u52p"))) .TrendBasedFibTimeDefinitionsViewModel } static createProperties(e) { var t = new r("linetooltrendbasedfibtime", e, !1, { range: [1, 11] }); return l._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline") .child("color") ], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child( "linewidth")), i.push(e.child("level" + r).child("color")); e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t)) } } l.LevelsCount = 11, l.version = 1, t.LineToolTrendBasedFibTime = l }, yfAl: function(e, t, i) { "use strict"; i.r(t); var s = i("aO4+"), r = i("Eyy1"), n = i("txPx"), o = i("aIyQ"), a = i.n(o), l = i("e3/o"), c = i("GxN8"), h = i("7ktv"), u = i("MWAT"), d = i("CW80"), p = i("s1Gx"); const _ = new Map([ ["trading", e => Object(d.isTrading)(e)], ["drawing", e => Object(d.isLineTool)(e) && !Object(d.isTrading)(e) && !e .isPhantom() ], ["drawingsForAllSymbols", e => Object(d.isLineTool)(e) && !Object(d.isTrading)(e) && !e.isPhantom() ], ["phantom", e => Object(d.isLineTool)(e) && e.isPhantom()], ["restRowSources", e => !Object(d.isLineTool)(e) && !Object(d.isTrading)(e)], ["leftPriceScale", (e, t) => "left" === f(e, t)], ["rightPriceScale", (e, t) => "right" === f(e, t)], ["overlayPriceScale", (e, t) => "overlay" === f(e, t)] ]), m = new Map([ ["trading", "visibleSorted"], ["drawing", "visibleSorted"], ["drawingsForAllSymbols", "allSorted"], ["phantom", "visibleSorted"], ["restRowSources", "visibleSorted"], ["leftPriceScale", "visibleSorted"], ["rightPriceScale", "visibleSorted"], ["overlayPriceScale", "visibleSorted"] ]); function f(e, t) { const i = e.priceScale(); return null === i ? "overlay" : t.priceScalePosition(i) } class g { constructor(e) { this._groupedSources = new Map, this._sources = null, this._pane = e } clear() { this._groupedSources.clear(), this._sources = null } destroy() { this.clear() } all() { return this._groupedSources.has("visibleSorted") || this._sortSources(), Object(r .ensureDefined)(this._groupedSources.get("visibleSorted")) } allIncludingHidden() { return this._groupedSources.has("allSorted") || this._sortSources(), Object(r .ensureDefined)(this._groupedSources.get("allSorted")) } allExceptSpecialSources() { if (!this._groupedSources.has("exceptSpecial")) { const e = this.allIncludingHidden().filter(e => !e.isSpeciallyZOrderedSource()); this._groupedSources.set("exceptSpecial", e) } return Object(r.ensureDefined)(this._groupedSources.get("exceptSpecial")) } tradingSources() { return this._getSourcesByGroupType("trading") } lineSources() { return this._getSourcesByGroupType("drawing") } lineSourcesForAllSymbols() { return this._getSourcesByGroupType("drawingsForAllSymbols") } phantomSources() { return this._getSourcesByGroupType("phantom") } allExceptLineAndTradingSources() { return this._getSourcesByGroupType("restRowSources") } hitTestSources() { if (!this._groupedSources.has("hitTest")) { const e = this.allExceptLineAndTradingSources().concat(this.lineSources()); this._groupedSources.set("hitTest", e) } return Object(r.ensureDefined)(this._groupedSources.get("hitTest")) } generalSources() { if (!this._groupedSources.has("general")) { const e = this.allExceptLineAndTradingSources().concat(this.lineSources()); this._groupedSources.set("general", Object(p.sortSources)(e)) } return Object(r.ensureDefined)(this._groupedSources.get("general")) } leftPriceScalesSources() { return this._getSourcesByGroupType("leftPriceScale") } rightPriceScalesSources() { return this._getSourcesByGroupType("rightPriceScale") } overlayPriceScaleSources() { return this._getSourcesByGroupType("overlayPriceScale") } _getSourcesByGroupType(e) { const t = Object(r.ensureDefined)(m.get(e)); return this._groupedSources.has(t) ? this._groupedSources.has(e) || this ._groupSources(e) : (this._sortSources(), this._groupSources(e)), Object(r .ensureDefined)(this._groupedSources.get(e)) } _sortSources() { null === this._sources && (this._sources = this._pane.dataSources()); const e = Object(p.sortSources)(this._sources), t = e.filter(e => !Object(d.isLineTool)(e) || e.isActualSymbol() && e .isActualCurrency() && e.isActualUnit()); this._groupedSources.set("allSorted", e), this._groupedSources.set("visibleSorted", t) } _groupSources(e) { const t = Object(r.ensureDefined)(m.get(e)), i = _.get(e); if (void 0 !== i) { const s = Object(r.ensureDefined)(this._groupedSources.get(t)).filter(e => i(e, this._pane)); this._groupedSources.set(e, s) } } } var b = i("1Wlv"), v = i("FaJS"), S = i("Qb4w"), y = i("3ClC"), w = i("/tGj"), P = i("2jby"); i.d(t, "PaneBase", (function() { return T })); const C = Object(n.getLogger)("Chart.Pane"); function x(e, t, i) { e.setMargins({ top: t, bottom: i }) } class T { constructor(e, t, i, s) { this.m_dataSources = [], this._sourceWatchedValuesSubscriptions = new Map, this .m_mainDataSource = null, this._cachedOrderedSources = new g(this), this ._sourcesById = new Map, this._dataSourcesCollectionChanged = new a.a, this ._dataSourceSymbolResolved = new a.a, this._sourcePropertiesChanged = new a.a, this._sourcesZOrderChanged = new a.a, this._tagsChanged = new a.a, this ._stretchFactor = 1e3, this._isInInsertManyDataSourcesState = !1, this ._lastLineDataSourceZOrder = null, this._rightPriceScales = [], this ._leftPriceScales = [], this._lockedPriceScale = null, this ._currentPriceScaleRatio = null, this._onPriceScalesChanged = new a.a, this ._isRecalculatingScales = !1, this._priceDataSources = [], this ._bulkActionsActive = 0, this ._reorderZOrderOnAddingSourceToCollectionAllowed = !0, this ._priceScaleSelectionStrategy = Object(u.createPriceScaleSelectionStrategy)(i .properties().priceScaleSelectionStrategyName.value()), this._id = null != s ? s : Object(l.randomHashN)(6) } id() { return this._id } bulkActionMacro(e) { this._bulkActionsActive += 1, e(), this._bulkActionsActive -= 1, 0 === this ._bulkActionsActive && this._dataSourcesCollectionChanged.fire() } sourcesByGroup() { return this._cachedOrderedSources } dataSourceForId(e) { return this._sourcesById.get(e) || null } changeSourceId(e, t) { Object(r.assert)(this.hasDataSource(e)), this._sourcesById.delete(e.id()), e.setId( t), this._sourcesById.set(t, e) } movePriceScale(e, t, i) { const s = this.priceScalePosition(e); if (s !== t) this.removePriceScale(e), this._placePriceScale(e, t, i), e .invalidateMargins(), this._invalidateSourcesCache(); else if (void 0 !== i && "overlay" !== s) { const t = "left" === s ? this._leftPriceScales : this._rightPriceScales, r = t.indexOf(e); t.splice(r, 1), t.splice(i, 0, e) } } isEmpty() { return null === this.m_mainDataSource } recalculatePriceScale(e) { if (!e) return; const t = e.sourcesForAutoscale(); if ((e.isAutoScale() || e.priceRangeShouldBeRecalculatedOnce()) && t && t.length > 0 && !this.timeScale().isEmpty()) { const t = this.timeScale().visibleBarsStrictRange(); e.recalculatePriceRange(t) } e.updateAllViews() } onSourceTagsChanged() { this._tagsChanged.fire() } insertDataSource(e, t, i) { e.setZorder(i), t || (t = this.findSuitableScale(e)), this._addSourceToCollections( e); let s = !1; (e === this.model().mainSeries() || null === this.m_mainDataSource) && (this .m_mainDataSource = e, s = !0), t.addDataSource(e, this ._isInInsertManyDataSourcesState), e.setPriceScale(t), t .invalidateMargins(), e.onTagsChanged && e.onTagsChanged().subscribe(this, this .onSourceTagsChanged), s && this._processMainSourceChange(), this._tagsChanged.fire(), e instanceof h .PriceDataSource && this.recalculatePriceScale(t), this ._invalidateSourcesCache() } addDataSource(e, t, i) { let s = e.zorder(); i || (Object(d.isLineTool)(e) && !e.isSpeciallyZOrderedSource() ? (s = null !== this ._lastLineDataSourceZOrder ? this._lastLineDataSourceZOrder + 1 : this .newLineToolZOrder(), this._isInInsertManyDataSourcesState && (this ._lastLineDataSourceZOrder = s)) : Object(y.isStudy)(e) && !e .isSpeciallyZOrderedSource() && (s = this.newStudyZOrder())), this .insertDataSource(e, t, s) } removeDataSource(e, t, i) { const s = this.m_dataSources.indexOf(e); if (-1 === s) return void C.logDebug("removeDataSource: invalid data source"); this._removeSourceFromCollections(s, !!i), e !== this.m_mainDataSource || t || (this .m_mainDataSource = null); const r = e.priceScale(); this.removeSourceFromPriceScale(e), e.onTagsChanged && e.onTagsChanged() .unsubscribe(this, this.onSourceTagsChanged), e instanceof h.PriceDataSource && !t && this._processMainSourceChange(), this._tagsChanged.fire(), r && e instanceof h.PriceDataSource && this.recalculatePriceScale(r), this ._invalidateSourcesCache() } hasDataSource(e) { return this._sourcesById.has(e.id()) } dataSources() { return this.m_dataSources } priceDataSources() { return this._priceDataSources } replaceSource(e, t, i) { const s = this.m_mainDataSource === e, r = e.zorder(); this.insertDataSource(t, i, r), this.removeDataSource(e, s), this._sourcesById.set(t .id(), t), s && (this.m_mainDataSource = t, this._processMainSourceChange()) } isOverlay(e) { const t = e.priceScale(); return null === t || "overlay" === this.priceScalePosition(t) } updateAllViews() { for (const e of this.m_dataSources) e.updateAllViews(); for (const e of this.model().customSources()) e.updateViewsForPane(this) } priceScalePosition(e) { return this._leftPriceScales.includes(e) ? "left" : this._rightPriceScales.includes( e) ? "right" : "overlay" } createPriceScaleAtPosition(e, t) { const i = this.properties().childs().axisProperties.state(); i.autoScale = !0; const s = new b.PriceScale(this.model().properties().scalesProperties, i); return s.setHeight(this.height()), x(s, this._defaultTopMargin(), this ._defaultBottomMargin()), this._placePriceScale(s, e, t), s } removePriceScale(e) { e.modeChanged().unsubscribeAll(this), e.priceRangeChanged().unsubscribeAll(this), e .internalHeightChanged().unsubscribeAll(this), e === this._lockedPriceScale && ( this._lockedPriceScale = null, this._currentPriceScaleRatio = null); const t = this._leftPriceScales.indexOf(e); - 1 !== t && (this._leftPriceScales[t] .invalidateMargins(), this._leftPriceScales.splice(t, 1)); const i = this._rightPriceScales.indexOf(e); if (-1 !== i && (this._rightPriceScales[i].invalidateMargins(), this ._rightPriceScales.splice(i, 1)), null === e.mainSource()) { const t = e.dataSources().length; 0 !== t && C.logError( "Invalid priceScale state: empty mainSource but non-empty data sources=" + t) } this._onPriceScalesChanged.fire() } move(e, t, i) { const s = e.priceScale(); this.removeSourceFromPriceScale(e), t.addDataSource(e), e.setPriceScale(t), t .invalidateMargins(), this._processMainSourceChange(), this ._invalidateSourcesCache(), e.isIncludedInAutoScale() && (null !== s && this .recalculatePriceScale(s), this.recalculatePriceScale(t)), this._onPriceScalesChanged.fire() } setZOrders(e) { e.forEach((e, t) => { t.setZorder(e) }), this._invalidateSourcesCache(), 0 === this._bulkActionsActive && this ._dataSourcesCollectionChanged.fire(), this.model().lightUpdate() } isMainPane() { const e = this.model().mainSeries(); for (const t of this.m_dataSources) if (t === e) return !0; return !1 } isLast() { const e = this.model().panes(); return e[e.length - 1] === this } newStudyZOrder() { return Object(P.newStudyZOrder)(this._priceDataSources) } newLineToolZOrder(e) { return Object(P.newLineToolZOrder)(this.m_dataSources, e) } containsMainSeries() { return this._sourcesById.has(this.model().mainSeries().id()) } applyPriceScaleRatio(e, t) { var i; null !== this._lockedPriceScale && this._lockedPriceScale !== e || this ._currentPriceScaleRatio === t || !this.isMainPane() || null === this ._lockedPriceScale && e !== (null === (i = this.mainDataSource()) || void 0 === i ? void 0 : i.priceScale()) || (this._setNewPriceRangeByScaleRatio(e, t, this._mainSourceVisiblePriceRange(e), !0, !0), null !== this ._lockedPriceScale ? this._tryToApplyNewPriceScaleRatio() : e.isLog() || this.model().mainSeriesScaleRatioPropertyOnChanged()) } sendToBack(e) { const t = this.sourcesByGroup().allExceptSpecialSources(); this._batchReorder(e, t[0], P.moveBeforeSource) } bringToFront(e) { const t = this.sourcesByGroup().allExceptSpecialSources(); this._batchReorder(e, t[t.length - 1], P.moveAfterSource) } sendBackward(e) { const t = this.sourcesByGroup().allIncludingHidden(), i = t.indexOf(e[0]); if (0 === i) this.bringToFront(e); else { const s = t[i - 1]; this.insertBefore(e, s) } } bringForward(e) { const t = this.sourcesByGroup().allExceptSpecialSources(), i = t.indexOf(e[e.length - 1]); if (i === t.length - 1) this.sendToBack(e); else { const s = t[i + 1]; this.insertAfter(e, s) } } insertAfter(e, t) { this._batchReorder(e, t, P.moveAfterSource) } insertBefore(e, t) { this._batchReorder(e, t, P.moveBeforeSource) } priceScaleSelectionStrategy() { return this._priceScaleSelectionStrategy } findTargetPriceAxisViews(e, t, i, s) { if (Object(c.a)(e) && this.model().paneForSource(e) !== this) return []; const r = e.priceScale(); if (t === r) return i; if (null === r) return []; if ("overlay" === this.priceScalePosition(r)) return t === this .defaultPriceScale() ? i : []; const n = this.priceScalePosition(t); if (n !== this.priceScalePosition(r)) return []; const o = "left" === n ? this.leftPriceScales() : this.rightPriceScales(); return o.indexOf(t) < o.indexOf(r) ? s : [] } onPriceScalesChanged() { return this._onPriceScalesChanged } setPaneSize(e) { let t; switch (e) { case "large": t = 1; break; case "medium": t = .6; break; case "small": t = .3; break; case "tiny": t = .15; break; default: throw new Error("Unknown size enum value: " + e) } this._stretchFactor = 1e3 * t } stretchFactor() { return this._stretchFactor } setStretchFactor(e) { this._stretchFactor = e } customSources(e) { return this.model().customSources(e) } onTagsChanged() { return this._tagsChanged } dataSourcesCollectionChanged() { return this._dataSourcesCollectionChanged } symbolSourceResolved() { return this._dataSourceSymbolResolved } sourcePropertiesChanged() { return this._sourcePropertiesChanged } sourceZOrderChanged() { return this._sourcesZOrderChanged } lineToolsForArea(e) { const t = this.height(), i = this.width(), s = this.logicalRectToPixels(e); return [...this.m_dataSources, ...this.model().multiPaneSources(this)].filter(d .isLineTool).filter(e => (e.paneViews(this) || []).some(e => { const r = e.renderer(t, i); return r && r.doesIntersectWithBox && r.doesIntersectWithBox(s) })) } logicalRectToPixels(e) { const t = this.defaultPriceScale(), i = this.timeScale(), n = Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainSource()) .firstValue()), o = t.priceToCoordinate(e.p1.price, n), a = i.indexToCoordinate(e.p1.index), l = t.priceToCoordinate(e.p2.price, n), c = i.indexToCoordinate(e.p2.index), h = new s.Point(Math.min(a, c), Math.min(o, l)), u = new s.Point(Math.max(a, c), Math.max(o, l)); return Object(s.box)(h, u) } clipboardLineToolOwnerSource(e) { const t = this.dataSourceForId(e); if (null !== t) { const e = t.ownerSource(); if (null !== e && null !== e.firstValue()) return e } const i = this.mainDataSource(); if (null !== i && null !== i.firstValue()) return i; for (const e of this.dataSources()) if (e instanceof h.PriceDataSource && null !== e.firstValue()) return e; return null } realignLineTools() { let e = !1; for (const t of this.m_dataSources) Object(d.isLineTool)(t) && (t .calcIsActualSymbol(), t.updateAllViews(), e = !0); return this._invalidateSourcesCache(), e } startScalePrice(e, t) { e.startScale(t) } scalePriceTo(e, t) { e.scaleTo(t), this.updateAllViews() } endScalePrice(e) { e.endScale() } resetPriceScale(e) { const t = this.timeScale().visibleBarsStrictRange(); e.isLockScale() || e.setMode({ autoScale: !0 }), e.recalculatePriceRange(t), this.updateAllViews() } restorePriceScaleState(e, t) { e.restoreState(t), this.updateAllViews() } beginInsertManyLineDataSources() { this._isInInsertManyDataSourcesState = !0, this._lastLineDataSourceZOrder = null } endInsertManyLineDataSources() { this._isInInsertManyDataSourcesState = !1, this._lastLineDataSourceZOrder = null } removeSourceFromPriceScale(e) { const t = e.priceScale(); if (null !== t) { const i = t.dataSources(); i.indexOf(e) >= 0 && t.removeDataSource(e), 0 === i.length && this .removePriceScale(t) } } _addSourceToCollections(e, t) { this.m_dataSources.push(e), this._sourcesById.set(e.id(), e), this ._invalidateSourcesCache(), t || 0 !== this._bulkActionsActive || this ._dataSourcesCollectionChanged.fire(); const i = () => { this._sourcePropertiesChanged.fire(e) }; e.properties().subscribe(this, i), e.zOrderChanged().subscribe(this, t => this ._sourcesZOrderChanged.fire(e, t)), Object(d.isLineTool)(e) && (e .normalizedPointsChanged().subscribe(this, i), e.fixedPointsChanged() .subscribe(this, i), e.hasAlert.subscribe(i), e.linkKey().subscribe(i), this ._sourceWatchedValuesSubscriptions.set(e.id(), i)), e instanceof h .PriceDataSource && (e.currencyChanged().subscribe(this, () => this ._invalidateSourcesCache()), e.unitChanged().subscribe(this, () => this ._invalidateSourcesCache()), this._priceDataSources.push(e), Object(w .isSymbolSource)(e) && e.symbolResolved().subscribe(this, () => this ._dataSourceSymbolResolved.fire(e))), e.isMultiPaneAvailable() && this .model().addMultiPaneSource(e), !e.isSpeciallyZOrderedSource() && this ._reorderZOrderOnAddingSourceToCollectionAllowed && (Object(d.isLineTool)(e) && Object(P.isReorderRequired)(null, e.zorder()) || Object(y.isStudy)(e) && Object(P.isReorderRequired)(e.zorder(), null)) && (this ._reorderZOrderOnAddingSourceToCollectionAllowed = Object(P .reorderDataSourcesZOrder)(this.m_dataSources)) } _removeSourceFromCollections(e, t) { const i = this.m_dataSources[e]; i.properties().unsubscribeAll(this), i.zOrderChanged().unsubscribeAll(this), this .m_dataSources.splice(e, 1), this._sourcesById.delete(i.id()); const s = i.id(); if (Object(d.isLineTool)(i) && (i.normalizedPointsChanged().unsubscribeAll(this), i .fixedPointsChanged().unsubscribeAll(this), this ._sourceWatchedValuesSubscriptions.has(s))) { const e = this._sourceWatchedValuesSubscriptions.get(s); i.hasAlert.unsubscribe(e), i.linkKey().unsubscribe(e) } if (this._invalidateSourcesCache(), i instanceof h.PriceDataSource) { i.currencyChanged().unsubscribeAll(this), i.unitChanged().unsubscribeAll(this); const e = this._priceDataSources.indexOf(i); Object(r.assert)(-1 !== e), this._priceDataSources.splice(e, 1), Object(w .isSymbolSource)(i) && i.symbolResolved().unsubscribeAll(this) } t || 0 !== this._bulkActionsActive || this._dataSourcesCollectionChanged.fire(), i .isMultiPaneAvailable() && this.model().removeMultiPaneSource(i), this ._reorderZOrderOnAddingSourceToCollectionAllowed = !0 } _recalculatePriceScaleByScaleRatio(e) { this.isMainPane() && e === this._lockedPriceScale && (null !== this ._currentPriceScaleRatio ? this._applyOldScaleRatioToPriceScale() : this ._tryToApplyNewPriceScaleRatio()) } _defaultBottomMargin() { return .01 * this.properties().childs().bottomMargin.value() } _defaultTopMargin() { return .01 * this.properties().childs().topMargin.value() } _updateMargins() { const e = this._defaultTopMargin(), t = this._defaultBottomMargin(); for (const i of this._leftPriceScales) x(i, e, t); for (const i of this._rightPriceScales) x(i, e, t); for (const i of this.m_dataSources) if (this.isOverlay(i)) { const s = i.priceScale(); null !== s && (x(s, e, t), this.recalculatePriceScale(s)) } for (const e of this._leftPriceScales) this.recalculatePriceScale(e); for (const e of this._rightPriceScales) this.recalculatePriceScale(e); this.updateAllViews() } _batchReorder(e, t, i) { i(this.sourcesByGroup().allExceptSpecialSources(), e, t), this ._invalidateSourcesCache(), this._dataSourcesCollectionChanged.fire(), this .model().fullUpdate() } _placePriceScale(e, t, i) { if ("overlay" === t) return void e.invalidateMargins(); const s = "left" === t ? this._leftPriceScales : this._rightPriceScales, n = void 0 === i ? s.length : i; s.splice(n, 0, e), e.modeChanged().subscribe(this, this._onPriceScaleModeChanged .bind(this, e)), e.internalHeightChanged().subscribe(this, this ._recalculatePriceScaleByScaleRatio.bind(this, e)), e.priceRangeChanged() .subscribe(this, this._recalculateTimeScaleByScaleRatio.bind(this, e)), e .priceRangeChanged().subscribe(this, this._onPriceScaleSetMinMaxPriceRange.bind( this, e)), e.isLockScale() && (Object(r.assert)(null === this ._lockedPriceScale), this._lockedPriceScale = e, this ._currentPriceScaleRatio = null), e.invalidateMargins(), this ._onPriceScalesChanged.fire() } _onPriceScaleModeChanged(e, t, i) { if (i.lockScale && (this._lockedPriceScale !== e && null !== this ._lockedPriceScale && this._lockedPriceScale.setMode({ lockScale: !1 }), this._lockedPriceScale = e, this._currentPriceScaleRatio = Object(v .scaleRatio)(this.timeScale(), e)), t.lockScale && !i.lockScale && (this ._lockedPriceScale = null, this._currentPriceScaleRatio = null), t .percentage === i.percentage && t.indexedTo100 === i.indexedTo100) return; const s = this.timeScale().visibleBarsStrictRange(); null !== s && (e.recalculatePriceRange(s), e.updateAllViews()) } _applyOldScaleRatioToPriceScale() { this._isRecalculatingScales || null === this._currentPriceScaleRatio || null === this._lockedPriceScale || (this._isRecalculatingScales = !0, this ._setNewPriceRangeByScaleRatio(this._lockedPriceScale, this ._currentPriceScaleRatio, this._mainSourceVisiblePriceRange(this ._lockedPriceScale)), this._isRecalculatingScales = !1) } _setNewPriceRangeByScaleRatio(e, t, i, s, r) { const n = Object(v.priceRangeByScaleRatio)(e, this.timeScale().barSpacing(), t); e.setPriceRange(null !== n ? n : i, s, r) } _applyOldScaleRatioToTimeScale() { this._isRecalculatingScales || null === this._currentPriceScaleRatio || (this ._isRecalculatingScales = !0, this._setNewBarSpacingByScaleRatio(), this ._isRecalculatingScales = !1) } _tryToApplyNewPriceScaleRatio() { const e = Object(r.ensureNotNull)(this._lockedPriceScale), t = Object(v.scaleRatio)(this.timeScale(), e); this._currentPriceScaleRatio === t || e.isLog() || (this._currentPriceScaleRatio = t, this.model().mainSeriesScaleRatioPropertyOnChanged()) } _recalculateTimeScaleByScaleRatio(e) { e === this._lockedPriceScale && (null !== this._currentPriceScaleRatio ? this ._applyOldScaleRatioToTimeScale() : this._tryToApplyNewPriceScaleRatio()) } _setNewBarSpacingByScaleRatio() { const e = this.timeScale().getValidBarSpacing(Object(v.barSpacingByScaleRatio)( Object(r.ensureNotNull)(this._lockedPriceScale), this ._currentPriceScaleRatio)); this.timeScale().isValidBarSpacing(e) && this.timeScale().setBarSpacing(e) } _mainSourceVisiblePriceRange(e) { const t = this.timeScale().visibleBarsStrictRange(); return null !== t ? Object(r.ensureNotNull)(Object(r.ensureNotNull)(e.mainSource()) .priceRange(t.firstBar(), t.lastBar())) : new S.PriceRange(-.5, .5) } _setMinMaxPriceRange() { const e = Object(r.ensureNotNull)(this._lockedPriceScale), t = Object(v.priceRangeByScaleRatio)(e, this.timeScale().maxBarSpacing(), this ._currentPriceScaleRatio), i = Object(v.priceRangeByScaleRatio)(e, this.timeScale().minBarSpacing(), this ._currentPriceScaleRatio); null !== t && e.setMaxPriceRange(t), null !== i && e.setMinPriceRange(i) } _onPriceScaleSetMinMaxPriceRange(e) { e === this._lockedPriceScale && this._setMinMaxPriceRange() } } }, yi8X: function(e, t, i) { "use strict"; i.r(t), i.d(t, "LineToolInfoLine", (function() { return n })); var s = i("Ocx9"), r = i("WPQD"); class n extends r.LineToolTrendLine { constructor(e, t) { super(e, t || n.createProperties()) } pointsCount() { return 2 } name() { return "Info Line" } static createProperties(e) { const t = new s.DefaultProperty("linetoolinfoline", e); return n._configureProperties(t), t } static _configureProperties(e) { r.LineToolTrendLine._configureProperties(e) } } }, "z+Sa": function(e, t, i) { "use strict"; i.r(t), i.d(t, "SeriesHorizontalBaseLinePaneView", (function() { return r })); var s = i("k4w6"); class r extends s.a { constructor(e) { super(e) } _updateImpl() { this._lineRendererData.visible = !1; const e = this._series.priceScale().mode(); if (!e.percentage && !e.indexedTo100) return; const t = this._series.firstValue(); null !== t && (this._lineRendererData.visible = !0, this._lineRendererData.y = this._series.priceScale().priceToCoordinate(t, t), this ._lineRendererData.color = this._series.properties().baseLineColor .value()) } } }, "z+cS": function(e, t, i) { "use strict"; i.r(t), i.d(t, "VerticalLineRenderer", (function() { return a })); var s = i("VdBB"), r = i("jFln"), n = i("gAom"), o = i("Zp/P"); class a { constructor() { this._data = null, this._hitTest = null } setData(e) { this._data = e } setHitTest(e) { this._hitTest = e } hitTest(e) { if (null === this._data) return null; const t = Object(o.interactionTolerance)().line, i = this._hitTest || new s.HitTestResult(s.HitTestResult.MOVEPOINT), r = Math.abs(e.x - this._data.x) <= t + this._data.linewidth / 2, n = void 0 === this._data.top || this._data.top - e.y <= t, a = void 0 === this._data.bottom || e.y - this._data.bottom <= t; return r && n && a ? i : null } draw(e, t) { if (null === this._data) return; if (this._data.linewidth <= 0) return; if (this._data.x < -this._data.linewidth / 2 || this._data.x > t.cssWidth + this ._data.linewidth / 2) return; const i = t.pixelRatio; e.lineCap = "butt", e.strokeStyle = this._data.color, e.lineWidth = Math.max(1, Math .floor(this._data.linewidth * i)), void 0 !== this._data.linestyle && Object(r.setLineStyle)(e, this._data.linestyle); const s = void 0 !== this._data.top ? Math.max(this._data.top, 0) : 0, o = void 0 !== this._data.bottom ? Math.min(this._data.bottom, t.cssHeight) : t .cssHeight, a = Math.round(this._data.x * i), l = Math.floor(s * i), c = Math.ceil(o * i); Object(n.drawVerticalLine)(e, a, l, c) } } }, "z61+": function(e, t, i) { "use strict"; var s = i("Eyy1"), r = i("0YCj"), n = i.n(r), o = i("23IT"), a = i("ogJP"), l = i("txPx"); const c = ["first_visible_bar_time", "last_visible_bar_time"]; function h(e) { return !e.groupId && !e.isHidden && !c.includes(e.id) } var u = i("Ecpn"); i.d(t, "a", (function() { return p })); const d = Object(l.getLogger)("Platform.GUI.PropertyDialog.Indicators.MetaInfo"); class p { constructor(e) { this._metaInfo = e } hasUserEditableInputs() { return this._metaInfo.inputs.some(h) } getUserEditableInputs() { return this._metaInfo.inputs.filter(h) } hasUserEditableProperties() { return n.a.isScriptStrategy(this._metaInfo) } hasUserEditableStyles() { const e = this._metaInfo; return e.plots.length > 0 || void 0 !== e.bands || void 0 !== e.filledAreas || Object(u.a)(e.shortId) || n.a.isScriptStrategy(this._metaInfo) || Object.values( e.graphics).some(e => void 0 !== e) } getUserEditablePlots() { const e = new Set, t = this._metaInfo; return t.plots.filter(i => { if (Object(o.isColorerPlot)(i) || Object(o.isTextColorerPlot)(i) || Object(o.isDataOffsetPlot)(i) || Object(o.isOhlcColorerPlot)(i) || Object(o.isAlertConditionPlot)(i)) return !1; if (Object(o.isOhlcPlot)(i)) { const r = i.target; if (e.has(r)) return !1; e.add(r); const n = Object(s.ensureDefined)(t.ohlcPlots); return !Object(s.ensureDefined)(n[r]).isHidden } { const e = t.styles ? t.styles[i.id] : void 0; return void 0 === e || !e.isHidden } }) } hasUserEditableOptions() { return this.hasUserEditableInputs() || this.hasUserEditableProperties() || this .hasUserEditableStyles() } getStrategyProperties() { const e = this._metaInfo, t = e.inputs.filter(m), i = { ..._ }; for (const s of t) { const t = s.internalID; i[t] = s, _.hasOwnProperty(t) || d.logWarn( `Unknown strategy input internal id ${t} in ${e.fullId}`) } return Object(a.clone)(i) } } const _ = { currency: void 0, backtest_fill_limits_assumption: void 0, calc_on_every_tick: void 0, calc_on_order_fills: void 0, commission_value: void 0, commission_type: void 0, initial_capital: void 0, pyramiding: void 0, slippage: void 0, default_qty_type: void 0, default_qty_value: void 0, margin_long: void 0, margin_short: void 0 }; function m(e) { return "strategy_props" === e.groupId } }, "z8/4": function(e, t, i) { "use strict"; i.r(t), i.d(t, "OverlayLegendView", (function() { return n })); var s = i("JjUe"), r = i("qXYw"); class n extends s.OverlayDataWindowView { constructor(e, t) { super(e, t), this._additional = null, this._showBarChange = t.properties() .paneProperties.legendProperties.showBarChange, this._showSeriesOHLC = t .properties().paneProperties.legendProperties.showSeriesOHLC, this ._studyOverlay = e, this._showBarChange.subscribe(this, this.update), this ._showSeriesOHLC.subscribe(this, this.update) } isValuesVisible() { return this._showSeriesOHLC.value() || this._showBarChange.value() } additional() { return this._additional } destroy() { this._showBarChange.unsubscribeAll(this), this._showSeriesOHLC.unsubscribeAll( this) } _updateImpl() { super._updateImpl() } _createValuesProvider(e, t) { return new r.OverlayLegendValuesProvider(e, t) } } }, zDbI: function(e, t, i) { "use strict"; i.r(t), i.d(t, "CHART_FONT_FAMILY", (function() { return r })); var s = i("mNbo"); const r = Object(s.isOnMobileAppPage)("old") ? "system-ui, -apple-system" : "'Trebuchet MS', Roboto, Ubuntu, sans-serif" }, zL3Q: function(e, t, i) { "use strict"; i.d(t, "a", (function() { return _ })), i.d(t, "b", (function() { return m })); var s = i("hY0g"), r = i.n(s), n = i("4o++"), o = i("mMWL"), a = i("CW80"), l = i("m/3z"); const c = new r.a(!1), h = new r.a(n.MagnetMode.WeakMagnet), u = Object(l.c)(), d = Object(l.d)(); function p() { const e = u.value(); if (d.value() && (o.isToolEditingNow.value() || o.isToolCreatingNow.value())) return void c .setValue(!1); const t = o.tool.value(), i = e && (Object(a.isLineToolName)(t) || o.isToolEditingNow.value() || Object(o .toolIsMeasure)(t)), s = Object(o.properties)().childs().magnet.value(); h.setValue(!s && i ? n.MagnetMode.StrongMagnet : Object(o.properties)().childs().magnetMode .value()), c.setValue(i ? !s : s) } function _() { return c } function m() { return h } Object(o.runOnDrawingStateReady)(() => { Object(o.properties)().childs().magnet.subscribe(null, p), Object(o.properties)() .childs().magnetMode.subscribe(null, p), u.subscribe(p), d.subscribe(p), o.tool .subscribe(p), o.isToolEditingNow.subscribe(p), p() }) }, zM7N: function(e, t, i) { "use strict"; i.d(t, "c", (function() { return c })), i.d(t, "b", (function() { return h })), i.d(t, "e", (function() { return u })), i.d(t, "d", (function() { return d })); var s = i("YFKU"), r = i("eJTA"), n = i("/McG"), o = i("8pII"), a = i("FZIs"); function l() { return { [a.a.Light]: JSON.parse(JSON.stringify(n)), [a.a.Dark]: JSON.parse(JSON.stringify(o)) } } function c() { return [a.a.Light, a.a.Dark] } function h(e) { return l()[e] } function u(e) { return { [a.a.Light]: s.t("Light", { context: "colorThemeName" }), [a.a.Dark]: s.t("Dark", { context: "colorThemeName" }) } [e] || e } function d(e) { const t = l(); return c().some(i => p(t[i], e)) } function p(e, t) { let i = e.content === t.content; return function(e = {}, t) { try { ! function e(t, i, s) { for (const r in t) if (t.hasOwnProperty(r)) { const n = i.concat(r); if ("object" == typeof t[r]) e(t[r], n, s); else if (s(n, t[r])) throw new Error("exit") } }(e, [], t) } catch (e) { return } }(e.content, (e, s) => { const n = function(e, t = {}) { let i = t; for (let t = 0; t < e.length; t++) { if (!i || "object" != typeof i) return; i = i[e[t]] } if ("string" == typeof i || "number" == typeof i) return i; return }(e, t.content); return i = function(e, t) { if ("string" == typeof e && "string" == typeof t) try { return Object(r.areEqualRgb)(Object(r.parseRgb)(e), Object(r .parseRgb)(t)) } catch (i) { return e === t } return e === t }(s, n), !i }), i } i.d(t, "a", (function() { return a.a })) }, zRdu: function(e, t, i) { "use strict"; var s; i.d(t, "a", (function() { return s })), function(e) { e[e.Separator = 0] = "Separator", e[e.Action = 1] = "Action", e[e.ActionAsync = 2] = "ActionAsync", e[e.Loader = 3] = "Loader" }(s || (s = {})) }, zUrt: function(e, t, i) { "use strict"; i.r(t), i.d(t, "backend", (function() { return s })); const s = i("Ery9") }, zXvd: function(e, t, i) { "use strict"; i.r(t), i.d(t, "NumericFormatter", (function() { return n })); var s = i("kcTO"), r = i("nc0P"); class n { constructor(e) { this._precision = e } format(e) { return (void 0 !== this._precision ? e.toFixed(this._precision) : n.formatNoE(e)) .replace(".", s.formatterOptions.decimalSign) } parse(e) { const t = e.replace(s.formatterOptions.decimalSign, "."); let i = parseFloat(t); return this._precision && (i = +i.toFixed(this._precision)), i } static formatNoE(e) { if (!Number.isFinite(e)) return String(e); const t = new r.Big(e); return t.lt(1) ? t.toFixed() : t.toString() } } }, zZ5f: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("5rJj"), n = i("j3hX").LineToolColorsProperty; class o extends s { constructor(e, t) { super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "xp9B", 7)).then(({ FibSpeedResistanceFanPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } hLevelsCount() { return o.HLevelsCount } vLevelsCount() { return o.VLevelsCount } pointsCount() { return 2 } name() { return "Fib Speed Resistance Fan" } processErase(e, t) { var i = "h" === t.type ? "hlevel" + t.index : "vlevel" + t.index, s = this.properties()[i].visible; e.setProperty(s, !1, "Erase level line") } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "2PB4"))) .FibSpeedResistanceFanDefinitionsViewModel } _snapTo45DegreesAvailable() { return !0 } static createProperties(e) { void 0 !== e && void 0 === e.reverse && (e.reverse = !0); var t = new r("linetoolfibspeedresistancefan", e, !1, { range: [1, 7], prefixes: ["h", "v"], names: ["coeff", "color", "visible"] }); return o._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e); var t = [e.child("grid").child("color")]; for (let i = 1; i <= o.HLevelsCount; i++) t.push(e.child("hlevel" + i).child( "color")); for (let i = 1; i <= o.VLevelsCount; i++) t.push(e.child("vlevel" + i).child( "color")); e.addChild("linesColors", new n(t)), e.addExclusion("linesColors") } } o.HLevelsCount = 7, o.VLevelsCount = 7, t.LineToolFibSpeedResistanceFan = o }, ziJ5: function(e, t, i) { "use strict"; (function(e) { var s = i("QIuV").LineToolTrading, r = i("Ss5c").LineDataSource, n = i("RTYN").PositionAveragePriceAxisView, o = i("jkoZ"), a = i("Ocx9").DefaultProperty, l = i("kcTO").PriceFormatter, c = i("s1Gx").sortSourcesPreOrdered.LineToolPosition; function h(e) { return null == e ? e = "" : e += "", e } class u { constructor(e) { this._line = e, this._data = { bodyText: "position", quantityText: "0" }, this._closeEnabled = !0, this._direction = "buy", this._profitState = "neutral" } setDirection(e) { return this._direction = e, this._line.updateAllViewsAndRedraw(), this } setProfitState(e) { return this._profitState = e, this._line.updateAllViewsAndRedraw(), this } getPrice() { return this._line.points().length > 0 ? this._line.points()[0].price : this ._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0 } setPrice(e) { if (this._line.points().length > 0) { var t = this._line.points()[0]; t.price = e, this._line._points[0] = t, this._line.normalizePoints(), this._line.updateAllViewsAndRedraw() } return this._line._timePoint.length > 0 && (this._line._timePoint[0].price = e), this } getText() { return this._data.bodyText } setText(e) { return this._data.bodyText = e || "", this._line.updateAllViewsAndRedraw(), this } setTooltip(e) { return this._line.properties().tooltip.setValue(h(e)), this } getTooltip() { return this._line.properties().tooltip.value() } setProtectTooltip(e) { return this._line.properties().protectTooltip.setValue(h(e)), this } getProtectTooltip() { return this._line.properties().protectTooltip.value() } setCloseTooltip(e) { return this._line.properties().closeTooltip.setValue(h(e)), this } getCloseTooltip() { return this._line.properties().closeTooltip.value() } setReverseTooltip(e) { return this._line.properties().reverseTooltip.setValue(h(e)), this } getReverseTooltip() { return this._line.properties().reverseTooltip.value() } getQuantity() { return this._data.quantityText } setQuantity(e) { return this._data.quantityText = e || "", this._line .updateAllViewsAndRedraw(), this } getExtendLeft() { var e = this._line.properties().extendLeft.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .extendLeft.value() : e } setExtendLeft(e) { return this._line.properties().extendLeft.setValue(e), this } getLineLength() { var e = this._line.properties().lineLength.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .lineLength.value() : e } setLineLength(e) { return this._line.properties().lineLength.setValue(Math.max(0, Math.min(e, 100))), this } getLineColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.lineBuyColor : e.lineSellColor) .value() } setLineColor(e) { return "buy" === this._direction ? this.setLineBuyColor(e) : this .setLineSellColor(e), this } setLineBuyColor(e) { return this._line.properties().lineBuyColor.setValue(e), this } setLineSellColor(e) { return this._line.properties().lineSellColor.setValue(e), this } getLineStyle() { var e = this._line.properties().lineStyle.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .lineStyle.value() : e } setLineStyle(e) { return this._line.properties().lineStyle.setValue(e), this } getLineWidth() { var e = this._line.properties().lineWidth.value(); return "inherit" === e ? this._line._model.properties().tradingProperties .lineWidth.value() : e } setLineWidth(e) { return this._line.properties().lineWidth.setValue(e), this } getBodyBorderColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.bodyBorderBuyColor : e .bodyBorderSellColor).value() } setBodyBorderColor(e) { return "buy" === this._direction ? this.setBodyBorderBuyColor(e) : this .setBodyBorderSellColor(e), this } setBodyBorderBuyColor(e) { return this._line.properties().bodyBorderBuyColor.setValue(e), this } setBodyBorderSellColor(e) { return this._line.properties().bodyBorderSellColor.setValue(e), this } getBodyBackgroundColor() { return o.getColorFromProperties(this._line.properties().bodyBackgroundColor, this._line.properties().bodyBackgroundTransparency) } setBodyBackgroundColor(e) { return o.setColorToProperties(e, this._line.properties() .bodyBackgroundColor, this._line.properties() .bodyBackgroundTransparency), this } getBodyTextColor() { var e = this._line.properties(); return ("positive" === this._profitState ? e.bodyTextPositiveColor : "negative" === this._profitState ? e.bodyTextNegativeColor : e .bodyTextNeutralColor).value() } setBodyTextColor(e) { return "positive" === this._profitState ? this.setBodyTextPositiveColor(e) : "negative" === this._profitState ? this.setBodyTextNegativeColor(e) : this.setBodyTextNeutralColor(e), this } setBodyTextPositiveColor(e) { return this._line.properties().bodyTextPositiveColor.setValue(e), this } setBodyTextNegativeColor(e) { return this._line.properties().bodyTextNegativeColor.setValue(e), this } setBodyTextNeutralColor(e) { return this._line.properties().bodyTextNeutralColor.setValue(e), this } getBodyFont() { return o.getFontFromProperties(this._line.properties().bodyFontFamily, this ._line.properties().bodyFontSize, this._line.properties() .bodyFontBold, this._line.properties().bodyFontItalic) } setBodyFont(e) { return o.setFontToProperties(e, this._line.properties().bodyFontFamily, this ._line.properties().bodyFontSize, this._line.properties() .bodyFontBold, this._line.properties().bodyFontItalic), this } getQuantityBorderColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.quantityBorderBuyColor : e .quantityBorderSellColor).value() } setQuantityBorderColor(e) { return "buy" === this._direction ? this.setQuantityBorderBuyColor(e) : this .setQuantityBorderSellColor(e), this } setQuantityBorderBuyColor(e) { return this._line.properties().quantityBorderBuyColor.setValue(e), this } setQuantityBorderSellColor(e) { return this._line.properties().quantityBorderSellColor.setValue(e), this } getQuantityBackgroundColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.quantityBackgroundBuyColor : e .quantityBackgroundSellColor).value() } setQuantityBackgroundColor(e) { return "buy" === this._direction ? this.setQuantityBackgroundBuyColor(e) : this.setQuantityBackgroundSellColor(e), this } setQuantityBackgroundBuyColor(e) { return this._line.properties().quantityBackgroundBuyColor.setValue(e), this } setQuantityBackgroundSellColor(e) { return this._line.properties().quantityBackgroundSellColor.setValue(e), this } getQuantityTextColor() { return o.getColorFromProperties(this._line.properties().quantityTextColor, this._line.properties().quantityTextTransparency) } setQuantityTextColor(e) { return o.setColorToProperties(e, this._line.properties().quantityTextColor, this._line.properties().quantityTextTransparency), this } getQuantityFont() { return o.getFontFromProperties(this._line.properties().quantityFontFamily, this._line.properties().quantityFontSize, this._line.properties() .quantityFontBold, this._line.properties().quantityFontItalic) } setQuantityFont(e) { return o.setFontToProperties(e, this._line.properties().quantityFontFamily, this._line.properties().quantityFontSize, this._line.properties() .quantityFontBold, this._line.properties().quantityFontItalic), this } getReverseButtonBorderColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.reverseButtonBorderBuyColor : e .reverseButtonBorderSellColor).value() } setReverseButtonBorderColor(e) { return "buy" === this._direction ? this.setReverseButtonBorderBuyColor(e) : this.setReverseButtonBorderSellColor(e), this } setReverseButtonBorderBuyColor(e) { return this._line.properties().reverseButtonBorderBuyColor.setValue(e), this } setReverseButtonBorderSellColor(e) { return this._line.properties().reverseButtonBorderSellColor.setValue(e), this } getReverseButtonBackgroundColor() { return o.getColorFromProperties(this._line.properties() .reverseButtonBackgroundColor, this._line.properties() .reverseButtonBackgroundTransparency) } setReverseButtonBackgroundColor(e) { return o.setColorToProperties(e, this._line.properties() .reverseButtonBackgroundColor, this._line.properties() .reverseButtonBackgroundTransparency), this } getReverseButtonIconColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.reverseButtonIconBuyColor : e .reverseButtonIconSellColor).value() } setReverseButtonIconColor(e) { return "buy" === this._direction ? this.setReverseButtonIconBuyColor(e) : this.setReverseButtonIconSellColor(e), this } setReverseButtonIconBuyColor(e) { return this._line.properties().reverseButtonIconBuyColor.setValue(e), this } setReverseButtonIconSellColor(e) { return this._line.properties().reverseButtonIconSellColor.setValue(e), this } getCloseButtonBorderColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.closeButtonBorderBuyColor : e .closeButtonBorderSellColor).value() } setCloseButtonBorderColor(e) { return "buy" === this._direction ? this.setCloseButtonBorderBuyColor(e) : this.setCloseButtonBorderSellColor(e), this } setCloseButtonBorderBuyColor(e) { return this._line.properties().closeButtonBorderBuyColor.setValue(e), this } setCloseButtonBorderSellColor(e) { return this._line.properties().closeButtonBorderSellColor.setValue(e), this } getCloseButtonBackgroundColor() { return o.getColorFromProperties(this._line.properties() .closeButtonBackgroundColor, this._line.properties() .closeButtonBackgroundTransparency) } setCloseButtonBackgroundColor(e) { return o.setColorToProperties(e, this._line.properties() .closeButtonBackgroundColor, this._line.properties() .closeButtonBackgroundTransparency), this } getCloseButtonIconColor() { var e = this._line.properties(); return ("buy" === this._direction ? e.closeButtonIconBuyColor : e .closeButtonIconSellColor).value() } setCloseButtonIconColor(e) { return "buy" === this._direction ? this.setCloseButtonIconBuyColor(e) : this .setCloseButtonIconSellColor(e), this } setCloseButtonIconBuyColor(e) { return this._line.properties().closeButtonIconBuyColor.setValue(e), this } setCloseButtonIconSellColor(e) { return this._line.properties().closeButtonIconSellColor.setValue(e), this } block() { this._blocked = !0, this._line.updateAllViewsAndRedraw() } unblock() { this._blocked = !1, this._line.updateAllViewsAndRedraw() } isFunction(e) { return "function" == typeof e } onReverse(e, t) { return t ? this.isFunction(t) && (this._onReverseData = e, this ._onReverseCallback = t) : this.isFunction(e) && (this ._onReverseCallback = e), this } callOnReverse() { this.isFunction(this._onReverseCallback) && this._onReverseCallback.call( this, this._onReverseData) } isOnReverseCallbackPresent() { return this.isFunction(this._onReverseCallback) } onClose(e, t) { return t ? this.isFunction(t) && (this._onCloseData = e, this ._onCloseCallback = t) : this.isFunction(e) && (this ._onCloseCallback = e), this } setCloseEnabled(e) { return this._closeEnabled === e || (this._closeEnabled = e, this ._onCloseCallback && this._line.updateAllViewsAndRedraw()), this } isCloseEnabled() { return this._closeEnabled } callOnClose() { this.isFunction(this._onCloseCallback) && this._closeEnabled && this ._onCloseCallback.call(this, this._onCloseData) } isOnCloseCallbackPresent() { return this._closeEnabled && this.isFunction(this._onCloseCallback) } onModify(e, t) { return t ? this.isFunction(t) && (this._onModifyData = e, this ._onModifyCallback = t) : this.isFunction(e) && (this ._onModifyCallback = e), this } callOnModify() { this.isFunction(this._onModifyCallback) && this._onModifyCallback.call(this, this._onModifyData) } onContextMenu(e, t) { return t ? this.isFunction(t) && (this._onContextMenuData = e, this ._onContextMenuCallback = t) : this.isFunction(e) && (this ._onContextMenuCallback = e), this } shouldShowContextMenu() { return this.isFunction(this._onContextMenuCallback) } callOnContextMenu() { if (this.isFunction(this._onContextMenuCallback)) return this ._onContextMenuCallback.call(this, this._onContextMenuData) } remove() { this._line._model.removeSource(this._line), delete this._line } } class d extends s { constructor(e, t) { super(e, t || d.createProperties()), this._adapter = new u(this), i.e( "lt-pane-views").then(i.t.bind(null, "GzSs", 7)).then(({ PositionPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }); var s = e.mainSeries().symbolInfo(), r = null !== s ? s.pricescale : 100, n = null !== s && s.fractional ? s.minmov : 1, o = null !== s && s.fractional, a = null !== s ? s.minmove2 : void 0; this._formatter = new l(r, n, o, a) } zorder() { return c } isSpeciallyZOrderedSource() { return !0 } setPoint(e, t, i) { this._points[e] = t, this.normalizePoints() } addPoint(e, t) { return this._points.push(e), this._lastPoint = null, this.normalizePoints(), this.createServerPoints(), !0 } name() { return "Position" } createPriceAxisView(e) { return this._priceAxisView = new n(this, { pointIndex: e, backgroundPropertyGetter: () => this._adapter.getLineColor() }), this._priceAxisView } paneViews() { return TradingView.printing && !e.enabled("snapshot_trading_drawings") ? null : this._model.properties().tradingProperties.showPositions .value() ? r.prototype.paneViews.call(this) : null } priceAxisViews(t, i) { return TradingView.printing && !e.enabled("snapshot_trading_drawings") ? null : this._model.properties().tradingProperties.showPositions .value() ? r.prototype.priceAxisViews.call(this, t, i) : null } hasContextMenu() { return this._adapter.shouldShowContextMenu() } contextMenuItems() { return this._adapter.callOnContextMenu() } formatter() { return this._formatter } static createProperties(e) { var t = new a("linetoolposition", e, !1, !1); return d._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e) } } t.LineToolPosition = d }).call(this, i("Kxc7")) }, zqZp: function(e, t, i) { "use strict"; var s = i("Ss5c").LineDataSource, r = i("Ocx9").DefaultProperty, n = i("j3hX").LineToolColorsProperty; class o extends s { constructor(e, t) { super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null, "Ni7V", 7)).then(({ PriceLabelPaneView: e }) => { this._setPaneViews([new e(this, this._model)]) }) } pointsCount() { return 1 } name() { return "Price Label" } async _getPropertyDefinitionsViewModelClass() { return (await Promise.all([i.e(27), i.e(62), i.e( "lt-property-pages-with-definitions")]).then(i.bind(null, "hQgR"))) .PriceLabelDefinitionsViewModel } static createProperties(e) { var t = new r("linetoolpricelabel", e); return o._configureProperties(t), t } static _configureProperties(e) { s._configureProperties(e), e.addChild("linesColors", new n([e.childs() .borderColor ])), e.addChild("textsColors", new n([e.childs().color])) } } t.LineToolPriceLabel = o } }, [ ["/G2Z", "runtime", "vendors"] ] ]);