{"version":3,"file":"home.fa102221.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/signals-switch/types.ts","webpack://@finviz/website/./js/app/home/signals-switch/EliteSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/FreeSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/index.tsx","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../node_modules/flux/index.js","webpack://@finviz/website/../node_modules/flux/lib/Dispatcher.js","webpack://@finviz/website/../node_modules/flux/lib/invariant.js","webpack://@finviz/website/../node_modules/keymirror/index.js"],"sourcesContent":["import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom/client'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { Instrument } from '../../main/types'\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n LayoutType,\r\n Quote,\r\n RootChartConfigObject,\r\n ScaleType,\r\n TIMEFRAME,\r\n Theme,\r\n} from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig: RootChartConfigObject = {\r\n layout: LayoutType['1h1v'],\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n charts: [\r\n {\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: TIMEFRAME.i3,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n instrument: Instrument.MarketSentiment,\r\n refreshData: false,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: ChartElementType.MarketSentiment,\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: RootChartConfigObject | null\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n state: MarketSentimentState = {\r\n loading: true,\r\n enabled: false,\r\n chartConfig: null,\r\n }\r\n\r\n _timer: number | null = null\r\n _lastRequest: CancelablePromise | null = null\r\n\r\n componentDidMount() {\r\n this._fetchData('', () => {\r\n this.setState({ chartConfig: marketSentimentChartConfig })\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._timer !== null) {\r\n this._lastRequest?.cancel?.()\r\n clearTimeout(this._timer)\r\n }\r\n }\r\n\r\n render() {\r\n const { loading, enabled, chartConfig } = this.state\r\n\r\n return (\r\n \r\n \r\n \r\n Click BULL for positive market sentiment
Click BEAR for negative market sentiment] offsetx=[-200] offsety=[20] delay=[100]\">\r\n {chartConfig && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n this._vote(e, 'bull')}\r\n >\r\n Bull\r\n \r\n \r\n this._vote(e, 'bear')}\r\n >\r\n Bear\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n _vote(e: MouseEvent, sentiment: string) {\r\n e.preventDefault()\r\n this.setState({ enabled: false })\r\n this._fetchData('?b=' + sentiment, undefined, false)\r\n }\r\n\r\n _fetchData = async (urlQuery = '', callback?: () => void, setTimer = true) => {\r\n if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n if (document.hidden) {\r\n // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n return\r\n }\r\n\r\n // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n this._lastRequest = apiRequest(`/api/market_sentiment.ashx${urlQuery}`)\r\n const json = await this._lastRequest\r\n if (json) {\r\n const quoteData = getData(json)\r\n const quote = Quote.findByAttribute('ticker', ticker)\r\n if (quote) {\r\n Quote.findByAttribute('ticker', ticker)!.updateAttributes(getData(json))\r\n } else {\r\n Quote.create(quoteData).save()\r\n }\r\n callback?.()\r\n\r\n this.setState({\r\n loading: false,\r\n enabled: json.enabled,\r\n })\r\n }\r\n\r\n if (setTimer) {\r\n this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n }\r\n }\r\n}\r\n\r\ninterface QuoteData {\r\n refresh: number\r\n enabled: boolean\r\n sum: number[]\r\n weight: number[]\r\n time: string\r\n visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n return {\r\n close: data.sum,\r\n volume: data.weight,\r\n date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n ticker: ticker,\r\n timeframe: 'i3',\r\n instrument: 'market_sentiment',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: data.visibleMinutes,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nlet root: ReactDOM.Root\r\nfunction mount() {\r\n const rootEl = document.getElementById('js-market-sentiment')\r\n root = ReactDOM.createRoot(rootEl!)\r\n root.render()\r\n}\r\n\r\nfunction unmount() {\r\n root.unmount?.()\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport { mapPerf } from '../maps/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { MapSubtypeId, MapTypeId } from '../maps/types'\r\nimport { getMapsRefreshInterval } from '../maps/utils'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n userId: string\r\n version: number\r\n interval: number\r\n hasGeoMaps: boolean\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript('refresh-init')\r\n\r\nfunction refreshPage(newDocument: Document) {\r\n // Replace market stats\r\n const oldMarketStats = document.getElementsByClassName('market-stats')\r\n const newMarketStats = newDocument.getElementsByClassName('market-stats')\r\n if (oldMarketStats.length === newMarketStats.length) {\r\n Array.from(oldMarketStats).forEach((_, index) => {\r\n const oldElement = oldMarketStats.item(index)\r\n const newElement = newMarketStats.item(index)\r\n if (oldElement && newElement) {\r\n oldElement.innerHTML = newElement.innerHTML\r\n }\r\n })\r\n }\r\n\r\n replaceSignalTables(newDocument)\r\n\r\n // Replace bottom\r\n const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n if (oldHomepageBottom && newHomepageBottom) {\r\n oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n }\r\n\r\n if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n }\r\n\r\n // Send refresh event to google analytics\r\n window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n // Refresh any ads that might be on the page\r\n if (window.finvizBannersLoaded === true) {\r\n window.initFinvizBanners?.()\r\n } else if (typeof window.refreshAds === 'function') {\r\n window.refreshAds('#js-homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nexport function replaceSignalTables(newDocument: Document) {\r\n // Replace left signals table\r\n const oldSignalsLeft = document.getElementById('js-signals_1')\r\n const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n if (oldSignalsLeft && newSignalsLeft) {\r\n oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldSignalsRight = document.getElementById('js-signals_2')\r\n const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n if (oldSignalsRight && newSignalsRight) {\r\n oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n }\r\n}\r\n\r\nexport async function getRefreshData() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: {\r\n 'Content-Type': ContentType.Html,\r\n 'X-Is-Ajax-Request': 'true',\r\n 'X-Theme': FinvizSettings.hasDarkTheme ? 'dark' : FinvizSettings.hasRedesignEnabled ? 'light' : 'legacy',\r\n },\r\n })\r\n\r\n if (!data) return undefined\r\n\r\n const newDocument = new DOMParser().parseFromString(data, 'text/html')\r\n const newRefreshInfo = parseJSONFromScript('refresh-init', newDocument)\r\n\r\n if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return undefined\r\n\r\n if (refreshInfo.version !== newRefreshInfo.version) {\r\n window.location.reload()\r\n }\r\n\r\n return newDocument\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n intervalCallbackOnWindowVisible({ interval }, async function handleRefresh() {\r\n const newDocument = await getRefreshData()\r\n\r\n if (newDocument) {\r\n refreshPage(newDocument)\r\n }\r\n })\r\n}\r\n\r\nenum IndicesPollingIntervalInMs {\r\n Default = 3000,\r\n Reduced = 60000,\r\n Free = 30000,\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n\r\n function getIndicesRefreshInterval() {\r\n if (!FinvizSettings.hasUserPremium) {\r\n return IndicesPollingIntervalInMs.Free\r\n }\r\n if (!isStockFastRefreshAvailable(false, false)) {\r\n return IndicesPollingIntervalInMs.Reduced\r\n }\r\n\r\n return IndicesPollingIntervalInMs.Default\r\n }\r\n\r\n intervalCallbackOnWindowVisible({ interval: getIndicesRefreshInterval }, async function handleRefresh() {\r\n const newIndicesData = await apiRequest('/api/indices_data.ashx')\r\n\r\n if (newIndicesData) {\r\n updateIndices(newIndicesData)\r\n }\r\n })\r\n\r\n intervalCallbackOnWindowVisible({ interval: getMapsRefreshInterval }, async function handleRefresh() {\r\n const perfDataSecReq = mapPerf(MapTypeId.Sector, MapSubtypeId.DayPerf)\r\n const perfDataGeoReq = refreshInfo.hasGeoMaps ? mapPerf(MapTypeId.World, MapSubtypeId.DayPerf) : null\r\n\r\n const [perfDataSec, perfDataGeo] = await Promise.all([perfDataSecReq, perfDataGeoReq])\r\n\r\n try {\r\n if (perfDataSec) {\r\n if (window.FinvizIndexSecMap.version !== perfDataSec.version) {\r\n window.location.reload()\r\n }\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, perfDataSec)\r\n }\r\n\r\n if (perfDataGeo) {\r\n if (window.FinvizIndexGeoMap.version !== perfDataGeo.version) {\r\n window.location.reload()\r\n }\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, perfDataGeo)\r\n }\r\n } catch {}\r\n })\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n ticker: string\r\n timeframe: string\r\n volume: number[]\r\n date: number[]\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n lastOpen: null\r\n lastHigh: null\r\n lastLow: null\r\n lastClose: number\r\n lastVolume: null\r\n lastDate: number\r\n prevClose: number\r\n afterClose: null\r\n afterChange: null\r\n relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n return {\r\n ...indices[index],\r\n ticker: ticker, // use text?\r\n timeframe: 'i10',\r\n instrument: 'stock',\r\n premarket: false,\r\n aftermarket: false,\r\n hasChartEvents: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: 390,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n const dowQ = Quote.findByAttribute('ticker', 'DOW')\r\n if (dowQ) dowQ.updateAttributes(getData('^DJI', 'DOW', indices))\r\n\r\n const nasdaqQ = Quote.findByAttribute('ticker', 'NASDAQ')\r\n if (nasdaqQ) nasdaqQ.updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n\r\n const sap500Q = Quote.findByAttribute('ticker', 'S&P 500')\r\n if (sap500Q) sap500Q.updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n\r\n const rutQ = Quote.findByAttribute('ticker', 'RUSSELL 2000')\r\n if (rutQ) rutQ.updateAttributes(getData('^RUT', 'RUSSELL 2000', indices))\r\n\r\n if (!dowQ || !nasdaqQ || !sap500Q || !rutQ) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3963831382/?project=33153&referrer=issue-stream&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('indices-data.ts updateIndices', {\r\n extra: {\r\n allAvailableTickers: Quote.all()\r\n .reduce((acc: string[], cur: { ticker: string }) => {\r\n acc.push(cur.ticker)\r\n return acc\r\n }, [])\r\n .join(','),\r\n },\r\n })\r\n }\r\n}\r\n","export enum HPSignalInterval {\r\n intraday = 'intraday',\r\n daily = 'daily',\r\n}\r\n\r\nexport const HP_SIGNAL_LABELS: Record = {\r\n [HPSignalInterval.intraday]: 'Intraday',\r\n [HPSignalInterval.daily]: 'Daily',\r\n}\r\nexport const HP_SIGNAL_COOKIE = 'signalsInterval'\r\nexport const HP_SIGNAL_SWITCH_RENDER_SELECTOR = 'js-switches-root'\r\n","import classNames from 'classnames'\r\n\r\nimport { Icon, Select, SelectOption } from '../../../main/components'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\nconst OPTIONS = Object.entries(HP_SIGNAL_LABELS).map(([value, label]) => ({ value: value as HPSignalInterval, label }))\r\nconst ROUNDING = IS_REDESIGN ? undefined : 'none'\r\n\r\ntype EliteSwitchProps = {\r\n isLoading: boolean\r\n signal: HPSignalInterval\r\n onSignalChange: (signals: HPSignalInterval) => void\r\n}\r\n\r\nexport default function EliteSwitch({ isLoading, signal, onSignalChange }: EliteSwitchProps) {\r\n return (\r\n option.value === signal)}\r\n rightContent={}\r\n onChange={({ value }) => {\r\n onSignalChange(value)\r\n }}\r\n placement=\"bottom-end\"\r\n orientation=\"horizontal\"\r\n isLoading={isLoading}\r\n disabled={isLoading}\r\n gutter={IS_REDESIGN ? 0 : 1}\r\n // override height defined by button to not stretch old hp signal tables\r\n style={IS_REDESIGN ? undefined : { height: 'auto' }}\r\n >\r\n {OPTIONS.map((item) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button, Icon, Paragraph } from '../../../main/components'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../../../main/components/popover'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\n\r\nexport default function FreeSwitch() {\r\n const state = usePopoverState({ placement: 'bottom-end' })\r\n const isOpen = state.useState('open')\r\n\r\n return (\r\n <>\r\n {IS_REDESIGN ? (\r\n \r\n {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n \r\n ) : (\r\n \r\n {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n Get access to intraday data with Finviz*Elite.\r\n \r\n \r\n Subscribe\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { setCookieRequest } from '../../../main/services/api'\r\nimport { getCookie } from '../../shared/cookie'\r\nimport { getRefreshData, replaceSignalTables } from '../refresh'\r\nimport EliteSwitch from './EliteSwitch'\r\nimport FreeSwitch from './FreeSwitch'\r\nimport { HPSignalInterval, HP_SIGNAL_COOKIE } from './types'\r\n\r\nconst HEADER_SWITCH_SELECTOR = '.js-signal-switch'\r\nconst SWITCH_BUTTON_SELECTOR = '.js-signal-switch-button'\r\nconst signalSwitchesElements = Array.from(document.querySelectorAll(HEADER_SWITCH_SELECTOR))\r\n\r\nfunction getSignalsCookie() {\r\n const value = getCookie(HP_SIGNAL_COOKIE)\r\n let signal = HPSignalInterval.daily\r\n const castedValue = value as HPSignalInterval\r\n\r\n if (FinvizSettings.hasUserPremium && !!castedValue) signal = castedValue\r\n return signal\r\n}\r\n\r\nasync function handleSignalIntervalChange() {\r\n const newDocument = await getRefreshData()\r\n if (newDocument) {\r\n replaceSignalTables(newDocument)\r\n } else {\r\n document.location.reload()\r\n }\r\n}\r\n\r\nexport default function HomepageSignals() {\r\n const [signal, setSignal] = React.useState(getSignalsCookie())\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n // remove inlined buttons from html template\r\n document.querySelectorAll(SWITCH_BUTTON_SELECTOR).forEach((element) => {\r\n element.remove()\r\n })\r\n }, [])\r\n\r\n const handleSignalChange = async (changedSignal: HPSignalInterval) => {\r\n if (changedSignal !== signal) {\r\n setSignal(changedSignal)\r\n setIsLoading(true)\r\n try {\r\n await setCookieRequest(HP_SIGNAL_COOKIE, changedSignal)\r\n await handleSignalIntervalChange().catch()\r\n } catch {\r\n setSignal(signal)\r\n }\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {signalSwitchesElements.map((element) =>\r\n ReactDOM.createPortal(\r\n FinvizSettings.hasUserPremium ? (\r\n \r\n ) : (\r\n \r\n ),\r\n element\r\n )\r\n )}\r\n \r\n )\r\n}\r\n","import ReactDOMClient from 'react-dom/client'\r\n\r\nimport { SpecificChartFunctionality } from '../../main/constants'\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n Instrument,\r\n LayoutType,\r\n Quote,\r\n ScaleType,\r\n TIMEFRAME,\r\n Theme,\r\n} from '../charts-lib'\r\nimport { getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport type { Indices } from './indices-data'\r\nimport { getData } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\nimport SignalIntervalSwitch from './signals-switch'\r\nimport { HP_SIGNAL_SWITCH_RENDER_SELECTOR } from './signals-switch/types'\r\n\r\nif (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n}\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width: 320,\r\n height: 190,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n colors: getCustomColorsFromCookies(),\r\n specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height: 190,\r\n timeframe: TIMEFRAME.i10,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData: false,\r\n // stretch: true,\r\n panes: [\r\n {\r\n height: 190,\r\n elements: [\r\n {\r\n type: ChartElementType.CandleStick,\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderSignalIntervalSwitch() {\r\n const signalSwitches = document.getElementById(HP_SIGNAL_SWITCH_RENDER_SELECTOR)\r\n\r\n if (signalSwitches) {\r\n const root = ReactDOMClient.createRoot(signalSwitches)\r\n root.render()\r\n }\r\n}\r\n\r\nready(function () {\r\n const indices = parseJSONFromScript('js-indices')!\r\n const root = ReactDOMClient.createRoot(document.getElementById('home_indexes')!)\r\n\r\n Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n Quote.create(getData('^RUT', 'RUSSELL 2000', indices)).save()\r\n\r\n root.render(\r\n <>\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n )\r\n\r\n renderSignalIntervalSwitch()\r\n})\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\r\n })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n const visibleNodes = getVisibleTooltipNodes(hoveredNode)\r\n\r\n if (!visibleNodes.length) return\r\n\r\n const tickersToLoad = visibleNodes.map((node) => node!.name)\r\n if (hoveredNode && !tickersToLoad.includes(hoveredNode?.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n })\r\n _lastSparklinesRequest?.cancel?.()\r\n _lastSparklinesRequest = apiRequest(\r\n '/api/map_sparklines.ashx',\r\n { query: { t: tickers.join(','), ty: mapType } },\r\n true\r\n )\r\n\r\n try {\r\n const data = await _lastSparklinesRequest\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n data: data,\r\n })\r\n } catch (error) {\r\n // This just means we canceled the previous request\r\n if (_lastSparklinesRequest.aborted) return\r\n\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n error,\r\n })\r\n }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node,\r\n mapNodeId,\r\n })\r\n },\r\n\r\n loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n if (tickers.length > 0) {\r\n debouncedLoadSparklines(tickers, mapType)\r\n }\r\n },\r\n\r\n loadSparklinesCancel() {\r\n _lastSparklinesRequest?.cancel?.()\r\n },\r\n\r\n resetSparklineData() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n },\r\n\r\n changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n treemap.zoom.translate([tx, ty])\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.CHANGE_TRANSLATE,\r\n })\r\n },\r\n\r\n zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n if (direction > 0) {\r\n const zoomLevel = treemap.getNextZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n } else {\r\n const zoomLevel = treemap.getPreviousZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n }\r\n },\r\n\r\n render() {\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n treemap.zoom.scale(1, { x: tx, y: ty })\r\n treemap.zoom.scale(scale, { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n updateLayout(\r\n treemap: Treemap,\r\n props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n ) {\r\n treemap.updateData(props)\r\n treemap.zoom.updateDimensions(props)\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n // Update hovered node if any\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n mapNodeId: treemap.mapNodeId,\r\n })\r\n updateVisibleSparklines(treemap)\r\n }\r\n },\r\n\r\n updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n if (!treemap || !data) return\r\n\r\n treemap.updatePerf(data)\r\n AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n updateVisibleSparklines(treemap)\r\n },\r\n\r\n _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_PUBLISH_CANVAS,\r\n getPublishCanvas,\r\n })\r\n },\r\n\r\n setupWidget() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_WIDGET,\r\n isWidget: true,\r\n })\r\n },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher {\r\n handleServerAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.SERVER_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n\r\n handleViewAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.VIEW_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n}\r\n\r\nconst dispatcher = new AppDispatcher()\r\nexport default dispatcher\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n RENDER_TREEMAP: null,\r\n CHANGE_TRANSLATE: null,\r\n SET_HOVERED_NODE: null,\r\n\r\n LOAD_SPARKLINES_STARTED: null,\r\n LOAD_SPARKLINES_COMPLETED: null,\r\n LOAD_SPARKLINES_FAILED: null,\r\n RESET_SPARKLINE_DATA: null,\r\n\r\n INIT_STARTED: null,\r\n INIT_FAILED: null,\r\n\r\n UPDATE_DATA: null,\r\n\r\n SET_PUBLISH_CANVAS: null,\r\n\r\n SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n SERVER_ACTION: null,\r\n VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n static CHANGE_EVENT = 'change'\r\n\r\n emitChange() {\r\n this.emit(Store.CHANGE_EVENT)\r\n }\r\n\r\n addChangeListener(callback: (...args: any[]) => void) {\r\n this.on(Store.CHANGE_EVENT, callback)\r\n }\r\n\r\n removeChangeListener(callback: (...args: any[]) => void) {\r\n this.removeListener(Store.CHANGE_EVENT, callback)\r\n }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n getHoveredNode(mapNodeId: string) {\r\n if (mapNodeId === _mapNodeId) return _hoveredNode\r\n return undefined\r\n }\r\n\r\n getSparklines() {\r\n return _sparklinesData\r\n }\r\n\r\n getDataVersion() {\r\n return _dataVersion\r\n }\r\n\r\n isWidget() {\r\n return _isWidget\r\n }\r\n\r\n getPublishCanvas() {\r\n return _getPublishCanvas()\r\n }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n var action = payload.action\r\n\r\n switch (action.type) {\r\n case ActionTypes.RENDER_TREEMAP:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_HOVERED_NODE:\r\n if (action.node !== _hoveredNode) {\r\n _hoveredNode = action.node\r\n _mapNodeId = action.mapNodeId\r\n mapStore.emitChange()\r\n }\r\n break\r\n\r\n case ActionTypes.CHANGE_TRANSLATE:\r\n // @ts-ignore\r\n _hoveredNode = undefined\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n _sparklinesData = { ..._sparklinesData, ...action.data }\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.RESET_SPARKLINE_DATA:\r\n case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n _sparklinesData = {}\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.UPDATE_DATA:\r\n _dataVersion = action.version\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_PUBLISH_CANVAS:\r\n _getPublishCanvas = action.getPublishCanvas\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_WIDGET:\r\n _isWidget = action.isWidget\r\n mapStore.emitChange()\r\n break\r\n }\r\n})\r\n\r\nexport default mapStore\r\n","import { SpecificChartFunctionality } from '../../main/constants'\r\nimport { ChartConfigChartPaneElement, Instrument, LayoutType, ScaleType, TIMEFRAME, Theme } from '../charts-lib'\r\nimport { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps extends ChartConfigChartPaneElement {\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: TIMEFRAME\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: Theme\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height,\r\n timeframe,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) {\r\n window.Sentry?.captureMessage('parseJSONFromScript', {\r\n extra: {\r\n el: el ? 'yes' : 'no',\r\n tagName: el?.tagName,\r\n type: el?.getAttribute('type'),\r\n },\r\n })\r\n }\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n arrow = 'canvas/arrow',\r\n avwapV1 = 'canvas/avwap/avwap_v1',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n curve = 'canvas/curve',\r\n element = 'canvas/element',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipse = 'canvas/ellipse',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n Shrtfl = 'indicators/shrtfl',\r\n Shrtra = 'indicators/shrtra',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport enum QuoteFinancialAttachment {\r\n shortInterest = 'shortInterest',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n // USD pairs\r\n BTCUSD: 'BTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n BNBUSD: 'BNBUSD',\r\n SOLUSD: 'SOLUSD',\r\n XRPUSD: 'XRPUSD',\r\n DOGEUSD: 'DOGEUSD',\r\n ADAUSD: 'ADAUSD',\r\n TRXUSD: 'TRXUSD',\r\n AVAXUSD: 'AVAXUSD',\r\n DOTUSD: 'DOTUSD',\r\n BCHUSD: 'BCHUSD',\r\n NEARUSD: 'NEARUSD',\r\n LTCUSD: 'LTCUSD',\r\n APTUSD: 'APTUSD',\r\n XLMUSD: 'XLMUSD',\r\n LINKUSD: 'LINKUSD',\r\n ETCUSD: 'ETCUSD',\r\n UNIUSD: 'UNIUSD',\r\n EGLDUSD: 'EGLDUSD',\r\n OPUSD: 'OPUSD',\r\n SUIUSD: 'SUIUSD',\r\n AAVEUSD: 'AAVEUSD',\r\n\r\n // EUR pairs\r\n BTCEUR: 'BTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n BNBEUR: 'BNBEUR',\r\n SOLEUR: 'SOLEUR',\r\n XRPEUR: 'XRPEUR',\r\n DOGEEUR: 'DOGEEUR',\r\n ADAEUR: 'ADAEUR',\r\n TRXEUR: 'TRXEUR',\r\n AVAXEUR: 'AVAXEUR',\r\n DOTEUR: 'DOTEUR',\r\n BCHEUR: 'BCHEUR',\r\n NEAREUR: 'NEAREUR',\r\n LTCEUR: 'LTCEUR',\r\n ICPEUR: 'ICPEUR',\r\n APTEUR: 'APTEUR',\r\n XLMEUR: 'XLMEUR',\r\n LINKEUR: 'LINKEUR',\r\n SHIBEUR: 'SHIBEUR',\r\n EGLDEUR: 'EGLDEUR',\r\n SEUR: 'SEUR',\r\n OPEUR: 'OPEUR',\r\n SUIEUR: 'SUIEUR',\r\n\r\n // USDT pairs\r\n BTCUSDT: 'BTCUSDT',\r\n ETHUSDT: 'ETHUSDT',\r\n BNBUSDT: 'BNBUSDT',\r\n SOLUSDT: 'SOLUSDT',\r\n XRPUSDT: 'XRPUSDT',\r\n DOGEUSDT: 'DOGEUSDT',\r\n ADAUSDT: 'ADAUSDT',\r\n TRXUSDT: 'TRXUSDT',\r\n AVAXUSDT: 'AVAXUSDT',\r\n DOTUSDT: 'DOTUSDT',\r\n BCHUSDT: 'BCHUSDT',\r\n NEARUSDT: 'NEARUSDT',\r\n LTCUSDT: 'LTCUSDT',\r\n ICPUSDT: 'ICPUSDT',\r\n FETUSDT: 'FETUSDT',\r\n ETCUSDT: 'ETCUSDT',\r\n APTUSDT: 'APTUSDT',\r\n XLMUSDT: 'XLMUSDT',\r\n LINKUSDT: 'LINKUSDT',\r\n SHIBUSDT: 'SHIBUSDT',\r\n UNIUSDT: 'UNIUSDT',\r\n EGLDUSDT: 'EGLDUSDT',\r\n SUSDT: 'SUSDT',\r\n OPUSDT: 'OPUSDT',\r\n SUIUSDT: 'SUIUSDT',\r\n AAVEUSDT: 'AAVEUSDT',\r\n TRUMPUSDT: 'TRUMPUSDT',\r\n\r\n // BTC pairs\r\n ETHBTC: 'ETHBTC',\r\n BNBBTC: 'BNBBTC',\r\n SOLBTC: 'SOLBTC',\r\n XRPBTC: 'XRPBTC',\r\n DOGEBTC: 'DOGEBTC',\r\n ADABTC: 'ADABTC',\r\n TRXBTC: 'TRXBTC',\r\n AVAXBTC: 'AVAXBTC',\r\n DOTBTC: 'DOTBTC',\r\n BCHBTC: 'BCHBTC',\r\n NEARBTC: 'NEARBTC',\r\n LTCBTC: 'LTCBTC',\r\n ICPBTC: 'ICPBTC',\r\n FETBTC: 'FETBTC',\r\n ETCBTC: 'ETCBTC',\r\n APTBTC: 'APTBTC',\r\n XLMBTC: 'XLMBTC',\r\n LINKBTC: 'LINKBTC',\r\n UNIBTC: 'UNIBTC',\r\n EGLDBTC: 'EGLDBTC',\r\n SBTC: 'SBTC',\r\n OPBTC: 'OPBTC',\r\n SUIBTC: 'SUIBTC',\r\n AAVEBTC: 'AAVEBTC',\r\n} as const\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging = 'hanging',\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic = 'ideographic',\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 30000,\r\n Elite = Default,\r\n Reduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\r\n\r\nexport const MARKET_START = { hours: 9, minutes: 30 }\r\nexport const MARKET_END = { hours: 16, minutes: 0 }\r\n","import {\r\n MARKET_END,\r\n MARKET_START,\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n isQuotePage ||\r\n isQuoteFinancials\r\n )\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string | number) {\r\n // Ideas have number periods\r\n const periodParts = `${periodString}`.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n if (!global.Sentry) {\r\n console.error('Sentry is not defined in the global scope !')\r\n return\r\n }\r\n global.Sentry.captureException(exception, captureContext)\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n// duplicate from Website/js/main/util.ts, to be refactored\r\nexport function getEarningsDateSuffix(date: Date) {\r\n const hours = date.getHours()\r\n\r\n if (hours <= 9) {\r\n return 'BMO'\r\n } else if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n\r\n return ''\r\n}\r\n\r\nexport function isValidTickerString(ticker: string) {\r\n const regex = /^@?[a-z0-9](?:[a-z0-9]*[-_]?[a-z0-9]+)?$/\r\n return regex.test(ticker.toLowerCase())\r\n}\r\n","/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n","/*\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n *\n * case 'city-update':\n * FlightPriceStore.price =\n * FlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n function Dispatcher() {\n this.$Dispatcher_callbacks = {};\n this.$Dispatcher_isPending = {};\n this.$Dispatcher_isHandled = {};\n this.$Dispatcher_isDispatching = false;\n this.$Dispatcher_pendingPayload = null;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n *\n * @param {function} callback\n * @return {string}\n */\n Dispatcher.prototype.register=function(callback) {\n var id = _prefix + _lastID++;\n this.$Dispatcher_callbacks[id] = callback;\n return id;\n };\n\n /**\n * Removes a callback based on its token.\n *\n * @param {string} id\n */\n Dispatcher.prototype.unregister=function(id) {\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n id\n );\n delete this.$Dispatcher_callbacks[id];\n };\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n *\n * @param {array} ids\n */\n Dispatcher.prototype.waitFor=function(ids) {\n invariant(\n this.$Dispatcher_isDispatching,\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n );\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this.$Dispatcher_isPending[id]) {\n invariant(\n this.$Dispatcher_isHandled[id],\n 'Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for `%s`.',\n id\n );\n continue;\n }\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n id\n );\n this.$Dispatcher_invokeCallback(id);\n }\n };\n\n /**\n * Dispatches a payload to all registered callbacks.\n *\n * @param {object} payload\n */\n Dispatcher.prototype.dispatch=function(payload) {\n invariant(\n !this.$Dispatcher_isDispatching,\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n );\n this.$Dispatcher_startDispatching(payload);\n try {\n for (var id in this.$Dispatcher_callbacks) {\n if (this.$Dispatcher_isPending[id]) {\n continue;\n }\n this.$Dispatcher_invokeCallback(id);\n }\n } finally {\n this.$Dispatcher_stopDispatching();\n }\n };\n\n /**\n * Is this Dispatcher currently dispatching.\n *\n * @return {boolean}\n */\n Dispatcher.prototype.isDispatching=function() {\n return this.$Dispatcher_isDispatching;\n };\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @param {string} id\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {\n this.$Dispatcher_isPending[id] = true;\n this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload);\n this.$Dispatcher_isHandled[id] = true;\n };\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @param {object} payload\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {\n for (var id in this.$Dispatcher_callbacks) {\n this.$Dispatcher_isPending[id] = false;\n this.$Dispatcher_isHandled[id] = false;\n }\n this.$Dispatcher_pendingPayload = payload;\n this.$Dispatcher_isDispatching = true;\n };\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_stopDispatching=function() {\n this.$Dispatcher_pendingPayload = null;\n this.$Dispatcher_isDispatching = false;\n };\n\n\nmodule.exports = Dispatcher;\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n 'Invariant Violation: ' +\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n"],"names":["ticker","marketSentimentChartConfig","layout","LayoutType","theme","FinvizSettings","hasDarkTheme","Theme","dark","light","width","height","scrollable","editable","cross","charts","timeframe","TIMEFRAME","i3","scale","ScaleType","Linear","instrument","Instrument","MarketSentiment","refreshData","premarket","aftermarket","dateRange","stretch","panes","elements","type","ChartElementType","overlays","Component","constructor","_this","arguments","this","_defineProperty","loading","enabled","chartConfig","async","urlQuery","length","undefined","callback","setTimer","_timer","clearTimeout","document","hidden","window","setTimeout","_fetchData","_lastRequest","apiRequest","json","quoteData","getData","Quote","findByAttribute","updateAttributes","create","save","setState","_json$refresh","refresh","componentDidMount","componentWillUnmount","_this$_lastRequest","_this$_lastRequest$ca","cancel","call","render","state","_jsx","cellPadding","cellSpacing","border","style","visibility","children","_jsxs","id","ChartLayout","config","valign","className","disabled","onClick","e","_vote","src","alt","display","hasRedesignEnabled","sentiment","preventDefault","data","close","sum","volume","weight","date","Array","from","repeat","map","x","parseInt","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","root","rootEl","getElementById","ReactDOM","mount","refreshInfo","parseJSONFromScript","replaceSignalTables","newDocument","oldSignalsLeft","newSignalsLeft","innerHTML","oldSignalsRight","newSignalsRight","getRefreshData","location","pathname","headers","ContentType","Html","DOMParser","parseFromString","newRefreshInfo","userId","version","reload","interval","IndicesPollingIntervalInMs","getIndicesRefreshInterval","hasUserPremium","isStockFastRefreshAvailable","Default","Reduced","Free","intervalCallbackOnWindowVisible","_window$gtag","_window","oldMarketStats","getElementsByClassName","newMarketStats","forEach","_","index","oldElement","item","newElement","oldHomepageBottom","newHomepageBottom","_window$initFinvizBan","_window2","then","_ref","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","refreshPage","newIndicesData","indices","dowQ","nasdaqQ","sap500Q","rutQ","_window$Sentry","Sentry","captureMessage","extra","allAvailableTickers","all","reduce","acc","cur","push","join","updateIndices","getMapsRefreshInterval","perfDataSecReq","mapPerf","MapTypeId","Sector","MapSubtypeId","DayPerf","perfDataGeoReq","hasGeoMaps","World","perfDataSec","perfDataGeo","Promise","FinvizIndexSecMap","mapActionCreators","updatePerfData","FinvizIndexGeoMap","hasChartEvents","HPSignalInterval","HP_SIGNAL_LABELS","intraday","daily","HP_SIGNAL_COOKIE","IS_REDESIGN","OPTIONS","Object","entries","value","label","ROUNDING","EliteSwitch","_ref2","isLoading","signal","onSignalChange","Select","size","rounding","classNames","find","option","rightContent","Icon","name","onChange","_ref3","placement","orientation","gutter","SelectOption","activeTheme","active","FreeSwitch","usePopoverState","isOpen","useState","_Fragment","Button","as","PopoverTrigger","title","fontSize","contentClass","Popover","Paragraph","href","leftContent","SWITCH_BUTTON_SELECTOR","signalSwitchesElements","querySelectorAll","HomepageSignals","setSignal","React","getCookie","castedValue","getSignalsCookie","setIsLoading","element","remove","handleSignalChange","changedSignal","setCookieRequest","handleSignalIntervalChange","catch","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","smallIndex","i10","Stock","CandleStick","ready","ReactDOMClient","signalSwitches","SignalIntervalSwitch","renderSignalIntervalSwitch","subtype","query","t","st","mapPerfScreener","search","uploadMap","method","FormUrlEncoded","body","URLSearchParams","file","replace","_targetScale","updateVisibleSparklines","treemap","hoveredNode","mapStore","getHoveredNode","mapNodeId","visibleNodes","getVisibleTooltipNodes","tickersToLoad","node","includes","debouncedLoadSparklines","_lastSparklinesRequest","debounce","tickers","mapType","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","aborted","LOAD_SPARKLINES_FAILED","trailing","setHoveredNode","SET_HOVERED_NODE","loadSparklineData","loadSparklinesCancel","_lastSparklinesReques3","_lastSparklinesReques4","resetSparklineData","RESET_SPARKLINE_DATA","changeTranslate","tx","zoom","translate","CHANGE_TRANSLATE","direction","offsetX","offsetY","zoomLevel","getNextZoomLevel","animate","toFixed","y","RENDER_TREEMAP","requestAnimationFrame","zoomIn","getPreviousZoomLevel","zoomOut","zoomAndTranslate","updateLayout","props","updateData","updateDimensions","nodes","updatePerf","UPDATE_DATA","_setOnPublish","getPublishCanvas","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","isWidget","Dispatcher","action","payload","source","PayloadSources","SERVER_ACTION","dispatch","VIEW_ACTION","keyMirror","INIT_STARTED","INIT_FAILED","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","addChangeListener","on","removeChangeListener","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_getPublishCanvas","_sparklinesData","_isWidget","getSparklines","getDataVersion","dispatchToken","register","getStaticChartConfig","paneElements","default","colorsOverride","leftOffset","JSON","parse","getParsedCookies","el","isValidElement","tagName","getAttribute","textContent","captureException","FONT_SIZE","XXS","XS","S","M","L","XXL","XXXL","LINE_HEIGHT","PADDING","XXXS","MARGIN","CHART_MARGIN","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OFFSET","MONTHS","ChartEditorEnum","CanvasElementType","IndicatorType","OverlayType","ChartEventType","ChartEventBadgeType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","LAYOUTS","columns","rows","count","gridAreas","SORT_DIRECTION","ASC","DESC","TIMEFRAMES_WITH_PRE_MARKET","i1","i2","i5","IntradayTimeframeInterval","i15","i30","h","h2","h4","TimeframeLabelShort","d","w","m","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","ETHUSD","BNBUSD","SOLUSD","XRPUSD","DOGEUSD","ADAUSD","TRXUSD","AVAXUSD","DOTUSD","BCHUSD","NEARUSD","LTCUSD","APTUSD","XLMUSD","LINKUSD","ETCUSD","UNIUSD","EGLDUSD","OPUSD","SUIUSD","AAVEUSD","BTCEUR","ETHEUR","BNBEUR","SOLEUR","XRPEUR","DOGEEUR","ADAEUR","TRXEUR","AVAXEUR","DOTEUR","BCHEUR","NEAREUR","LTCEUR","ICPEUR","APTEUR","XLMEUR","LINKEUR","SHIBEUR","EGLDEUR","SEUR","OPEUR","SUIEUR","BTCUSDT","ETHUSDT","BNBUSDT","SOLUSDT","XRPUSDT","DOGEUSDT","ADAUSDT","TRXUSDT","AVAXUSDT","DOTUSDT","BCHUSDT","NEARUSDT","LTCUSDT","ICPUSDT","FETUSDT","ETCUSDT","APTUSDT","XLMUSDT","LINKUSDT","SHIBUSDT","UNIUSDT","EGLDUSDT","SUSDT","OPUSDT","SUIUSDT","AAVEUSDT","TRUMPUSDT","ETHBTC","BNBBTC","SOLBTC","XRPBTC","DOGEBTC","ADABTC","TRXBTC","AVAXBTC","DOTBTC","BCHBTC","NEARBTC","LTCBTC","ICPBTC","FETBTC","ETCBTC","APTBTC","XLMBTC","LINKBTC","UNIBTC","EGLDBTC","SBTC","OPBTC","SUIBTC","AAVEBTC","TextAlign","TextBaseline","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","Percentage","Logarithmic","PANE_HEIGHT_DEFAULT","chart","indicator","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","getTimeframeLabel","QuotePageQueryChartTypes","MacroTimeframe","MicroMacroTimeframe","micro","macro","minutes","hours","days","weeks","months","MicroTimeframeRange","keys","prev","curr","SetVisibilityTo","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","MARKET_START","MARKET_END","Utils","min","_len","args","_key","arg","max","_len2","_key2","minMax","_len3","_key3","getScaleRatio","devicePixelRatio","setSizeOnCanvasElement","canvasElement","ratio","getQuoteDateTimestampOffsetInSeconds","referenceDate","Date","dayNumber","getDate","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","convertLocalToNyTime","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","getTime","hasPremarket","hasAftermarket","bufferMinutes","getMinutes","dayOfWeek","currentDayMinutes","getHours","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","dateFromUnixTimestamp","timestamp","setUTCSeconds","dateStringFromDate","getFullYear","String","padStart","dateFromDateString","dateString","yyyy","mm","dd","split","Number","isNaN","Error","isMobile","testTouchPoints","getIsSSr","isMobileOs","navigator","userAgent","indexOf","createEvent","match","msMaxTouchPoints","maxTouchPoints","createElement","isIPad","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","setCookie","expires","toUTCString","hostname","getFullscreenStatus","_ref4","_ref5","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getRequestFullscreen","_ref6","_ref7","_element$requestFulls","requestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","getExitFullscreen","_ref8","_ref9","_document$exitFullscr","exitFullscreen","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","addEventListener","getChartsDimensions","chartElementId","_box$width","_box$height","containerElement","box","getBoundingClientRect","Math","getIsMobileScreenSize","innerWidth","getIsMobilePortrait","numberToStringWithUnitsSuffix","suffix","isRedesignEnabled","_window$FinvizSetting","isRedesignedPage","obj","matchingPages","forexPage","futuresPage","cryptoPage","isQuotePage","quotePage","isQuoteFinancials","quoteFinancials","getRoundedString","number","numOfDecimalPlaces","precision","pow","round","process","getParsedIntegersFromPeriodString","periodString","part","exception","captureContext","isPositiveFloat","parsedNumber","parseFloat","isFinite","isPositiveInteger","string","isInRange","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","getValueInRange","isPrimaryClick","hasOwnProperty","button","getJSONReplacerFunc","visited","WeakSet","key","has","add","formatDateToStringUS","options","toLocaleDateString","day","month","year","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","substring","c","getRandomValues","Uint8Array","toString","getEarningsDateSuffix","module","exports","invariant","_lastID","$Dispatcher_callbacks","$Dispatcher_isPending","$Dispatcher_isHandled","$Dispatcher_isDispatching","$Dispatcher_pendingPayload","prototype","unregister","waitFor","ids","ii","$Dispatcher_invokeCallback","$Dispatcher_startDispatching","$Dispatcher_stopDispatching","isDispatching","condition","format","a","b","f","argIndex","framesToPop","ret","isArray"],"sourceRoot":""}