@tradecanvas/core 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@tradecanvas/commons`);var t=class{canvas;ctx;dpr=1;constructor(e,t){this.canvas=document.createElement(`canvas`),this.canvas.style.position=`absolute`,this.canvas.style.top=`0`,this.canvas.style.left=`0`,this.canvas.style.zIndex=String(t),this.canvas.style.pointerEvents=`none`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas)}resize(e,t){this.dpr=t;let n=Math.round(e.width*t),r=Math.round(e.height*t);(this.canvas.width!==n||this.canvas.height!==r)&&(this.canvas.width=n,this.canvas.height=r),this.canvas.style.width=`${e.width}px`,this.canvas.style.height=`${e.height}px`,this.ctx.setTransform(t,0,0,t,0,0)}clear(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.setTransform(this.dpr,0,0,this.dpr,0,0)}getSize(){return{width:this.canvas.width/this.dpr,height:this.canvas.height/this.dpr}}destroy(){this.canvas.remove()}},n=class{layers=new Map;constructor(e){this.container=e}createLayers(){this.destroy();for(let n of[e.LayerType.Background,e.LayerType.Main,e.LayerType.Overlay,e.LayerType.UI])this.layers.set(n,new t(this.container,n))}getLayer(e){return this.layers.get(e)}resize(e,t){for(let n of this.layers.values())n.resize(e,t)}destroy(){for(let e of this.layers.values())e.destroy();this.layers.clear()}},r=class{animFrameId=0;running=!1;dirtyLayers=new Set;swapLayers=new Set;callback=null;setCallback(e){this.callback=e}markDirty(e){this.dirtyLayers.add(e),this.running&&!this.animFrameId&&this.scheduleFrame()}markAllDirty(){this.dirtyLayers.add(e.LayerType.Background),this.dirtyLayers.add(e.LayerType.Main),this.dirtyLayers.add(e.LayerType.Overlay),this.dirtyLayers.add(e.LayerType.UI),this.running&&!this.animFrameId&&this.scheduleFrame()}start(){this.running=!0,this.markAllDirty()}stop(){this.running=!1,this.animFrameId&&=(cancelAnimationFrame(this.animFrameId),0)}scheduleFrame(){this.animFrameId=requestAnimationFrame(()=>{if(this.animFrameId=0,!(!this.running||!this.callback)&&this.dirtyLayers.size>0){let e=this.dirtyLayers;this.dirtyLayers=this.swapLayers,this.callback(e),e.clear(),this.swapLayers=e}})}},i=class{observer=null;callback=null;currentDpr=1;resizeScheduled=!1;cachedSize;constructor(e){this.container=e,this.currentDpr=window.devicePixelRatio||1,this.cachedSize={width:e.clientWidth,height:e.clientHeight}}getDpr(){return this.currentDpr}getContainerSize(){return this.cachedSize}readContainerSize(){let e=this.container.clientWidth,t=this.container.clientHeight;return(e!==this.cachedSize.width||t!==this.cachedSize.height)&&(this.cachedSize={width:e,height:t}),this.cachedSize}onResize(e){this.callback=e,this.observer=new ResizeObserver(()=>{this.resizeScheduled||(this.resizeScheduled=!0,requestAnimationFrame(()=>{this.resizeScheduled=!1,this.currentDpr=window.devicePixelRatio||1;let e=this.container.clientWidth,t=this.container.clientHeight;e===this.cachedSize.width&&t===this.cachedSize.height||(this.cachedSize={width:e,height:t},this.callback?.(this.cachedSize,this.currentDpr))}))}),this.observer.observe(this.container)}destroy(){this.observer?.disconnect(),this.observer=null,this.callback=null}};function a(e,t){return e*(t.barWidth+t.barSpacing)-t.offset+t.chartRect.x+t.barWidth/2}function o(e,t){let{min:n,max:r}=t.priceRange;if(t.logScale&&n>0&&r>0){let i=Math.log(n),a=Math.log(r)-i;if(a===0)return t.chartRect.y+t.chartRect.height/2;let o=(Math.log(Math.max(e,2**-52))-i)/a;return t.chartRect.y+t.chartRect.height*(1-o)}let i=r-n;if(i===0)return t.chartRect.y+t.chartRect.height/2;let a=(e-n)/i;return t.chartRect.y+t.chartRect.height*(1-a)}function s(e,t){let n=t.barWidth+t.barSpacing;return Math.round((e-t.chartRect.x-t.barWidth/2+t.offset)/n)}function c(e,t){let{min:n,max:r}=t.priceRange,i=1-(e-t.chartRect.y)/t.chartRect.height;if(t.logScale&&n>0&&r>0){let e=Math.log(n);return Math.exp(e+(Math.log(r)-e)*i)}return n+(r-n)*i}function l(e,t){if(t.length===0)return-1;if(e<=t[0].time)return 0;if(e>=t[t.length-1].time)return t.length-1;let n=0,r=t.length-1;for(;n<=r;){let i=n+r>>>1;if(t[i].time===e)return i;t[i].time<e?n=i+1:r=i-1}if(n>=t.length)return t.length-1;if(r<0)return 0;let i=t[r].time,a=t[n].time,o=a===i?0:(e-i)/(a-i);return r+o}function u(e,t){let n=t.data;return n&&n.length>0?l(e,n):e}function d(e,t){return a(u(e,t),t)}function f(e,t){let n=s(e,t),r=t.data;return r&&r.length>0?r[Math.max(0,Math.min(r.length-1,n))].time:n}var p=class{layerManager;renderLoop;dprManager;renderCtx=null;bgLayer;mainLayer;overlayLayer;uiLayer;onContainerResize=null;constructor(e){this.layerManager=new n(e),this.renderLoop=new r,this.dprManager=new i(e),this.layerManager.createLayers(),this.cacheLayerRefs(),this.renderLoop.setCallback(e=>this.render(e)),this.dprManager.onResize((e,t)=>{this.layerManager.resize(e,t),this.renderLoop.markAllDirty(),this.onContainerResize?.(e)});let t=this.dprManager.getContainerSize(),a=this.dprManager.getDpr();this.layerManager.resize(t,a)}cacheLayerRefs(){this.bgLayer=this.layerManager.getLayer(e.LayerType.Background),this.mainLayer=this.layerManager.getLayer(e.LayerType.Main),this.overlayLayer=this.layerManager.getLayer(e.LayerType.Overlay),this.uiLayer=this.layerManager.getLayer(e.LayerType.UI)}setRenderContext(e){this.renderCtx=e}start(){this.renderLoop.start()}stop(){this.renderLoop.stop()}requestRender(e){e===void 0?this.renderLoop.markAllDirty():this.renderLoop.markDirty(e)}render(t){let n=this.renderCtx;if(!n)return;let{viewport:r,theme:i,data:l}=n,u=n.numberLocale??`en-US`;if(!(r.chartRect.width<=0||r.chartRect.height<=0)){if(t.has(e.LayerType.Background)&&this.bgLayer&&(this.bgLayer.clear(),n.gridRenderer?.render(this.bgLayer.ctx,r,i),n.sessionShading?.render(this.bgLayer.ctx,l,r,i),n.sessionBreaks?.render(this.bgLayer.ctx,r,i,l),n.watermark?.render(this.bgLayer.ctx,r,i)),t.has(e.LayerType.Main)&&this.mainLayer){this.mainLayer.clear();let e=this.mainLayer.ctx;e.save(),e.beginPath(),e.rect(r.chartRect.x,r.chartRect.y,r.chartRect.width,r.chartRect.height),e.clip(),n.depthHeatmap?.render(e,r,i),n.volumeRenderer?.render(e,l,r,i),n.volumeProfile?.render(e,l,r,i),n.marketProfile?.render(e,l,r,i),n.chartRenderer?.render(e,l,r,i),n.compareRenderer?.render(e,l,r,i),n.indicatorEngine?.renderOverlays(e,r),n.periodLevels?.render(e,l,r,i),n.pivotMarkers?.render(e,l,r,i),n.renderOverlayPlugins?.(e,`main`),e.restore();let t=n.panels,a=n.indicatorEngine;if(a&&t.length>0){let n=`10px ${i.font.family}`,r=a.getPanelIndicators(),o=new Map;for(let e of r)o.set(e.instanceId,e);for(let r of t){if(r.rect.width<=0||r.rect.height<=0)continue;e.save(),e.beginPath(),e.rect(r.rect.x,r.rect.y,r.rect.width,r.rect.height),e.clip(),e.fillStyle=i.background,e.fillRect(r.rect.x,r.rect.y,r.rect.width,r.rect.height),e.fillStyle=i.axisLine,e.fillRect(r.rect.x,r.rect.y,r.rect.width,3),e.fillStyle=i.textSecondary,e.font=n,e.textBaseline=`top`,e.textAlign=`left`;let t=o.get(r.instanceId);t&&e.fillText(t.descriptor.name,r.rect.x+6,r.rect.y+6),e.save(),e.beginPath(),e.rect(r.rect.x,r.rect.y+20,r.rect.width,r.rect.height-20),e.clip(),a.renderPanel(e,r.instanceId,r.viewport),e.restore(),e.restore()}}}if(t.has(e.LayerType.Overlay)&&this.overlayLayer){this.overlayLayer.clear();let e=this.overlayLayer.ctx;n.priceLimits&&this.renderPriceLimits(e,r,i,n.priceLimits),n.tradeZoneManager?.render(e,r,i),n.drawingRenderer?.render(e,r),n.tradingRenderer?.render(e,r,i),n.signalMarkerManager?.render(e,r,i),n.alertManager?.render(e,r,i),n.measureOverlay?.render(e,r,i),n.crosshairHandler?.render(e,r,i),n.renderOverlayPlugins?.(e,`overlay`);let t=n.crosshairHandler?.getPosition();if(t&&n.panels.length>0)for(let r of n.panels){let o=r.rect;if(t.x>=o.x&&t.x<=o.x+o.width&&t.y>=o.y&&t.y<=o.y+o.height){let c=r.viewport,l=t.x,u=s(l,c);l=a(Math.max(0,Math.min((n.data?.length??1)-1,Math.round(u))),c),e.save(),e.beginPath(),e.rect(o.x,o.y,o.width,o.height),e.clip(),e.setLineDash([4,4]),e.strokeStyle=i.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(l)+.5,o.y),e.lineTo(Math.round(l)+.5,o.y+o.height),e.stroke(),e.beginPath(),e.moveTo(o.x,Math.round(t.y)+.5),e.lineTo(o.x+o.width,Math.round(t.y)+.5),e.stroke(),e.setLineDash([]),e.restore();break}}}if(t.has(e.LayerType.UI)&&this.uiLayer){this.uiLayer.clear();let t=this.uiLayer.ctx;if(n.priceAxis?.render(t,r,i),n.tradingRenderer?.renderAxisBadges(t,r,i),n.currentPriceLine?.render(t,r,i),n.timeAxis?.render(t,r,i,l,n.timeAxisY),n.crosshairHandler?.renderAxisLabels(t,r,i,l,n.timeAxisY),n.chartLegend?.render(t,r,i,l),n.barCountdown?.render(t,r,i,l),n.renderOverlayPlugins?.(t,`ui`),n.panels.length>0){let r=n.crosshairHandler?.getPosition(),a=n.indicatorEngine,d=`${i.font.sizeSmall}px ${i.font.family}`,f;if(a){let e=a.getPanelIndicators();f=new Map;for(let t of e)f.set(t.instanceId,t)}for(let p of n.panels){let n=p.viewport,m=p.rect,{min:h,max:g}=n.priceRange;if(g-h<=0||m.height<=0)continue;let _=m.x+m.width,v=n.chartRect;t.strokeStyle=i.axisLine,t.lineWidth=1,t.beginPath(),t.moveTo(_+.5,m.y),t.lineTo(_+.5,m.y+m.height),t.stroke();let y=(0,e.computeTickStep)(h,g,4),b=Math.ceil(h/y)*y,x=y<1?Math.ceil(-Math.log10(y))+1:+(y<10);t.font=d,t.textBaseline=`middle`,t.textAlign=`left`;for(let r=b;r<=g;r+=y){let a=o(r,n);a<v.y||a>v.y+v.height||(t.strokeStyle=i.axisLine,t.beginPath(),t.moveTo(_,Math.round(a)+.5),t.lineTo(_+4,Math.round(a)+.5),t.stroke(),t.fillStyle=i.axisLabel,t.fillText((0,e.formatPrice)(r,x,u),_+6,a))}if(r&&r.x>=m.x&&r.x<=m.x+m.width&&r.y>=m.y&&r.y<=m.y+m.height){let a=(0,e.formatPrice)(c(r.y,n),x,u);t.font=`bold ${i.font.sizeSmall}px ${i.font.family}`;let o=t.measureText(a).width,s=Math.min(o+10,e.PRICE_AXIS_WIDTH-2);t.fillStyle=i.crosshair,t.fillRect(_+1,r.y-9,s,18),t.fillStyle=i.background,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(a,_+5,r.y)}if(r&&a){let e=s(r.x,n),o=Math.max(0,Math.min((l?.length??1)-1,Math.round(e))),c=a.getOutput(p.instanceId);if(c?.series&&o<c.series.length){let e=c.series[o];if(e){let n=[];for(let t in e){let r=e[t];r!==void 0&&n.push(`${t}: ${r.toFixed(x)}`)}if(n.length>0){let e=f?.get(p.instanceId),r=e?t.measureText(e.descriptor.name).width+14:10;t.font=d,t.fillStyle=i.textSecondary,t.textBaseline=`top`,t.textAlign=`left`,t.fillText(n.join(` `),m.x+r,m.y+6)}}}}}}}}}renderPriceLimits(t,n,r,i){let{chartRect:a}=n,s=[{price:i.ceiling,color:i.colors?.ceiling??`#FF00FF`,label:`CE`},{price:i.floor,color:i.colors?.floor??`#00FFFF`,label:`FL`},{price:i.reference,color:i.colors?.reference??`#FFD700`,label:`REF`}],c=`bold 9px ${r.font.family}`,l=`10px ${r.font.family}`;for(let{price:r,color:i,label:u}of s){let s=o(r,n);if(s<a.y||s>a.y+a.height)continue;t.setLineDash([8,4]),t.strokeStyle=i,t.lineWidth=1,t.beginPath(),t.moveTo(a.x,Math.round(s)+.5),t.lineTo(a.x+a.width,Math.round(s)+.5),t.stroke(),t.setLineDash([]),t.font=c,t.fillStyle=i,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(`${u} ${r.toFixed(2)}`,a.x+4,s-2);let d=a.x+a.width+1;t.fillStyle=i,t.fillRect(d,s-7,e.PRICE_AXIS_WIDTH-2,14),t.fillStyle=`#000`,t.font=l,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(r.toFixed(2),d+4,s)}}destroy(){this.renderLoop.stop(),this.dprManager.destroy(),this.layerManager.destroy()}},m=class{state;dataLength=0;minBarWidth;maxBarWidth;rightMarginBars;constructor(t,n,r=2,i=30,a=5){this.minBarWidth=r,this.maxBarWidth=i,this.rightMarginBars=a;let o=this.computeChartRect(t,n);this.state={visibleRange:{from:0,to:0},priceRange:{min:0,max:1},barWidth:e.DEFAULT_BAR_WIDTH,barSpacing:e.DEFAULT_BAR_SPACING,offset:0,chartRect:o}}getState(){return{visibleRange:{...this.state.visibleRange},priceRange:{...this.state.priceRange},barWidth:this.state.barWidth,barSpacing:this.state.barSpacing,offset:this.state.offset,chartRect:{...this.state.chartRect},logScale:this.state.logScale,scaleMode:this.state.scaleMode,scaleBaseline:this.state.scaleBaseline}}setLogScale(e){this.setScaleMode(e?`logarithmic`:`regular`)}isLogScale(){return(this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`))===`logarithmic`}setScaleMode(e){this.state.scaleMode=e,this.state.logScale=e===`logarithmic`}getScaleMode(){return this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`)}setScaleBaseline(e){this.state.scaleBaseline=e}setRightMargin(e){this.rightMarginBars=e}computeChartRect(t,n){return{x:0,y:0,width:Math.max(0,t-e.PRICE_AXIS_WIDTH),height:Math.max(0,n-e.TIME_AXIS_HEIGHT)}}resize(e,t){this.state.chartRect=this.computeChartRect(e,t),this.clampOffset()}setChartRect(e){this.state.chartRect={x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)},this.clampOffset(),this.updateVisibleRange()}updateData(t,n){this.dataLength=t.length,this.dataLength!==0&&(this.clampOffset(),this.updateVisibleRange(),n&&(this.state.priceRange=(0,e.computePriceRange)(t,this.state.visibleRange.from,Math.min(this.state.visibleRange.to,this.dataLength-1),.08)))}setPriceRange(e,t){this.state.priceRange={min:e,max:t}}scalePriceRange(e){if(!Number.isFinite(e)||e<=0)return;let{min:t,max:n}=this.state.priceRange,r=(t+n)/2,i=(n-t)/2,a=Math.max(i*e,1e-9);this.state.priceRange={min:r-a,max:r+a}}scrollBy(e){this.state.offset+=e,this.clampOffset(),this.updateVisibleRange()}isAtEnd(){let e=this.state.barWidth+this.state.barSpacing,t=this.rightMarginBars*e,n=this.dataLength*e-this.state.chartRect.width+t;return this.state.offset>=n-e*2}scrollToEnd(){let e=this.state.barWidth+this.state.barSpacing,t=this.rightMarginBars*e,n=this.dataLength*e;this.state.offset=n-this.state.chartRect.width+t,this.updateVisibleRange()}zoom(t,n){let r=this.state.barWidth,i=(0,e.clamp)(r*(1+t),this.minBarWidth,this.maxBarWidth);if(i===r)return;let a=this.state.barWidth+this.state.barSpacing,o=(this.state.offset+n)/a;this.state.barWidth=i;let s=i+this.state.barSpacing;this.state.offset=o*s-n,this.clampOffset(),this.updateVisibleRange()}clampOffset(){if(this.state.chartRect.width<=0)return;let t=this.state.barWidth+this.state.barSpacing,n=this.dataLength*t,r=this.rightMarginBars*t,i=n-this.state.chartRect.width+r,a,o;i>0?(a=-(this.state.chartRect.width*.5),o=i):(a=i,o=i),this.state.offset=(0,e.clamp)(this.state.offset,a,o)}updateVisibleRange(){let e=this.state.barWidth+this.state.barSpacing;if(e<=0||this.state.chartRect.width<=0)return;let t=Math.floor(this.state.offset/e),n=Math.ceil(this.state.chartRect.width/e)+1,r=Math.min(t+n,this.dataLength-1);this.state.visibleRange={from:Math.max(0,t),to:Math.max(0,r)}}};function h(t,n){return(0,e.sliceVisibleData)(t,n.visibleRange.from,n.visibleRange.to)}var g=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=g(n.high),a=g(n.low),c=g(n.open),l=g(n.close),u=n.close>=n.open,d=u?_:v;d.moveTo(r,i),d.lineTo(r,a);let f=u?l:c,p=Math.max(Math.abs(l-c),1);(u?y:b).rect(r-s,f,o,p)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(_),e.strokeStyle=r.candleDownWick,e.stroke(v),e.fillStyle=r.candleUp,e.fill(y),e.fillStyle=r.candleDown,e.fill(b)}};function _(e,t,n){if(t>=e){let t=Array(Math.max(0,e));for(let n=0;n<e;n++)t[n]=n;return t}if(t<=2)return e>=2?[0,e-1]:e===1?[0]:[];let r=[0],i=(e-2)/(t-2),a=0;for(let o=0;o<t-2;o++){let t=Math.floor((o+1)*i)+1,s=Math.floor((o+2)*i)+1;s>e&&(s=e);let c=0,l=0,u=0;for(let e=t;e<s;e++)c+=e,l+=n(e),u++;if(u>0)c/=u,l/=u;else{let r=Math.min(t,e-1);c=r,l=n(r)}let d=Math.floor(o*i)+1,f=Math.floor((o+1)*i)+1,p=n(a),m=-1,h=d;for(let e=d;e<f;e++){let t=Math.abs((a-c)*(n(e)-p)-(a-e)*(l-p));t>m&&(m=t,h=e)}r.push(h),a=h}return r.push(e-1),r}var v=64;function y(e,t,n,r,i){let a=Math.max(0,e),o=Math.min(t,n-1);if(o<a)return[];let s=o-a+1,c=Math.max(v,Math.ceil(r*2));if(s<=c){let e=Array(s);for(let t=0;t<s;t++)e[t]=a+t;return e}let l=_(s,c,e=>i(a+e));for(let e=0;e<l.length;e++)l[e]+=a;return l}var b=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,s=-n.offset+n.chartRect.x+n.barWidth/2,{min:c,max:l}=n.priceRange,u=l-c;if(u===0)return;let d=n.chartRect.y,f=n.chartRect.height/u;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let p=y(i,a,t.length,n.chartRect.width,e=>t[e].close),m=!1;for(let n of p){let r=n*o+s,i=d+(l-t[n].close)*f;m?e.lineTo(r,i):(e.moveTo(r,i),m=!0)}e.stroke()}},x=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,s=-n.offset+n.chartRect.x+n.barWidth/2,{min:c,max:l}=n.priceRange,u=l-c;if(u===0)return;let d=n.chartRect.y,f=n.chartRect.height,p=f/u,m=d+f,h=y(i,a,t.length,n.chartRect.width,e=>t[e].close);if(h.length===0)return;let g=h[0],_=g*o+s,v=d+(l-t[g].close)*p,b=e.createLinearGradient(0,d,0,m);b.addColorStop(0,r.areaTopColor),b.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(_,m),e.lineTo(_,v);let x=_;for(let n=1;n<h.length;n++){let r=h[n];x=r*o+s,e.lineTo(x,d+(l-t[r].close)*p)}e.lineTo(x,m),e.closePath(),e.fillStyle=b,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`,e.moveTo(_,v);for(let n=1;n<h.length;n++){let r=h[n];e.lineTo(r*o+s,d+(l-t[r].close)*p)}e.stroke()}},S=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open?_:v,a=g(n.high),o=g(n.low),c=g(n.open),l=g(n.close);i.moveTo(r,a),i.lineTo(r,o),i.moveTo(r-s,c),i.lineTo(r,c),i.moveTo(r,l),i.lineTo(r+s,l)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v)}},C=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=[],b=[],x=new Path2D,S=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=e===0||n.close>=t[e-1].close,c=g(n.high),l=g(n.low),u=g(n.open),d=g(n.close),f=Math.min(u,d),p=Math.max(Math.abs(d-u),1),m=a?_:v;m.moveTo(r,c),m.lineTo(r,l),i?(a?y:b).push({x:r-s,y:f,w:o,h:p}):(a?x:S).rect(r-s,f,o,p)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v),e.fillStyle=r.candleUp,e.fill(x),e.fillStyle=r.candleDown,e.fill(S),e.lineWidth=1.5,e.strokeStyle=r.candleUp;for(let t of y)e.strokeRect(t.x,t.y,t.w,t.h);e.strokeStyle=r.candleDown;for(let t of b)e.strokeRect(t.x,t.y,t.w,t.h)}},w=class{baselinePrice=null;setBaseline(e){this.baselinePrice=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=g(this.baselinePrice??this.computeBaseline(t,i,a)),{chartRect:v}=n,y=[],b=[];for(let e=i;e<=a&&e<t.length;e++)y.push(h(e)),b.push(g(t[e].close));if(y.length<2)return;let x=y.length-1;e.save();let S=new Path2D;S.rect(v.x,v.y,v.width,_-v.y),e.clip(S);let C=new Path2D;C.moveTo(y[0],_);for(let e=0;e<=x;e++)C.lineTo(y[e],b[e]);C.lineTo(y[x],_),C.closePath(),e.fillStyle=`${r.candleUp}20`,e.fill(C),e.restore(),e.save();let w=new Path2D;w.rect(v.x,_,v.width,v.y+v.height-_),e.clip(w);let T=new Path2D;T.moveTo(y[0],_);for(let e=0;e<=x;e++)T.lineTo(y[e],b[e]);T.lineTo(y[x],_),T.closePath(),e.fillStyle=`${r.candleDown}20`,e.fill(T),e.restore();let E=new Path2D,D=new Path2D;for(let e=1;e<=x;e++){let t=b[e]<=_?E:D;t.moveTo(y[e-1],b[e-1]),t.lineTo(y[e],b[e])}e.lineWidth=2,e.strokeStyle=r.candleUp,e.stroke(E),e.strokeStyle=r.candleDown,e.stroke(D),e.setLineDash([6,4]),e.strokeStyle=r.textSecondary,e.lineWidth=1;let O=new Path2D;O.moveTo(v.x,_),O.lineTo(v.x+v.width,_),e.stroke(O),e.setLineDash([])}computeBaseline(e,t,n){let r=0,i=0;for(let a=t;a<=n&&a<e.length;a++)r+=e[a].close,i++;return i>0?r/i:0}},T=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=g(Math.max(n.open,n.close)),c=g(Math.min(n.open,n.close)),l=Math.max(c-a,1),u=r-s;i?(_.rect(u,a,o,l),y.rect(u,a,o,l)):(v.rect(u,a,o,l),b.rect(u,a,o,l))}e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v),e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},E=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,o=g(n.high),s=g(n.low),c=i?_:v;if(c.moveTo(r,o),c.lineTo(r,s),e<a&&e+1<t.length){let t=h(e+1),n=i?s:o;c.moveTo(r,n),c.lineTo(t,n)}}e.strokeStyle=r.candleUp,e.lineWidth=3,e.stroke(_),e.strokeStyle=r.candleDown,e.lineWidth=1,e.stroke(v)}},D=class{boxSize=1;setBoxSize(e){this.boxSize=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=Math.abs(this.boxSize*m),v=Math.min(s*.8,_*.8)*.5,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=n.high,o=n.low,s=Math.max(1,Math.round((a-o)/this.boxSize));for(let e=0;e<s;e++){let t=g(o+(e+.5)*this.boxSize);i?(y.moveTo(r-v,t-v),y.lineTo(r+v,t+v),y.moveTo(r+v,t-v),y.lineTo(r-v,t+v)):(b.moveTo(r+v,t),b.arc(r,t,v,0,Math.PI*2))}}e.lineWidth=1.5,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},O=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:s}=n.priceRange,c=s-o;if(c===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=n.barWidth,m=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>m&&(m=t[e].volume);m===0&&(m=1);let h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D,y=e=>e*l+u,b=e=>d+(s-e)*f;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=y(e),i=b(n.high),a=b(n.low),o=b(n.open),s=b(n.close),c=n.close>=n.open,l=p*Math.max(.2,n.volume/m),u=l/2,d=c?h:g;d.moveTo(r,i),d.lineTo(r,a);let f=c?s:o,x=Math.max(Math.abs(s-o),1);(c?_:v).rect(r-u,f,l,x)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(h),e.strokeStyle=r.candleDownWick,e.stroke(g),e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v)}},k=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:s}=n.priceRange,c=s-o;if(c===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=n.barWidth,m=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>m&&(m=t[e].volume);m===0&&(m=1);let h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D,y=e=>e*l+u,b=e=>d+(s-e)*f;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e>0?t[e-1]:n,i=y(e),a=b(n.high),o=b(n.low),s=n.close>=r.close,c=p*Math.max(.15,n.volume/m),l=c/2,u=Math.max(o-a,1),d=s?h:g,f=s?_:v;d.rect(i-l,a,c,u),f.rect(i-l,a,c,u)}e.fillStyle=A(r.candleUp,.55),e.fill(h),e.fillStyle=A(r.candleDown,.55),e.fill(g),e.lineWidth=1,e.strokeStyle=r.candleUpWick,e.stroke(_),e.strokeStyle=r.candleDownWick,e.stroke(v)}};function A(e,t){if(e.startsWith(`#`)){let n=Math.round(Math.max(0,Math.min(1,t))*255).toString(16).padStart(2,`0`);if(e.length===7)return`${e}${n}`;if(e.length===9)return`${e.slice(0,7)}${n}`}return e}var ee=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f,h=[],g=[];for(let e=i;e<=a&&e<t.length;e++){let n=p(e);h.push({x:n,y:m(t[e].high)}),g.push({x:n,y:m(t[e].low)})}if(h.length===0)return;let _=e.createLinearGradient(0,d,0,d+n.chartRect.height);_.addColorStop(0,r.areaTopColor),_.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(h[0].x,h[0].y);for(let t=1;t<h.length;t++)e.lineTo(h[t].x,h[t].y);for(let t=g.length-1;t>=0;t--)e.lineTo(g[t].x,g[t].y);e.closePath(),e.fillStyle=_,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke()}},te=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`miter`;let h=0;for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);n===i?e.moveTo(r,a):(e.lineTo(r,h),e.lineTo(r,a)),h=a}e.stroke()}},ne=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let h=[];for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);h.push({x:r,y:a}),n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke();let g=Math.max(2,Math.min(4,n.barWidth*.3)),_=new Path2D;for(let{x:e,y:t}of h)_.moveTo(e+g,t),_.arc(e,t,g,0,Math.PI*2);e.fillStyle=r.lineColor,e.fill(_),e.strokeStyle=r.background,e.lineWidth=1,e.stroke(_)}},re=class{visible=!0;heightRatio=.2;setVisible(e){this.visible=e}setHeightRatio(e){this.heightRatio=Math.max(.05,Math.min(.5,e))}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o}=n,s=n.barWidth,c=s/2,l=s+n.barSpacing,u=-n.offset+o.x+c,d=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>d&&(d=t[e].volume);if(d===0)return;let f=o.height*this.heightRatio,p=o.y+o.height,m=f/d,h=new Path2D,g=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e*l+u,i=n.volume*m;(n.close>=n.open?h:g).rect(r-c,p-i,s,i)}e.globalAlpha=.35,e.fillStyle=r.candleUp,e.fill(h),e.fillStyle=r.candleDown,e.fill(g),e.globalAlpha=1}},ie=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;highlightPoC=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setHighlightPoC(e){this.highlightPoC=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:s}=n,c=s.max-s.min;if(c<=0)return;let l=new Float64Array(this.buckets),u=new Float64Array(this.buckets),d=new Float64Array(this.buckets);for(let e=i;e<=a&&e<t.length;e++){let n=t[e];if(n.volume<=0)continue;let r=Math.max(n.low,s.min),i=Math.min(n.high,s.max);if(i<=r)continue;let a=(r-s.min)/c,o=(i-s.min)/c,f=Math.max(0,Math.floor(a*this.buckets)),p=Math.min(this.buckets-1,Math.floor(o*this.buckets)),m=Math.max(1,p-f+1),h=n.volume/m,g=n.close>=n.open;for(let e=f;e<=p;e++)l[e]+=h,g?u[e]+=h:d[e]+=h}let f=0,p=-1;for(let e=0;e<l.length;e++)l[e]>f&&(f=l[e],p=e);if(f===0)return;let m=o.width*this.widthRatio,h=o.x+o.width,g=o.height/this.buckets,_=1/f;e.save(),e.globalAlpha=this.opacity;for(let t=0;t<this.buckets;t++){let n=l[t];if(n===0)continue;let i=o.y+o.height-(t+1)*g,a=n*_*m,s=u[t]*_*m,c=d[t]*_*m;s>0&&(e.fillStyle=r.candleUp,e.fillRect(h-s,i+.5,s,g-1)),c>0&&(e.fillStyle=r.candleDown,e.fillRect(h-a,i+.5,c,g-1)),this.highlightPoC&&t===p&&(e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(o.x,i+g/2+.5),e.lineTo(h-a-2,i+g/2+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=this.opacity)}e.restore()}};function ae(e,t){return e<0?0:e>t?t:e}function j(e,t,n,r={}){let i=Math.max(4,Math.min(500,Math.floor(r.buckets??48))),a=n-t;if(a<=0||e.length===0)return null;let o=a/i,s=new Float64Array(i);for(let r of e){let e=Math.min(r.low,r.high),a=Math.max(r.low,r.high);if(a<t||e>n)continue;let c=ae(Math.floor((e-t)/o),i-1),l=ae(Math.floor((a-t)/o),i-1);for(let e=c;e<=l;e++)s[e]+=1}let c=0,l=0,u=0;for(let e=0;e<i;e++)u+=s[e],s[e]>l&&(l=s[e],c=e);if(u===0)return null;let d=u*(r.valueAreaPct??.7),f=c,p=c,m=s[c];for(;m<d&&(f>0||p<i-1);){let e=f>0?s[f-1]:-1;(p<i-1?s[p+1]:-1)>=e?(p+=1,m+=s[p]):(--f,m+=s[f])}let h=[];for(let e=0;e<i;e++){let n=t+e*o;h.push({low:n,high:n+o,mid:n+o/2,count:s[e]})}return{buckets:h,pocIndex:c,maxCount:l,totalCount:u,valueAreaLow:t+f*o,valueAreaHigh:t+(p+1)*o}}function oe(e){let t=(e%52+52)%52;return t<26?String.fromCharCode(65+t):String.fromCharCode(97+t-26)}function se(e,t,n,r=48){let i=Math.max(4,Math.min(500,Math.floor(r))),a=n-t,o=Array.from({length:i},()=>[]);if(a<=0)return o;let s=a/i;return e.forEach((e,r)=>{let a=Math.min(e.low,e.high),c=Math.max(e.low,e.high);if(c<t||a>n)return;let l=Math.max(0,Math.min(i-1,Math.floor((a-t)/s))),u=Math.max(0,Math.min(i-1,Math.floor((c-t)/s)));for(let e=l;e<=u;e++)o[e].push(r)}),o}function ce(t,n,r,i={}){if(t.length===0||r-n<=0)return[];let a=[],o=0,s=(0,e.timeframeBucketStart)(t[0].time,`1d`),c=(e,o,s)=>{let c=j(t.slice(e,o+1),n,r,i);c&&a.push({startIndex:e,endIndex:o,startTime:s,profile:c})};for(let n=1;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,`1d`);r!==s&&(c(o,n-1,s),o=n,s=r)}return c(o,t.length-1,s),a}var le=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;valueAreaPct=.7;highlightPoC=!0;showStats=!0;splitBySession=!1;letters=!1;lastStats=null;setVisible(e){this.visible=e,e||(this.lastStats=null)}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setValueAreaPct(e){this.valueAreaPct=Math.max(.3,Math.min(.95,e))}setHighlightPoC(e){this.highlightPoC=e}setShowStats(e){this.showStats=e}setSplitBySession(e){this.splitBySession=e}isSplitBySession(){return this.splitBySession}setLetters(e){this.letters=e}getStats(){return this.lastStats}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:s}=n,c=Math.max(0,i),l=Math.min(a,t.length-1);if(l<c)return;let u=t.slice(c,l+1);if(this.splitBySession){this.lastStats=null,this.renderSplit(e,u,c,n,r);return}let d=j(u,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(!d){this.lastStats=null;return}let f=d.buckets[d.pocIndex].mid;this.lastStats={poc:f,vah:d.valueAreaHigh,val:d.valueAreaLow,valueAreaPct:this.valueAreaPct};let p=d.buckets.length,m=o.width*this.widthRatio,h=o.x,g=o.height/p,_=1/d.maxCount;e.save();for(let t=0;t<p;t++){let n=d.buckets[t];if(n.count===0)continue;let i=o.y+o.height-(t+1)*g,a=n.count*_*m,s=n.mid>=d.valueAreaLow&&n.mid<=d.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?r.candleUp:r.textSecondary,e.fillRect(h,i+.5,a,g-1)}let v=e=>o.y+o.height*(1-(e-s.min)/(s.max-s.min));e.globalAlpha=.6,e.strokeStyle=r.candleUp,e.lineWidth=1,e.setLineDash([1,3]);for(let t of[d.valueAreaHigh,d.valueAreaLow]){let n=v(t);e.beginPath(),e.moveTo(h,Math.round(n)+.5),e.lineTo(o.x+o.width,Math.round(n)+.5),e.stroke()}if(e.setLineDash([]),this.highlightPoC){let t=v(f);e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(h,Math.round(t)+.5),e.lineTo(o.x+o.width,Math.round(t)+.5),e.stroke(),e.setLineDash([])}this.showStats&&this.drawStats(e,o.x+6,o.y+6,f,d.valueAreaHigh,d.valueAreaLow,r),e.restore()}renderSplit(e,t,n,r,i){let{chartRect:o,priceRange:s}=r,c=ce(t,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(c.length===0)return;let l=s.max-s.min,u=e=>o.y+o.height*(1-(e-s.min)/l),d=r.barWidth/2;e.save();for(let l of c){let c=l.profile,f=c.buckets.length,p=o.height/f,m=a(n+l.startIndex,r)-d,h=a(n+l.endIndex,r)+d,g=Math.max(2,h-m),_=1/c.maxCount,v=this.letters&&p>=7,y=v?se(t.slice(l.startIndex,l.endIndex+1),s.min,s.max,this.buckets):null;if(v&&y){e.font=`${Math.min(11,Math.floor(p))}px ui-monospace, monospace`,e.textBaseline=`middle`,e.textAlign=`left`;let t=Math.max(1,Math.floor(g/6));for(let n=0;n<f;n++){let r=y[n];if(r.length===0)continue;let a=o.y+o.height-(n+.5)*p,s=c.buckets[n].mid>=c.valueAreaLow&&c.buckets[n].mid<=c.valueAreaHigh;e.globalAlpha=s?.95:.6,e.fillStyle=s?i.candleUp:i.textSecondary;let l=Math.min(r.length,t);for(let t=0;t<l;t++)e.fillText(oe(r[t]),m+t*6,a)}}else for(let t=0;t<f;t++){let n=c.buckets[t];if(n.count===0)continue;let r=o.y+o.height-(t+1)*p,a=n.count*_*g,s=n.mid>=c.valueAreaLow&&n.mid<=c.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?i.candleUp:i.textSecondary,e.fillRect(m,r+.5,a,p-1)}if(this.highlightPoC){let t=u(c.buckets[c.pocIndex].mid);e.globalAlpha=1,e.strokeStyle=i.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(m,Math.round(t)+.5),e.lineTo(Math.min(h,o.x+o.width),Math.round(t)+.5),e.stroke(),e.setLineDash([])}}e.restore()}drawStats(e,t,n,r,i,a,o){let s=ue(r),c=[[`POC`,r.toFixed(s),o.crosshair],[`VAH`,i.toFixed(s),o.candleUp],[`VAL`,a.toFixed(s),o.candleUp]];e.globalAlpha=1,e.font=`600 10px ${o.font.family}`,e.textBaseline=`middle`;let l=0;for(let[,t]of c)l=Math.max(l,e.measureText(t).width);let u=38+l,d=6+c.length*14;e.fillStyle=o.background,e.globalAlpha=.82,de(e,t,n,u,d,4),e.fill(),e.globalAlpha=1,c.forEach(([r,i,a],s)=>{let c=n+6/2+14/2+s*14;e.fillStyle=a,e.textAlign=`left`,e.fillText(r,t+6,c),e.fillStyle=o.text,e.textAlign=`right`,e.fillText(i,t+u-6,c)}),e.textAlign=`left`}};function ue(e){let t=Math.abs(e);return t>=1e3?2:t>=1?4:6}function de(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function fe(t,n){let r=n===`day`?`1d`:`1w`,i=[];for(let n of t){let t=(0,e.timeframeBucketStart)(n.time,r),a=i[i.length-1];a&&a.key===t?(a.high=Math.max(a.high,n.high),a.low=Math.min(a.low,n.low),a.close=n.close):i.push({key:t,open:n.open,high:n.high,low:n.low,close:n.close})}return i}function pe(e,t=`day`){let n=fe(e,t);if(n.length<2)return[];let r=n[n.length-2],i=n[n.length-1],a=t===`day`?`D`:`W`;return[{id:`p${a}h`,label:`P${a}H`,price:r.high},{id:`p${a}c`,label:`P${a}C`,price:r.close},{id:`p${a}l`,label:`P${a}L`,price:r.low},{id:`open`,label:t===`day`?`Day Open`:`Week Open`,price:i.open}]}var me=class{visible=!1;period=`day`;setVisible(e){this.visible=e}isVisible(){return this.visible}setPeriod(e){this.period=e}getPeriod(){return this.period}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=pe(t,this.period);if(i.length===0)return;let{chartRect:a}=n,s=a.y,c=a.y+a.height;e.save(),e.font=`600 10px ${r.font.family}`,e.textBaseline=`middle`;for(let t of i){let i=o(t.price,n);if(i<s||i>c)continue;let l=he(t,r);e.strokeStyle=l,e.globalAlpha=.7,e.lineWidth=1,e.setLineDash([5,4]),e.beginPath(),e.moveTo(a.x,Math.round(i)+.5),e.lineTo(a.x+a.width,Math.round(i)+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=1;let u=t.label,d=e.measureText(u).width,f=a.x+a.width-d-10;e.fillStyle=r.background,e.globalAlpha=.85,e.fillRect(f-4,i-7,d+8,14),e.globalAlpha=1,e.fillStyle=l,e.textAlign=`left`,e.fillText(u,f,i+.5)}e.restore()}};function he(e,t){return e.id.endsWith(`h`)?t.candleUp:e.id.endsWith(`l`)?t.candleDown:t.textSecondary}function ge(e){let t,n;return e.map(e=>{let r;return e.type===`high`?(r=t===void 0||e.price>t?`HH`:`LH`,t=e.price):(r=n===void 0||e.price<n?`LL`:`HL`,n=e.price),{...e,label:r}})}function _e(e,t=5,n=5){let r=Math.max(1,Math.floor(t)),i=Math.max(1,Math.floor(n)),a=[];for(let t=r;t<e.length-i;t++){let n=e[t].high,o=e[t].low,s=!0,c=!0;for(let a=t-r;a<=t+i&&!(a!==t&&(e[a].high>=n&&(s=!1),e[a].low<=o&&(c=!1),!s&&!c));a++);s?a.push({index:t,price:n,type:`high`}):c&&a.push({index:t,price:o,type:`low`})}return a}var ve=class{visible=!1;left=5;right=5;showLabels=!1;structureLabels=!1;setVisible(e){this.visible=e}isVisible(){return this.visible}setStrength(e,t){this.left=Math.max(1,Math.floor(e)),this.right=Math.max(1,Math.floor(t))}setShowLabels(e){this.showLabels=e}setStructureLabels(e){this.structureLabels=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=_e(t,this.left,this.right);if(i.length===0)return;let s=this.structureLabels?ge(i):i,{from:c,to:l}=n.visibleRange;e.save(),e.font=`10px ${r.font.family}`,e.textAlign=`center`;for(let t of s){if(t.index<c-1||t.index>l+1)continue;let i=a(t.index,n),s=o(t.price,n),u=t.type===`high`,d=u?r.candleDown:r.candleUp,f=u?s-8:s+8;e.fillStyle=d,e.beginPath(),u?(e.moveTo(i-5,f-5),e.lineTo(i+5,f-5),e.lineTo(i,f)):(e.moveTo(i-5,f+5),e.lineTo(i+5,f+5),e.lineTo(i,f)),e.closePath(),e.fill();let p=this.structureLabels&&`label`in t?String(t.label):this.showLabels?ye(t.price):null;p&&(e.textBaseline=u?`bottom`:`top`,e.fillText(p,i,u?f-5-1:f+5+1))}e.restore()}};function ye(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var be=class{buffer=[];constructor(e=240){this.capacity=e,this.capacity=Math.max(1,Math.floor(e))}push(e,t){let n={time:e,bids:t.bids.map(e=>({...e})),asks:t.asks.map(e=>({...e}))},r=this.buffer[this.buffer.length-1];r&&r.time===e?this.buffer[this.buffer.length-1]=n:(this.buffer.push(n),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity)))}snapshots(){return this.buffer}maxVolume(){let e=0;for(let t of this.buffer){for(let n of t.bids)n.volume>e&&(e=n.volume);for(let n of t.asks)n.volume>e&&(e=n.volume)}return e}setCapacity(e){this.capacity=Math.max(1,Math.floor(e)),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}clear(){this.buffer=[]}get size(){return this.buffer.length}},xe=class{buffer=new be(240);visible=!1;opacity=.7;setVisible(e){this.visible=e}isVisible(){return this.visible}setOpacity(e){this.opacity=Math.max(.1,Math.min(1,e))}setCapacity(e){this.buffer.setCapacity(e)}push(e,t){this.buffer.push(e,t)}clear(){this.buffer.clear()}render(e,t,n){if(!this.visible)return;let r=this.buffer.snapshots();if(r.length===0)return;let i=this.buffer.maxVolume();if(i<=0)return;let a=1/i,{chartRect:o}=t,s=Math.max(2,t.barWidth+t.barSpacing),c=o.x,l=o.x+o.width,u=o.y,f=o.y+o.height;e.save();for(let i of r){let r=d(i.time,t);if(r<c-s||r>l+s)continue;let o=r-s/2;this.drawSide(e,i.bids,n.candleUp,o,s,t,a,u,f),this.drawSide(e,i.asks,n.candleDown,o,s,t,a,u,f)}e.restore()}drawSide(e,t,n,r,i,a,s,c,l){if(t.length===0)return;let u=Se(t,a);e.fillStyle=n;for(let n of t){let t=o(n.price,a);t<c-u||t>l+u||(e.globalAlpha=Math.min(1,Math.sqrt(n.volume*s))*this.opacity,e.fillRect(r,t-u/2,i,u))}e.globalAlpha=1}};function Se(e,t){if(e.length<2)return 3;let n=e.map(e=>e.price).sort((e,t)=>e-t),r=[];for(let e=1;e<n.length;e++){let t=n[e]-n[e-1];t>0&&r.push(t)}if(r.length===0)return 3;r.sort((e,t)=>e-t);let i=r[Math.floor(r.length/2)],a=Math.abs(o(n[0],t)-o(n[0]+i,t));return Math.max(2,Math.min(a,12))}var Ce=class{symbols=new Map;mode=`percent`;setMode(e){this.mode=e}addSymbol(e){this.symbols.set(e.id,e)}removeSymbol(e){this.symbols.delete(e)}setSymbolData(e,t){let n=this.symbols.get(e);n&&(n.data=t)}setSymbolVisible(e,t){let n=this.symbols.get(e);n&&(n.visible=t)}getSymbols(){return Array.from(this.symbols.values())}clear(){this.symbols.clear()}render(e,t,n,r){if(this.symbols.size===0||t.length===0)return;let{chartRect:i}=n;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.symbols.values())!i.visible||i.data.length===0||this.renderSymbol(e,i,t,n,r);e.restore()}renderSymbol(e,t,n,r,i){let{chartRect:s}=r,c=r.barWidth+r.barSpacing,l=Math.max(0,Math.floor(r.offset/c));if(l>=n.length||l>=t.data.length)return;let u=n[l].close,d=t.data[l].close;if(u===0||d===0)return;e.strokeStyle=t.color,e.lineWidth=t.lineWidth??1.5,e.lineJoin=`round`,e.beginPath();let f=!1,p=Math.min(n.length,t.data.length);for(let n=l;n<p;n++){let i=a(n,r);if(i<s.x-c)continue;if(i>s.x+s.width+c)break;let l;l=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r):o(t.data[n].close,r),f?e.lineTo(i,l):(e.moveTo(i,l),f=!0)}if(e.stroke(),f){let n=Math.min(l+2,p-1),i=a(n,r)+4,s;s=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r)-4:o(t.data[n].close,r)-4,e.fillStyle=t.color,e.font=`bold 10px sans-serif`,e.textBaseline=`bottom`,e.textAlign=`left`,e.fillText(t.label,i,s)}}};function we(e){if(e.length===0)return[];let t=[],n=e[0].open,r=(e[0].open+e[0].high+e[0].low+e[0].close)/4;for(let i=0;i<e.length;i++){let a=e[i],o=(a.open+a.high+a.low+a.close)/4,s=i===0?a.open:(n+r)/2,c=Math.max(a.high,s,o),l=Math.min(a.low,s,o);t.push({time:a.time,open:s,high:c,low:l,close:o,volume:a.volume}),n=s,r=o}return t}function Te(e,t){if(e.length===0)return[];let n=t.brickSize;t.useATR&&e.length>(t.atrPeriod??14)&&(n=Ee(e,t.atrPeriod??14)),n<=0&&(n=1);let r=[],i=Math.round(e[0].close/n)*n,a=e[0].time;for(let t=1;t<e.length;t++){let o=e[t].close-i,s=Math.floor(Math.abs(o)/n);if(s>=1){let c=o>0?1:-1;for(let o=0;o<s;o++){let o=i;i+=c*n,r.push({time:a++,open:o,high:Math.max(o,i),low:Math.min(o,i),close:i,volume:e[t].volume/s})}}}return r}function Ee(e,t){let n=0;for(let r=1;r<=Math.min(t,e.length-1);r++){let t=Math.max(e[r].high-e[r].low,Math.abs(e[r].high-e[r-1].close),Math.abs(e[r].low-e[r-1].close));n+=t}return n/t}function De(e,t=3){if(e.length===0)return[];let n=[],r=0;n.push({time:r++,open:e[0].open,high:Math.max(e[0].open,e[0].close),low:Math.min(e[0].open,e[0].close),close:e[0].close,volume:e[0].volume});for(let i=1;i<e.length;i++){let a=e[i].close,o=n[n.length-1],s=o.close>=o.open,c=Math.min(t,n.length),l=-1/0,u=1/0;for(let e=n.length-c;e<n.length;e++)l=Math.max(l,n[e].high),u=Math.min(u,n[e].low);s&&a>o.close?n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume}):!s&&a<o.close||s&&a<u?n.push({time:r++,open:o.close,high:o.close,low:a,close:a,volume:e[i].volume}):!s&&a>l&&n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume})}return n}function Oe(e,t=4){if(e.length<2)return e.slice();let n=[],r=e[1].close>=e[0].close?1:-1,i=e[0].close,a=e[0].close,o=e[0].close,s=0;for(let c=1;c<e.length;c++){let l=e[c].close,u=t/100*o;r===1?(l>i&&(i=l),i-l>=u&&(n.push({time:s++,open:o,high:i,low:o,close:i,volume:e[c].volume}),r=-1,o=i,a=l,i=l)):(l<a&&(a=l),l-a>=u&&(n.push({time:s++,open:o,high:o,low:a,close:a,volume:e[c].volume}),r=1,o=a,i=l,a=l))}return r===1?n.push({time:s,open:o,high:i,low:o,close:i,volume:0}):n.push({time:s,open:o,high:o,low:a,close:a,volume:0}),n}function ke(e,t,n=3){if(e.length===0||t<=0)return[];let r=[],i=0,a=0,o=0,s=0,c=Math.round(e[0].close/t)*t;a=c,o=c,i=1;for(let c=1;c<e.length;c++){let l=e[c].close,u=Math.round(l/t)*t;i===1?u>a?a=u:a-u>=t*n&&(r.push({time:s++,open:o,high:a,low:o,close:a,volume:e[c].volume}),i=-1,o=u,a-=t):u<o?o=u:u-o>=t*n&&(r.push({time:s++,open:a,high:a,low:o,close:o,volume:e[c].volume}),i=1,a=u,o+=t)}return r.push({time:s,open:i===1?o:a,high:a,low:o,close:i===1?a:o,volume:0}),r}function Ae(e,t){if(e.length===0||t.rangeSize<=0)return[];let n=[],r=e[0].time,i=e[0].open,a=i,o=i,s=0,c=(e,c)=>{for(e>a&&(a=e),e<o&&(o=e),s+=c;a-o>=t.rangeSize;){let c=e>=i,l=c?i+t.rangeSize:i-t.rangeSize;n.push({time:r++,open:i,high:c?l:i,low:c?i:l,close:l,volume:s}),i=l,a=l,o=l,s=0}};for(let t of e){let e=t.close>=t.open?[t.low,t.high,t.close]:[t.high,t.low,t.close],n=t.volume/e.length;for(let t of e)c(t,n)}return n}var M=class{drawLine(e,t,n,r){if(!(t.length<2)){e.beginPath(),e.strokeStyle=n,e.lineWidth=r,e.lineJoin=`round`,e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);e.stroke()}}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(e,t,n,r){let i=[],{from:s,to:c}=r.visibleRange;for(let l=s;l<=c&&l<n.length;l++){let s=e.values.get(n[l].time);s&&s[t]!==void 0&&i.push({x:a(l,r),y:o(s[t],r)})}return i}},je=1,Me=class{registry=new Map;instances=new Map;register(e){this.registry.set(e.descriptor.id,e)}getAvailableIndicators(){return Array.from(this.registry.values()).map(e=>e.descriptor)}addIndicator(e,t={},n){let r=this.registry.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);let i=`tc_${e}_${je++}`,a={id:e,instanceId:i,params:{...r.descriptor.defaultConfig,...t},visible:!0},o={plugin:r,config:a,output:null,style:{colors:a.style?.colors??[`#2196F3`,`#FF9800`,`#4CAF50`,`#E91E63`,`#9C27B0`],lineWidths:a.style?.lineWidths??[1.5],opacity:a.style?.opacity??1}};return n&&(o.output=r.calculate(n,a)),this.instances.set(i,o),i}removeIndicator(e){this.instances.delete(e)}updateIndicator(e,t,n){let r=this.instances.get(e);r&&(Object.assign(r.config.params,t),n&&(r.output=r.plugin.calculate(n,r.config)))}recalculateAll(e){for(let t of this.instances.values())t.output=t.plugin.calculate(e,t.config)}getOutput(e){return this.instances.get(e)?.output??null}renderOverlays(e,t){for(let n of this.instances.values())!n.output||!n.config.visible||n.plugin.descriptor.placement===`overlay`&&n.plugin.render(e,n.output,t,n.style)}renderPanel(e,t,n){let r=this.instances.get(t);!r?.output||!r.config.visible||r.plugin.render(e,r.output,n,r.style)}getIndicatorConfig(e){return this.instances.get(e)?.config??null}setVisible(e,t){let n=this.instances.get(e);return n?(n.config.visible=t,t):null}isVisible(e){return this.instances.get(e)?.config.visible??!1}getIndicatorDescriptor(e){return this.instances.get(e)?.plugin.descriptor??null}getActiveIndicators(){let e=[];for(let[t,n]of this.instances)e.push({instanceId:t,id:n.config.id,params:{...n.config.params},descriptor:n.plugin.descriptor,visible:n.config.visible??!0});return e}updateIndicatorStyle(e,t){let n=this.instances.get(e);n&&Object.assign(n.style,t)}getOverlayPriceRange(e,t){let n=1/0,r=-1/0;for(let i of this.instances.values()){if(!i.output||!i.config.visible||i.plugin.descriptor.placement!==`overlay`)continue;let a=0;for(let[,o]of i.output.values){if(a>=e&&a<=t)for(let e in o){let t=o[e];t!==void 0&&isFinite(t)&&(t<n&&(n=t),t>r&&(r=t))}a++}}return n===1/0?null:{min:n,max:r}}getPanelIndicators(){let e=[];for(let[t,n]of this.instances)n.plugin.descriptor.placement===`panel`&&e.push({instanceId:t,descriptor:n.plugin.descriptor});return e}};function N(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function P(e,t,n,r=1){let i=N(e,t,n);return Math.max(r,Math.floor(i))}var Ne=class extends M{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Pe=class extends M{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=2/(n+1),i=new Map,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Fe=class extends M{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2}};calculate(e,t){let n=P(t,`period`,20,1),r=N(t,`stdDev`,2),i=new Map,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=0,d=l-c+1,f=new Float64Array(d),p=new Float64Array(d),m=new Float64Array(d),h=new Float64Array(d),g=new Float64Array(d),_=new Float64Array(d);for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t||t.upper===void 0)continue;let n=a(e,r);f[u]=n,p[u]=o(t.upper,r),m[u]=n,h[u]=o(t.middle,r),g[u]=n,_[u]=o(t.lower,r),u++}if(!(u<2)){t.beginPath(),t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);for(let e=u-1;e>=0;e--)t.lineTo(g[e],_[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[0],.1),t.fill(),t.beginPath(),t.strokeStyle=i.colors[0],t.lineWidth=i.lineWidths[0],t.lineJoin=`round`,t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[1]??i.colors[0],t.moveTo(m[0],h[0]);for(let e=1;e<u;e++)t.lineTo(m[e],h[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[0],t.moveTo(g[0],_[0]);for(let e=1;e<u;e++)t.lineTo(g[e],_[e]);t.stroke()}}},Ie=class extends M{descriptor={id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null),i=0,a=0;for(let t=0;t<e.length;t++){let o=(e[t].high+e[t].low+e[t].close)/3;if(i+=e[t].volume,a+=o*e[t].volume,i>0){let o={value:a/i};n.set(e[t].time,o),r[t]=o}}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Le=class extends M{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26}};calculate(e,t){let n=P(t,`tenkan`,9,1),r=P(t,`kijun`,26,1),i=P(t,`senkou`,52,1),a=new Map,o=Array(e.length).fill(null),s=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},c=s(n),l=s(r),u=s(i);for(let t=0;t<e.length;t++){let s={};t>=n-1&&(s.tenkan=(c.highs[t]+c.lows[t])/2),t>=r-1&&(s.kijun=(l.highs[t]+l.lows[t])/2),s.tenkan!==void 0&&s.kijun!==void 0&&(s.senkouA=(s.tenkan+s.kijun)/2),t>=i-1&&(s.senkouB=(u.highs[t]+u.lows[t])/2),t>=r-1&&(s.chikou=e[t].close),(s.tenkan!==void 0||s.kijun!==void 0||s.senkouA!==void 0||s.senkouB!==void 0)&&(a.set(e[t].time,s),o[t]=s)}return{values:a,series:o}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=l-c+1,d=new Float64Array(u),f=new Float64Array(u),p=0,m=new Float64Array(u),h=new Float64Array(u),g=0,_=new Float64Array(u),v=new Float64Array(u),y=0,b=new Float64Array(u),x=new Float64Array(u),S=0;for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.tenkan!==void 0&&(d[p]=n,f[p]=o(t.tenkan,r),p++),t.kijun!==void 0&&(m[g]=n,h[g]=o(t.kijun,r),g++),t.senkouA!==void 0&&(_[y]=n,v[y]=o(t.senkouA,r),y++),t.senkouB!==void 0&&(b[S]=n,x[S]=o(t.senkouB,r),S++)}if(y>1&&S>1){let n=Math.min(y,S);t.beginPath(),t.moveTo(_[0],v[0]);for(let e=1;e<n;e++)t.lineTo(_[e],v[e]);for(let e=n-1;e>=0;e--)t.lineTo(b[e],x[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[2]??`#26A69A`,.15),t.fill()}let C=(e,n,r,i,a)=>{if(!(r<2)){t.beginPath(),t.strokeStyle=i,t.lineWidth=a,t.lineJoin=`round`,t.moveTo(e[0],n[0]);for(let i=1;i<r;i++)t.lineTo(e[i],n[i]);t.stroke()}};C(d,f,p,i.colors[0],i.lineWidths[0]),C(m,h,g,i.colors[1]??`#FF9800`,i.lineWidths[0]),C(_,v,y,i.colors[2]??`#26A69A`,1),C(b,x,S,i.colors[3]??`#EF5350`,1)}},Re=class extends M{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2}};calculate(e,t){let n=N(t,`step`,.02),r=N(t,`max`,.2),i=new Map,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=Math.max(1.5,n.barWidth*.15);for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),u=o(s.value,n);e.beginPath(),e.arc(c,u,l,0,Math.PI*2),e.fillStyle=s.trend===1?r.colors[0]:r.colors[1]??`#EF5350`,e.fill()}}},ze=class extends M{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3}};calculate(e,t){let n=P(t,`period`,10,1),r=N(t,`multiplier`,3),i=new Map,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s;c=g<u||e[t-1].close>u?g:u,l=_>d||e[t-1].close<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let v={value:f,trend:m};i.set(e[t].time,v),a[t]=v,u=c,d=l,p=f}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#EF5350`,d=0,f=0,p=0;for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),m=o(s.value,n),h=s.trend??1;p!==0&&(e.beginPath(),e.strokeStyle=h===1?l:u,e.lineWidth=r.lineWidths[0]+.5,e.moveTo(d,f),e.lineTo(c,m),e.stroke()),d=c,f=m,p=h}}},Be=class extends M{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5}};calculate(e,t){let n=P(t,`emaPeriod`,20,1),r=P(t,`atrPeriod`,10,1),i=N(t,`multiplier`,1.5),a=new Map;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},Ve=class extends M{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??`#787B86`,1),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},He=[`s3`,`s2`,`s1`,`pp`,`r1`,`r2`,`r3`],Ue=class extends M{descriptor={id:`pivots`,name:`Pivot Points (Classic)`,placement:`overlay`,defaultConfig:{lookback:24}};calculate(e,t){let n=P(t,`lookback`,24,1),r=new Map,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};for(let t=n;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n;r<t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s=e[t-1].close,c=(a+o+s)/3,l=a-o,u={pp:c,r1:2*c-o,s1:2*c-a,r2:c+l,s2:c-l,r3:a+2*(c-o),s3:o-2*(a-c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#EF5350`,d=r.colors[2]??`#26A69A`,f=r.lineWidths[0],p=e=>e===`pp`?l:e.startsWith(`r`)?u:d;for(let t of He){e.beginPath(),e.strokeStyle=p(t),e.lineWidth=t===`pp`?f:Math.max(1,f-1),t!==`pp`&&e.setLineDash([4,3]);let r=!1;for(let l=s;l<=c&&l<i.length;l++){let s=i[l]?.[t];if(s===void 0)continue;let c=a(l,n),u=o(s,n);r?e.lineTo(c,u):(e.moveTo(c,u),r=!0)}e.stroke(),e.setLineDash([])}}},We=class extends M{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0}};calculate(e,t){let n=N(t,`anchorTime`,0),r=new Map,i=Array(e.length).fill(null),a=0;if(n>0&&(a=e.findIndex(e=>e.time>=n),a<0))return{values:r,series:i};let o=0,s=0;for(let t=a;t<e.length;t++){let n=(e[t].high+e[t].low+e[t].close)/3;if(o+=e[t].volume,s+=n*e[t].volume,o>0){let n={value:s/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ge=class extends M{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5}};calculate(e,t){let n=Math.max(.01,N(t,`deviation`,5))/100,r=new Map,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(e,t,n,r){let i=t.meta?.pivots;if(!(!i||i.length<2)){e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;for(let t=0;t<i.length;t++){let r=i[t],s=a(r.idx,n),c=o(r.price,n);t===0?e.moveTo(s,c):e.lineTo(s,c)}e.stroke()}}},Ke=class extends M{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2}};calculate(e,t){let n=P(t,`period`,100,2),r=N(t,`stdDev`,2),i=new Map,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},qe=class extends M{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21}};calculate(e,t){let n=P(t,`period`,21,2),r=new Map,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=Je(a,n),l=Je(a,o),u=Ye(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}};function Je(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function Ye(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var Xe=class extends M{descriptor={id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`}};calculate(t,n){let r=P(n,`period`,50,1),i=String(n.params.timeframe??`1d`),a=new Map,o=Array(t.length).fill(null);if(t.length===0)return{values:a,series:o};let s=[],c=(0,e.timeframeBucketStart)(t[0].time,i),l=t[0].close,u=null,d=()=>{if(s.length<r)return;let e=0;for(let t=s.length-r;t<s.length;t++)e+=s[t];u=e/r};for(let n=0;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,i);if(r!==c&&(s.push(l),d(),c=r),l=t[n].close,u!==null){let e={value:u};a.set(t[n].time,e),o[n]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ze=class extends M{descriptor={id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1}};calculate(t,n){let r=Math.min(3,P(n,`bands`,1,0)),i=new Map,a=Array(t.length).fill(null);if(t.length===0)return{values:i,series:a};let o=(0,e.timeframeBucketStart)(t[0].time,`1d`),s=0,c=0,l=0;for(let n=0;n<t.length;n++){let u=t[n],d=(0,e.timeframeBucketStart)(u.time,`1d`);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,t={value:e,session:o};if(r>0){let n=Math.max(0,c/l-e*e),i=Math.sqrt(n);for(let n=1;n<=r;n++)t[`u${n}`]=e+n*i,t[`l${n}`]=e-n*i}i.set(u.time,t),a[n]=t}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:a,to:o}=n.visibleRange;e.globalAlpha=.55,e.lineWidth=1,e.setLineDash([4,3]),e.strokeStyle=r.colors[1]??r.colors[0];for(let t=1;t<=3;t++)this.strokeBandSeries(e,i,n,a,o,e=>e[`u${t}`]),this.strokeBandSeries(e,i,n,a,o,e=>e[`l${t}`]);e.setLineDash([]),e.globalAlpha=1,e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,this.strokeBandSeries(e,i,n,a,o,e=>e.value)}strokeBandSeries(e,t,n,r,i,s){e.beginPath();let c,l=!1;for(let u=r;u<=i&&u<t.length;u++){let r=t[u],i=r?s(r):void 0;if(r===null||i===void 0){l=!1;continue}let d=a(u,n),f=o(i,n),p=r.session!==c;!l||p?(e.moveTo(d,f),l=!0):e.lineTo(d,f),c=r.session}e.stroke()}},Qe=class extends M{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3}};calculate(e,t){let n=P(t,`period`,22,1),r=N(t,`multiplier`,3),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.setLineDash([5,3]);let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke(),e.setLineDash([])};l(`long`,r.colors[0]??`#26A69A`),l(`short`,r.colors[1]??`#EF5350`)}},$e=class extends M{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3}};calculate(e,t){let n=P(t,`jaw`,13,1),r=P(t,`teeth`,8,1),i=P(t,`lips`,5,1),a=P(t,`jawShift`,8,0),o=P(t,`teethShift`,5,0),s=P(t,`lipsShift`,3,0),c=new Map,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=et(d,n),p=et(d,r),m=et(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke()};l(`jaw`,r.colors[0]??`#2962FF`),l(`teeth`,r.colors[1]??`#EF5350`),l(`lips`,r.colors[2]??`#26A69A`)}};function et(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var tt=class extends M{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34}};calculate(e,t){let n=P(t,`fast`,5,1),r=P(t,`slow`,34,1),i=new Map,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#26A69A`,g=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.up?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},nt=class extends M{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10}};calculate(e,t){let n=P(t,`fast`,3,1),r=P(t,`slow`,10,1),i=new Map,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#26A69A`,g=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.value>=0?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},rt=class extends M{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=0,o=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?a+=n:o-=n}a/=n,o/=n;let s={value:o===0?100:100-100/(1+a/o)};r.set(e[n].time,s),i[n]=s;for(let t=n+1;t<e.length;t++){let s=e[t].close-e[t-1].close,c=s>0?s:0,l=s<0?-s:0;a=(a*(n-1)+c)/n,o=(o*(n-1)+l)/n;let u={value:o===0?100:100-100/(1+a/o)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath();for(let t of[30,70]){let n=l(t);e.moveTo(o.x,n),e.lineTo(o.x+o.width,n)}e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},it=class extends M{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new Map,o=Array(e.length).fill(null);if(e.length<r)return{values:a,series:o};let s=2/(n+1),c=2/(r+1),l=2/(i+1),u=e[0].close,d=e[0].close,f=0,p=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(u=n,d=n):(u=(n-u)*s+u,d=(n-d)*c+d),t>=r-1){let n=u-d;p?f=(n-f)*l+f:(f=n,p=!0);let r=n-f,i={macd:n,signal:f,histogram:r};a.set(e[t].time,i),o[t]=i}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.macd!==void 0&&(t.macd<l&&(l=t.macd),t.macd>u&&(u=t.macd)),t.signal!==void 0&&(t.signal<l&&(l=t.signal),t.signal>u&&(u=t.signal)),t.histogram!==void 0&&(t.histogram<l&&(l=t.histogram),t.histogram>u&&(u=t.histogram)))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d),p=f(0),m=n.barWidth/2,h=r.colors[2]??`#26A69A`,g=r.colors[3]??`#EF5350`,_=r.colors[0],v=r.colors[1]??`#FF9800`;e.beginPath();let y=new Path2D,b=new Path2D,x=!1,S=!1,C=new Path2D,w=new Path2D;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(!t)continue;let r=a(e,n);if(t.histogram!==void 0){let e=f(t.histogram),i=Math.min(e,p),a=Math.max(Math.abs(e-p),1);t.histogram>=0?y.rect(r-m,i,n.barWidth,a):b.rect(r-m,i,n.barWidth,a)}if(t.macd!==void 0){let e=f(t.macd);x?C.lineTo(r,e):(C.moveTo(r,e),x=!0)}if(t.signal!==void 0){let e=f(t.signal);S?w.lineTo(r,e):(w.moveTo(r,e),S=!0)}}e.fillStyle=h,e.fill(y),e.fillStyle=g,e.fill(b),e.strokeStyle=_,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.stroke(C),e.strokeStyle=v,e.stroke(w)}},at=class extends M{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3}};calculate(e,t){let n=P(t,`kPeriod`,14,1),r=P(t,`dPeriod`,3,1),i=P(t,`smooth`,3,1),a=new Map,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]),u(`d`,r.colors[1]??`#FF9800`)}},ot=class extends M{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},st=class extends M{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`adx`,r.colors[0]),u(`plusDI`,r.colors[1]??`#26A69A`),u(`minusDI`,r.colors[2]??`#EF5350`)}},ct=class extends M{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},lt=class extends M{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-20,-80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},ut=class extends M{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-100,0,100])if(t>=f&&t<=p){let n=h(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},dt=class extends M{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},ft=class extends M{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25}};calculate(e,t){let n=P(t,`period`,25,1),r=new Map,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`up`,r.colors[0]),u(`down`,r.colors[1]??`#EF5350`)}},pt=class extends M{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12}};calculate(e,t){let n=P(t,`period`,12,1),r=new Map,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);if(0>=f&&0<=p){e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);let t=h(0);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},mt=class extends M{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7}};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=P(t,`longPeriod`,25,1),r=P(t,`shortPeriod`,13,1),i=P(t,`signalPeriod`,7,1),a=new Map,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.tsi!==void 0&&(l=Math.min(l,t.tsi),u=Math.max(u,t.tsi)),t.signal!==void 0&&(l=Math.min(l,t.signal),u=Math.max(u,t.signal)))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=h(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};g(`tsi`,r.colors[0]),g(`signal`,r.colors[1]??`#FF9800`)}},ht=class extends M{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=n.barWidth/2;for(let t=s;t<=c&&t<i.length;t++){let o=i[t];if(o&&o.value!==void 0){let i=a(t,n),s=h(o.value),c=h(0);e.fillStyle=o.value>=0?r.colors[0]:r.colors[1]??`#EF5350`;let l=Math.min(s,c);e.fillRect(i-g,l,n.barWidth,Math.max(Math.abs(s-c),1))}}}},gt=class extends M{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0}};calculate(e,t){let n=N(t,`mode`,0)>=1,r=new Map,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2,p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value),c=Math.min(s,d),l=Math.max(Math.abs(s-d),1);e.fillStyle=r.up?p:m,e.fillRect(o-f,c,n.barWidth,l)}}},_t=class extends M{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`viPlus`,`viMinus`]){let n=t[e];n!==void 0&&(n<l&&(l=n),n>u&&(u=n))}}if(l===1/0)return;let d=(u-l)*.1||.1;l-=d,u+=d;let f=u-l||1,p=e=>o.y+o.height*(1-(e-l)/f);if(1>=l&&1<=u){e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);let t=p(1);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}let m=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=p(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};m(`viPlus`,r.colors[0]??`#26A69A`),m(`viMinus`,r.colors[1]??`#EF5350`)}},vt=class extends M{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,2),r=new Map,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[38.2,61.8]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},yt=class extends M{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28}};calculate(e,t){let n=P(t,`fast`,7,1),r=P(t,`mid`,14,1),i=P(t,`slow`,28,1),a=new Map,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=bt(l(s,t,n),l(c,t,n)),d=bt(l(s,t,r),l(c,t,r)),f=bt(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function bt(e,t){return t===0?0:e/t}var xt=class extends M{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new Map,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},St=class extends M{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100}};calculate(e,t){let n=P(t,`rsiPeriod`,3,1),r=P(t,`streakPeriod`,2,1),i=P(t,`rankPeriod`,100,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=Ct(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=Ct(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[10,90]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Ct(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var wt=class extends M{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10}};calculate(e,t){let n=P(t,`longRoc`,14,1),r=P(t,`shortRoc`,11,1),i=P(t,`wma`,10,1),a=new Map,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},Tt=class extends M{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9}};calculate(e,t){let n=P(t,`roc1`,10,1),r=P(t,`roc2`,15,1),i=P(t,`roc3`,20,1),a=P(t,`roc4`,30,1),o=P(t,`sma1`,10,1),s=P(t,`sma2`,10,1),c=P(t,`sma3`,10,1),l=P(t,`sma4`,15,1),u=P(t,`signal`,9,1),d=new Map,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=I(F(m,n),o),g=I(F(m,r),s),_=I(F(m,i),c),v=I(F(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=I(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}};function F(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function I(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var Et=class extends M{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`bull`,`bear`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r)continue;let o=a(t,n);if(r.bull!==void 0){let t=u(r.bull);e.fillStyle=p,e.globalAlpha=.8,e.fillRect(o-f,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}if(r.bear!==void 0){let t=u(r.bear);e.fillStyle=m,e.globalAlpha=.8,e.fillRect(o,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}}e.globalAlpha=1}},Dt=class extends M{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10}};calculate(e,t){let n=P(t,`fast`,23,1),r=P(t,`slow`,50,1),i=P(t,`cycle`,10,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=Ot(Ot(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[25,75]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Ot(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var kt=class extends M{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13}};calculate(e,t){let n=P(t,`fast`,34,1),r=P(t,`slow`,55,1),i=P(t,`signal`,13,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}},At=class extends M{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`trigger`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`trigger`,r.colors[1]??`#FF9800`)}},jt=class extends M{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,2),r=Math.floor(n/2)+1,i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);e.fillStyle=r.value>=0?p:m,e.fillRect(o-f,Math.min(s,d),n.barWidth,Math.max(1,Math.abs(s-d)))}}},Mt=class extends M{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14}};calculate(e,t){let n=P(t,`smooth`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+1)/2),u=l(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,u),e.lineTo(o.x+o.width,u),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(Math.max(-1,Math.min(1,r.value)));d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},Nt=class extends M{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25}};calculate(e,t){let n=P(t,`ema`,9,1),r=P(t,`sum`,25,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;l=Math.min(l,26),u=Math.max(u,27.5);let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[26.5,27]){let n=f(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}},Pt=class extends M{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/200);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-50,0,50]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Ft=class extends M{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9}};calculate(e,t){let n=P(t,`period`,15,1),r=P(t,`signal`,9,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=L(L(L(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=L(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}};function L(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var It=class extends M{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}};function R(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}var Lt=class extends M{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){Rt(e,t,n,r,a)}};function Rt(e,t,n,r,i){let a=t.series;if(!a)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<a.length;e++){let t=a[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<a.length;t++){let r=a[t];if(!r||r.value===void 0)continue;let o=i(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}var zt=class extends M{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}render(e,t,n,r){Rt(e,t,n,r,a)}},Bt=class extends M{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10}};calculate(e,t){let n=P(t,`ema`,10,1),r=P(t,`roc`,10,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}render(e,t,n,r){R(e,t,n,r)}},Vt=class extends M{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10}};calculate(e,t){let n=P(t,`period`,10,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}},Ht=class extends M{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3}};calculate(e,t){let n=P(t,`rsiPeriod`,14,1),r=P(t,`stochPeriod`,14,1),i=P(t,`k`,3,1),a=P(t,`d`,3,1),o=new Map,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=Ut(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=Wt(u,i),f=Wt(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){u=!1;continue}let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]??`#2962FF`),u(`d`,r.colors[1]??`#FF9800`)}};function Ut(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function Wt(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var Gt=class extends M{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=Kt(c,n),u=Kt(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=Kt(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`,`hist`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=Math.max(1,o.width/(c-s+1)*.6);for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.hist;if(r===void 0)continue;let o=a(t,n),s=u(r);e.fillStyle=r>=0?`rgba(38,166,154,0.5)`:`rgba(239,83,80,0.5)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d)))}e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};p(`value`,r.colors[0]??`#2962FF`),p(`signal`,r.colors[1]??`#FF9800`)}};function Kt(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var qt=class extends M{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{}};calculate(e){let t=new Map,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=Jt(i,e,5)-Jt(i,e,34);for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let o={value:a[i]-r/5};t.set(e[i].time,o),n[i]=o}return{values:t,series:n}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=Math.max(1,o.width/(c-s+1)*.6),p;for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.value;if(r===void 0){p=void 0;continue}let o=a(t,n),s=u(r);e.fillStyle=(p===void 0?r>=0:r>=p)?`rgba(38,166,154,0.85)`:`rgba(239,83,80,0.85)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d))),p=r}}};function Jt(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var Yt=class extends M{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5}};calculate(e,t){let n=P(t,`period`,20,1),r=P(t,`momentum`,5,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#2962FF`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){u=!1;continue}let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Xt=class extends M{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}},Zt=class extends M{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8}};calculate(e,t){let n=P(t,`period`,8,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}},Qt=class extends M{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=3;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}let u=e=>o.y+o.height*(1-(e+l)/(2*l));e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-3,0,3]){let n=u(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#2962FF`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){d=!1;continue}let o=a(t,n),s=u(r.value);d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},$t=class extends M{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},en=class extends M{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`panel`,defaultConfig:{rows:24}};calculate(e,t){let n=P(t,`rows`,24,1),r=new Map,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(e,t,n,r){let{chartRect:i}=n,a=t.meta;if(!a||a.maxVolume===0)return;let{minPrice:o,rows:s,rowHeight:c,bins:l,maxVolume:u}=a,d=i.height/s,f=i.width*.3;for(let t=0;t<s;t++){let a=(o+(t+.5)*c-n.priceRange.min)/(n.priceRange.max-n.priceRange.min),s=i.y+i.height*(1-a),p=l[t]/u*f;e.fillStyle=l[t]>u*.7?r.colors[1]??`rgba(255, 152, 0, 0.5)`:r.colors[0]??`rgba(33, 150, 243, 0.3)`,e.fillRect(i.x,s-d/2,p,Math.max(d-1,1))}}},tn=class extends M{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},nn=class extends M{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([])),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}};function rn(e){e.register(new Ne),e.register(new Pe),e.register(new Fe),e.register(new Ie),e.register(new Le),e.register(new Re),e.register(new ze),e.register(new Be),e.register(new Ve),e.register(new Ue),e.register(new We),e.register(new Ge),e.register(new Ke),e.register(new qe),e.register(new Xe),e.register(new Ze),e.register(new Qe),e.register(new $e),e.register(new rt),e.register(new it),e.register(new at),e.register(new ot),e.register(new st),e.register(new ct),e.register(new lt),e.register(new ut),e.register(new dt),e.register(new ft),e.register(new pt),e.register(new mt),e.register(new ht),e.register(new $t),e.register(new en),e.register(new tn),e.register(new nn),e.register(new tt),e.register(new nt),e.register(new gt),e.register(new _t),e.register(new vt),e.register(new yt),e.register(new xt),e.register(new St),e.register(new wt),e.register(new Tt),e.register(new Et),e.register(new Dt),e.register(new kt),e.register(new At),e.register(new jt),e.register(new Mt),e.register(new Nt),e.register(new Pt),e.register(new Ft),e.register(new It),e.register(new zt),e.register(new Lt),e.register(new Bt),e.register(new Vt),e.register(new Ht),e.register(new Gt),e.register(new qt),e.register(new Yt),e.register(new Xt),e.register(new Zt),e.register(new Qt)}function an(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`number`?t.type===`result`||t.type===`pong`||t.type===`error`:!1}var on=class{worker;fallbackPlugins;timeoutMs;nextRequestId=1;pending=new Map;messageHandler;constructor(e,t={}){this.worker=e,this.fallbackPlugins=t.fallbackPlugins??new Map,this.timeoutMs=t.timeoutMs??3e4,this.messageHandler=e=>this.handleMessage(e),this.worker&&(this.worker.addEventListener(`message`,this.messageHandler),this.worker.addEventListener(`error`,this.messageHandler))}hasWorker(){return this.worker!==null}registerFallbackPlugin(e){this.fallbackPlugins.set(e.descriptor.id,e)}async calculate(e,t,n){if(!this.worker){let r=this.fallbackPlugins.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);return r.calculate(n,t)}let r=this.nextRequestId++,i={type:`calculate`,requestId:r,indicatorId:e,config:t,data:n};return new Promise((t,n)=>{let a={resolve:t,reject:n,timer:null};this.timeoutMs>0&&(a.timer=setTimeout(()=>{this.pending.delete(r),n(Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`))},this.timeoutMs)),this.pending.set(r,a),this.worker.postMessage(i)})}ping(){if(!this.worker)return Promise.resolve();let e=this.nextRequestId++;return new Promise((t,n)=>{let r={resolve:()=>t(),reject:n,timer:this.timeoutMs>0?setTimeout(()=>{this.pending.delete(e),n(Error(`Indicator worker ping timeout`))},this.timeoutMs):null};this.pending.set(e,r),this.worker.postMessage({type:`ping`,requestId:e})})}terminate(){this.worker&&=(this.worker.removeEventListener(`message`,this.messageHandler),this.worker.removeEventListener(`error`,this.messageHandler),this.worker.terminate(),null);for(let e of this.pending.values())e.timer&&clearTimeout(e.timer),e.reject(Error(`Indicator worker terminated`));this.pending.clear()}handleMessage(e){let t=e.data;if(t!==void 0){if(!an(t))return;this.dispatchResponse(t);return}let n=e.message??`Indicator worker error`;for(let[e,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(Error(n)),this.pending.delete(e)}dispatchResponse(e){let t=this.pending.get(e.requestId);if(t){if(this.pending.delete(e.requestId),t.timer&&clearTimeout(t.timer),e.type===`error`){t.reject(Error(e.message));return}if(e.type===`pong`){t.resolve(void 0);return}t.resolve(e.output)}}},sn=class{visible=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}render(t,n,r){if(!this.visible)return;let{chartRect:i,priceRange:a}=n;t.strokeStyle=r.grid,t.lineWidth=1;let o=a.max-a.min;if(o<=0)return;let s=1/o;t.beginPath();let c=(0,e.computeTickStep)(a.min,a.max,8),l=Math.ceil(a.min/c)*c;for(let e=l;e<=a.max;e+=c){let n=Math.round(i.y+i.height*(1-(e-a.min)*s))+.5;t.moveTo(i.x,n),t.lineTo(i.x+i.width,n)}let u=n.barWidth+n.barSpacing,d=Math.max(1,Math.ceil(80/u)),{from:f,to:p}=n.visibleRange,m=-n.offset+i.x+n.barWidth/2;for(let e=f;e<=p;e++){if(e%d!==0)continue;let n=Math.round(e*u+m)+.5;t.moveTo(n,i.y),t.lineTo(n,i.y+i.height)}t.stroke()}},cn=class{locale=`en-US`;setLocale(e){this.locale=e}render(t,n,r){let{chartRect:i,priceRange:a}=n,o=i.x+i.width,s=a.max-a.min;if(s<=0)return;let c=1/s;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o+.5,i.y),t.lineTo(o+.5,i.y+i.height),t.stroke(),t.globalAlpha=1;let l=(0,e.computeTickStep)(a.min,a.max,8),u=Math.ceil(a.min/l)*l,d=l<1?Math.ceil(-Math.log10(l))+1:2,f=`500 ${r.font.sizeSmall}px ${r.font.family}`,p=n.scaleMode??(n.logScale?`logarithmic`:`regular`),m=n.scaleBaseline,h=[];for(let t=u;t<=a.max;t+=l){let n=i.y+i.height*(1-(t-a.min)*c);h.push({y:n,text:(0,e.formatPriceScaleLabel)(t,p,m,d,this.locale)})}t.font=f,t.textBaseline=`middle`,t.textAlign=`left`,t.strokeStyle=r.axisLine,t.globalAlpha=.45,t.beginPath();for(let{y:e}of h)t.moveTo(o+1,e+.5),t.lineTo(o+4,e+.5);t.stroke(),t.globalAlpha=1,t.fillStyle=r.axisLabel;for(let{y:e,text:n}of h)t.fillText(n,o+8,e)}},ln=e=>e<10?`0`+e:``+e,un=class{tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}render(t,n,r,i,a){let{chartRect:o}=n,s=a??o.y+o.height;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o.x,s+.5),t.lineTo(o.x+o.width,s+.5),t.stroke(),t.globalAlpha=1;let c=n.barWidth+n.barSpacing,l=Math.max(1,Math.ceil(80/c)),{from:u,to:d}=n.visibleRange,f=-n.offset+o.x+n.barWidth/2;t.font=`500 ${r.font.sizeSmall}px ${r.font.family}`,t.textBaseline=`top`,t.textAlign=`center`,t.fillStyle=r.axisLabel;let p=-1;for(let n=u;n<=d&&n<i.length;n++){if(n%l!==0)continue;let r=n*c+f,a=i[n].time,{day:o,month:u,hours:d,minutes:m}=(0,e.timeParts)(a>0xe8d4a51000?a:a*1e3,this.tzOffsetMinutes),h;o===p?h=`${ln(d)}:${ln(m)}`:(h=`${u}/${o}`,p=o),t.fillText(h,r,s+7)}let m=o.x+o.width-4,h=s+7;t.font=`500 ${r.font.sizeSmall-1}px ${r.font.family}`,t.textAlign=`right`,t.textBaseline=`top`,t.globalAlpha=.75,t.fillStyle=r.textSecondary,t.fillText((0,e.tzLabel)(this.tzOffsetMinutes),m,h),t.globalAlpha=1}},dn=class{panHandler=null;zoomHandler=null;crosshairHandler=null;axisDragHandler=null;alertDragHandler=null;axisViewportGetter=null;onAxisDoubleClick=null;measureHandlers=null;measuring=!1;onAltClick=null;onEscape=null;onConfirm=null;onClick=null;downPos=null;downMoved=!1;pressForClick=!1;drawingManager=null;tradingManager=null;paneResizeHandler=null;viewportGetter=null;onOverlayDirty=null;boundHandlers=[];lastTouchDist=0;lastTouchMid={x:0,y:0};touchActive=!1;touchStartPos={x:0,y:0};longPressTimer=null;longPressMs=500;longPressMaxMove=8;cachedRect=null;constructor(e){this.element=e}setOverlayDirtyCallback(e){this.onOverlayDirty=e}setPanHandler(e){this.panHandler=e}setZoomHandler(e){this.zoomHandler=e}setCrosshairHandler(e){this.crosshairHandler=e}setAltClickHandler(e){this.onAltClick=e}setEscapeHandler(e){this.onEscape=e}setConfirmHandler(e){this.onConfirm=e}setClickHandler(e){this.onClick=e}setMeasureHandlers(e){this.measureHandlers=e}setAxisDragHandler(e,t,n){this.axisDragHandler=e,this.axisViewportGetter=t,this.onAxisDoubleClick=n??null}setDrawingManager(e,t){this.drawingManager=e,this.viewportGetter=t}setAlertDragHandler(e){this.alertDragHandler=e}setTradingManager(e,t){this.tradingManager=e,this.viewportGetter=t}setPaneResizeHandler(e){this.paneResizeHandler=e}attach(){let e=()=>this.viewportGetter?.()??null,t=e=>{let t=this.axisViewportGetter?.();if(!t)return null;let n=t.chartRect;return e.y>n.y+n.height?`time`:e.x>n.x+n.width?`price`:null},n=n=>{this.invalidateRect();let r=this.getMousePos(n),i=e();this.downPos=r,this.downMoved=!1,this.pressForClick=!1;let a=t(r);if(a&&this.axisDragHandler){this.axisDragHandler.begin(a,r);return}if(!this.paneResizeHandler?.tryBegin(r)){if(n.shiftKey&&this.measureHandlers){this.measuring=!0,this.measureHandlers.begin(r),this.onOverlayDirty?.();return}if(n.altKey&&this.onAltClick){this.onAltClick(r);return}if(!(this.tradingManager&&i&&this.tradingManager.onPointerDown(r,i))&&!(this.drawingManager&&i&&this.drawingManager.onPointerDown(r,i))){if(this.alertDragHandler?.tryBegin(r)){this.onOverlayDirty?.();return}this.pressForClick=!0,this.panHandler?.onPointerDown(r)}}},r=n=>{let r=this.getMousePos(n),i=e();if(this.downPos&&!this.downMoved){let e=r.x-this.downPos.x,t=r.y-this.downPos.y;e*e+t*t>16&&(this.downMoved=!0)}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(r);return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(r);return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.move(r),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measureHandlers.move(r),this.onOverlayDirty?.();return}let a=t(r),o=this.paneResizeHandler?.cursorAt(r)??null;if(a===`price`?this.element.style.cursor=`ns-resize`:a===`time`?this.element.style.cursor=`ew-resize`:this.alertDragHandler?.isOverAlert(r)?this.element.style.cursor=`ns-resize`:o?this.element.style.cursor=o:(this.element.style.cursor===`ns-resize`||this.element.style.cursor===`ew-resize`)&&(this.element.style.cursor=``),this.tradingManager&&i&&this.tradingManager.onPointerMove(r,i)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}if(this.drawingManager&&i&&this.drawingManager.onPointerMove(r,i)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(r),this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.()},i=()=>{if(this.axisDragHandler?.isActive()){this.axisDragHandler.end();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.end();return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.end(),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measuring=!1,this.measureHandlers.end(),this.onOverlayDirty?.();return}this.tradingManager?.onPointerUp()||this.drawingManager?.onPointerUp()||(this.panHandler?.onPointerUp(),this.pressForClick&&!this.downMoved&&this.downPos&&this.onClick&&this.onClick(this.downPos),this.pressForClick=!1,this.downPos=null)},a=e=>{let n=t(this.getMousePos(e));n&&this.onAxisDoubleClick&&this.onAxisDoubleClick(n)},o=()=>{this.panHandler?.onPointerUp(),this.drawingManager?.onPointerUp(),this.tradingManager?.onPointerUp(),this.alertDragHandler?.end(),this.paneResizeHandler?.end(),this.crosshairHandler?.onPointerLeave(),this.pressForClick=!1,this.downPos=null,this.onOverlayDirty?.()},s=e=>{e.preventDefault();let t=this.getMousePos(e);this.zoomHandler?.onWheel(e.deltaY,t)},c=e=>{if(e.key===`Escape`&&this.onEscape&&this.onEscape(),e.key===`Enter`&&this.onConfirm&&this.onConfirm()){e.preventDefault();return}this.drawingManager?.onKeyDown(e.key,e.ctrlKey||e.metaKey)&&e.preventDefault()},l=t=>{let n=e();!this.tradingManager||!n||this.tradingManager.onContextMenu(this.getMousePos(t),n)&&t.preventDefault()},u=n=>{if(n.preventDefault(),this.invalidateRect(),n.touches.length===1){let r=this.getTouchPos(n.touches[0]);this.touchStartPos=r;let i=t(r);if(i&&this.axisDragHandler){this.axisDragHandler.begin(i,r),this.touchActive=!0;return}if(this.paneResizeHandler?.tryBegin(r)){this.touchActive=!0;return}let a=e();if(this.tradingManager&&a&&this.tradingManager.onPointerDown(r,a)){this.touchActive=!0,this.onOverlayDirty?.();return}this.onAltClick&&(this.clearLongPress(),this.longPressTimer=setTimeout(()=>{this.longPressTimer=null,this.onAltClick?.(r),this.panHandler?.onPointerUp(),this.onOverlayDirty?.()},this.longPressMs)),this.panHandler?.onPointerDown(r),this.crosshairHandler?.onPointerMove(r),this.touchActive=!0}else n.touches.length===2&&(this.clearLongPress(),this.panHandler?.onPointerUp(),this.lastTouchDist=this.getTouchDistance(n.touches[0],n.touches[1]),this.lastTouchMid=this.getTouchMidpoint(n.touches[0],n.touches[1]),this.touchActive=!0)},d=t=>{if(t.preventDefault(),t.touches.length===1&&this.touchActive){let n=this.getTouchPos(t.touches[0]);if(this.longPressTimer){let e=n.x-this.touchStartPos.x,t=n.y-this.touchStartPos.y;Math.hypot(e,t)>this.longPressMaxMove&&this.clearLongPress()}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n),this.onOverlayDirty?.();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n),this.onOverlayDirty?.();return}let r=e();if(this.tradingManager&&r&&this.tradingManager.onPointerMove(n,r)){this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n)}else if(t.touches.length===2){let e=this.getTouchDistance(t.touches[0],t.touches[1]),n=this.getTouchMidpoint(t.touches[0],t.touches[1]);if(this.lastTouchDist>0){let t=(e/this.lastTouchDist-1)*.5;this.zoomHandler?.onWheel(-t*100,n)}let r=this.lastTouchMid.x-n.x;Math.abs(r)>1&&(this.panHandler?.onPointerDown(this.lastTouchMid),this.panHandler?.onPointerMove(n)),this.lastTouchDist=e,this.lastTouchMid=n}this.onOverlayDirty?.()},f=e=>{if(this.clearLongPress(),e.touches.length===0)this.axisDragHandler?.isActive()&&this.axisDragHandler.end(),this.paneResizeHandler?.end(),this.tradingManager?.onPointerUp(),this.panHandler?.onPointerUp(),this.crosshairHandler?.onPointerLeave(),this.touchActive=!1,this.lastTouchDist=0;else if(e.touches.length===1){let t=this.getTouchPos(e.touches[0]);this.panHandler?.onPointerDown(t)}},p=()=>this.invalidateRect(),m=()=>this.invalidateRect();this.element.addEventListener(`mousedown`,n),this.element.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i),this.element.addEventListener(`mouseleave`,o),this.element.addEventListener(`dblclick`,a),this.element.addEventListener(`wheel`,s,{passive:!1}),this.element.addEventListener(`contextmenu`,l),this.element.addEventListener(`touchstart`,u,{passive:!1}),this.element.addEventListener(`touchmove`,d,{passive:!1}),this.element.addEventListener(`touchend`,f),document.addEventListener(`keydown`,c),window.addEventListener(`resize`,p),this.element.addEventListener(`scroll`,m,{passive:!0}),this.boundHandlers.push(()=>this.element.removeEventListener(`mousedown`,n),()=>this.element.removeEventListener(`mousemove`,r),()=>document.removeEventListener(`mouseup`,i),()=>this.element.removeEventListener(`mouseleave`,o),()=>this.element.removeEventListener(`dblclick`,a),()=>this.element.removeEventListener(`wheel`,s),()=>this.element.removeEventListener(`contextmenu`,l),()=>this.element.removeEventListener(`touchstart`,u),()=>this.element.removeEventListener(`touchmove`,d),()=>this.element.removeEventListener(`touchend`,f),()=>document.removeEventListener(`keydown`,c),()=>window.removeEventListener(`resize`,p),()=>this.element.removeEventListener(`scroll`,m))}detach(){for(let e of this.boundHandlers)e();this.boundHandlers=[],this.cachedRect=null,this.clearLongPress()}clearLongPress(){this.longPressTimer&&=(clearTimeout(this.longPressTimer),null)}invalidateRect(){this.cachedRect=null}getRect(){return this.cachedRect||=this.element.getBoundingClientRect(),this.cachedRect}getMousePos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchPos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchDistance(e,t){return Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY)}getTouchMidpoint(e,t){let n=this.getRect();return{x:(e.clientX+t.clientX)/2-n.left,y:(e.clientY+t.clientY)/2-n.top}}},fn=class{dragging=!1;lastX=0;lastTime=0;velocity=0;momentumId=0;callback;friction=.92;constructor(e){this.callback=e}onPointerDown(e){this.dragging=!0,this.lastX=e.x,this.lastTime=Date.now(),this.velocity=0,this.stopMomentum()}onPointerMove(e){if(!this.dragging)return;let t=Date.now(),n=this.lastX-e.x,r=t-this.lastTime;r>0&&(this.velocity=n/r),this.lastX=e.x,this.lastTime=t,this.callback(n)}onPointerUp(){this.dragging&&(this.dragging=!1,Math.abs(this.velocity)>.1&&this.startMomentum())}startMomentum(){this.stopMomentum();let e=this.velocity*16,t=()=>{if(e*=this.friction,Math.abs(e)<.5){this.momentumId=0;return}this.callback(e),this.momentumId=requestAnimationFrame(t)};this.momentumId=requestAnimationFrame(t)}stopMomentum(){this.momentumId&&=(cancelAnimationFrame(this.momentumId),0)}},pn=class{callback;sensitivity;pendingDelta=0;pendingCenterX=0;rafId=0;constructor(e,t=.001){this.callback=e,this.sensitivity=t}onWheel(e,t){this.pendingDelta+=-e*this.sensitivity,this.pendingCenterX=t.x,this.rafId||=requestAnimationFrame(()=>{this.rafId=0;let e=this.pendingDelta,t=this.pendingCenterX;this.pendingDelta=0,this.callback(e,t)})}dispose(){this.rafId&&=(cancelAnimationFrame(this.rafId),0)}},mn=class{dragging=!1;axis=null;startPos={x:0,y:0};lastPos={x:0,y:0};moved=!1;threshold=3;sensitivity=.005;constructor(e,t){this.onPriceScale=e,this.onTimeScale=t}begin(e,t){this.dragging=!0,this.axis=e,this.startPos=t,this.lastPos=t,this.moved=!1}move(e){if(!this.dragging||!this.axis)return!1;let t=e.x-this.startPos.x,n=e.y-this.startPos.y;if(!this.moved&&Math.hypot(t,n)<this.threshold)return!1;if(this.moved=!0,this.axis===`price`){let t=e.y-this.lastPos.y,n=Math.exp(t*this.sensitivity);this.onPriceScale(n)}else{let t=e.x-this.lastPos.x,n=Math.exp(t*this.sensitivity);this.onTimeScale(n)}return this.lastPos=e,!0}end(){let e=this.dragging&&this.moved;return this.dragging=!1,this.axis=null,this.moved=!1,e}isActive(){return this.dragging}},hn=class{draggingId=null;constructor(e,t){this.alerts=e,this.viewportGetter=t}isOverAlert(e){let t=this.viewportGetter();return t?this.alerts.getAlertAtPoint(e,t)!==null:!1}tryBegin(e){let t=this.viewportGetter();if(!t)return!1;let n=this.alerts.getAlertAtPoint(e,t);return n?(this.draggingId=n.id,!0):!1}move(e){if(this.draggingId===null)return;let t=this.viewportGetter();t&&this.alerts.updateAlertPrice(this.draggingId,c(e.y,t))}end(){this.draggingId=null}isActive(){return this.draggingId!==null}},gn=class{state=null;layoutGetter=null;onResize=null;constructor(e=4){this.tolerance=e}configure(e,t){this.layoutGetter=e,this.onResize=t}hitTest(e,t){for(let n of t.dividers)if(_n(e,n.rect,this.tolerance)){let e=t.panels.find(e=>e.config.id===n.panelId);if(e)return{panelId:n.panelId,orientation:n.orientation,position:e.config.position,size:e.config.size}}return null}cursorAt(e){let t=this.layoutGetter?.();if(!t)return null;let n=this.hitTest(e,t);return n?n.orientation===`horizontal`?`ns-resize`:`ew-resize`:null}tryBegin(e){let t=this.layoutGetter?.();if(!t)return!1;let n=this.hitTest(e,t);return n?(this.state={panelId:n.panelId,position:n.position,startSize:n.size,startPos:e},!0):!1}move(e){let t=this.computeSize(e);t&&this.onResize?.(t.panelId,t.size)}computeSize(e){let t=this.state;if(!t)return null;let n=0;switch(t.position){case`bottom`:n=t.startPos.y-e.y;break;case`top`:n=e.y-t.startPos.y;break;case`left`:n=e.x-t.startPos.x;break;case`right`:n=t.startPos.x-e.x;break}return{panelId:t.panelId,size:t.startSize+n}}end(){this.state=null}isActive(){return this.state!==null}};function _n(e,t,n){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var vn=class{position=null;callback=null;data=[];tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}magnetMode=!0;mode=`magnet`;pricePrecision=2;locale=`en-US`;pendingBarIndex=null;pendingPoint=null;callbackScheduled=!1;lastCallbackBarIndex=-1;setCallback(e){this.callback=e}setData(e){this.data=e}setMagnetMode(e){this.magnetMode=e,this.mode=e?`magnet`:`normal`}setMode(e){this.mode=e,this.magnetMode=e===`magnet`}getMode(){return this.mode}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}getPosition(){return this.position}onPointerMove(e){this.position=e}onPointerLeave(){this.position=null,this.pendingBarIndex=null,this.pendingPoint=null,this.lastCallbackBarIndex=-1,this.flushCallback(null,null)}render(e,t,n){if(!this.position||this.mode===`hidden`)return;let{chartRect:r}=t,{x:i,y:o}=this.position;if(i<r.x||i>r.x+r.width||o<r.y||o>r.y+r.height)return;let c=s(i,t);if(c=Math.max(0,Math.min(this.data.length-1,c)),this.magnetMode&&c>=0&&c<this.data.length&&(i=a(c,t)),c!==this.lastCallbackBarIndex&&(this.pendingBarIndex=c,this.pendingPoint={x:i,y:o},this.lastCallbackBarIndex=c,this.scheduleCallback()),this.magnetMode&&c>=0&&c<this.data.length){let a=t.barWidth+t.barSpacing,o=a/2;e.fillStyle=n.crosshair,e.globalAlpha=.08,e.fillRect(i-o,r.y,a,r.height),e.globalAlpha=1}e.setLineDash([4,4]),e.strokeStyle=n.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(i)+.5,r.y),e.lineTo(Math.round(i)+.5,r.y+r.height),e.stroke(),e.beginPath(),e.moveTo(r.x,Math.round(o)+.5),e.lineTo(r.x+r.width,Math.round(o)+.5),e.stroke(),e.setLineDash([])}renderAxisLabels(t,n,r,i,o){if(!this.position||this.mode===`hidden`)return;let{chartRect:l}=n,{x:u,y:d}=this.position;if(u<l.x||u>l.x+l.width||d<l.y||d>l.y+l.height)return;let f=s(u,n);f=Math.max(0,Math.min(i.length-1,f)),this.magnetMode&&f>=0&&f<i.length&&(u=a(f,n));let p=`600 ${r.font.sizeSmall}px ${r.font.family}`;if(yn(t,{text:(0,e.formatPrice)(c(d,n),this.pricePrecision,this.locale),anchorX:l.x+l.width,anchorY:d,orientation:`right`,bg:r.text,fg:r.background,font:p}),f>=0&&f<i.length){let e=bn(i[f].time,this.tzOffsetMinutes),n=o??l.y+l.height;yn(t,{text:e,anchorX:u,anchorY:n,orientation:`bottom`,bg:r.text,fg:r.background,font:p})}}scheduleCallback(){this.callbackScheduled||(this.callbackScheduled=!0,queueMicrotask(()=>{this.callbackScheduled=!1,this.flushCallback(this.pendingBarIndex,this.pendingPoint)}))}flushCallback(e,t){this.callback?.(e,t)}};function yn(e,t){e.save(),e.font=t.font;let n=Math.ceil(e.measureText(t.text).width)+16;if(t.orientation===`right`){let r=t.anchorX+5,i=t.anchorY-20/2;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(r,t.anchorY-5),e.lineTo(r,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,t.anchorY+5),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(t.text,r+8,t.anchorY)}else{let r=t.anchorX-n/2,i=t.anchorY+5;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(t.anchorX+5,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,i),e.lineTo(t.anchorX-5,i),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`center`,e.fillText(t.text,t.anchorX,i+20/2)}e.restore()}function bn(t,n){let{month:r,day:i,hours:a,minutes:o}=(0,e.timeParts)(t>0xe8d4a51000?t:t*1e3,n);return`${r}/${i} ${a<10?`0`+a:a}:${o<10?`0`+o:o}`}var xn=class{callbacks;enabled=!0;constructor(e){this.callbacks=e}setEnabled(e){this.enabled=e}handleKey(e){if(!this.enabled)return!1;let t=e.shiftKey?10:1;switch(e.key){case`ArrowLeft`:return this.callbacks.scrollBars(-t),!0;case`ArrowRight`:return this.callbacks.scrollBars(t),!0;case`ArrowUp`:case`+`:case`=`:return this.callbacks.zoom(.1),!0;case`ArrowDown`:case`-`:return this.callbacks.zoom(-.1),!0;case`Home`:return this.callbacks.goToStart(),!0;case`End`:return this.callbacks.goToEnd(),!0;case` `:return this.callbacks.fitContent(),!0;default:return!1}}},Sn=class{el=null;visible=!1;timeEl;openEl;highEl;lowEl;closeEl;changeEl;volEl;measuredWidth=155;measuredHeight=95;measured=!1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`none`,zIndex:`100`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=this.addLine(this.el);let t=this.addLine(this.el),n=this.addLine(this.el);this.changeEl=this.addLine(this.el),this.volEl=this.addLine(this.el),t.append(this.label(`O `),this.openEl=this.val(),this.label(` H `),this.highEl=this.val()),n.append(this.label(`L `),this.lowEl=this.val(),this.label(` C `),this.closeEl=this.val()),e.appendChild(this.el)}show(e,t,n,r){if(!this.el)return;let i=t.close>=t.open?n.candleUp:n.candleDown,a=e=>e.toFixed(2),o=new Date(t.time);this.timeEl.textContent=`${o.getMonth()+1}/${o.getDate()} ${String(o.getHours()).padStart(2,`0`)}:${String(o.getMinutes()).padStart(2,`0`)}`,this.timeEl.style.color=n.textSecondary,this.openEl.textContent=a(t.open),this.highEl.textContent=a(t.high),this.lowEl.textContent=a(t.low),this.closeEl.textContent=a(t.close),this.openEl.style.color=i,this.highEl.style.color=i,this.lowEl.style.color=i,this.closeEl.style.color=i;let s=t.close-t.open,c=t.open===0?0:s/t.open*100,l=s>=0?`+`:``;this.changeEl.textContent=`${l}${a(s)} (${l}${c.toFixed(2)}%)`,this.changeEl.style.color=i;let u=t.volume;this.volEl.textContent=`Vol ${u>=1e6?(u/1e6).toFixed(1)+`M`:u>=1e3?(u/1e3).toFixed(1)+`K`:u.toFixed(0)}`,this.volEl.style.color=n.textSecondary;let d=Cn(n.background);this.el.style.background=d?wn(n.background,.95):wn(n.background,.97),this.el.style.border=`1px solid ${n.axisLine}`,this.el.style.boxShadow=d?`0 4px 12px rgba(0,0,0,0.5)`:`0 4px 12px rgba(0,0,0,0.15)`,this.el.style.color=n.text,this.el.style.backdropFilter=`blur(8px)`,!this.measured&&this.visible&&(this.measuredWidth=this.el.offsetWidth,this.measuredHeight=this.el.offsetHeight,this.measured=!0);let f=e.x+16,p=e.y-40;f+this.measuredWidth>r.width-80&&(f=e.x-this.measuredWidth-16),p<4&&(p=4),p+this.measuredHeight>r.height&&(p=r.height-this.measuredHeight-4),this.el.style.transform=`translate(${Math.round(f)}px, ${Math.round(p)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.visible||=(this.el.style.display=`block`,!0)}hide(){this.el&&this.visible&&(this.el.style.display=`none`,this.visible=!1)}isVisible(){return this.visible}destroy(){this.el?.remove(),this.el=null,this.visible=!1,this.measured=!1}addLine(e){let t=document.createElement(`div`);return e.appendChild(t),t}label(e){let t=document.createElement(`span`);return t.textContent=e,t.style.opacity=`0.6`,t}val(){return document.createElement(`span`)}};function Cn(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}let t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(t){let e=parseInt(t[1]),n=parseInt(t[2]),r=parseInt(t[3]);return(.299*e+.587*n+.114*r)/255<.5}return!0}function wn(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var Tn=class{el=null;deltaEl=null;timeEl=null;ohlcEl=null;pinnedBar=null;pinnedIndex=-1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`auto`,cursor:`pointer`,zIndex:`99`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=document.createElement(`div`),this.ohlcEl=document.createElement(`div`),this.deltaEl=document.createElement(`div`),this.deltaEl.style.marginTop=`4px`,this.deltaEl.style.paddingTop=`4px`,this.deltaEl.style.borderTop=`1px solid currentColor`,this.deltaEl.style.opacity=`0.85`,this.deltaEl.style.fontVariantNumeric=`tabular-nums`,this.el.appendChild(this.timeEl),this.el.appendChild(this.ohlcEl),this.el.appendChild(this.deltaEl);let t=document.createElement(`div`);t.textContent=`📌 pinned`,t.style.fontSize=`9px`,t.style.opacity=`0.6`,t.style.marginBottom=`2px`,t.style.letterSpacing=`0.04em`,t.style.textTransform=`uppercase`,this.el.insertBefore(t,this.timeEl),e.appendChild(this.el)}pin(e,t,n){if(!this.el||!this.timeEl||!this.ohlcEl)return;this.pinnedBar=e,this.pinnedIndex=t;let r=e.close>=e.open?n.candleUp:n.candleDown,i=new Date(e.time>0xe8d4a51000?e.time:e.time*1e3);this.timeEl.textContent=`${i.getMonth()+1}/${i.getDate()} ${En(i.getHours())}:${En(i.getMinutes())}`,this.timeEl.style.color=n.textSecondary,this.ohlcEl.innerHTML=`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@tradecanvas/commons`);var t=class{canvas;ctx;dpr=1;constructor(e,t){this.canvas=document.createElement(`canvas`),this.canvas.style.position=`absolute`,this.canvas.style.top=`0`,this.canvas.style.left=`0`,this.canvas.style.zIndex=String(t),this.canvas.style.pointerEvents=`none`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas)}resize(e,t){this.dpr=t;let n=Math.round(e.width*t),r=Math.round(e.height*t);(this.canvas.width!==n||this.canvas.height!==r)&&(this.canvas.width=n,this.canvas.height=r),this.canvas.style.width=`${e.width}px`,this.canvas.style.height=`${e.height}px`,this.ctx.setTransform(t,0,0,t,0,0)}clear(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.setTransform(this.dpr,0,0,this.dpr,0,0)}getSize(){return{width:this.canvas.width/this.dpr,height:this.canvas.height/this.dpr}}destroy(){this.canvas.remove()}},n=class{layers=new Map;constructor(e){this.container=e}createLayers(){this.destroy();for(let n of[e.LayerType.Background,e.LayerType.Main,e.LayerType.Overlay,e.LayerType.UI])this.layers.set(n,new t(this.container,n))}getLayer(e){return this.layers.get(e)}resize(e,t){for(let n of this.layers.values())n.resize(e,t)}destroy(){for(let e of this.layers.values())e.destroy();this.layers.clear()}},r=class{animFrameId=0;running=!1;dirtyLayers=new Set;swapLayers=new Set;callback=null;setCallback(e){this.callback=e}markDirty(e){this.dirtyLayers.add(e),this.running&&!this.animFrameId&&this.scheduleFrame()}markAllDirty(){this.dirtyLayers.add(e.LayerType.Background),this.dirtyLayers.add(e.LayerType.Main),this.dirtyLayers.add(e.LayerType.Overlay),this.dirtyLayers.add(e.LayerType.UI),this.running&&!this.animFrameId&&this.scheduleFrame()}start(){this.running=!0,this.markAllDirty()}stop(){this.running=!1,this.animFrameId&&=(cancelAnimationFrame(this.animFrameId),0)}scheduleFrame(){this.animFrameId=requestAnimationFrame(()=>{if(this.animFrameId=0,!(!this.running||!this.callback)&&this.dirtyLayers.size>0){let e=this.dirtyLayers;this.dirtyLayers=this.swapLayers,this.callback(e),e.clear(),this.swapLayers=e}})}},i=class{observer=null;callback=null;currentDpr=1;resizeScheduled=!1;cachedSize;constructor(e){this.container=e,this.currentDpr=window.devicePixelRatio||1,this.cachedSize={width:e.clientWidth,height:e.clientHeight}}getDpr(){return this.currentDpr}getContainerSize(){return this.cachedSize}readContainerSize(){let e=this.container.clientWidth,t=this.container.clientHeight;return(e!==this.cachedSize.width||t!==this.cachedSize.height)&&(this.cachedSize={width:e,height:t}),this.cachedSize}onResize(e){this.callback=e,this.observer=new ResizeObserver(()=>{this.resizeScheduled||(this.resizeScheduled=!0,requestAnimationFrame(()=>{this.resizeScheduled=!1,this.currentDpr=window.devicePixelRatio||1;let e=this.container.clientWidth,t=this.container.clientHeight;e===this.cachedSize.width&&t===this.cachedSize.height||(this.cachedSize={width:e,height:t},this.callback?.(this.cachedSize,this.currentDpr))}))}),this.observer.observe(this.container)}destroy(){this.observer?.disconnect(),this.observer=null,this.callback=null}};function a(e,t){return e*(t.barWidth+t.barSpacing)-t.offset+t.chartRect.x+t.barWidth/2}function o(e,t){let{min:n,max:r}=t.priceRange;if(t.logScale&&n>0&&r>0){let i=Math.log(n),a=Math.log(r)-i;if(a===0)return t.chartRect.y+t.chartRect.height/2;let o=(Math.log(Math.max(e,2**-52))-i)/a;return t.chartRect.y+t.chartRect.height*(1-o)}let i=r-n;if(i===0)return t.chartRect.y+t.chartRect.height/2;let a=(e-n)/i;return t.chartRect.y+t.chartRect.height*(1-a)}function s(e,t){let n=t.barWidth+t.barSpacing;return Math.round((e-t.chartRect.x-t.barWidth/2+t.offset)/n)}function c(e,t){let{min:n,max:r}=t.priceRange,i=1-(e-t.chartRect.y)/t.chartRect.height;if(t.logScale&&n>0&&r>0){let e=Math.log(n);return Math.exp(e+(Math.log(r)-e)*i)}return n+(r-n)*i}function l(e,t){if(t.length===0)return-1;if(e<=t[0].time)return 0;if(e>=t[t.length-1].time)return t.length-1;let n=0,r=t.length-1;for(;n<=r;){let i=n+r>>>1;if(t[i].time===e)return i;t[i].time<e?n=i+1:r=i-1}if(n>=t.length)return t.length-1;if(r<0)return 0;let i=t[r].time,a=t[n].time,o=a===i?0:(e-i)/(a-i);return r+o}function u(e,t){let n=t.data;return n&&n.length>0?l(e,n):e}function d(e,t){return a(u(e,t),t)}function f(e,t){let n=s(e,t),r=t.data;return r&&r.length>0?r[Math.max(0,Math.min(r.length-1,n))].time:n}var p=class{layerManager;renderLoop;dprManager;renderCtx=null;bgLayer;mainLayer;overlayLayer;uiLayer;onContainerResize=null;constructor(e){this.layerManager=new n(e),this.renderLoop=new r,this.dprManager=new i(e),this.layerManager.createLayers(),this.cacheLayerRefs(),this.renderLoop.setCallback(e=>this.render(e)),this.dprManager.onResize((e,t)=>{this.layerManager.resize(e,t),this.renderLoop.markAllDirty(),this.onContainerResize?.(e)});let t=this.dprManager.getContainerSize(),a=this.dprManager.getDpr();this.layerManager.resize(t,a)}cacheLayerRefs(){this.bgLayer=this.layerManager.getLayer(e.LayerType.Background),this.mainLayer=this.layerManager.getLayer(e.LayerType.Main),this.overlayLayer=this.layerManager.getLayer(e.LayerType.Overlay),this.uiLayer=this.layerManager.getLayer(e.LayerType.UI)}setRenderContext(e){this.renderCtx=e}start(){this.renderLoop.start()}stop(){this.renderLoop.stop()}requestRender(e){e===void 0?this.renderLoop.markAllDirty():this.renderLoop.markDirty(e)}render(t){let n=this.renderCtx;if(!n)return;let{viewport:r,theme:i,data:l}=n,u=n.numberLocale??`en-US`;if(!(r.chartRect.width<=0||r.chartRect.height<=0)){if(t.has(e.LayerType.Background)&&this.bgLayer&&(this.bgLayer.clear(),n.gridRenderer?.render(this.bgLayer.ctx,r,i),n.sessionShading?.render(this.bgLayer.ctx,l,r,i),n.sessionBreaks?.render(this.bgLayer.ctx,r,i,l),n.watermark?.render(this.bgLayer.ctx,r,i)),t.has(e.LayerType.Main)&&this.mainLayer){this.mainLayer.clear();let e=this.mainLayer.ctx;e.save(),e.beginPath(),e.rect(r.chartRect.x,r.chartRect.y,r.chartRect.width,r.chartRect.height),e.clip(),n.depthHeatmap?.render(e,r,i),n.volumeRenderer?.render(e,l,r,i),n.volumeProfile?.render(e,l,r,i),n.marketProfile?.render(e,l,r,i),n.chartRenderer?.render(e,l,r,i),n.compareRenderer?.render(e,l,r,i),n.indicatorEngine?.renderOverlays(e,r),n.periodLevels?.render(e,l,r,i),n.pivotMarkers?.render(e,l,r,i),n.renderOverlayPlugins?.(e,`main`),e.restore();let t=n.panels,a=n.indicatorEngine;if(a&&t.length>0){let n=`10px ${i.font.family}`,r=a.getPanelIndicators(),o=new Map;for(let e of r)o.set(e.instanceId,e);for(let r of t){if(r.rect.width<=0||r.rect.height<=0)continue;e.save(),e.beginPath(),e.rect(r.rect.x,r.rect.y,r.rect.width,r.rect.height),e.clip(),e.fillStyle=i.background,e.fillRect(r.rect.x,r.rect.y,r.rect.width,r.rect.height),e.fillStyle=i.axisLine,e.fillRect(r.rect.x,r.rect.y,r.rect.width,3),e.fillStyle=i.textSecondary,e.font=n,e.textBaseline=`top`,e.textAlign=`left`;let t=o.get(r.instanceId);t&&e.fillText(t.descriptor.name,r.rect.x+6,r.rect.y+6),e.save(),e.beginPath(),e.rect(r.rect.x,r.rect.y+20,r.rect.width,r.rect.height-20),e.clip(),a.renderPanel(e,r.instanceId,r.viewport),e.restore(),e.restore()}}}if(t.has(e.LayerType.Overlay)&&this.overlayLayer){this.overlayLayer.clear();let e=this.overlayLayer.ctx;n.priceLimits&&this.renderPriceLimits(e,r,i,n.priceLimits),n.tradeZoneManager?.render(e,r,i),n.drawingRenderer?.render(e,r),n.tradingRenderer?.render(e,r,i),n.signalMarkerManager?.render(e,r,i),n.alertManager?.render(e,r,i),n.measureOverlay?.render(e,r,i),n.crosshairHandler?.render(e,r,i),n.renderOverlayPlugins?.(e,`overlay`);let t=n.crosshairHandler?.getPosition();if(t&&n.panels.length>0)for(let r of n.panels){let o=r.rect;if(t.x>=o.x&&t.x<=o.x+o.width&&t.y>=o.y&&t.y<=o.y+o.height){let c=r.viewport,l=t.x,u=s(l,c);l=a(Math.max(0,Math.min((n.data?.length??1)-1,Math.round(u))),c),e.save(),e.beginPath(),e.rect(o.x,o.y,o.width,o.height),e.clip(),e.setLineDash([4,4]),e.strokeStyle=i.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(l)+.5,o.y),e.lineTo(Math.round(l)+.5,o.y+o.height),e.stroke(),e.beginPath(),e.moveTo(o.x,Math.round(t.y)+.5),e.lineTo(o.x+o.width,Math.round(t.y)+.5),e.stroke(),e.setLineDash([]),e.restore();break}}}if(t.has(e.LayerType.UI)&&this.uiLayer){this.uiLayer.clear();let t=this.uiLayer.ctx;if(n.priceAxis?.render(t,r,i),n.tradingRenderer?.renderAxisBadges(t,r,i),n.currentPriceLine?.render(t,r,i),n.timeAxis?.render(t,r,i,l,n.timeAxisY),n.crosshairHandler?.renderAxisLabels(t,r,i,l,n.timeAxisY),n.chartLegend?.render(t,r,i,l),n.barCountdown?.render(t,r,i,l),n.renderOverlayPlugins?.(t,`ui`),n.panels.length>0){let r=n.crosshairHandler?.getPosition(),a=n.indicatorEngine,d=`${i.font.sizeSmall}px ${i.font.family}`,f;if(a){let e=a.getPanelIndicators();f=new Map;for(let t of e)f.set(t.instanceId,t)}for(let p of n.panels){let n=p.viewport,m=p.rect,{min:h,max:g}=n.priceRange;if(g-h<=0||m.height<=0)continue;let _=m.x+m.width,v=n.chartRect;t.strokeStyle=i.axisLine,t.lineWidth=1,t.beginPath(),t.moveTo(_+.5,m.y),t.lineTo(_+.5,m.y+m.height),t.stroke();let y=(0,e.computeTickStep)(h,g,4),b=Math.ceil(h/y)*y,x=y<1?Math.ceil(-Math.log10(y))+1:+(y<10);t.font=d,t.textBaseline=`middle`,t.textAlign=`left`;for(let r=b;r<=g;r+=y){let a=o(r,n);a<v.y||a>v.y+v.height||(t.strokeStyle=i.axisLine,t.beginPath(),t.moveTo(_,Math.round(a)+.5),t.lineTo(_+4,Math.round(a)+.5),t.stroke(),t.fillStyle=i.axisLabel,t.fillText((0,e.formatPrice)(r,x,u),_+6,a))}if(r&&r.x>=m.x&&r.x<=m.x+m.width&&r.y>=m.y&&r.y<=m.y+m.height){let a=(0,e.formatPrice)(c(r.y,n),x,u);t.font=`bold ${i.font.sizeSmall}px ${i.font.family}`;let o=t.measureText(a).width,s=Math.min(o+10,e.PRICE_AXIS_WIDTH-2);t.fillStyle=i.crosshair,t.fillRect(_+1,r.y-9,s,18),t.fillStyle=i.background,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(a,_+5,r.y)}if(r&&a){let e=s(r.x,n),o=Math.max(0,Math.min((l?.length??1)-1,Math.round(e))),c=a.getOutput(p.instanceId);if(c?.series&&o<c.series.length){let e=c.series[o];if(e){let n=[];for(let t in e){let r=e[t];r!==void 0&&n.push(`${t}: ${r.toFixed(x)}`)}if(n.length>0){let e=f?.get(p.instanceId),r=e?t.measureText(e.descriptor.name).width+14:10;t.font=d,t.fillStyle=i.textSecondary,t.textBaseline=`top`,t.textAlign=`left`,t.fillText(n.join(` `),m.x+r,m.y+6)}}}}}}}}}renderPriceLimits(t,n,r,i){let{chartRect:a}=n,s=[{price:i.ceiling,color:i.colors?.ceiling??`#FF00FF`,label:`CE`},{price:i.floor,color:i.colors?.floor??`#00FFFF`,label:`FL`},{price:i.reference,color:i.colors?.reference??`#FFD700`,label:`REF`}],c=`bold 9px ${r.font.family}`,l=`10px ${r.font.family}`;for(let{price:r,color:i,label:u}of s){let s=o(r,n);if(s<a.y||s>a.y+a.height)continue;t.setLineDash([8,4]),t.strokeStyle=i,t.lineWidth=1,t.beginPath(),t.moveTo(a.x,Math.round(s)+.5),t.lineTo(a.x+a.width,Math.round(s)+.5),t.stroke(),t.setLineDash([]),t.font=c,t.fillStyle=i,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(`${u} ${r.toFixed(2)}`,a.x+4,s-2);let d=a.x+a.width+1;t.fillStyle=i,t.fillRect(d,s-7,e.PRICE_AXIS_WIDTH-2,14),t.fillStyle=`#000`,t.font=l,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(r.toFixed(2),d+4,s)}}destroy(){this.renderLoop.stop(),this.dprManager.destroy(),this.layerManager.destroy()}},m=class{state;dataLength=0;minBarWidth;maxBarWidth;rightMarginBars;constructor(t,n,r=2,i=30,a=5){this.minBarWidth=r,this.maxBarWidth=i,this.rightMarginBars=a;let o=this.computeChartRect(t,n);this.state={visibleRange:{from:0,to:0},priceRange:{min:0,max:1},barWidth:e.DEFAULT_BAR_WIDTH,barSpacing:e.DEFAULT_BAR_SPACING,offset:0,chartRect:o}}getState(){return{visibleRange:{...this.state.visibleRange},priceRange:{...this.state.priceRange},barWidth:this.state.barWidth,barSpacing:this.state.barSpacing,offset:this.state.offset,chartRect:{...this.state.chartRect},logScale:this.state.logScale,scaleMode:this.state.scaleMode,scaleBaseline:this.state.scaleBaseline}}setLogScale(e){this.setScaleMode(e?`logarithmic`:`regular`)}isLogScale(){return(this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`))===`logarithmic`}setScaleMode(e){this.state.scaleMode=e,this.state.logScale=e===`logarithmic`}getScaleMode(){return this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`)}setScaleBaseline(e){this.state.scaleBaseline=e}setRightMargin(e){this.rightMarginBars=e}computeChartRect(t,n){return{x:0,y:0,width:Math.max(0,t-e.PRICE_AXIS_WIDTH),height:Math.max(0,n-e.TIME_AXIS_HEIGHT)}}resize(e,t){this.state.chartRect=this.computeChartRect(e,t),this.clampOffset()}setChartRect(e){this.state.chartRect={x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)},this.clampOffset(),this.updateVisibleRange()}updateData(t,n){this.dataLength=t.length,this.dataLength!==0&&(this.clampOffset(),this.updateVisibleRange(),n&&(this.state.priceRange=(0,e.computePriceRange)(t,this.state.visibleRange.from,Math.min(this.state.visibleRange.to,this.dataLength-1),.08)))}setPriceRange(e,t){this.state.priceRange={min:e,max:t}}scalePriceRange(e){if(!Number.isFinite(e)||e<=0)return;let{min:t,max:n}=this.state.priceRange,r=(t+n)/2,i=(n-t)/2,a=Math.max(i*e,1e-9);this.state.priceRange={min:r-a,max:r+a}}scrollBy(e){this.state.offset+=e,this.clampOffset(),this.updateVisibleRange()}isAtEnd(){let e=this.state.barWidth+this.state.barSpacing,t=this.rightMarginBars*e,n=this.dataLength*e-this.state.chartRect.width+t;return this.state.offset>=n-e*2}scrollToEnd(){let e=this.state.barWidth+this.state.barSpacing,t=this.rightMarginBars*e,n=this.dataLength*e;this.state.offset=n-this.state.chartRect.width+t,this.updateVisibleRange()}zoom(t,n){let r=this.state.barWidth,i=(0,e.clamp)(r*(1+t),this.minBarWidth,this.maxBarWidth);if(i===r)return;let a=this.state.barWidth+this.state.barSpacing,o=(this.state.offset+n)/a;this.state.barWidth=i;let s=i+this.state.barSpacing;this.state.offset=o*s-n,this.clampOffset(),this.updateVisibleRange()}clampOffset(){if(this.state.chartRect.width<=0)return;let t=this.state.barWidth+this.state.barSpacing,n=this.dataLength*t,r=this.rightMarginBars*t,i=n-this.state.chartRect.width+r,a,o;if(i>0)a=-(this.state.chartRect.width*.5),o=i;else{let e=this.state.chartRect.width*.5;a=i-e,o=i+e}this.state.offset=(0,e.clamp)(this.state.offset,a,o)}updateVisibleRange(){let e=this.state.barWidth+this.state.barSpacing;if(e<=0||this.state.chartRect.width<=0)return;let t=Math.floor(this.state.offset/e),n=Math.ceil(this.state.chartRect.width/e)+1,r=Math.min(t+n,this.dataLength-1);this.state.visibleRange={from:Math.max(0,t),to:Math.max(0,r)}}};function h(t,n){return(0,e.sliceVisibleData)(t,n.visibleRange.from,n.visibleRange.to)}var g=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=g(n.high),a=g(n.low),c=g(n.open),l=g(n.close),u=n.close>=n.open,d=u?_:v;d.moveTo(r,i),d.lineTo(r,a);let f=u?l:c,p=Math.max(Math.abs(l-c),1);(u?y:b).rect(r-s,f,o,p)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(_),e.strokeStyle=r.candleDownWick,e.stroke(v),e.fillStyle=r.candleUp,e.fill(y),e.fillStyle=r.candleDown,e.fill(b)}};function _(e,t,n){if(t>=e){let t=Array(Math.max(0,e));for(let n=0;n<e;n++)t[n]=n;return t}if(t<=2)return e>=2?[0,e-1]:e===1?[0]:[];let r=[0],i=(e-2)/(t-2),a=0;for(let o=0;o<t-2;o++){let t=Math.floor((o+1)*i)+1,s=Math.floor((o+2)*i)+1;s>e&&(s=e);let c=0,l=0,u=0;for(let e=t;e<s;e++)c+=e,l+=n(e),u++;if(u>0)c/=u,l/=u;else{let r=Math.min(t,e-1);c=r,l=n(r)}let d=Math.floor(o*i)+1,f=Math.floor((o+1)*i)+1,p=n(a),m=-1,h=d;for(let e=d;e<f;e++){let t=Math.abs((a-c)*(n(e)-p)-(a-e)*(l-p));t>m&&(m=t,h=e)}r.push(h),a=h}return r.push(e-1),r}var v=64;function y(e,t,n,r,i){let a=Math.max(0,e),o=Math.min(t,n-1);if(o<a)return[];let s=o-a+1,c=Math.max(v,Math.ceil(r*2));if(s<=c){let e=Array(s);for(let t=0;t<s;t++)e[t]=a+t;return e}let l=_(s,c,e=>i(a+e));for(let e=0;e<l.length;e++)l[e]+=a;return l}var b=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,s=-n.offset+n.chartRect.x+n.barWidth/2,{min:c,max:l}=n.priceRange,u=l-c;if(u===0)return;let d=n.chartRect.y,f=n.chartRect.height/u;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let p=y(i,a,t.length,n.chartRect.width,e=>t[e].close),m=!1;for(let n of p){let r=n*o+s,i=d+(l-t[n].close)*f;m?e.lineTo(r,i):(e.moveTo(r,i),m=!0)}e.stroke()}},x=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth+n.barSpacing,s=-n.offset+n.chartRect.x+n.barWidth/2,{min:c,max:l}=n.priceRange,u=l-c;if(u===0)return;let d=n.chartRect.y,f=n.chartRect.height,p=f/u,m=d+f,h=y(i,a,t.length,n.chartRect.width,e=>t[e].close);if(h.length===0)return;let g=h[0],_=g*o+s,v=d+(l-t[g].close)*p,b=e.createLinearGradient(0,d,0,m);b.addColorStop(0,r.areaTopColor),b.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(_,m),e.lineTo(_,v);let x=_;for(let n=1;n<h.length;n++){let r=h[n];x=r*o+s,e.lineTo(x,d+(l-t[r].close)*p)}e.lineTo(x,m),e.closePath(),e.fillStyle=b,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`,e.moveTo(_,v);for(let n=1;n<h.length;n++){let r=h[n];e.lineTo(r*o+s,d+(l-t[r].close)*p)}e.stroke()}},S=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open?_:v,a=g(n.high),o=g(n.low),c=g(n.open),l=g(n.close);i.moveTo(r,a),i.lineTo(r,o),i.moveTo(r-s,c),i.lineTo(r,c),i.moveTo(r,l),i.lineTo(r+s,l)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v)}},C=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=[],b=[],x=new Path2D,S=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=e===0||n.close>=t[e-1].close,c=g(n.high),l=g(n.low),u=g(n.open),d=g(n.close),f=Math.min(u,d),p=Math.max(Math.abs(d-u),1),m=a?_:v;m.moveTo(r,c),m.lineTo(r,l),i?(a?y:b).push({x:r-s,y:f,w:o,h:p}):(a?x:S).rect(r-s,f,o,p)}e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(_),e.strokeStyle=r.candleDown,e.stroke(v),e.fillStyle=r.candleUp,e.fill(x),e.fillStyle=r.candleDown,e.fill(S),e.lineWidth=1.5,e.strokeStyle=r.candleUp;for(let t of y)e.strokeRect(t.x,t.y,t.w,t.h);e.strokeStyle=r.candleDown;for(let t of b)e.strokeRect(t.x,t.y,t.w,t.h)}},w=class{baselinePrice=null;setBaseline(e){this.baselinePrice=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=g(this.baselinePrice??this.computeBaseline(t,i,a)),{chartRect:v}=n,y=[],b=[];for(let e=i;e<=a&&e<t.length;e++)y.push(h(e)),b.push(g(t[e].close));if(y.length<2)return;let x=y.length-1;e.save();let S=new Path2D;S.rect(v.x,v.y,v.width,_-v.y),e.clip(S);let C=new Path2D;C.moveTo(y[0],_);for(let e=0;e<=x;e++)C.lineTo(y[e],b[e]);C.lineTo(y[x],_),C.closePath(),e.fillStyle=`${r.candleUp}20`,e.fill(C),e.restore(),e.save();let w=new Path2D;w.rect(v.x,_,v.width,v.y+v.height-_),e.clip(w);let T=new Path2D;T.moveTo(y[0],_);for(let e=0;e<=x;e++)T.lineTo(y[e],b[e]);T.lineTo(y[x],_),T.closePath(),e.fillStyle=`${r.candleDown}20`,e.fill(T),e.restore();let E=new Path2D,D=new Path2D;for(let e=1;e<=x;e++){let t=b[e]<=_?E:D;t.moveTo(y[e-1],b[e-1]),t.lineTo(y[e],b[e])}e.lineWidth=2,e.strokeStyle=r.candleUp,e.stroke(E),e.strokeStyle=r.candleDown,e.stroke(D),e.setLineDash([6,4]),e.strokeStyle=r.textSecondary,e.lineWidth=1;let O=new Path2D;O.moveTo(v.x,_),O.lineTo(v.x+v.width,_),e.stroke(O),e.setLineDash([])}computeBaseline(e,t,n){let r=0,i=0;for(let a=t;a<=n&&a<e.length;a++)r+=e[a].close,i++;return i>0?r/i:0}},T=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=g(Math.max(n.open,n.close)),c=g(Math.min(n.open,n.close)),l=Math.max(c-a,1),u=r-s;i?(_.rect(u,a,o,l),y.rect(u,a,o,l)):(v.rect(u,a,o,l),b.rect(u,a,o,l))}e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v),e.lineWidth=1,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},E=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=new Path2D,v=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,o=g(n.high),s=g(n.low),c=i?_:v;if(c.moveTo(r,o),c.lineTo(r,s),e<a&&e+1<t.length){let t=h(e+1),n=i?s:o;c.moveTo(r,n),c.lineTo(t,n)}}e.strokeStyle=r.candleUp,e.lineWidth=3,e.stroke(_),e.strokeStyle=r.candleDown,e.lineWidth=1,e.stroke(v)}},D=class{boxSize=1;setBoxSize(e){this.boxSize=e}render(e,t,n,r){let{from:i,to:a}=n.visibleRange,o=n.barWidth,s=o/2,c=o+n.barSpacing,l=-n.offset+n.chartRect.x+s,{min:u,max:d}=n.priceRange,f=d-u;if(f===0)return;let p=n.chartRect.y,m=n.chartRect.height/f,h=e=>e*c+l,g=e=>p+(d-e)*m,_=Math.abs(this.boxSize*m),v=Math.min(s*.8,_*.8)*.5,y=new Path2D,b=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=h(e),i=n.close>=n.open,a=n.high,o=n.low,s=Math.max(1,Math.round((a-o)/this.boxSize));for(let e=0;e<s;e++){let t=g(o+(e+.5)*this.boxSize);i?(y.moveTo(r-v,t-v),y.lineTo(r+v,t+v),y.moveTo(r+v,t-v),y.lineTo(r-v,t+v)):(b.moveTo(r+v,t),b.arc(r,t,v,0,Math.PI*2))}}e.lineWidth=1.5,e.strokeStyle=r.candleUp,e.stroke(y),e.strokeStyle=r.candleDown,e.stroke(b)}},O=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:s}=n.priceRange,c=s-o;if(c===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=n.barWidth,m=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>m&&(m=t[e].volume);m===0&&(m=1);let h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D,y=e=>e*l+u,b=e=>d+(s-e)*f;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=y(e),i=b(n.high),a=b(n.low),o=b(n.open),s=b(n.close),c=n.close>=n.open,l=p*Math.max(.2,n.volume/m),u=l/2,d=c?h:g;d.moveTo(r,i),d.lineTo(r,a);let f=c?s:o,x=Math.max(Math.abs(s-o),1);(c?_:v).rect(r-u,f,l,x)}e.strokeStyle=r.candleUpWick,e.lineWidth=1,e.stroke(h),e.strokeStyle=r.candleDownWick,e.stroke(g),e.fillStyle=r.candleUp,e.fill(_),e.fillStyle=r.candleDown,e.fill(v)}},k=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange,{min:o,max:s}=n.priceRange,c=s-o;if(c===0||i>a||t.length===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=n.barWidth,m=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>m&&(m=t[e].volume);m===0&&(m=1);let h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D,y=e=>e*l+u,b=e=>d+(s-e)*f;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e>0?t[e-1]:n,i=y(e),a=b(n.high),o=b(n.low),s=n.close>=r.close,c=p*Math.max(.15,n.volume/m),l=c/2,u=Math.max(o-a,1),d=s?h:g,f=s?_:v;d.rect(i-l,a,c,u),f.rect(i-l,a,c,u)}e.fillStyle=A(r.candleUp,.55),e.fill(h),e.fillStyle=A(r.candleDown,.55),e.fill(g),e.lineWidth=1,e.strokeStyle=r.candleUpWick,e.stroke(_),e.strokeStyle=r.candleDownWick,e.stroke(v)}};function A(e,t){if(e.startsWith(`#`)){let n=Math.round(Math.max(0,Math.min(1,t))*255).toString(16).padStart(2,`0`);if(e.length===7)return`${e}${n}`;if(e.length===9)return`${e.slice(0,7)}${n}`}return e}var ee=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f,h=[],g=[];for(let e=i;e<=a&&e<t.length;e++){let n=p(e);h.push({x:n,y:m(t[e].high)}),g.push({x:n,y:m(t[e].low)})}if(h.length===0)return;let _=e.createLinearGradient(0,d,0,d+n.chartRect.height);_.addColorStop(0,r.areaTopColor),_.addColorStop(1,r.areaBottomColor),e.beginPath(),e.moveTo(h[0].x,h[0].y);for(let t=1;t<h.length;t++)e.lineTo(h[t].x,h[t].y);for(let t=g.length-1;t>=0;t--)e.lineTo(g[t].x,g[t].y);e.closePath(),e.fillStyle=_,e.fill(),e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke()}},te=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`miter`;let h=0;for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);n===i?e.moveTo(r,a):(e.lineTo(r,h),e.lineTo(r,a)),h=a}e.stroke()}},ne=class{render(e,t,n,r){let{from:i,to:a}=n.visibleRange;if(i>a||t.length===0)return;let{min:o,max:s}=n.priceRange,c=s-o;if(c===0)return;let l=n.barWidth+n.barSpacing,u=-n.offset+n.chartRect.x+n.barWidth/2,d=n.chartRect.y,f=n.chartRect.height/c,p=e=>e*l+u,m=e=>d+(s-e)*f;e.beginPath(),e.strokeStyle=r.lineColor,e.lineWidth=2,e.lineJoin=`round`;let h=[];for(let n=i;n<=a&&n<t.length;n++){let r=p(n),a=m(t[n].close);h.push({x:r,y:a}),n===i?e.moveTo(r,a):e.lineTo(r,a)}e.stroke();let g=Math.max(2,Math.min(4,n.barWidth*.3)),_=new Path2D;for(let{x:e,y:t}of h)_.moveTo(e+g,t),_.arc(e,t,g,0,Math.PI*2);e.fillStyle=r.lineColor,e.fill(_),e.strokeStyle=r.background,e.lineWidth=1,e.stroke(_)}},re=class{visible=!0;heightRatio=.2;setVisible(e){this.visible=e}setHeightRatio(e){this.heightRatio=Math.max(.05,Math.min(.5,e))}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o}=n,s=n.barWidth,c=s/2,l=s+n.barSpacing,u=-n.offset+o.x+c,d=0;for(let e=i;e<=a&&e<t.length;e++)t[e].volume>d&&(d=t[e].volume);if(d===0)return;let f=o.height*this.heightRatio,p=o.y+o.height,m=f/d,h=new Path2D,g=new Path2D;for(let e=i;e<=a&&e<t.length;e++){let n=t[e],r=e*l+u,i=n.volume*m;(n.close>=n.open?h:g).rect(r-c,p-i,s,i)}e.globalAlpha=.35,e.fillStyle=r.candleUp,e.fill(h),e.fillStyle=r.candleDown,e.fill(g),e.globalAlpha=1}},ie=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;highlightPoC=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setHighlightPoC(e){this.highlightPoC=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:s}=n,c=s.max-s.min;if(c<=0)return;let l=new Float64Array(this.buckets),u=new Float64Array(this.buckets),d=new Float64Array(this.buckets);for(let e=i;e<=a&&e<t.length;e++){let n=t[e];if(n.volume<=0)continue;let r=Math.max(n.low,s.min),i=Math.min(n.high,s.max);if(i<=r)continue;let a=(r-s.min)/c,o=(i-s.min)/c,f=Math.max(0,Math.floor(a*this.buckets)),p=Math.min(this.buckets-1,Math.floor(o*this.buckets)),m=Math.max(1,p-f+1),h=n.volume/m,g=n.close>=n.open;for(let e=f;e<=p;e++)l[e]+=h,g?u[e]+=h:d[e]+=h}let f=0,p=-1;for(let e=0;e<l.length;e++)l[e]>f&&(f=l[e],p=e);if(f===0)return;let m=o.width*this.widthRatio,h=o.x+o.width,g=o.height/this.buckets,_=1/f;e.save(),e.globalAlpha=this.opacity;for(let t=0;t<this.buckets;t++){let n=l[t];if(n===0)continue;let i=o.y+o.height-(t+1)*g,a=n*_*m,s=u[t]*_*m,c=d[t]*_*m;s>0&&(e.fillStyle=r.candleUp,e.fillRect(h-s,i+.5,s,g-1)),c>0&&(e.fillStyle=r.candleDown,e.fillRect(h-a,i+.5,c,g-1)),this.highlightPoC&&t===p&&(e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(o.x,i+g/2+.5),e.lineTo(h-a-2,i+g/2+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=this.opacity)}e.restore()}};function ae(e,t){return e<0?0:e>t?t:e}function j(e,t,n,r={}){let i=Math.max(4,Math.min(500,Math.floor(r.buckets??48))),a=n-t;if(a<=0||e.length===0)return null;let o=a/i,s=new Float64Array(i);for(let r of e){let e=Math.min(r.low,r.high),a=Math.max(r.low,r.high);if(a<t||e>n)continue;let c=ae(Math.floor((e-t)/o),i-1),l=ae(Math.floor((a-t)/o),i-1);for(let e=c;e<=l;e++)s[e]+=1}let c=0,l=0,u=0;for(let e=0;e<i;e++)u+=s[e],s[e]>l&&(l=s[e],c=e);if(u===0)return null;let d=u*(r.valueAreaPct??.7),f=c,p=c,m=s[c];for(;m<d&&(f>0||p<i-1);){let e=f>0?s[f-1]:-1;(p<i-1?s[p+1]:-1)>=e?(p+=1,m+=s[p]):(--f,m+=s[f])}let h=[];for(let e=0;e<i;e++){let n=t+e*o;h.push({low:n,high:n+o,mid:n+o/2,count:s[e]})}return{buckets:h,pocIndex:c,maxCount:l,totalCount:u,valueAreaLow:t+f*o,valueAreaHigh:t+(p+1)*o}}function oe(e){let t=(e%52+52)%52;return t<26?String.fromCharCode(65+t):String.fromCharCode(97+t-26)}function se(e,t,n,r=48){let i=Math.max(4,Math.min(500,Math.floor(r))),a=n-t,o=Array.from({length:i},()=>[]);if(a<=0)return o;let s=a/i;return e.forEach((e,r)=>{let a=Math.min(e.low,e.high),c=Math.max(e.low,e.high);if(c<t||a>n)return;let l=Math.max(0,Math.min(i-1,Math.floor((a-t)/s))),u=Math.max(0,Math.min(i-1,Math.floor((c-t)/s)));for(let e=l;e<=u;e++)o[e].push(r)}),o}function ce(t,n,r,i={}){if(t.length===0||r-n<=0)return[];let a=[],o=0,s=(0,e.timeframeBucketStart)(t[0].time,`1d`),c=(e,o,s)=>{let c=j(t.slice(e,o+1),n,r,i);c&&a.push({startIndex:e,endIndex:o,startTime:s,profile:c})};for(let n=1;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,`1d`);r!==s&&(c(o,n-1,s),o=n,s=r)}return c(o,t.length-1,s),a}var le=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;valueAreaPct=.7;highlightPoC=!0;showStats=!0;splitBySession=!1;letters=!1;lastStats=null;setVisible(e){this.visible=e,e||(this.lastStats=null)}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setValueAreaPct(e){this.valueAreaPct=Math.max(.3,Math.min(.95,e))}setHighlightPoC(e){this.highlightPoC=e}setShowStats(e){this.showStats=e}setSplitBySession(e){this.splitBySession=e}isSplitBySession(){return this.splitBySession}setLetters(e){this.letters=e}getStats(){return this.lastStats}render(e,t,n,r){if(!this.visible||t.length===0)return;let{from:i,to:a}=n.visibleRange,{chartRect:o,priceRange:s}=n,c=Math.max(0,i),l=Math.min(a,t.length-1);if(l<c)return;let u=t.slice(c,l+1);if(this.splitBySession){this.lastStats=null,this.renderSplit(e,u,c,n,r);return}let d=j(u,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(!d){this.lastStats=null;return}let f=d.buckets[d.pocIndex].mid;this.lastStats={poc:f,vah:d.valueAreaHigh,val:d.valueAreaLow,valueAreaPct:this.valueAreaPct};let p=d.buckets.length,m=o.width*this.widthRatio,h=o.x,g=o.height/p,_=1/d.maxCount;e.save();for(let t=0;t<p;t++){let n=d.buckets[t];if(n.count===0)continue;let i=o.y+o.height-(t+1)*g,a=n.count*_*m,s=n.mid>=d.valueAreaLow&&n.mid<=d.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?r.candleUp:r.textSecondary,e.fillRect(h,i+.5,a,g-1)}let v=e=>o.y+o.height*(1-(e-s.min)/(s.max-s.min));e.globalAlpha=.6,e.strokeStyle=r.candleUp,e.lineWidth=1,e.setLineDash([1,3]);for(let t of[d.valueAreaHigh,d.valueAreaLow]){let n=v(t);e.beginPath(),e.moveTo(h,Math.round(n)+.5),e.lineTo(o.x+o.width,Math.round(n)+.5),e.stroke()}if(e.setLineDash([]),this.highlightPoC){let t=v(f);e.globalAlpha=1,e.strokeStyle=r.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(h,Math.round(t)+.5),e.lineTo(o.x+o.width,Math.round(t)+.5),e.stroke(),e.setLineDash([])}this.showStats&&this.drawStats(e,o.x+6,o.y+6,f,d.valueAreaHigh,d.valueAreaLow,r),e.restore()}renderSplit(e,t,n,r,i){let{chartRect:o,priceRange:s}=r,c=ce(t,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(c.length===0)return;let l=s.max-s.min,u=e=>o.y+o.height*(1-(e-s.min)/l),d=r.barWidth/2;e.save();for(let l of c){let c=l.profile,f=c.buckets.length,p=o.height/f,m=a(n+l.startIndex,r)-d,h=a(n+l.endIndex,r)+d,g=Math.max(2,h-m),_=1/c.maxCount,v=this.letters&&p>=7,y=v?se(t.slice(l.startIndex,l.endIndex+1),s.min,s.max,this.buckets):null;if(v&&y){e.font=`${Math.min(11,Math.floor(p))}px ui-monospace, monospace`,e.textBaseline=`middle`,e.textAlign=`left`;let t=Math.max(1,Math.floor(g/6));for(let n=0;n<f;n++){let r=y[n];if(r.length===0)continue;let a=o.y+o.height-(n+.5)*p,s=c.buckets[n].mid>=c.valueAreaLow&&c.buckets[n].mid<=c.valueAreaHigh;e.globalAlpha=s?.95:.6,e.fillStyle=s?i.candleUp:i.textSecondary;let l=Math.min(r.length,t);for(let t=0;t<l;t++)e.fillText(oe(r[t]),m+t*6,a)}}else for(let t=0;t<f;t++){let n=c.buckets[t];if(n.count===0)continue;let r=o.y+o.height-(t+1)*p,a=n.count*_*g,s=n.mid>=c.valueAreaLow&&n.mid<=c.valueAreaHigh;e.globalAlpha=s?Math.min(1,this.opacity+.18):this.opacity,e.fillStyle=s?i.candleUp:i.textSecondary,e.fillRect(m,r+.5,a,p-1)}if(this.highlightPoC){let t=u(c.buckets[c.pocIndex].mid);e.globalAlpha=1,e.strokeStyle=i.crosshair,e.lineWidth=1,e.setLineDash([3,2]),e.beginPath(),e.moveTo(m,Math.round(t)+.5),e.lineTo(Math.min(h,o.x+o.width),Math.round(t)+.5),e.stroke(),e.setLineDash([])}}e.restore()}drawStats(e,t,n,r,i,a,o){let s=ue(r),c=[[`POC`,r.toFixed(s),o.crosshair],[`VAH`,i.toFixed(s),o.candleUp],[`VAL`,a.toFixed(s),o.candleUp]];e.globalAlpha=1,e.font=`600 10px ${o.font.family}`,e.textBaseline=`middle`;let l=0;for(let[,t]of c)l=Math.max(l,e.measureText(t).width);let u=38+l,d=6+c.length*14;e.fillStyle=o.background,e.globalAlpha=.82,de(e,t,n,u,d,4),e.fill(),e.globalAlpha=1,c.forEach(([r,i,a],s)=>{let c=n+6/2+14/2+s*14;e.fillStyle=a,e.textAlign=`left`,e.fillText(r,t+6,c),e.fillStyle=o.text,e.textAlign=`right`,e.fillText(i,t+u-6,c)}),e.textAlign=`left`}};function ue(e){let t=Math.abs(e);return t>=1e3?2:t>=1?4:6}function de(e,t,n,r,i,a){e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+i,a),e.arcTo(t+r,n+i,t,n+i,a),e.arcTo(t,n+i,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function fe(t,n){let r=n===`day`?`1d`:`1w`,i=[];for(let n of t){let t=(0,e.timeframeBucketStart)(n.time,r),a=i[i.length-1];a&&a.key===t?(a.high=Math.max(a.high,n.high),a.low=Math.min(a.low,n.low),a.close=n.close):i.push({key:t,open:n.open,high:n.high,low:n.low,close:n.close})}return i}function pe(e,t=`day`){let n=fe(e,t);if(n.length<2)return[];let r=n[n.length-2],i=n[n.length-1],a=t===`day`?`D`:`W`;return[{id:`p${a}h`,label:`P${a}H`,price:r.high},{id:`p${a}c`,label:`P${a}C`,price:r.close},{id:`p${a}l`,label:`P${a}L`,price:r.low},{id:`open`,label:t===`day`?`Day Open`:`Week Open`,price:i.open}]}var me=class{visible=!1;period=`day`;setVisible(e){this.visible=e}isVisible(){return this.visible}setPeriod(e){this.period=e}getPeriod(){return this.period}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=pe(t,this.period);if(i.length===0)return;let{chartRect:a}=n,s=a.y,c=a.y+a.height;e.save(),e.font=`600 10px ${r.font.family}`,e.textBaseline=`middle`;for(let t of i){let i=o(t.price,n);if(i<s||i>c)continue;let l=he(t,r);e.strokeStyle=l,e.globalAlpha=.7,e.lineWidth=1,e.setLineDash([5,4]),e.beginPath(),e.moveTo(a.x,Math.round(i)+.5),e.lineTo(a.x+a.width,Math.round(i)+.5),e.stroke(),e.setLineDash([]),e.globalAlpha=1;let u=t.label,d=e.measureText(u).width,f=a.x+a.width-d-10;e.fillStyle=r.background,e.globalAlpha=.85,e.fillRect(f-4,i-7,d+8,14),e.globalAlpha=1,e.fillStyle=l,e.textAlign=`left`,e.fillText(u,f,i+.5)}e.restore()}};function he(e,t){return e.id.endsWith(`h`)?t.candleUp:e.id.endsWith(`l`)?t.candleDown:t.textSecondary}function ge(e){let t,n;return e.map(e=>{let r;return e.type===`high`?(r=t===void 0||e.price>t?`HH`:`LH`,t=e.price):(r=n===void 0||e.price<n?`LL`:`HL`,n=e.price),{...e,label:r}})}function _e(e,t=5,n=5){let r=Math.max(1,Math.floor(t)),i=Math.max(1,Math.floor(n)),a=[];for(let t=r;t<e.length-i;t++){let n=e[t].high,o=e[t].low,s=!0,c=!0;for(let a=t-r;a<=t+i&&!(a!==t&&(e[a].high>=n&&(s=!1),e[a].low<=o&&(c=!1),!s&&!c));a++);s?a.push({index:t,price:n,type:`high`}):c&&a.push({index:t,price:o,type:`low`})}return a}var ve=class{visible=!1;left=5;right=5;showLabels=!1;structureLabels=!1;setVisible(e){this.visible=e}isVisible(){return this.visible}setStrength(e,t){this.left=Math.max(1,Math.floor(e)),this.right=Math.max(1,Math.floor(t))}setShowLabels(e){this.showLabels=e}setStructureLabels(e){this.structureLabels=e}render(e,t,n,r){if(!this.visible||t.length===0)return;let i=_e(t,this.left,this.right);if(i.length===0)return;let s=this.structureLabels?ge(i):i,{from:c,to:l}=n.visibleRange;e.save(),e.font=`10px ${r.font.family}`,e.textAlign=`center`;for(let t of s){if(t.index<c-1||t.index>l+1)continue;let i=a(t.index,n),s=o(t.price,n),u=t.type===`high`,d=u?r.candleDown:r.candleUp,f=u?s-8:s+8;e.fillStyle=d,e.beginPath(),u?(e.moveTo(i-5,f-5),e.lineTo(i+5,f-5),e.lineTo(i,f)):(e.moveTo(i-5,f+5),e.lineTo(i+5,f+5),e.lineTo(i,f)),e.closePath(),e.fill();let p=this.structureLabels&&`label`in t?String(t.label):this.showLabels?ye(t.price):null;p&&(e.textBaseline=u?`bottom`:`top`,e.fillText(p,i,u?f-5-1:f+5+1))}e.restore()}};function ye(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var be=class{buffer=[];constructor(e=240){this.capacity=e,this.capacity=Math.max(1,Math.floor(e))}push(e,t){let n={time:e,bids:t.bids.map(e=>({...e})),asks:t.asks.map(e=>({...e}))},r=this.buffer[this.buffer.length-1];r&&r.time===e?this.buffer[this.buffer.length-1]=n:(this.buffer.push(n),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity)))}snapshots(){return this.buffer}maxVolume(){let e=0;for(let t of this.buffer){for(let n of t.bids)n.volume>e&&(e=n.volume);for(let n of t.asks)n.volume>e&&(e=n.volume)}return e}setCapacity(e){this.capacity=Math.max(1,Math.floor(e)),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}clear(){this.buffer=[]}get size(){return this.buffer.length}},xe=class{buffer=new be(240);visible=!1;opacity=.7;setVisible(e){this.visible=e}isVisible(){return this.visible}setOpacity(e){this.opacity=Math.max(.1,Math.min(1,e))}setCapacity(e){this.buffer.setCapacity(e)}push(e,t){this.buffer.push(e,t)}clear(){this.buffer.clear()}render(e,t,n){if(!this.visible)return;let r=this.buffer.snapshots();if(r.length===0)return;let i=this.buffer.maxVolume();if(i<=0)return;let a=1/i,{chartRect:o}=t,s=Math.max(2,t.barWidth+t.barSpacing),c=o.x,l=o.x+o.width,u=o.y,f=o.y+o.height;e.save();for(let i of r){let r=d(i.time,t);if(r<c-s||r>l+s)continue;let o=r-s/2;this.drawSide(e,i.bids,n.candleUp,o,s,t,a,u,f),this.drawSide(e,i.asks,n.candleDown,o,s,t,a,u,f)}e.restore()}drawSide(e,t,n,r,i,a,s,c,l){if(t.length===0)return;let u=Se(t,a);e.fillStyle=n;for(let n of t){let t=o(n.price,a);t<c-u||t>l+u||(e.globalAlpha=Math.min(1,Math.sqrt(n.volume*s))*this.opacity,e.fillRect(r,t-u/2,i,u))}e.globalAlpha=1}};function Se(e,t){if(e.length<2)return 3;let n=e.map(e=>e.price).sort((e,t)=>e-t),r=[];for(let e=1;e<n.length;e++){let t=n[e]-n[e-1];t>0&&r.push(t)}if(r.length===0)return 3;r.sort((e,t)=>e-t);let i=r[Math.floor(r.length/2)],a=Math.abs(o(n[0],t)-o(n[0]+i,t));return Math.max(2,Math.min(a,12))}var Ce=class{symbols=new Map;mode=`percent`;setMode(e){this.mode=e}addSymbol(e){this.symbols.set(e.id,e)}removeSymbol(e){this.symbols.delete(e)}setSymbolData(e,t){let n=this.symbols.get(e);n&&(n.data=t)}setSymbolVisible(e,t){let n=this.symbols.get(e);n&&(n.visible=t)}getSymbols(){return Array.from(this.symbols.values())}clear(){this.symbols.clear()}render(e,t,n,r){if(this.symbols.size===0||t.length===0)return;let{chartRect:i}=n;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let i of this.symbols.values())!i.visible||i.data.length===0||this.renderSymbol(e,i,t,n,r);e.restore()}renderSymbol(e,t,n,r,i){let{chartRect:s}=r,c=r.barWidth+r.barSpacing,l=Math.max(0,Math.floor(r.offset/c));if(l>=n.length||l>=t.data.length)return;let u=n[l].close,d=t.data[l].close;if(u===0||d===0)return;e.strokeStyle=t.color,e.lineWidth=t.lineWidth??1.5,e.lineJoin=`round`,e.beginPath();let f=!1,p=Math.min(n.length,t.data.length);for(let n=l;n<p;n++){let i=a(n,r);if(i<s.x-c)continue;if(i>s.x+s.width+c)break;let l;l=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r):o(t.data[n].close,r),f?e.lineTo(i,l):(e.moveTo(i,l),f=!0)}if(e.stroke(),f){let n=Math.min(l+2,p-1),i=a(n,r)+4,s;s=this.mode===`percent`?o(u*(1+(t.data[n].close-d)/d),r)-4:o(t.data[n].close,r)-4,e.fillStyle=t.color,e.font=`bold 10px sans-serif`,e.textBaseline=`bottom`,e.textAlign=`left`,e.fillText(t.label,i,s)}}};function we(e){if(e.length===0)return[];let t=[],n=e[0].open,r=(e[0].open+e[0].high+e[0].low+e[0].close)/4;for(let i=0;i<e.length;i++){let a=e[i],o=(a.open+a.high+a.low+a.close)/4,s=i===0?a.open:(n+r)/2,c=Math.max(a.high,s,o),l=Math.min(a.low,s,o);t.push({time:a.time,open:s,high:c,low:l,close:o,volume:a.volume}),n=s,r=o}return t}function Te(e,t){if(e.length===0)return[];let n=t.brickSize;t.useATR&&e.length>(t.atrPeriod??14)&&(n=Ee(e,t.atrPeriod??14)),n<=0&&(n=1);let r=[],i=Math.round(e[0].close/n)*n,a=e[0].time;for(let t=1;t<e.length;t++){let o=e[t].close-i,s=Math.floor(Math.abs(o)/n);if(s>=1){let c=o>0?1:-1;for(let o=0;o<s;o++){let o=i;i+=c*n,r.push({time:a++,open:o,high:Math.max(o,i),low:Math.min(o,i),close:i,volume:e[t].volume/s})}}}return r}function Ee(e,t){let n=0;for(let r=1;r<=Math.min(t,e.length-1);r++){let t=Math.max(e[r].high-e[r].low,Math.abs(e[r].high-e[r-1].close),Math.abs(e[r].low-e[r-1].close));n+=t}return n/t}function De(e,t=3){if(e.length===0)return[];let n=[],r=0;n.push({time:r++,open:e[0].open,high:Math.max(e[0].open,e[0].close),low:Math.min(e[0].open,e[0].close),close:e[0].close,volume:e[0].volume});for(let i=1;i<e.length;i++){let a=e[i].close,o=n[n.length-1],s=o.close>=o.open,c=Math.min(t,n.length),l=-1/0,u=1/0;for(let e=n.length-c;e<n.length;e++)l=Math.max(l,n[e].high),u=Math.min(u,n[e].low);s&&a>o.close?n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume}):!s&&a<o.close||s&&a<u?n.push({time:r++,open:o.close,high:o.close,low:a,close:a,volume:e[i].volume}):!s&&a>l&&n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume})}return n}function Oe(e,t=4){if(e.length<2)return e.slice();let n=[],r=e[1].close>=e[0].close?1:-1,i=e[0].close,a=e[0].close,o=e[0].close,s=0;for(let c=1;c<e.length;c++){let l=e[c].close,u=t/100*o;r===1?(l>i&&(i=l),i-l>=u&&(n.push({time:s++,open:o,high:i,low:o,close:i,volume:e[c].volume}),r=-1,o=i,a=l,i=l)):(l<a&&(a=l),l-a>=u&&(n.push({time:s++,open:o,high:o,low:a,close:a,volume:e[c].volume}),r=1,o=a,i=l,a=l))}return r===1?n.push({time:s,open:o,high:i,low:o,close:i,volume:0}):n.push({time:s,open:o,high:o,low:a,close:a,volume:0}),n}function ke(e,t,n=3){if(e.length===0||t<=0)return[];let r=[],i=0,a=0,o=0,s=0,c=Math.round(e[0].close/t)*t;a=c,o=c,i=1;for(let c=1;c<e.length;c++){let l=e[c].close,u=Math.round(l/t)*t;i===1?u>a?a=u:a-u>=t*n&&(r.push({time:s++,open:o,high:a,low:o,close:a,volume:e[c].volume}),i=-1,o=u,a-=t):u<o?o=u:u-o>=t*n&&(r.push({time:s++,open:a,high:a,low:o,close:o,volume:e[c].volume}),i=1,a=u,o+=t)}return r.push({time:s,open:i===1?o:a,high:a,low:o,close:i===1?a:o,volume:0}),r}function Ae(e,t){if(e.length===0||t.rangeSize<=0)return[];let n=[],r=e[0].time,i=e[0].open,a=i,o=i,s=0,c=(e,c)=>{for(e>a&&(a=e),e<o&&(o=e),s+=c;a-o>=t.rangeSize;){let c=e>=i,l=c?i+t.rangeSize:i-t.rangeSize;n.push({time:r++,open:i,high:c?l:i,low:c?i:l,close:l,volume:s}),i=l,a=l,o=l,s=0}};for(let t of e){let e=t.close>=t.open?[t.low,t.high,t.close]:[t.high,t.low,t.close],n=t.volume/e.length;for(let t of e)c(t,n)}return n}var M=class{drawLine(e,t,n,r){if(!(t.length<2)){e.beginPath(),e.strokeStyle=n,e.lineWidth=r,e.lineJoin=`round`,e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);e.stroke()}}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(e,t,n,r){let i=[],{from:s,to:c}=r.visibleRange;for(let l=s;l<=c&&l<n.length;l++){let s=e.values.get(n[l].time);s&&s[t]!==void 0&&i.push({x:a(l,r),y:o(s[t],r)})}return i}},je=1,Me=class{registry=new Map;instances=new Map;register(e){this.registry.set(e.descriptor.id,e)}getAvailableIndicators(){return Array.from(this.registry.values()).map(e=>e.descriptor)}addIndicator(e,t={},n){let r=this.registry.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);let i=`tc_${e}_${je++}`,a={id:e,instanceId:i,params:{...r.descriptor.defaultConfig,...t},visible:!0},o={plugin:r,config:a,output:null,style:{colors:a.style?.colors??[`#2196F3`,`#FF9800`,`#4CAF50`,`#E91E63`,`#9C27B0`],lineWidths:a.style?.lineWidths??[1.5],opacity:a.style?.opacity??1}};return n&&(o.output=r.calculate(n,a)),this.instances.set(i,o),i}removeIndicator(e){this.instances.delete(e)}updateIndicator(e,t,n){let r=this.instances.get(e);r&&(Object.assign(r.config.params,t),n&&(r.output=r.plugin.calculate(n,r.config)))}recalculateAll(e){for(let t of this.instances.values())t.output=t.plugin.calculate(e,t.config)}getOutput(e){return this.instances.get(e)?.output??null}renderOverlays(e,t){for(let n of this.instances.values())!n.output||!n.config.visible||n.plugin.descriptor.placement===`overlay`&&n.plugin.render(e,n.output,t,n.style)}renderPanel(e,t,n){let r=this.instances.get(t);!r?.output||!r.config.visible||r.plugin.render(e,r.output,n,r.style)}getIndicatorConfig(e){return this.instances.get(e)?.config??null}setVisible(e,t){let n=this.instances.get(e);return n?(n.config.visible=t,t):null}isVisible(e){return this.instances.get(e)?.config.visible??!1}getIndicatorDescriptor(e){return this.instances.get(e)?.plugin.descriptor??null}getActiveIndicators(){let e=[];for(let[t,n]of this.instances)e.push({instanceId:t,id:n.config.id,params:{...n.config.params},descriptor:n.plugin.descriptor,visible:n.config.visible??!0});return e}updateIndicatorStyle(e,t){let n=this.instances.get(e);n&&Object.assign(n.style,t)}getOverlayPriceRange(e,t){let n=1/0,r=-1/0;for(let i of this.instances.values()){if(!i.output||!i.config.visible||i.plugin.descriptor.placement!==`overlay`)continue;let a=0;for(let[,o]of i.output.values){if(a>=e&&a<=t)for(let e in o){let t=o[e];t!==void 0&&isFinite(t)&&(t<n&&(n=t),t>r&&(r=t))}a++}}return n===1/0?null:{min:n,max:r}}getPanelIndicators(){let e=[];for(let[t,n]of this.instances)n.plugin.descriptor.placement===`panel`&&e.push({instanceId:t,descriptor:n.plugin.descriptor});return e}};function N(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function P(e,t,n,r=1){let i=N(e,t,n);return Math.max(r,Math.floor(i))}var Ne=class extends M{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Pe=class extends M{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=2/(n+1),i=new Map,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Fe=class extends M{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2}};calculate(e,t){let n=P(t,`period`,20,1),r=N(t,`stdDev`,2),i=new Map,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=0,d=l-c+1,f=new Float64Array(d),p=new Float64Array(d),m=new Float64Array(d),h=new Float64Array(d),g=new Float64Array(d),_=new Float64Array(d);for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t||t.upper===void 0)continue;let n=a(e,r);f[u]=n,p[u]=o(t.upper,r),m[u]=n,h[u]=o(t.middle,r),g[u]=n,_[u]=o(t.lower,r),u++}if(!(u<2)){t.beginPath(),t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);for(let e=u-1;e>=0;e--)t.lineTo(g[e],_[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[0],.1),t.fill(),t.beginPath(),t.strokeStyle=i.colors[0],t.lineWidth=i.lineWidths[0],t.lineJoin=`round`,t.moveTo(f[0],p[0]);for(let e=1;e<u;e++)t.lineTo(f[e],p[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[1]??i.colors[0],t.moveTo(m[0],h[0]);for(let e=1;e<u;e++)t.lineTo(m[e],h[e]);t.stroke(),t.beginPath(),t.strokeStyle=i.colors[0],t.moveTo(g[0],_[0]);for(let e=1;e<u;e++)t.lineTo(g[e],_[e]);t.stroke()}}},Ie=class extends M{descriptor={id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null),i=0,a=0;for(let t=0;t<e.length;t++){let o=(e[t].high+e[t].low+e[t].close)/3;if(i+=e[t].volume,a+=o*e[t].volume,i>0){let o={value:a/i};n.set(e[t].time,o),r[t]=o}}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Le=class extends M{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26}};calculate(e,t){let n=P(t,`tenkan`,9,1),r=P(t,`kijun`,26,1),i=P(t,`senkou`,52,1),a=new Map,o=Array(e.length).fill(null),s=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},c=s(n),l=s(r),u=s(i);for(let t=0;t<e.length;t++){let s={};t>=n-1&&(s.tenkan=(c.highs[t]+c.lows[t])/2),t>=r-1&&(s.kijun=(l.highs[t]+l.lows[t])/2),s.tenkan!==void 0&&s.kijun!==void 0&&(s.senkouA=(s.tenkan+s.kijun)/2),t>=i-1&&(s.senkouB=(u.highs[t]+u.lows[t])/2),t>=r-1&&(s.chikou=e[t].close),(s.tenkan!==void 0||s.kijun!==void 0||s.senkouA!==void 0||s.senkouB!==void 0)&&(a.set(e[t].time,s),o[t]=s)}return{values:a,series:o}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=l-c+1,d=new Float64Array(u),f=new Float64Array(u),p=0,m=new Float64Array(u),h=new Float64Array(u),g=0,_=new Float64Array(u),v=new Float64Array(u),y=0,b=new Float64Array(u),x=new Float64Array(u),S=0;for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.tenkan!==void 0&&(d[p]=n,f[p]=o(t.tenkan,r),p++),t.kijun!==void 0&&(m[g]=n,h[g]=o(t.kijun,r),g++),t.senkouA!==void 0&&(_[y]=n,v[y]=o(t.senkouA,r),y++),t.senkouB!==void 0&&(b[S]=n,x[S]=o(t.senkouB,r),S++)}if(y>1&&S>1){let n=Math.min(y,S);t.beginPath(),t.moveTo(_[0],v[0]);for(let e=1;e<n;e++)t.lineTo(_[e],v[e]);for(let e=n-1;e>=0;e--)t.lineTo(b[e],x[e]);t.closePath(),t.fillStyle=(0,e.withAlpha)(i.colors[2]??`#26A69A`,.15),t.fill()}let C=(e,n,r,i,a)=>{if(!(r<2)){t.beginPath(),t.strokeStyle=i,t.lineWidth=a,t.lineJoin=`round`,t.moveTo(e[0],n[0]);for(let i=1;i<r;i++)t.lineTo(e[i],n[i]);t.stroke()}};C(d,f,p,i.colors[0],i.lineWidths[0]),C(m,h,g,i.colors[1]??`#FF9800`,i.lineWidths[0]),C(_,v,y,i.colors[2]??`#26A69A`,1),C(b,x,S,i.colors[3]??`#EF5350`,1)}},Re=class extends M{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2}};calculate(e,t){let n=N(t,`step`,.02),r=N(t,`max`,.2),i=new Map,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=Math.max(1.5,n.barWidth*.15);for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),u=o(s.value,n);e.beginPath(),e.arc(c,u,l,0,Math.PI*2),e.fillStyle=s.trend===1?r.colors[0]:r.colors[1]??`#EF5350`,e.fill()}}},ze=class extends M{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3}};calculate(e,t){let n=P(t,`period`,10,1),r=N(t,`multiplier`,3),i=new Map,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s;c=g<u||e[t-1].close>u?g:u,l=_>d||e[t-1].close<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let v={value:f,trend:m};i.set(e[t].time,v),a[t]=v,u=c,d=l,p=f}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#EF5350`,d=0,f=0,p=0;for(let t=s;t<=c&&t<i.length;t++){let s=i[t];if(!s||s.value===void 0)continue;let c=a(t,n),m=o(s.value,n),h=s.trend??1;p!==0&&(e.beginPath(),e.strokeStyle=h===1?l:u,e.lineWidth=r.lineWidths[0]+.5,e.moveTo(d,f),e.lineTo(c,m),e.stroke()),d=c,f=m,p=h}}},Be=class extends M{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5}};calculate(e,t){let n=P(t,`emaPeriod`,20,1),r=P(t,`atrPeriod`,10,1),i=N(t,`multiplier`,1.5),a=new Map;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},Ve=class extends M{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??`#787B86`,1),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},He=[`s3`,`s2`,`s1`,`pp`,`r1`,`r2`,`r3`],Ue=class extends M{descriptor={id:`pivots`,name:`Pivot Points (Classic)`,placement:`overlay`,defaultConfig:{lookback:24}};calculate(e,t){let n=P(t,`lookback`,24,1),r=new Map,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};for(let t=n;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n;r<t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s=e[t-1].close,c=(a+o+s)/3,l=a-o,u={pp:c,r1:2*c-o,s1:2*c-a,r2:c+l,s2:c-l,r3:a+2*(c-o),s3:o-2*(a-c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=r.colors[0],u=r.colors[1]??`#EF5350`,d=r.colors[2]??`#26A69A`,f=r.lineWidths[0],p=e=>e===`pp`?l:e.startsWith(`r`)?u:d;for(let t of He){e.beginPath(),e.strokeStyle=p(t),e.lineWidth=t===`pp`?f:Math.max(1,f-1),t!==`pp`&&e.setLineDash([4,3]);let r=!1;for(let l=s;l<=c&&l<i.length;l++){let s=i[l]?.[t];if(s===void 0)continue;let c=a(l,n),u=o(s,n);r?e.lineTo(c,u):(e.moveTo(c,u),r=!0)}e.stroke(),e.setLineDash([])}}},We=class extends M{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0}};calculate(e,t){let n=N(t,`anchorTime`,0),r=new Map,i=Array(e.length).fill(null),a=0;if(n>0&&(a=e.findIndex(e=>e.time>=n),a<0))return{values:r,series:i};let o=0,s=0;for(let t=a;t<e.length;t++){let n=(e[t].high+e[t].low+e[t].close)/3;if(o+=e[t].volume,s+=n*e[t].volume,o>0){let n={value:s/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ge=class extends M{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5}};calculate(e,t){let n=Math.max(.01,N(t,`deviation`,5))/100,r=new Map,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(e,t,n,r){let i=t.meta?.pivots;if(!(!i||i.length<2)){e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;for(let t=0;t<i.length;t++){let r=i[t],s=a(r.idx,n),c=o(r.price,n);t===0?e.moveTo(s,c):e.lineTo(s,c)}e.stroke()}}},Ke=class extends M{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2}};calculate(e,t){let n=P(t,`period`,100,2),r=N(t,`stdDev`,2),i=new Map,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}render(t,n,r,i){let s=n.series;if(!s)return;let{from:c,to:l}=r.visibleRange,u=[],d=[],f=[];for(let e=c;e<=l&&e<s.length;e++){let t=s[e];if(!t)continue;let n=a(e,r);t.middle!==void 0&&d.push({x:n,y:o(t.middle,r)}),t.upper!==void 0&&u.push({x:n,y:o(t.upper,r)}),t.lower!==void 0&&f.push({x:n,y:o(t.lower,r)})}this.drawBand(t,u,f,(0,e.withAlpha)(i.colors[0],.08)),this.drawLine(t,u,i.colors[0],i.lineWidths[0]),this.drawLine(t,d,i.colors[1]??i.colors[0],i.lineWidths[0]),this.drawLine(t,f,i.colors[0],i.lineWidths[0])}},qe=class extends M{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21}};calculate(e,t){let n=P(t,`period`,21,2),r=new Map,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=Je(a,n),l=Je(a,o),u=Ye(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}};function Je(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function Ye(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var Xe=class extends M{descriptor={id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`}};calculate(t,n){let r=P(n,`period`,50,1),i=String(n.params.timeframe??`1d`),a=new Map,o=Array(t.length).fill(null);if(t.length===0)return{values:a,series:o};let s=[],c=(0,e.timeframeBucketStart)(t[0].time,i),l=t[0].close,u=null,d=()=>{if(s.length<r)return;let e=0;for(let t=s.length-r;t<s.length;t++)e+=s[t];u=e/r};for(let n=0;n<t.length;n++){let r=(0,e.timeframeBucketStart)(t[n].time,i);if(r!==c&&(s.push(l),d(),c=r),l=t[n].close,u!==null){let e={value:u};a.set(t[n].time,e),o[n]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange;e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let s=a(t,n),c=o(r.value,n);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()}},Ze=class extends M{descriptor={id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1}};calculate(t,n){let r=Math.min(3,P(n,`bands`,1,0)),i=new Map,a=Array(t.length).fill(null);if(t.length===0)return{values:i,series:a};let o=(0,e.timeframeBucketStart)(t[0].time,`1d`),s=0,c=0,l=0;for(let n=0;n<t.length;n++){let u=t[n],d=(0,e.timeframeBucketStart)(u.time,`1d`);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,t={value:e,session:o};if(r>0){let n=Math.max(0,c/l-e*e),i=Math.sqrt(n);for(let n=1;n<=r;n++)t[`u${n}`]=e+n*i,t[`l${n}`]=e-n*i}i.set(u.time,t),a[n]=t}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:a,to:o}=n.visibleRange;e.globalAlpha=.55,e.lineWidth=1,e.setLineDash([4,3]),e.strokeStyle=r.colors[1]??r.colors[0];for(let t=1;t<=3;t++)this.strokeBandSeries(e,i,n,a,o,e=>e[`u${t}`]),this.strokeBandSeries(e,i,n,a,o,e=>e[`l${t}`]);e.setLineDash([]),e.globalAlpha=1,e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,this.strokeBandSeries(e,i,n,a,o,e=>e.value)}strokeBandSeries(e,t,n,r,i,s){e.beginPath();let c,l=!1;for(let u=r;u<=i&&u<t.length;u++){let r=t[u],i=r?s(r):void 0;if(r===null||i===void 0){l=!1;continue}let d=a(u,n),f=o(i,n),p=r.session!==c;!l||p?(e.moveTo(d,f),l=!0):e.lineTo(d,f),c=r.session}e.stroke()}},Qe=class extends M{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3}};calculate(e,t){let n=P(t,`period`,22,1),r=N(t,`multiplier`,3),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.setLineDash([5,3]);let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke(),e.setLineDash([])};l(`long`,r.colors[0]??`#26A69A`),l(`short`,r.colors[1]??`#EF5350`)}},$e=class extends M{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3}};calculate(e,t){let n=P(t,`jaw`,13,1),r=P(t,`teeth`,8,1),i=P(t,`lips`,5,1),a=P(t,`jawShift`,8,0),o=P(t,`teethShift`,5,0),s=P(t,`lipsShift`,3,0),c=new Map,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=et(d,n),p=et(d,r),m=et(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}render(e,t,n,r){let i=t.series;if(!i)return;let{from:s,to:c}=n.visibleRange,l=(t,l)=>{e.beginPath(),e.strokeStyle=l,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let s=i[r];if(!s||s[t]===void 0){u=!1;continue}let c=a(r,n),l=o(s[t],n);u?e.lineTo(c,l):(e.moveTo(c,l),u=!0)}e.stroke()};l(`jaw`,r.colors[0]??`#2962FF`),l(`teeth`,r.colors[1]??`#EF5350`),l(`lips`,r.colors[2]??`#26A69A`)}};function et(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var tt=class extends M{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34}};calculate(e,t){let n=P(t,`fast`,5,1),r=P(t,`slow`,34,1),i=new Map,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#26A69A`,g=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.up?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},nt=class extends M{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10}};calculate(e,t){let n=P(t,`fast`,3,1),r=P(t,`slow`,10,1),i=new Map,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=Math.max(Math.abs(l),Math.abs(u))||1,f=e=>o.y+o.height*(1-(e+d)/(2*d)),p=f(0),m=n.barWidth/2,h=r.colors[0]??`#26A69A`,g=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value),c=Math.min(s,p),l=Math.max(Math.abs(s-p),1);e.fillStyle=r.value>=0?h:g,e.fillRect(o-m,c,n.barWidth,l)}}},rt=class extends M{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=0,o=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?a+=n:o-=n}a/=n,o/=n;let s={value:o===0?100:100-100/(1+a/o)};r.set(e[n].time,s),i[n]=s;for(let t=n+1;t<e.length;t++){let s=e[t].close-e[t-1].close,c=s>0?s:0,l=s<0?-s:0;a=(a*(n-1)+c)/n,o=(o*(n-1)+l)/n;let u={value:o===0?100:100-100/(1+a/o)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath();for(let t of[30,70]){let n=l(t);e.moveTo(o.x,n),e.lineTo(o.x+o.width,n)}e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},it=class extends M{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new Map,o=Array(e.length).fill(null);if(e.length<r)return{values:a,series:o};let s=2/(n+1),c=2/(r+1),l=2/(i+1),u=e[0].close,d=e[0].close,f=0,p=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(u=n,d=n):(u=(n-u)*s+u,d=(n-d)*c+d),t>=r-1){let n=u-d;p?f=(n-f)*l+f:(f=n,p=!0);let r=n-f,i={macd:n,signal:f,histogram:r};a.set(e[t].time,i),o[t]=i}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.macd!==void 0&&(t.macd<l&&(l=t.macd),t.macd>u&&(u=t.macd)),t.signal!==void 0&&(t.signal<l&&(l=t.signal),t.signal>u&&(u=t.signal)),t.histogram!==void 0&&(t.histogram<l&&(l=t.histogram),t.histogram>u&&(u=t.histogram)))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d),p=f(0),m=n.barWidth/2,h=r.colors[2]??`#26A69A`,g=r.colors[3]??`#EF5350`,_=r.colors[0],v=r.colors[1]??`#FF9800`;e.beginPath();let y=new Path2D,b=new Path2D,x=!1,S=!1,C=new Path2D,w=new Path2D;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(!t)continue;let r=a(e,n);if(t.histogram!==void 0){let e=f(t.histogram),i=Math.min(e,p),a=Math.max(Math.abs(e-p),1);t.histogram>=0?y.rect(r-m,i,n.barWidth,a):b.rect(r-m,i,n.barWidth,a)}if(t.macd!==void 0){let e=f(t.macd);x?C.lineTo(r,e):(C.moveTo(r,e),x=!0)}if(t.signal!==void 0){let e=f(t.signal);S?w.lineTo(r,e):(w.moveTo(r,e),S=!0)}}e.fillStyle=h,e.fill(y),e.fillStyle=g,e.fill(b),e.strokeStyle=_,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`,e.stroke(C),e.strokeStyle=v,e.stroke(w)}},at=class extends M{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3}};calculate(e,t){let n=P(t,`kPeriod`,14,1),r=P(t,`dPeriod`,3,1),i=P(t,`smooth`,3,1),a=new Map,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]),u(`d`,r.colors[1]??`#FF9800`)}},ot=class extends M{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},st=class extends M{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`adx`,r.colors[0]),u(`plusDI`,r.colors[1]??`#26A69A`),u(`minusDI`,r.colors[2]??`#EF5350`)}},ct=class extends M{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},lt=class extends M{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-20,-80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},ut=class extends M{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-100,0,100])if(t>=f&&t<=p){let n=h(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},dt=class extends M{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=l(r.value);u?e.lineTo(i,o):(e.moveTo(i,o),u=!0)}}e.stroke()}},ft=class extends M{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25}};calculate(e,t){let n=P(t,`period`,25,1),r=new Map,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100),u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`up`,r.colors[0]),u(`down`,r.colors[1]??`#EF5350`)}},pt=class extends M{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12}};calculate(e,t){let n=P(t,`period`,12,1),r=new Map,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);if(0>=f&&0<=p){e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);let t=h(0);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}},mt=class extends M{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7}};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=P(t,`longPeriod`,25,1),r=P(t,`shortPeriod`,13,1),i=P(t,`signalPeriod`,7,1),a=new Map,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&(t.tsi!==void 0&&(l=Math.min(l,t.tsi),u=Math.max(u,t.tsi)),t.signal!==void 0&&(l=Math.min(l,t.signal),u=Math.max(u,t.signal)))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=h(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};g(`tsi`,r.colors[0]),g(`signal`,r.colors[1]??`#FF9800`)}},ht=class extends M{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([]));let g=n.barWidth/2;for(let t=s;t<=c&&t<i.length;t++){let o=i[t];if(o&&o.value!==void 0){let i=a(t,n),s=h(o.value),c=h(0);e.fillStyle=o.value>=0?r.colors[0]:r.colors[1]??`#EF5350`;let l=Math.min(s,c);e.fillRect(i-g,l,n.barWidth,Math.max(Math.abs(s-c),1))}}}},gt=class extends M{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0}};calculate(e,t){let n=N(t,`mode`,0)>=1,r=new Map,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2,p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value),c=Math.min(s,d),l=Math.max(Math.abs(s-d),1);e.fillStyle=r.up?p:m,e.fillRect(o-f,c,n.barWidth,l)}}},_t=class extends M{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`viPlus`,`viMinus`]){let n=t[e];n!==void 0&&(n<l&&(l=n),n>u&&(u=n))}}if(l===1/0)return;let d=(u-l)*.1||.1;l-=d,u+=d;let f=u-l||1,p=e=>o.y+o.height*(1-(e-l)/f);if(1>=l&&1<=u){e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);let t=p(1);e.beginPath(),e.moveTo(o.x,t),e.lineTo(o.x+o.width,t),e.stroke(),e.setLineDash([])}let m=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0)continue;let s=a(r,n),c=p(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};m(`viPlus`,r.colors[0]??`#26A69A`),m(`viMinus`,r.colors[1]??`#EF5350`)}},vt=class extends M{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,2),r=new Map,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[38.2,61.8]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},yt=class extends M{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28}};calculate(e,t){let n=P(t,`fast`,7,1),r=P(t,`mid`,14,1),i=P(t,`slow`,28,1),a=new Map,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=bt(l(s,t,n),l(c,t,n)),d=bt(l(s,t,r),l(c,t,r)),f=bt(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function bt(e,t){return t===0?0:e/t}var xt=class extends M{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new Map,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},St=class extends M{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100}};calculate(e,t){let n=P(t,`rsiPeriod`,3,1),r=P(t,`streakPeriod`,2,1),i=P(t,`rankPeriod`,100,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=Ct(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=Ct(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[10,90]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Ct(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var wt=class extends M{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10}};calculate(e,t){let n=P(t,`longRoc`,14,1),r=P(t,`shortRoc`,11,1),i=P(t,`wma`,10,1),a=new Map,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}},Tt=class extends M{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9}};calculate(e,t){let n=P(t,`roc1`,10,1),r=P(t,`roc2`,15,1),i=P(t,`roc3`,20,1),a=P(t,`roc4`,30,1),o=P(t,`sma1`,10,1),s=P(t,`sma2`,10,1),c=P(t,`sma3`,10,1),l=P(t,`sma4`,15,1),u=P(t,`signal`,9,1),d=new Map,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=I(F(m,n),o),g=I(F(m,r),s),_=I(F(m,i),c),v=I(F(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=I(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}};function F(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function I(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var Et=class extends M{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13}};calculate(e,t){let n=P(t,`period`,13,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`bull`,`bear`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r)continue;let o=a(t,n);if(r.bull!==void 0){let t=u(r.bull);e.fillStyle=p,e.globalAlpha=.8,e.fillRect(o-f,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}if(r.bear!==void 0){let t=u(r.bear);e.fillStyle=m,e.globalAlpha=.8,e.fillRect(o,Math.min(t,d),Math.max(1,f),Math.abs(t-d))}}e.globalAlpha=1}},Dt=class extends M{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10}};calculate(e,t){let n=P(t,`fast`,23,1),r=P(t,`slow`,50,1),i=P(t,`cycle`,10,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=Ot(Ot(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[25,75]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}};function Ot(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var kt=class extends M{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13}};calculate(e,t){let n=P(t,`fast`,34,1),r=P(t,`slow`,55,1),i=P(t,`signal`,13,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}},At=class extends M{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`trigger`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`trigger`,r.colors[1]??`#FF9800`)}},jt=class extends M{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,2),r=Math.floor(n/2)+1,i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=n.barWidth/2;e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=r.colors[0]??`#26A69A`,m=r.colors[1]??`#EF5350`;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);e.fillStyle=r.value>=0?p:m,e.fillRect(o-f,Math.min(s,d),n.barWidth,Math.max(1,Math.abs(s-d)))}}},Mt=class extends M{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14}};calculate(e,t){let n=P(t,`smooth`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+1)/2),u=l(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,u),e.lineTo(o.x+o.width,u),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(Math.max(-1,Math.min(1,r.value)));d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},Nt=class extends M{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25}};calculate(e,t){let n=P(t,`ema`,9,1),r=P(t,`sum`,25,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;l=Math.min(l,26),u=Math.max(u,27.5);let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[26.5,27]){let n=f(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}},Pt=class extends M{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9}};calculate(e,t){let n=P(t,`period`,9,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-(e+100)/200);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-50,0,50]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Ft=class extends M{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9}};calculate(e,t){let n=P(t,`period`,15,1),r=P(t,`signal`,9,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=L(L(L(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=L(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}};function L(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var It=class extends M{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}};function R(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let f=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0)continue;let o=a(t,n),s=u(r.value);f?e.lineTo(o,s):(e.moveTo(o,s),f=!0)}e.stroke()}var Lt=class extends M{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){Rt(e,t,n,r,a)}};function Rt(e,t,n,r,i){let a=t.series;if(!a)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<a.length;e++){let t=a[e]?.value;t!==void 0&&(t<l&&(l=t),t>u&&(u=t))}if(l===1/0)return;let d=u-l||1,f=e=>o.y+o.height*(1-(e-l)/d);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let p=!1;for(let t=s;t<=c&&t<a.length;t++){let r=a[t];if(!r||r.value===void 0)continue;let o=i(t,n),s=f(r.value);p?e.lineTo(o,s):(e.moveTo(o,s),p=!0)}e.stroke()}var zt=class extends M{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}render(e,t,n,r){Rt(e,t,n,r,a)}},Bt=class extends M{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10}};calculate(e,t){let n=P(t,`ema`,10,1),r=P(t,`roc`,10,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}render(e,t,n,r){R(e,t,n,r)}},Vt=class extends M{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10}};calculate(e,t){let n=P(t,`period`,10,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};f(`value`,r.colors[0]??`#2962FF`),f(`signal`,r.colors[1]??`#FF9800`)}},Ht=class extends M{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3}};calculate(e,t){let n=P(t,`rsiPeriod`,14,1),r=P(t,`stochPeriod`,14,1),i=P(t,`k`,3,1),a=P(t,`d`,3,1),o=new Map,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=Ut(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=Wt(u,i),f=Wt(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[20,80]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]);let u=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){u=!1;continue}let s=a(r,n),c=l(o[t]);u?e.lineTo(s,c):(e.moveTo(s,c),u=!0)}e.stroke()};u(`k`,r.colors[0]??`#2962FF`),u(`d`,r.colors[1]??`#FF9800`)}};function Ut(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function Wt(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var Gt=class extends M{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9}};calculate(e,t){let n=P(t,`fast`,12,1),r=P(t,`slow`,26,1),i=P(t,`signal`,9,1),a=new Map,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=Kt(c,n),u=Kt(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=Kt(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];if(t)for(let e of[`value`,`signal`,`hist`]){let n=t[e];n!==void 0&&Math.abs(n)>l&&(l=Math.abs(n))}}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0),f=Math.max(1,o.width/(c-s+1)*.6);for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.hist;if(r===void 0)continue;let o=a(t,n),s=u(r);e.fillStyle=r>=0?`rgba(38,166,154,0.5)`:`rgba(239,83,80,0.5)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d)))}e.strokeStyle=r.colors[2]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let p=(t,o)=>{e.beginPath(),e.strokeStyle=o,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let l=!1;for(let r=s;r<=c&&r<i.length;r++){let o=i[r];if(!o||o[t]===void 0){l=!1;continue}let s=a(r,n),c=u(o[t]);l?e.lineTo(s,c):(e.moveTo(s,c),l=!0)}e.stroke()};p(`value`,r.colors[0]??`#2962FF`),p(`signal`,r.colors[1]??`#FF9800`)}};function Kt(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var qt=class extends M{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{}};calculate(e){let t=new Map,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=Jt(i,e,5)-Jt(i,e,34);for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let o={value:a[i]-r/5};t.set(e[i].time,o),n[i]=o}return{values:t,series:n}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}if(l===0)return;let u=e=>o.y+o.height*(1-(e+l)/(2*l)),d=u(0);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,d),e.lineTo(o.x+o.width,d),e.stroke(),e.setLineDash([]);let f=Math.max(1,o.width/(c-s+1)*.6),p;for(let t=s;t<=c&&t<i.length;t++){let r=i[t]?.value;if(r===void 0){p=void 0;continue}let o=a(t,n),s=u(r);e.fillStyle=(p===void 0?r>=0:r>=p)?`rgba(38,166,154,0.85)`:`rgba(239,83,80,0.85)`;let c=Math.min(s,d);e.fillRect(o-f/2,c,f,Math.max(1,Math.abs(s-d))),p=r}}};function Jt(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var Yt=class extends M{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5}};calculate(e,t){let n=P(t,`period`,20,1),r=P(t,`momentum`,5,1),i=new Map,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=e=>o.y+o.height*(1-e/100);e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[30,70]){let n=l(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#2962FF`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let u=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){u=!1;continue}let o=a(t,n),s=l(r.value);u?e.lineTo(o,s):(e.moveTo(o,s),u=!0)}e.stroke()}},Xt=class extends M{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}},Zt=class extends M{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8}};calculate(e,t){let n=P(t,`period`,8,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}render(e,t,n,r){R(e,t,n,r)}},Qt=class extends M{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=3;for(let e=s;e<=c&&e<i.length;e++){let t=i[e]?.value;t!==void 0&&Math.abs(t)>l&&(l=Math.abs(t))}let u=e=>o.y+o.height*(1-(e+l)/(2*l));e.strokeStyle=r.colors[1]??`#787B86`,e.lineWidth=1,e.setLineDash([4,4]);for(let t of[-3,0,3]){let n=u(t);e.beginPath(),e.moveTo(o.x,n),e.lineTo(o.x+o.width,n),e.stroke()}e.setLineDash([]),e.beginPath(),e.strokeStyle=r.colors[0]??`#2962FF`,e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let d=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(!r||r.value===void 0){d=!1;continue}let o=a(t,n),s=u(r.value);d?e.lineTo(o,s):(e.moveTo(o,s),d=!0)}e.stroke()}},$t=class extends M{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20}};calculate(e,t){let n=P(t,`period`,20,1),r=new Map,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},en=class extends M{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`panel`,defaultConfig:{rows:24}};calculate(e,t){let n=P(t,`rows`,24,1),r=new Map,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(e,t,n,r){let{chartRect:i}=n,a=t.meta;if(!a||a.maxVolume===0)return;let{minPrice:o,rows:s,rowHeight:c,bins:l,maxVolume:u}=a,d=i.height/s,f=i.width*.3;for(let t=0;t<s;t++){let a=(o+(t+.5)*c-n.priceRange.min)/(n.priceRange.max-n.priceRange.min),s=i.y+i.height*(1-a),p=l[t]/u*f;e.fillStyle=l[t]>u*.7?r.colors[1]??`rgba(255, 152, 0, 0.5)`:r.colors[0]??`rgba(33, 150, 243, 0.3)`,e.fillRect(i.x,s-d/2,p,Math.max(d-1,1))}}},tn=class extends M{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{}};calculate(e,t){let n=new Map,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d-f,m=e=>o.y+o.height*(1-(e-f)/p);e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let h=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=m(r.value);h?e.lineTo(i,o):(e.moveTo(i,o),h=!0)}}e.stroke()}},nn=class extends M{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14}};calculate(e,t){let n=P(t,`period`,14,1),r=new Map,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let{chartRect:o}=n,{from:s,to:c}=n.visibleRange,l=1/0,u=-1/0;for(let e=s;e<=c&&e<i.length;e++){let t=i[e];t&&t.value!==void 0&&(l=Math.min(l,t.value),u=Math.max(u,t.value))}if(l===1/0)return;let d=(u-l||1)*.1,f=l-d,p=u+d,m=p-f,h=e=>o.y+o.height*(1-(e-f)/m);0>=f&&0<=p&&(e.strokeStyle=`#787B86`,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(o.x,h(0)),e.lineTo(o.x+o.width,h(0)),e.stroke(),e.setLineDash([])),e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;let g=!1;for(let t=s;t<=c&&t<i.length;t++){let r=i[t];if(r&&r.value!==void 0){let i=a(t,n),o=h(r.value);g?e.lineTo(i,o):(e.moveTo(i,o),g=!0)}}e.stroke()}};function rn(e){e.register(new Ne),e.register(new Pe),e.register(new Fe),e.register(new Ie),e.register(new Le),e.register(new Re),e.register(new ze),e.register(new Be),e.register(new Ve),e.register(new Ue),e.register(new We),e.register(new Ge),e.register(new Ke),e.register(new qe),e.register(new Xe),e.register(new Ze),e.register(new Qe),e.register(new $e),e.register(new rt),e.register(new it),e.register(new at),e.register(new ot),e.register(new st),e.register(new ct),e.register(new lt),e.register(new ut),e.register(new dt),e.register(new ft),e.register(new pt),e.register(new mt),e.register(new ht),e.register(new $t),e.register(new en),e.register(new tn),e.register(new nn),e.register(new tt),e.register(new nt),e.register(new gt),e.register(new _t),e.register(new vt),e.register(new yt),e.register(new xt),e.register(new St),e.register(new wt),e.register(new Tt),e.register(new Et),e.register(new Dt),e.register(new kt),e.register(new At),e.register(new jt),e.register(new Mt),e.register(new Nt),e.register(new Pt),e.register(new Ft),e.register(new It),e.register(new zt),e.register(new Lt),e.register(new Bt),e.register(new Vt),e.register(new Ht),e.register(new Gt),e.register(new qt),e.register(new Yt),e.register(new Xt),e.register(new Zt),e.register(new Qt)}function an(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`number`?t.type===`result`||t.type===`pong`||t.type===`error`:!1}var on=class{worker;fallbackPlugins;timeoutMs;nextRequestId=1;pending=new Map;messageHandler;constructor(e,t={}){this.worker=e,this.fallbackPlugins=t.fallbackPlugins??new Map,this.timeoutMs=t.timeoutMs??3e4,this.messageHandler=e=>this.handleMessage(e),this.worker&&(this.worker.addEventListener(`message`,this.messageHandler),this.worker.addEventListener(`error`,this.messageHandler))}hasWorker(){return this.worker!==null}registerFallbackPlugin(e){this.fallbackPlugins.set(e.descriptor.id,e)}async calculate(e,t,n){if(!this.worker){let r=this.fallbackPlugins.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);return r.calculate(n,t)}let r=this.nextRequestId++,i={type:`calculate`,requestId:r,indicatorId:e,config:t,data:n};return new Promise((t,n)=>{let a={resolve:t,reject:n,timer:null};this.timeoutMs>0&&(a.timer=setTimeout(()=>{this.pending.delete(r),n(Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`))},this.timeoutMs)),this.pending.set(r,a),this.worker.postMessage(i)})}ping(){if(!this.worker)return Promise.resolve();let e=this.nextRequestId++;return new Promise((t,n)=>{let r={resolve:()=>t(),reject:n,timer:this.timeoutMs>0?setTimeout(()=>{this.pending.delete(e),n(Error(`Indicator worker ping timeout`))},this.timeoutMs):null};this.pending.set(e,r),this.worker.postMessage({type:`ping`,requestId:e})})}terminate(){this.worker&&=(this.worker.removeEventListener(`message`,this.messageHandler),this.worker.removeEventListener(`error`,this.messageHandler),this.worker.terminate(),null);for(let e of this.pending.values())e.timer&&clearTimeout(e.timer),e.reject(Error(`Indicator worker terminated`));this.pending.clear()}handleMessage(e){let t=e.data;if(t!==void 0){if(!an(t))return;this.dispatchResponse(t);return}let n=e.message??`Indicator worker error`;for(let[e,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(Error(n)),this.pending.delete(e)}dispatchResponse(e){let t=this.pending.get(e.requestId);if(t){if(this.pending.delete(e.requestId),t.timer&&clearTimeout(t.timer),e.type===`error`){t.reject(Error(e.message));return}if(e.type===`pong`){t.resolve(void 0);return}t.resolve(e.output)}}},sn=class{visible=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}render(t,n,r){if(!this.visible)return;let{chartRect:i,priceRange:a}=n;t.strokeStyle=r.grid,t.lineWidth=1;let o=a.max-a.min;if(o<=0)return;let s=1/o;t.beginPath();let c=(0,e.computeTickStep)(a.min,a.max,8),l=Math.ceil(a.min/c)*c;for(let e=l;e<=a.max;e+=c){let n=Math.round(i.y+i.height*(1-(e-a.min)*s))+.5;t.moveTo(i.x,n),t.lineTo(i.x+i.width,n)}let u=n.barWidth+n.barSpacing,d=Math.max(1,Math.ceil(80/u)),{from:f,to:p}=n.visibleRange,m=-n.offset+i.x+n.barWidth/2;for(let e=f;e<=p;e++){if(e%d!==0)continue;let n=Math.round(e*u+m)+.5;t.moveTo(n,i.y),t.lineTo(n,i.y+i.height)}t.stroke()}},cn=class{locale=`en-US`;setLocale(e){this.locale=e}render(t,n,r){let{chartRect:i,priceRange:a}=n,o=i.x+i.width,s=a.max-a.min;if(s<=0)return;let c=1/s;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o+.5,i.y),t.lineTo(o+.5,i.y+i.height),t.stroke(),t.globalAlpha=1;let l=(0,e.computeTickStep)(a.min,a.max,8),u=Math.ceil(a.min/l)*l,d=l<1?Math.ceil(-Math.log10(l))+1:2,f=`500 ${r.font.sizeSmall}px ${r.font.family}`,p=n.scaleMode??(n.logScale?`logarithmic`:`regular`),m=n.scaleBaseline,h=[];for(let t=u;t<=a.max;t+=l){let n=i.y+i.height*(1-(t-a.min)*c);h.push({y:n,text:(0,e.formatPriceScaleLabel)(t,p,m,d,this.locale)})}t.font=f,t.textBaseline=`middle`,t.textAlign=`left`,t.strokeStyle=r.axisLine,t.globalAlpha=.45,t.beginPath();for(let{y:e}of h)t.moveTo(o+1,e+.5),t.lineTo(o+4,e+.5);t.stroke(),t.globalAlpha=1,t.fillStyle=r.axisLabel;for(let{y:e,text:n}of h)t.fillText(n,o+8,e)}},ln=e=>e<10?`0`+e:``+e,un=class{tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}render(t,n,r,i,a){let{chartRect:o}=n,s=a??o.y+o.height;t.strokeStyle=r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(o.x,s+.5),t.lineTo(o.x+o.width,s+.5),t.stroke(),t.globalAlpha=1;let c=n.barWidth+n.barSpacing,l=Math.max(1,Math.ceil(80/c)),{from:u,to:d}=n.visibleRange,f=-n.offset+o.x+n.barWidth/2;t.font=`500 ${r.font.sizeSmall}px ${r.font.family}`,t.textBaseline=`top`,t.textAlign=`center`,t.fillStyle=r.axisLabel;let p=-1;for(let n=u;n<=d&&n<i.length;n++){if(n%l!==0)continue;let r=n*c+f,a=i[n].time,{day:o,month:u,hours:d,minutes:m}=(0,e.timeParts)(a>0xe8d4a51000?a:a*1e3,this.tzOffsetMinutes),h;o===p?h=`${ln(d)}:${ln(m)}`:(h=`${u}/${o}`,p=o),t.fillText(h,r,s+7)}let m=o.x+o.width-4,h=s+7;t.font=`500 ${r.font.sizeSmall-1}px ${r.font.family}`,t.textAlign=`right`,t.textBaseline=`top`,t.globalAlpha=.75,t.fillStyle=r.textSecondary,t.fillText((0,e.tzLabel)(this.tzOffsetMinutes),m,h),t.globalAlpha=1}},dn=class{panHandler=null;zoomHandler=null;crosshairHandler=null;axisDragHandler=null;alertDragHandler=null;axisViewportGetter=null;onAxisDoubleClick=null;measureHandlers=null;measuring=!1;onAltClick=null;onEscape=null;onConfirm=null;onClick=null;downPos=null;downMoved=!1;pressForClick=!1;drawingManager=null;tradingManager=null;paneResizeHandler=null;viewportGetter=null;onOverlayDirty=null;boundHandlers=[];lastTouchDist=0;lastTouchMid={x:0,y:0};touchActive=!1;touchStartPos={x:0,y:0};longPressTimer=null;longPressMs=500;longPressMaxMove=8;cachedRect=null;constructor(e){this.element=e}setOverlayDirtyCallback(e){this.onOverlayDirty=e}setPanHandler(e){this.panHandler=e}setZoomHandler(e){this.zoomHandler=e}setCrosshairHandler(e){this.crosshairHandler=e}setAltClickHandler(e){this.onAltClick=e}setEscapeHandler(e){this.onEscape=e}setConfirmHandler(e){this.onConfirm=e}setClickHandler(e){this.onClick=e}setMeasureHandlers(e){this.measureHandlers=e}setAxisDragHandler(e,t,n){this.axisDragHandler=e,this.axisViewportGetter=t,this.onAxisDoubleClick=n??null}setDrawingManager(e,t){this.drawingManager=e,this.viewportGetter=t}setAlertDragHandler(e){this.alertDragHandler=e}setTradingManager(e,t){this.tradingManager=e,this.viewportGetter=t}setPaneResizeHandler(e){this.paneResizeHandler=e}attach(){let e=()=>this.viewportGetter?.()??null,t=e=>{let t=this.axisViewportGetter?.();if(!t)return null;let n=t.chartRect;return e.y>n.y+n.height?`time`:e.x>n.x+n.width?`price`:null},n=n=>{this.invalidateRect();let r=this.getMousePos(n),i=e();this.downPos=r,this.downMoved=!1,this.pressForClick=!1;let a=t(r);if(a&&this.axisDragHandler){this.axisDragHandler.begin(a,r);return}if(!this.paneResizeHandler?.tryBegin(r)){if(n.shiftKey&&this.measureHandlers){this.measuring=!0,this.measureHandlers.begin(r),this.onOverlayDirty?.();return}if(n.altKey&&this.onAltClick){this.onAltClick(r);return}if(!(this.tradingManager&&i&&this.tradingManager.onPointerDown(r,i))&&!(this.drawingManager&&i&&this.drawingManager.onPointerDown(r,i))){if(this.alertDragHandler?.tryBegin(r)){this.onOverlayDirty?.();return}this.pressForClick=!0,this.panHandler?.onPointerDown(r)}}},r=n=>{let r=this.getMousePos(n),i=e();if(this.downPos&&!this.downMoved){let e=r.x-this.downPos.x,t=r.y-this.downPos.y;e*e+t*t>16&&(this.downMoved=!0)}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(r);return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(r);return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.move(r),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measureHandlers.move(r),this.onOverlayDirty?.();return}let a=t(r),o=this.paneResizeHandler?.cursorAt(r)??null;if(a===`price`?this.element.style.cursor=`ns-resize`:a===`time`?this.element.style.cursor=`ew-resize`:this.alertDragHandler?.isOverAlert(r)?this.element.style.cursor=`ns-resize`:o?this.element.style.cursor=o:(this.element.style.cursor===`ns-resize`||this.element.style.cursor===`ew-resize`)&&(this.element.style.cursor=``),this.tradingManager&&i&&this.tradingManager.onPointerMove(r,i)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}if(this.drawingManager&&i&&this.drawingManager.onPointerMove(r,i)){this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(r),this.crosshairHandler?.onPointerMove(r),this.onOverlayDirty?.()},i=()=>{if(this.axisDragHandler?.isActive()){this.axisDragHandler.end();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.end();return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.end(),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measuring=!1,this.measureHandlers.end(),this.onOverlayDirty?.();return}this.tradingManager?.onPointerUp()||this.drawingManager?.onPointerUp()||(this.panHandler?.onPointerUp(),this.pressForClick&&!this.downMoved&&this.downPos&&this.onClick&&this.onClick(this.downPos),this.pressForClick=!1,this.downPos=null)},a=e=>{let n=t(this.getMousePos(e));n&&this.onAxisDoubleClick&&this.onAxisDoubleClick(n)},o=()=>{this.panHandler?.onPointerUp(),this.drawingManager?.onPointerUp(),this.tradingManager?.onPointerUp(),this.alertDragHandler?.end(),this.paneResizeHandler?.end(),this.crosshairHandler?.onPointerLeave(),this.pressForClick=!1,this.downPos=null,this.onOverlayDirty?.()},s=e=>{e.preventDefault();let t=this.getMousePos(e);this.zoomHandler?.onWheel(e.deltaY,t)},c=e=>{if(e.key===`Escape`&&this.onEscape&&this.onEscape(),e.key===`Enter`&&this.onConfirm&&this.onConfirm()){e.preventDefault();return}this.drawingManager?.onKeyDown(e.key,e.ctrlKey||e.metaKey)&&e.preventDefault()},l=t=>{let n=e();!this.tradingManager||!n||this.tradingManager.onContextMenu(this.getMousePos(t),n)&&t.preventDefault()},u=n=>{if(n.preventDefault(),this.invalidateRect(),n.touches.length===1){let r=this.getTouchPos(n.touches[0]);this.touchStartPos=r;let i=t(r);if(i&&this.axisDragHandler){this.axisDragHandler.begin(i,r),this.touchActive=!0;return}if(this.paneResizeHandler?.tryBegin(r)){this.touchActive=!0;return}let a=e();if(this.tradingManager&&a&&this.tradingManager.onPointerDown(r,a)){this.touchActive=!0,this.onOverlayDirty?.();return}this.onAltClick&&(this.clearLongPress(),this.longPressTimer=setTimeout(()=>{this.longPressTimer=null,this.onAltClick?.(r),this.panHandler?.onPointerUp(),this.onOverlayDirty?.()},this.longPressMs)),this.panHandler?.onPointerDown(r),this.crosshairHandler?.onPointerMove(r),this.touchActive=!0}else n.touches.length===2&&(this.clearLongPress(),this.panHandler?.onPointerUp(),this.lastTouchDist=this.getTouchDistance(n.touches[0],n.touches[1]),this.lastTouchMid=this.getTouchMidpoint(n.touches[0],n.touches[1]),this.touchActive=!0)},d=t=>{if(t.preventDefault(),t.touches.length===1&&this.touchActive){let n=this.getTouchPos(t.touches[0]);if(this.longPressTimer){let e=n.x-this.touchStartPos.x,t=n.y-this.touchStartPos.y;Math.hypot(e,t)>this.longPressMaxMove&&this.clearLongPress()}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n),this.onOverlayDirty?.();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n),this.onOverlayDirty?.();return}let r=e();if(this.tradingManager&&r&&this.tradingManager.onPointerMove(n,r)){this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n)}else if(t.touches.length===2){let e=this.getTouchDistance(t.touches[0],t.touches[1]),n=this.getTouchMidpoint(t.touches[0],t.touches[1]);if(this.lastTouchDist>0){let t=(e/this.lastTouchDist-1)*.5;this.zoomHandler?.onWheel(-t*100,n)}let r=this.lastTouchMid.x-n.x;Math.abs(r)>1&&(this.panHandler?.onPointerDown(this.lastTouchMid),this.panHandler?.onPointerMove(n)),this.lastTouchDist=e,this.lastTouchMid=n}this.onOverlayDirty?.()},f=e=>{if(this.clearLongPress(),e.touches.length===0)this.axisDragHandler?.isActive()&&this.axisDragHandler.end(),this.paneResizeHandler?.end(),this.tradingManager?.onPointerUp(),this.panHandler?.onPointerUp(),this.crosshairHandler?.onPointerLeave(),this.touchActive=!1,this.lastTouchDist=0;else if(e.touches.length===1){let t=this.getTouchPos(e.touches[0]);this.panHandler?.onPointerDown(t)}},p=()=>this.invalidateRect(),m=()=>this.invalidateRect();this.element.addEventListener(`mousedown`,n),this.element.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i),this.element.addEventListener(`mouseleave`,o),this.element.addEventListener(`dblclick`,a),this.element.addEventListener(`wheel`,s,{passive:!1}),this.element.addEventListener(`contextmenu`,l),this.element.addEventListener(`touchstart`,u,{passive:!1}),this.element.addEventListener(`touchmove`,d,{passive:!1}),this.element.addEventListener(`touchend`,f),document.addEventListener(`keydown`,c),window.addEventListener(`resize`,p),this.element.addEventListener(`scroll`,m,{passive:!0}),this.boundHandlers.push(()=>this.element.removeEventListener(`mousedown`,n),()=>this.element.removeEventListener(`mousemove`,r),()=>document.removeEventListener(`mouseup`,i),()=>this.element.removeEventListener(`mouseleave`,o),()=>this.element.removeEventListener(`dblclick`,a),()=>this.element.removeEventListener(`wheel`,s),()=>this.element.removeEventListener(`contextmenu`,l),()=>this.element.removeEventListener(`touchstart`,u),()=>this.element.removeEventListener(`touchmove`,d),()=>this.element.removeEventListener(`touchend`,f),()=>document.removeEventListener(`keydown`,c),()=>window.removeEventListener(`resize`,p),()=>this.element.removeEventListener(`scroll`,m))}detach(){for(let e of this.boundHandlers)e();this.boundHandlers=[],this.cachedRect=null,this.clearLongPress()}clearLongPress(){this.longPressTimer&&=(clearTimeout(this.longPressTimer),null)}invalidateRect(){this.cachedRect=null}getRect(){return this.cachedRect||=this.element.getBoundingClientRect(),this.cachedRect}getMousePos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchPos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchDistance(e,t){return Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY)}getTouchMidpoint(e,t){let n=this.getRect();return{x:(e.clientX+t.clientX)/2-n.left,y:(e.clientY+t.clientY)/2-n.top}}},fn=class{dragging=!1;lastX=0;lastTime=0;velocity=0;momentumId=0;callback;friction=.92;constructor(e){this.callback=e}onPointerDown(e){this.dragging=!0,this.lastX=e.x,this.lastTime=Date.now(),this.velocity=0,this.stopMomentum()}onPointerMove(e){if(!this.dragging)return;let t=Date.now(),n=this.lastX-e.x,r=t-this.lastTime;r>0&&(this.velocity=n/r),this.lastX=e.x,this.lastTime=t,this.callback(n)}onPointerUp(){this.dragging&&(this.dragging=!1,Math.abs(this.velocity)>.1&&this.startMomentum())}startMomentum(){this.stopMomentum();let e=this.velocity*16,t=()=>{if(e*=this.friction,Math.abs(e)<.5){this.momentumId=0;return}this.callback(e),this.momentumId=requestAnimationFrame(t)};this.momentumId=requestAnimationFrame(t)}stopMomentum(){this.momentumId&&=(cancelAnimationFrame(this.momentumId),0)}},pn=class{callback;sensitivity;pendingDelta=0;pendingCenterX=0;rafId=0;constructor(e,t=.001){this.callback=e,this.sensitivity=t}onWheel(e,t){this.pendingDelta+=-e*this.sensitivity,this.pendingCenterX=t.x,this.rafId||=requestAnimationFrame(()=>{this.rafId=0;let e=this.pendingDelta,t=this.pendingCenterX;this.pendingDelta=0,this.callback(e,t)})}dispose(){this.rafId&&=(cancelAnimationFrame(this.rafId),0)}},mn=class{dragging=!1;axis=null;startPos={x:0,y:0};lastPos={x:0,y:0};moved=!1;threshold=3;sensitivity=.005;constructor(e,t){this.onPriceScale=e,this.onTimeScale=t}begin(e,t){this.dragging=!0,this.axis=e,this.startPos=t,this.lastPos=t,this.moved=!1}move(e){if(!this.dragging||!this.axis)return!1;let t=e.x-this.startPos.x,n=e.y-this.startPos.y;if(!this.moved&&Math.hypot(t,n)<this.threshold)return!1;if(this.moved=!0,this.axis===`price`){let t=e.y-this.lastPos.y,n=Math.exp(t*this.sensitivity);this.onPriceScale(n)}else{let t=e.x-this.lastPos.x,n=Math.exp(t*this.sensitivity);this.onTimeScale(n)}return this.lastPos=e,!0}end(){let e=this.dragging&&this.moved;return this.dragging=!1,this.axis=null,this.moved=!1,e}isActive(){return this.dragging}},hn=class{draggingId=null;constructor(e,t){this.alerts=e,this.viewportGetter=t}isOverAlert(e){let t=this.viewportGetter();return t?this.alerts.getAlertAtPoint(e,t)!==null:!1}tryBegin(e){let t=this.viewportGetter();if(!t)return!1;let n=this.alerts.getAlertAtPoint(e,t);return n?(this.draggingId=n.id,!0):!1}move(e){if(this.draggingId===null)return;let t=this.viewportGetter();t&&this.alerts.updateAlertPrice(this.draggingId,c(e.y,t))}end(){this.draggingId=null}isActive(){return this.draggingId!==null}},gn=class{state=null;layoutGetter=null;onResize=null;constructor(e=4){this.tolerance=e}configure(e,t){this.layoutGetter=e,this.onResize=t}hitTest(e,t){for(let n of t.dividers)if(_n(e,n.rect,this.tolerance)){let e=t.panels.find(e=>e.config.id===n.panelId);if(e)return{panelId:n.panelId,orientation:n.orientation,position:e.config.position,size:e.config.size}}return null}cursorAt(e){let t=this.layoutGetter?.();if(!t)return null;let n=this.hitTest(e,t);return n?n.orientation===`horizontal`?`ns-resize`:`ew-resize`:null}tryBegin(e){let t=this.layoutGetter?.();if(!t)return!1;let n=this.hitTest(e,t);return n?(this.state={panelId:n.panelId,position:n.position,startSize:n.size,startPos:e},!0):!1}move(e){let t=this.computeSize(e);t&&this.onResize?.(t.panelId,t.size)}computeSize(e){let t=this.state;if(!t)return null;let n=0;switch(t.position){case`bottom`:n=t.startPos.y-e.y;break;case`top`:n=e.y-t.startPos.y;break;case`left`:n=e.x-t.startPos.x;break;case`right`:n=t.startPos.x-e.x;break}return{panelId:t.panelId,size:t.startSize+n}}end(){this.state=null}isActive(){return this.state!==null}};function _n(e,t,n){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var vn=class{position=null;callback=null;data=[];tzOffsetMinutes=null;setTimezoneOffset(e){this.tzOffsetMinutes=e}magnetMode=!0;mode=`magnet`;pricePrecision=2;locale=`en-US`;pendingBarIndex=null;pendingPoint=null;callbackScheduled=!1;lastCallbackBarIndex=-1;setCallback(e){this.callback=e}setData(e){this.data=e}setMagnetMode(e){this.magnetMode=e,this.mode=e?`magnet`:`normal`}setMode(e){this.mode=e,this.magnetMode=e===`magnet`}getMode(){return this.mode}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}getPosition(){return this.position}onPointerMove(e){this.position=e}onPointerLeave(){this.position=null,this.pendingBarIndex=null,this.pendingPoint=null,this.lastCallbackBarIndex=-1,this.flushCallback(null,null)}render(e,t,n){if(!this.position||this.mode===`hidden`)return;let{chartRect:r}=t,{x:i,y:o}=this.position;if(i<r.x||i>r.x+r.width||o<r.y||o>r.y+r.height)return;let c=s(i,t);if(c=Math.max(0,Math.min(this.data.length-1,c)),this.magnetMode&&c>=0&&c<this.data.length&&(i=a(c,t)),c!==this.lastCallbackBarIndex&&(this.pendingBarIndex=c,this.pendingPoint={x:i,y:o},this.lastCallbackBarIndex=c,this.scheduleCallback()),this.magnetMode&&c>=0&&c<this.data.length){let a=t.barWidth+t.barSpacing,o=a/2;e.fillStyle=n.crosshair,e.globalAlpha=.08,e.fillRect(i-o,r.y,a,r.height),e.globalAlpha=1}e.setLineDash([4,4]),e.strokeStyle=n.crosshair,e.lineWidth=1,e.beginPath(),e.moveTo(Math.round(i)+.5,r.y),e.lineTo(Math.round(i)+.5,r.y+r.height),e.stroke(),e.beginPath(),e.moveTo(r.x,Math.round(o)+.5),e.lineTo(r.x+r.width,Math.round(o)+.5),e.stroke(),e.setLineDash([])}renderAxisLabels(t,n,r,i,o){if(!this.position||this.mode===`hidden`)return;let{chartRect:l}=n,{x:u,y:d}=this.position;if(u<l.x||u>l.x+l.width||d<l.y||d>l.y+l.height)return;let f=s(u,n);f=Math.max(0,Math.min(i.length-1,f)),this.magnetMode&&f>=0&&f<i.length&&(u=a(f,n));let p=`600 ${r.font.sizeSmall}px ${r.font.family}`;if(yn(t,{text:(0,e.formatPrice)(c(d,n),this.pricePrecision,this.locale),anchorX:l.x+l.width,anchorY:d,orientation:`right`,bg:r.text,fg:r.background,font:p}),f>=0&&f<i.length){let e=bn(i[f].time,this.tzOffsetMinutes),n=o??l.y+l.height;yn(t,{text:e,anchorX:u,anchorY:n,orientation:`bottom`,bg:r.text,fg:r.background,font:p})}}scheduleCallback(){this.callbackScheduled||(this.callbackScheduled=!0,queueMicrotask(()=>{this.callbackScheduled=!1,this.flushCallback(this.pendingBarIndex,this.pendingPoint)}))}flushCallback(e,t){this.callback?.(e,t)}};function yn(e,t){e.save(),e.font=t.font;let n=Math.ceil(e.measureText(t.text).width)+16;if(t.orientation===`right`){let r=t.anchorX+5,i=t.anchorY-20/2;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(r,t.anchorY-5),e.lineTo(r,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,t.anchorY+5),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`left`,e.fillText(t.text,r+8,t.anchorY)}else{let r=t.anchorX-n/2,i=t.anchorY+5;e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(t.anchorX+5,i),e.lineTo(r+n,i),e.lineTo(r+n,i+20),e.lineTo(r,i+20),e.lineTo(r,i),e.lineTo(t.anchorX-5,i),e.closePath(),e.fillStyle=t.bg,e.fill(),e.fillStyle=t.fg,e.textBaseline=`middle`,e.textAlign=`center`,e.fillText(t.text,t.anchorX,i+20/2)}e.restore()}function bn(t,n){let{month:r,day:i,hours:a,minutes:o}=(0,e.timeParts)(t>0xe8d4a51000?t:t*1e3,n);return`${r}/${i} ${a<10?`0`+a:a}:${o<10?`0`+o:o}`}var xn=class{callbacks;enabled=!0;constructor(e){this.callbacks=e}setEnabled(e){this.enabled=e}handleKey(e){if(!this.enabled)return!1;let t=e.shiftKey?10:1;switch(e.key){case`ArrowLeft`:return this.callbacks.scrollBars(-t),!0;case`ArrowRight`:return this.callbacks.scrollBars(t),!0;case`ArrowUp`:case`+`:case`=`:return this.callbacks.zoom(.1),!0;case`ArrowDown`:case`-`:return this.callbacks.zoom(-.1),!0;case`Home`:return this.callbacks.goToStart(),!0;case`End`:return this.callbacks.goToEnd(),!0;case` `:return this.callbacks.fitContent(),!0;default:return!1}}},Sn=class{el=null;visible=!1;timeEl;openEl;highEl;lowEl;closeEl;changeEl;volEl;measuredWidth=155;measuredHeight=95;measured=!1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`none`,zIndex:`100`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=this.addLine(this.el);let t=this.addLine(this.el),n=this.addLine(this.el);this.changeEl=this.addLine(this.el),this.volEl=this.addLine(this.el),t.append(this.label(`O `),this.openEl=this.val(),this.label(` H `),this.highEl=this.val()),n.append(this.label(`L `),this.lowEl=this.val(),this.label(` C `),this.closeEl=this.val()),e.appendChild(this.el)}show(e,t,n,r){if(!this.el)return;let i=t.close>=t.open?n.candleUp:n.candleDown,a=e=>e.toFixed(2),o=new Date(t.time);this.timeEl.textContent=`${o.getMonth()+1}/${o.getDate()} ${String(o.getHours()).padStart(2,`0`)}:${String(o.getMinutes()).padStart(2,`0`)}`,this.timeEl.style.color=n.textSecondary,this.openEl.textContent=a(t.open),this.highEl.textContent=a(t.high),this.lowEl.textContent=a(t.low),this.closeEl.textContent=a(t.close),this.openEl.style.color=i,this.highEl.style.color=i,this.lowEl.style.color=i,this.closeEl.style.color=i;let s=t.close-t.open,c=t.open===0?0:s/t.open*100,l=s>=0?`+`:``;this.changeEl.textContent=`${l}${a(s)} (${l}${c.toFixed(2)}%)`,this.changeEl.style.color=i;let u=t.volume;this.volEl.textContent=`Vol ${u>=1e6?(u/1e6).toFixed(1)+`M`:u>=1e3?(u/1e3).toFixed(1)+`K`:u.toFixed(0)}`,this.volEl.style.color=n.textSecondary;let d=Cn(n.background);this.el.style.background=d?wn(n.background,.95):wn(n.background,.97),this.el.style.border=`1px solid ${n.axisLine}`,this.el.style.boxShadow=d?`0 4px 12px rgba(0,0,0,0.5)`:`0 4px 12px rgba(0,0,0,0.15)`,this.el.style.color=n.text,this.el.style.backdropFilter=`blur(8px)`,!this.measured&&this.visible&&(this.measuredWidth=this.el.offsetWidth,this.measuredHeight=this.el.offsetHeight,this.measured=!0);let f=e.x+16,p=e.y-40;f+this.measuredWidth>r.width-80&&(f=e.x-this.measuredWidth-16),p<4&&(p=4),p+this.measuredHeight>r.height&&(p=r.height-this.measuredHeight-4),this.el.style.transform=`translate(${Math.round(f)}px, ${Math.round(p)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.visible||=(this.el.style.display=`block`,!0)}hide(){this.el&&this.visible&&(this.el.style.display=`none`,this.visible=!1)}isVisible(){return this.visible}destroy(){this.el?.remove(),this.el=null,this.visible=!1,this.measured=!1}addLine(e){let t=document.createElement(`div`);return e.appendChild(t),t}label(e){let t=document.createElement(`span`);return t.textContent=e,t.style.opacity=`0.6`,t}val(){return document.createElement(`span`)}};function Cn(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}let t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(t){let e=parseInt(t[1]),n=parseInt(t[2]),r=parseInt(t[3]);return(.299*e+.587*n+.114*r)/255<.5}return!0}function wn(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var Tn=class{el=null;deltaEl=null;timeEl=null;ohlcEl=null;pinnedBar=null;pinnedIndex=-1;create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`4px`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`auto`,cursor:`pointer`,zIndex:`99`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=document.createElement(`div`),this.ohlcEl=document.createElement(`div`),this.deltaEl=document.createElement(`div`),this.deltaEl.style.marginTop=`4px`,this.deltaEl.style.paddingTop=`4px`,this.deltaEl.style.borderTop=`1px solid currentColor`,this.deltaEl.style.opacity=`0.85`,this.deltaEl.style.fontVariantNumeric=`tabular-nums`,this.el.appendChild(this.timeEl),this.el.appendChild(this.ohlcEl),this.el.appendChild(this.deltaEl);let t=document.createElement(`div`);t.textContent=`📌 pinned`,t.style.fontSize=`9px`,t.style.opacity=`0.6`,t.style.marginBottom=`2px`,t.style.letterSpacing=`0.04em`,t.style.textTransform=`uppercase`,this.el.insertBefore(t,this.timeEl),e.appendChild(this.el)}pin(e,t,n){if(!this.el||!this.timeEl||!this.ohlcEl)return;this.pinnedBar=e,this.pinnedIndex=t;let r=e.close>=e.open?n.candleUp:n.candleDown,i=new Date(e.time>0xe8d4a51000?e.time:e.time*1e3);this.timeEl.textContent=`${i.getMonth()+1}/${i.getDate()} ${En(i.getHours())}:${En(i.getMinutes())}`,this.timeEl.style.color=n.textSecondary,this.ohlcEl.innerHTML=`
2
2
  <span style="opacity:.6">O </span><span style="color:${r}">${z(e.open)}</span>
3
3
  <span style="opacity:.6"> H </span><span style="color:${r}">${z(e.high)}</span>
4
4
  <span style="opacity:.6"> L </span><span style="color:${r}">${z(e.low)}</span>