1import{c as Os}from"./runtime-TpP8awPJ.js";import{a as J}from"./vendor-echarts-B9GXyg58.js";import Bs from"./html2canvas.esm-QH1iLAAe.js";import{d as Ps,o as Is,w as Ws,t as js,a5 as Ks,a6 as Us,a8 as Ke,R as Gs,aH as Vs,J as qs}from"./vendor-vue-gs8sh0JI.js";function Ys(G,Ae){const D=Os(G,Ae.onError),{byId:R}=D;try{let t=function(n){const e=yn[n];return e?e[F]||e.en:n},I=function(n){return n==null?"â":typeof n=="object"?n[F]||n.en:n},rn=function(n){return _n[n]||{en:n,cn:n,icon:"ð"}},kn=function(n){return Sn[n]||{en:n||"â",cn:n||"â",tone:"flat",icon:"â¹ï¸"}},Mn=function(n){const e=O(n.spread_arb)||{},a=((e.strategy||{}).current||{}).signal||((e.indicator||{}).current||{}).state;return a?I(Ln[a]||{en:Ge(a),cn:Ge(a)}):null},Tn=function(n,e){return Fn[n]||{en:e||n,cn:e||n,icon:"ð"}},ne=function(n){if(n==null||n==="")return"flat";const e=String(n).toLowerCase().trim().replace(/[\s\-]+/g,"_");return Rn.test(e)?"up":An.test(e)?"dn":"flat"},on=function(n){return n==null||!isFinite(n)||Math.abs(n)<1e-9?"flat":n>0?"up":"dn"},Ge=function(n){return String(n??"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())},q=function(n){const e=String(n??"").replace(/_/g," ").trim();if(!e)return"â";if(e.toLowerCase()==="unstudied")return F==="cn"?"å°æ åæµçç¥":"No backtested strategy yet";if(F==="cn"){const a=Dn[e.toLowerCase()];if(a)return a}return e.split(/\s+/).length<=3?Ge(e):e.charAt(0).toUpperCase()+e.slice(1)},ln=function(n){if(!n)return null;const e=String(n).toLowerCase();return/\b(no[\s_-]?trade|stand aside|flat|wait|neutral|observe)\b/.test(e)?I(Ne.wait):/narrow/.test(e)?I(Ne.narrow):/widen/.test(e)?I(Ne.widen):/fade/.test(e)?I(Ne.fade):/long/.test(e)?I(Ne.long):/short/.test(e)?I(Ne.short):String(n).length<=Nn?q(n):null},O=function(n){const e=n&&n.data;return!e||typeof e!="object"?null:"success"in e&&"data"in e?e.data||null:e},s=function(n){return String(n??"").replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e])},w=function(n,e){return e=e??2,n==null||!isFinite(+n)?"â":(+n).toLocaleString(void 0,{maximumFractionDigits:e})},V=function(n,e){return e=e??1,n==null||!isFinite(+n)?"â":(+n>0?"+":"")+(+n).toFixed(e)+"%"},U=function(n,e){return e=e??0,n==null||!isFinite(+n)?"â":"Â¥"+(+n).toLocaleString(void 0,{maximumFractionDigits:e})},te=function(n){if(!n)return"â";const e=new Date(String(n).length<=10?n+"T00:00:00Z":n);return isNaN(e)?String(n):e.toLocaleDateString(F==="cn"?"zh-CN":void 0,{year:"numeric",month:"short",day:"numeric",timeZone:"UTC"})},Hn=function(n){if(!n)return"â";const e=new Date(n);return isNaN(e)?String(n):e.toLocaleString(F==="cn"?"zh-CN":void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})},zn=function(n){try{return new URL(n).hostname.replace(/^www\./,"")}catch{return""}},de=function(n,e){return n?F!=="cn"?n[e]||null:n.zh&&n.zh[e]||n[e]||null:null},we=function(n,e){return!!(n&&F==="cn"&&n[e]&&!(n.zh&&n.zh[e]))},pe=function(n){return n?'<span class="tag" title="'+s(t("enSourceHint"))+'" style="margin-left:6px;color:var(--muted);font-weight:700">EN</span>':""},Ve=function(n,e){return n=n||{},F==="cn"?n[e+"_zh"]||(Array.isArray(n[e])?[]:""):n[e]||(Array.isArray(n[e+"_zh"])?[]:"")},qe=function(n,e){n=n||{};const a=n[e],i=Array.isArray(a)?a.length>0:!!a;return F==="cn"&&i&&!(Array.isArray(n[e+"_zh"])?n[e+"_zh"].length>0:n[e+"_zh"])},Ce=function(n,e,a){return'<span class="chip '+(a||ne(e))+'"><span class="dot"></span>'+(n?'<span class="lab">'+s(n)+"</span>":"")+s(q(e))+"</span>"},un=function(n){const e={low:1,medium:2,high:3}[String(n||"").toLowerCase()]||0;let a="";for(let i=1;i<=3;i++)a+='<i class="'+(i<=e?"f":"")+'"></i>';return'<span class="pips">'+a+"</span>"},Me=function(n,e,a){if(!a)return"";const i=!!T.open[n];return'<div class="disc"><button type="button" class="'+(i?"open":"")+'" data-report-action="tgl" data-report-value="'+n+'"><span>'+s(e)+'</span><span class="cv">â¾</span></button><div class="body'+(i?" show":"")+'">'+a+"</div></div>"},Oe=function(n){return s(n).replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/`([^`]+)`/g,"<code>$1</code>")},_e=function(n){if(!n)return"";const e=String(n).replace(/\r/g,"").split(` 2`),a=[];let i=0;const r=Oe,c=o=>/^\s*(#{2,4}\s|>|[-*]\s|\|)/.test(o);for(;i<e.length;){const o=e[i];if(!o.trim()){i++;continue}if(/^\s*\|/.test(o)&&/^\s*\|[\s:|\-]+\|\s*$/.test(e[i+1]||"")){const v=o.split("|").slice(1,-1).map(p=>p.trim());i+=2;const h=[];for(;i<e.length&&/^\s*\|/.test(e[i]);)h.push(e[i].split("|").slice(1,-1).map(p=>p.trim())),i++;a.push('<div class="tblwrap"><table class="tbl"><thead><tr>'+v.map(p=>"<th>"+r(p)+"</th>").join("")+"</tr></thead><tbody>"+h.map(p=>"<tr>"+p.map(b=>"<td>"+r(b)+"</td>").join("")+"</tr>").join("")+"</tbody></table></div>");continue}const l=o.match(/^\s*(#{2,4})\s+(.*)$/);if(l){a.push('<h4 class="md-h">'+r(l[2])+"</h4>"),i++;continue}if(/^\s*>/.test(o)){const v=[];for(;i<e.length&&/^\s*>/.test(e[i]);)v.push(e[i].replace(/^\s*>\s?/,"")),i++;a.push('<blockquote class="md-q">'+r(v.join(" ").trim())+"</blockquote>");continue}if(/^\s*[-*]\s/.test(o)){const v=[];for(;i<e.length&&/^\s*[-*]\s/.test(e[i]);)v.push(e[i].replace(/^\s*[-*]\s+/,"")),i++;a.push('<ul class="md-ul">'+v.map(h=>"<li>"+r(h)+"</li>").join("")+"</ul>");continue}const f=[o];for(i++;i<e.length&&e[i].trim()&&!c(e[i]);)f.push(e[i]),i++;a.push('<p class="md-p">'+r(f.join(" "))+"</p>")}return'<div class="md">'+a.join("")+"</div>"},Zs=function(n){return n?_e(n):'<div class="empty">'+s(t("noData"))+"</div>"},On=function(n,e){if(!n)return null;const a=String(n),i="(?=\\n[ \\t]*#{2,4}[ \\t]|\\n[ \\t]*\\*\\*[^*\\n]+\\*\\*[ \\t]*\\n|(?![\\s\\S]))",r=["^[ \\t]*#{2,4}[ \\t]*"+e+"[ \\t]*:?[ \\t]*\\n([\\s\\S]*?)"+i,"^[ \\t]*\\*\\*"+e+"[^*\\n]*\\*\\*[ \\t]*\\n([\\s\\S]*?)"+i];for(const c of r){const o=a.match(new RegExp(c,"im"));if(o&&o[1].trim())return o[1].trim()}return null},De=function(n,e){for(const a of e){const i=On(n,a);if(i)return i}return null}
2,$=function(n,e){const a=n&&String(n).match(e);return a?a[1].trim():null},Ye=function(n){if(!n)return null;const e=$(n,/\*\*(?:Outlook|屿)[:ï¼]\*\*\s*(.+)/);let a=e,i=null;if(e){const c=e.match(/^(\S+)\s*[ï¼(](?:confidence|置信度)[:ï¼]\s*([^)ï¼]+)[)ï¼]/);c&&(a=c[1],i=c[2].trim())}const r=De(n,["Key Drivers","Drivers","æ ¸å¿é©±å¨","å ³é®é©±å¨","主è¦é©±å¨å ç´ "]);return{supply:$(n,/\*\*(?:Supply\/Demand|ä¾é)[:ï¼]\*\*\s*(.+)/),outlook:a,conf:i,pvf:$(n,/\*\*(?:Price vs Fundamental|ä»·æ ¼ä¸åºæ¬é¢|ä»·æ ¼ vs åºæ¬é¢)[:ï¼]\*\*\s*(.+)/),summary:De(n,["Summary","Assessment","æè¦","æ»ç»","å°ç»"]),drivers:Bn(r),full:n}},Bn=function(n){if(!n)return null;const e=String(n).split(` 3`).filter(r=>/^\s*\|/.test(r));if(e.length<3)return null;const a=e[0].split("|").slice(1,-1).map(r=>r.trim()),i=e.slice(2).map(r=>r.split("|").slice(1,-1).map(c=>c.trim())).filter(r=>r.length===a.length);return i.length?{head:a,rows:i}:null},$e=function(n){if(!n)return null;const e=String(n).match(/(?:^|\n)((?:>\s?.*\n?)+)/);return{sentiment:$(n,/\*\*(?:Overall Sentiment|æ´ä½æ 绪|æ»ä½æ 绪)[:ï¼]\*\*\s*`?([a-z_]+)`?/i),lede:e?e[1].replace(/^\s*>\s?/gm,"").replace(/\n/g," ").trim():null,summary:De(n,["Summary","News Summary","æè¦","æ»ç»","æ°é»æè¦"]),full:n}},Xe=function(n){if(!n)return null;const e={},a=$(n,/(Recommendation=[^\n]+)/);a&&a.split("|").forEach(c=>{const o=c.indexOf("=");o>0&&(e[c.slice(0,o).trim().toLowerCase()]=c.slice(o+1).trim())});const i=[],r=De(n,["Module Outputs","Modules","模åè¾åº","模åç»æ"]);return r&&r.split(` 4`).forEach(c=>{const o=c.match(/^\s*-\s*([a-z_]+):\s*signal=([a-z_]+),\s*conf=([\d.]+),\s*summary=(.*)$/i);o&&i.push({name:o[1],signal:o[2],conf:parseFloat(o[3]),summary:o[4].trim()})}),{kv:e,mods:i,profile:$(n,/-\s*Profile:\s*(.+)/),rule:$(n,/-\s*Rule-based action:\s*(.+)/),full:n}},In=function(n){const e=String(n||"").split(` 5`),a=r=>r.replace(/[*`#]/g,"").trim(),i=r=>{const c=a(r).split(/[.;]/)[0].trim().replace(/[,:]+$/,"");return c&&c.length<=Pn?c:null};for(const r of e){const c=r.match(/Live signal\**\s*:\**\s*[`*]*([a-z][a-z_]{2,30})[`*]*/i);if(c)return c[1]}for(const r of[/recommended posture/i,/bottom line/i,/^\**posture\**\s*:/i])for(let c=0;c<e.length;c++){if(!r.test(e[c]))continue;const o=i(e[c].replace(new RegExp(".*"+r.source,"i"),""));if(o)return o;for(let l=c+1;l<Math.min(c+4,e.length);l++)if(a(e[l]))return i(e[l])}return null},Wn=function(n){let e=n.match(/^\s*[-*]\s*\*\*(.+?):\s*(.+?)\*\*\s*(?:\u2014|--|-|:)?\s*(.*)$/);return e?{k:e[1].trim(),v:e[2].trim(),note:e[3].trim()}:(e=n.match(/^\s*[-*]\s*([^:*]+?):\s*\*\*(.+?)\*\*\s*(?:\u2014|--|-|:)?\s*(.*)$/),e?{k:e[1].trim(),v:e[2].trim(),note:e[3].trim()}:(e=n.match(/^\s*[-*]\s*\*\*(.+?)\*\*\s*(?:\u2014|--|-)?\s*(.*)$/),e?{k:e[1].trim(),v:"",note:e[2].trim()}:null))},Ze=function(n){if(!n)return null;const e=[],a=De(n,["Spread condition","Condition summary","Conditions","Condition interpretation","ä»·å·®ç¶åµ","ä»·å·®æ¡ä»¶","ç¶åµè§£è¯»"]);return a&&a.split(` 6`).forEach(i=>{const r=Wn(i);r&&e.push(r)}),{posture:In(n),conds:e,full:n}},Be=function(n,e){if(!n)return null;const r=(String(n).split(/\n\s*\n/)[0]||"").split(/\n(?=\s*(?:\||\*\*|#{1,6}\s|\d+\.\s|FINAL VIEW|FINAL RECOMMENDATION|Bottom line))/i)[0].replace(/\s+/g," ").trim();return r?e&&r.length>e?r.slice(0,e).replace(/[\s,;:ï¼ãï¼ï¼]+$/,"")+"â¦":r:null},jn=function(n){if(!n)return null;let e=String(n).replace(/!\[[^\]]*\]\([^)]*\)/g," ").replace(/\[([^\]]{1,140}?)\]\([^)]*\)/g,"$1").replace(/(^|[\s(])#{1,6}(?=\s)/g,"$1").replace(/https?:\/\/\S+/g," ").replace(/-{2,}/g," ").replace(/\|/g," ").replace(/^\s{0,3}[-*>]\s?/gm,"").replace(/\*\*?/g,"").replace(/!?\[[^\]]*\]?(\([^)]*)?[\u2026]?\s*$/,"").replace(/[ \t]*\n[ \t]*/g," ").replace(/ {2,}/g," ").replace(/\s*[\u2026]+\s*$/,"").trim();return!e||e.length<40||e.split(/\s+/).filter(Boolean).length<8||!(/[.!?]\s+[A-Z\u4e00-\u9fff"']/.test(e)||new RegExp("(?<!\\d)[.!?]\\s*$").test(e)||/[ãï¼ï¼]/.test(e))?null:e},Pe=function(n){if(!n)return null;const e=String(n).replace(/^\s*(?:(?:Bull|Bear)\s+Analyst|å¤å¤´åæå¸|空头åæå¸)[:ï¼]\s*/i,"").trim(),a=$(e,/(?:FINAL VIEW|FINAL RECOMMENDATION|FINAL|æç»è§ç¹|æç»ç»è®º)\s*[:ï¼]?\s*([\s\S]*?)(?=\n\s*\n|\n\s*\d+\.\s|$)/i),i=$(e,/\n\s*1\.\s*(?:THE CRUX|\u6838\u5fc3\u77db\u76fe|\u6838\u5fc3\u5206\u6b67|\u6838\u5fc3\u95ee\u9898|\u5173\u952e\u5206\u6b67|\u5173\u952e\u95ee\u9898|\u6838\u5fc3\u4e89\u8bae)\s*\n([\s\S]*?)(?=\n\s*\d+\.\s|$)/i);return{headline:Be(a||e.split(/\n\s*\n/)[0],300),crux:Be(i,300),full:e}},Se=function(n,e,a){if(!n)return e;if(!e)return n;const i={...n};let r=!1;return a.forEach(c=>{!i[c]&&e[c]&&(i[c]=e[c],r=!0)}
6),i.enFallback=r,i},dn=function(n){return n?{verdict:$(n,/(?:Verdict|\u7ed3\u8bba|\u88c1\u5b9a|\u5224\u5b9a)[:\uff1a]\s*([\s\S]*?)(?=\n\s*\n|\nCRUX|$)/i),crux:$(n,/CRUX RESOLUTION\s*\n([\s\S]*?)(?=\n[A-Z][A-Z ]{5,}\n|$)/),full:n}:null},pn=function(n){if(!n)return null;const e=$(n,/confidence is [\w\s]*?at \*\*([\d.]+)\*\*/);return{rec:$(n,/[Ff]inal recommendation:\s*\*\*(.+?)\*\*/)||$(n,/[Rr]ecommendation:\s*\*\*(.+?)\*\*/),bias:$(n,/[Aa]ggregate bias is \*\*(.+?)\*\*/),conf:e?parseFloat(e):null,regime:$(n,/regime is \*\*(.+?)\*\*/),full:n}},Kn=function(n){const e=R("fc-chart");if(!e||typeof J>"u")return;const a=O(n.futures_risk)||{},i=a.history||{},r=a.forecast||{},c=a.risk_bounds||{},o=i.dates||[],l=i.close||[];if(l.length<2||!r.targets||!r.targets.length){ae&&(ae.dispose(),ae=null),e.innerHTML="";return}ae||(ae=D.chart(J,e,null,{renderer:"canvas"}));const f=l[l.length-1],v=y=>f*(1+y/100),h=oe.map(y=>{const N=r.targets.indexOf(y.k);return N<0?null:{h:r.horizon_td[N],pred:r.pred_pct[N],lo:r.band80_lo_pct[N],hi:r.band80_hi_pct[N],k:y.k}}).filter(Boolean).sort((y,N)=>y.h-N.h);if(!h.length){ae&&(ae.dispose(),ae=null),e.innerHTML="";return}const p=c&&c.horizon_td||[],b=h[h.length-1].h,S=p.length?p[p.length-1]:0,m=Math.max(b,S,1),C=Math.max(l.length-1,1),P=l.map((y,N)=>[N-C,y]),j=y=>o[Math.max(0,Math.min(o.length-1,Math.round(y)+C))],H=C*.55,A=y=>H*Math.sqrt(Math.max(y,0)/m),L=l[l.length-1]>=l[0]?"#0a8a3e":"#d70015",k=(y,N,M)=>{if(y<=N[0])return M[0];for(let E=1;E<N.length;E++)if(y<=N[E]){const le=(y-N[E-1])/(N[E]-N[E-1]);return M[E-1]+le*(M[E]-M[E-1])}return M[M.length-1]},z=[0].concat(h.map(y=>y.h)),K=[0].concat(h.map(y=>y.lo)),d=[0].concat(h.map(y=>y.hi)),u=48,g=[];for(let y=0;y<=u;y++){const N=b*y/u;g.push({x:A(N),lo:v(k(N,z,K)),hi:v(k(N,z,d))})}let _=[];if(p.length){const y=[0].concat(p),N=[0].concat(c.outer_dn_pct||[]),M=[0].concat(c.outer_up_pct||[]);for(let E=0;E<=u;E++){const le=S*E/u;_.push({x:A(le),lo:v(k(le,y,N)),hi:v(k(le,y,M))})}}const x=[[0,f]].concat(h.map(y=>[A(y.h),v(y.pred)])),B=[];if(T.horizon){const y=h.find(N=>N.k===T.horizon);y&&B.push({name:"sel",xAxis:A(y.h),yAxis:v(y.pred),symbolSize:11,itemStyle:{color:"#0071e3"}})}const W=[{xAxis:0,lineStyle:{color:"#c7c7cc",type:"dashed",width:1},label:{show:!1}}].concat(h.map(y=>{const N=oe.find(M=>M.k===y.k);return{xAxis:A(y.h),lineStyle:{color:"#e4e9f0",type:"dashed",width:1},label:{show:!0,formatter:N?I(N):y.h+"d",color:"#9ca3af",fontSize:9,position:"end"}}}));T.risk!=null&&p.indexOf(T.risk)>=0&&W.push({xAxis:A(T.risk),lineStyle:{color:"#8a5cf6",type:"solid",width:1.4,opacity:.85},label:{show:!1}});const Z=P.map(y=>y[1]).concat(g.map(y=>y.lo),g.map(y=>y.hi),_.map(y=>y.lo),_.map(y=>y.hi)).filter(y=>y!=null&&isFinite(y)),Y=Math.min.apply(null,Z),Q=Math.max.apply(null,Z),me=(Q-Y)*.08||Math.abs(Q)*.01||.01;ae.setOption({animation:!1,backgroundColor:"transparent",grid:{left:52,right:12,top:14,bottom:26},tooltip:{trigger:"axis",confine:!0,axisPointer:{type:"line"},formatter:function(y){const N=y[0];if(!N)return"";const M=Array.isArray(N.value)?N.value[0]:N.axisValue;let E;if(M<=0)E=te(j(M));else{const ue=Math.round(Math.pow(M/H,2)*m),ye=h.reduce((Le,mn)=>Math.abs(mn.h-ue)<Math.abs(Le.h-ue)?mn:Le,h[0]),ze=oe.find(Le=>Le.k===ye.k);E=ze?I(ze):ue+"d"}let le=s(E||"");if(y.forEach(ue=>{const ye=Array.isArray(ue.value)?ue.value[1]:null;ye!=null&&(ue.seriesName==="History"&&(le+="<br/>"+s(t("lnHistory"))+" "+w(ye,2)),ue.seriesName==="Forecast"&&(le+="<br/>"+s(t("lnCone"))+" "+w(ye,2)+" ("+V((ye/f-1)*100,2)+")"))}),M>0){const ue=k(Math.round(Math.pow(M/H,2)*m),z,K),ye=k(Math.round(Math.pow(M/H,2)*m),z,d);if(ue!=null&&ye!=null&&(le+="<br/>"+s(t("lnCone"))+" band "+w(v(ue),2)+" ⦠"+w(v(ye),2)),p.length){const ze=k(Math.round(Math.pow(M/H,2)*m),[0].concat(p),[0].concat(c.outer_dn_pct||[])),Le=k(Math.round(Math.pow(M/H,2)*m),[0].concat(p),[0].concat(c.outer_up_pct||[]));ze!=null&&Le!=null&&(le+="<br/>"+s(t("lnRisk"))+" "+w(v(ze),2)+" ⦠"+w(v(Le),2))}}return le}},xAxis:{type:"value",min:-C,max:H,axisLine:{lineStyle:{color:"#e4e9f0"}},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1}},yAxis:{type:"value",min:+(Y-me).toFixed(2),max:+(Q+me).toFixed(2),scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10}},series:[_.length?{name:"Risk corridor",type:"custom",silent:!0,z:1,data:[0],renderItem:(y,N)=>{if(y.dataIndex!==0)return;const M=[];for(const E of _)M.push(N.coord([E.x,E.hi]));for(let E=_.length-1;E>=0;
6E--)M.push(N.coord([_[E].x,_[E].lo]));return{type:"polygon",shape:{points:M},style:{fill:"rgba(138,92,246,.14)"}}}}:null,{name:"Forecast band",type:"custom",silent:!0,z:2,data:[0],renderItem:(y,N)=>{if(y.dataIndex!==0)return;const M=[];for(const E of g)M.push(N.coord([E.x,E.hi]));for(let E=g.length-1;E>=0;E--)M.push(N.coord([g[E].x,g[E].lo]));return{type:"polygon",shape:{points:M},style:{fill:L+"2e"}}}},{name:"History",type:"line",z:3,data:P,symbol:"none",lineStyle:{color:L,width:2},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:L+"29"},{offset:1,color:L+"00"}]}}},{name:"Forecast",type:"line",z:4,data:x,symbol:"circle",symbolSize:6,itemStyle:{color:L,borderColor:"#fff",borderWidth:1.2},lineStyle:{color:L,width:1.6,type:"dashed"},markLine:{silent:!0,symbol:"none",data:W},markPoint:B.length?{data:B,itemStyle:{borderColor:"#fff",borderWidth:1.5}}:void 0}].filter(Boolean)},!0)},Un=function(n){const e=n&&n.rows||{},a=(e.dates||[]).length,i=e.real_up_pct||[],r=e.real_dn_pct||[],c=e.ml_up_pct||[],o=e.ml_dn_pct||[];let l=0,f=0;for(let v=0;v<a;v++){const h=i[v];if(h==null||!isFinite(h))continue;l++;const p=r[v];(p!=null&&isFinite(p)&&p!==h?[h,p]:[h]).some(S=>c[v]!=null&&S>c[v]||o[v]!=null&&S<o[v])&&f++}return{n:a,resolved:l,breaches:f,unresolved:a-l,hasInner:(e.inner_dn_pct||[]).length===a&&a>0}},Gn=function(){const n=R("bd-plot");if(!n||typeof J>"u")return;const e=n.dataset.h,i=(((O((ee.data[ce]||{}).futures_risk)||{}).risk_bounds||{}).lookback||{})[e],r=i&&i.rows||{},c=r.dates||[];if(c.length<2){he&&(he.dispose(),he=null),n.innerHTML="";return}he||(he=D.chart(J,n,null,{renderer:"canvas"}));const o=r.ml_dn_pct||[],l=r.ml_up_pct||[],f=r.inner_dn_pct||[],v=r.inner_up_pct||[],h=r.naive_dn_pct||[],p=r.naive_up_pct||[],b=r.real_up_pct||[],S=r.real_dn_pct||[],m=c.length,C=f.length===m&&v.length===m,P=o.map((L,k)=>l[k]!=null&&L!=null?l[k]-L:null),j=C?f.map((L,k)=>v[k]!=null&&L!=null?v[k]-L:null):[],H=[],A=[];for(let L=0;L<m;L++){const k=b[L],z=S[L];if(k==null||!isFinite(k))continue;const K=l[L]!=null&&k>l[L]||o[L]!=null&&k<o[L];if((k>=0?H:A).push({value:[L,k],breach:K}),z!=null&&isFinite(z)&&z!==k){const d=l[L]!=null&&z>l[L]||o[L]!=null&&z<o[L];(z>=0?H:A).push({value:[L,z],breach:d})}}const X=L=>({symbolSize:k=>k.breach?7:4.4,itemStyle:{color:L?"#d70015":"#0a8a3e",borderColor:k=>k.breach?"#fff":"transparent",borderWidth:k=>k.breach?1.5:0,opacity:k=>k.breach?1:.65}});he.setOption({animation:!1,backgroundColor:"transparent",grid:{left:44,right:12,top:14,bottom:46},tooltip:{trigger:"axis",confine:!0,axisPointer:{type:"line"},formatter:function(L){const k=L[0]?L[0].dataIndex:null;if(k==null)return"";const z=x=>x==null||!isFinite(x)?"â":(x>0?"+":"")+x.toFixed(2)+"%",K=(x,B)=>x==null||B==null?"â":z(x)+" ⦠"+z(B),d=b[k],u=S[k],g=d!=null&&isFinite(d);let _=s(te(c[k]));return g?u!=null&&isFinite(u)&&u!==d?_+="<br/>"+s(t("bdLnUp"))+" "+z(d)+"<br/>"+s(t("bdLnDn"))+" "+z(u):_+="<br/>"+s(t("bdTipReal"))+" "+z(d):_+="<br/>"+s(t("bdTipReal"))+" "+s(t("bdTipPending")),_+="<br/>"+s(t("bdLnMl"))+" "+K(o[k],l[k]),C&&(_+="<br/>"+s(t("bdLnInner"))+" "+K(f[k],v[k])),_+="<br/>"+s(t("bdLnNaive"))+" "+K(h[k],p[k]),_}},xAxis:{type:"category",data:c,boundaryGap:!1,axisLine:{lineStyle:{color:"#e4e9f0"}},axisLabel:{color:"#9ca3af",fontSize:10,formatter:te,hideOverlap:!0}},yAxis:{type:"value",scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10,formatter:function(L){return(L>0?"+":"")+L+"%"}}},dataZoom:[{type:"inside",start:0,end:100},{type:"slider",bottom:2,height:14,borderColor:"#e4e9f0",fillerColor:"rgba(99,102,241,.12)"}],series:[{name:"naiveLo",type:"line",data:h,symbol:"none",lineStyle:{color:"#aeaeb2",width:1,type:"dashed"},silent:!0},{name:"naiveHi",type:"line",data:p,symbol:"none",lineStyle:{color:"#aeaeb2",width:1,type:"dashed"},silent:!0},{name:"mlLo",type:"line",data:o,stack:"ml",symbol:"none",lineStyle:{opacity:0},areaStyle:{opacity:0},silent:!0},{name:"ML corridor",type:"line",data:P,stack:"ml",symbol:"none",lineStyle:{color:"#5856d6",width:1.4,opacity:.9},areaStyle:{color:"#5856d6",opacity:.09},silent:!0}].concat(C?[{name:"innerLo",type:"line",data:f,stack:"inner",symbol
6:"none",lineStyle:{opacity:0},areaStyle:{opacity:0},silent:!0},{name:"ML corridor (inner)",type:"line",data:j,stack:"inner",symbol:"none",lineStyle:{opacity:0},areaStyle:{color:"#5856d6",opacity:.14},silent:!0}]:[]).concat([{name:"Realized rise",type:"scatter",data:H,...X(!0)},{name:"Realized drop",type:"scatter",data:A,...X(!1)}])},!0)},fn=function(n,e,a,i){if(!n||typeof J>"u")return;const r=(e||[]).map(c=>c==null?null:Number(c));if(r.filter(c=>c!=null&&isFinite(c)).length<2){ve&&(ve.dispose(),ve=null),n.innerHTML="";return}ve||(ve=D.chart(J,n,null,{renderer:"canvas"})),ve.setOption({animation:!1,backgroundColor:"transparent",grid:{left:2,right:2,top:6,bottom:2,containLabel:!1},tooltip:{trigger:"axis",confine:!0,axisPointer:{type:"line"},formatter:function(c){const o=c[0].data;return c[0].dataIndex+1+": "+(o==null?"â":w(o,3))}},xAxis:{type:"category",data:r.map((c,o)=>o+1),show:!1,boundaryGap:!1},yAxis:{type:"value",scale:!0,show:!1},dataZoom:[{type:"inside"}],series:[{type:"line",data:r,symbol:"none",connectNulls:!0,lineStyle:{color:a,width:2},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:a+"33"},{offset:1,color:a+"02"}]}},markLine:i!=null?{silent:!0,symbol:"none",lineStyle:{color:"#d8d8dd",type:"dashed"},data:[{yAxis:i}]}:void 0}]},!0)},Vn=function(n){const e=O(n.trading_analysis)||{},a=e.decision_json||{},i=!!(e.zh&&Object.keys(e.zh).length),r=90,c=!de(e,"final_decision")&&F==="cn"&&!!(e.final_decision||a.action),o=de(e,"final_decision")||a.action||"",l=String(o).split(` 7`).map(x=>x.trim()).filter(Boolean)[0]||"",f=String(a.action||l).toLowerCase().split(/[\s\-]/)[0],v=l.length<=r?l:l.slice(0,r).trim()+"â¦",h=ne(f==="hold"?"neutral":f),p=f==="buy"||f==="long"?"ð":f==="sell"||f==="short"?"ð":"â",b=F==="cn"&&!(e.zh&&e.zh.decision_reason)&&!!a.reason,S=F==="cn"&&e.zh&&e.zh.decision_reason||a.reason,C=(O(n.futures_risk)||{}).forecast||{},P=(C.targets||[]).indexOf("d21"),j=P>=0?C.pred_pct[P]:null,H=Ye(e.fundamentals_report),A=$e(e.news_report),X=Xe(e.statistical_analysis),L=Ze(e.spread_report),k=O(n.spread_arb)||{},z=L&&L.posture||k.strategy&&k.strategy.current&&k.strategy.current.signal||null,K=[{k:t("consFore"),v:j!=null?V(j,2):"â",tn:on(j),h:t("consFore1M")},{k:t("consFund"),v:q(H&&H.outlook),tn:ne(H&&H.outlook),h:t("consFundH")},{k:t("consNews"),v:q(A&&A.sentiment),tn:ne(A&&A.sentiment),h:t("consNewsH")},{k:t("consSpread"),v:ln(z)||Mn(n)||"â",tn:ne(z),h:t("consSpreadH")},{k:t("consStats"),v:q(X&&X.kv.recommendation),tn:ne(X&&X.kv.recommendation),h:t("consStatsH")}],d=K.filter(x=>x.tn==="up").length,u=K.filter(x=>x.tn==="dn").length,g=K.filter(x=>x.tn==="flat").length;let _;return g>=3?_=t("agreeNeutral"):d>=3||u>=3?_=t("agreeStrong"):_=t("agreeMixed"),'<div class="sec" id="s-verdict"><div class="sec-hd"><span class="sec-n">3</span><span class="sec-t"><span class="em">ð¯</span>'+s(t("secVerdict"))+'</span></div><div class="sec-sub">'+s(t("secVerdictSub"))+'</div><div class="hero '+h+'"><div class="hic">'+p+'</div><div class="hbd"><div class="htl">'+s(v||"â")+pe(c)+"</div>"+(S?'<div class="hsb">'+s(S)+pe(b&&!c)+"</div>":"")+"</div></div>"+(F==="cn"&&!i&&(e.final_decision||e.fundamentals_report)?'<div class="wellnote warn" style="margin-top:10px">'+s(t("zhUnavailable"))+"</div>":"")+'<div class="cons">'+K.map(x=>'<div class="cons-c '+x.tn+'"><div class="k">'+s(x.k)+'</div><div class="v">'+s(x.v)+'</div><div class="h">'+s(x.h)+"</div></div>").join("")+'</div><div class="agree">'+s(t("agreeLead"))+": <b>"+d+"</b> "+s(t("agreeBull"))+" · <b>"+u+"</b> "+s(t("agreeBear"))+" · <b>"+g+"</b> "+s(t("agreeFlat"))+". "+s(_)+"</div></div>"},qn=function(n){const e=n.futures_risk||{},a=O(e);if(e.status!=="ok"||!a)return"";const i=Yn(a);return'<div class="sec" id="s-forecast"><div class="sec-hd"><span class="sec-n">4</span><span class="sec-t"><span class="em">ð</span>'+s(t("secForecast"))+'</span></div><div class="sec-sub">'+s(t("secForecastSub"))+"</div>"+i+"</div>"},Yn=function(n){const e=n.forecast||{},a=n.risk_bounds||{},i=n.winners||{},r=n.history||{},c=Math.round((n.band_level||.8)*100);let o;if(T.horizon){const d=oe.find(x=>x.k===T.horizon),u=(e.targets||[]).indexOf(T.horizon),g=i[T.horizon]||{},_=g.accuracy!=null?Math.round(g.accuracy*100):null;o='<div class="callout"><b>'+s(I(d))+"</b> · "+s(t("expChange"))+" <b>"+V(e.pred_pct[u],2)+"</b>, "+s(t("likelyRange"))+" <b>"+V(e.band80_lo_pct[u],1)+" ⦠"+V(e.band80_hi_pct[u],1)+"</b>"+(_!=null?", "+s(t("histAcc"))+" <b>"+_+"%</b>":"")+".</div>"}else if(T.risk){const d=(a.horizon_td||[]).indexOf(T.risk);o='<div class="callout risk"><b>'+s(I(Ue[T.risk]||{en:T.risk+"d",cn:T.risk+"天"}))+"</b> · "+s(t("riskPlan"))+" <b>"+V(a.outer_dn_pct[d],1)+" ⦠"+V(a.outer_up_pct[d],1)+"</b>. "+s(t("notPrediction"))+"</div>"}else o='<div class="callout">
7'+s(t("tapHint"))+"</div>";const l=oe.map(d=>{const u=(e.targets||[]).indexOf(d.k);if(u<0)return"";const g=i[d.k]||{},_=!!g.beats_rw,x=T.horizon===d.k;return'<button type="button" class="fc'+(_?" beat":"")+(x?" on":"")+'" data-report-action="pickH" data-report-value="'+d.k+'"><span class="bg '+(_?"y":"n")+'">'+s(t(_?"beatsRw":"refOnly"))+'</span><span class="hl">'+s(I(d))+'</span><span class="hp '+on(e.pred_pct[u])+'">'+V(e.pred_pct[u],2)+'</span><span class="hr">'+V(e.band80_lo_pct[u],1)+" ⦠"+V(e.band80_hi_pct[u],1)+"</span></button>"}).join(""),f=oe.some(d=>{const u=i[d.k]||{};return u.accuracy_recent!=null||u.mape_recent!=null||u.mae_recent!=null||u.coverage_80_recent!=null}),v=f&&T.accView==="recent",h='<span style="color:var(--muted);font-size:11px">â</span>',p=(d,u)=>{if(!v)return d[u];const g=d[u+"_recent"];return g??void 0},b=d=>{const u=p(d,"mape");return u??p(d,"mae")},S={dir:d=>{const u=p(d,"accuracy");if(u==null)return null;const g=Math.round(u*100);return'<div class="gauge" style="background:conic-gradient('+(g>=60?"var(--green)":g>=53?"var(--amber)":"var(--muted2)")+" calc("+g+'*1%),var(--fill2) 0)"><div class="hole">'+g+"%</div></div>"},pt:d=>{const u=b(d);if(u==null)return null;const g=!v&&d.beats_rw?'<span class="s pos">â'+Math.abs(d.mae_skill_pct||0).toFixed(1)+"% "+s(t("vsRw"))+"</span>":"";return'<div class="ptc"><span class="m">±'+(u*100).toFixed(2)+"%</span>"+g+"</div>"},band:d=>{const u=p(d,"coverage_80");if(u==null)return null;const g=Math.round(u*100),_=g>=78?"var(--green)":g>=70?"var(--amber)":"var(--red)";return'<div class="bdc"><div class="w"><i style="width:'+Math.min(g,100)+"%;background:"+_+'"></i></div><span class="l" style="color:'+_+'">'+g+"%"+(g>=78?" â":"")+"</span></div>"}},m=[{k:"dir",h:"colDir",hint:"colDirH"},{k:"pt",h:"colPt",hint:"colPtH"},{k:"band",h:"colBand",hint:"colBandH"}].filter(d=>oe.some(u=>S[d.k](i[u.k]||{})!==null)),C=' style="--acc-cols:64px'+m.map(()=>" 1fr").join("")+'"',P='<div class="acch"'+C+"><div></div>"+m.map(d=>'<div class="col"><span class="h">'+s(t(d.h))+'</span><span class="hint">'+s(t(d.hint))+"</span></div>").join("")+"</div>",j=oe.map(d=>{const u=i[d.k]||{};return'<div class="accr"'+C+'><span class="hl">'+s(I(d))+"</span>"+m.map(g=>S[g.k](u)||h).join("")+"</div>"}).join(""),H=oe.filter(d=>{const u=i[d.k]||{};return p(u,"accuracy")==null&&u.winner==="rw"}),A=oe.map(d=>i[d.k]).find(Boolean)||{},X=A.backtest_years!=null||A.recent_days!=null,L='<div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px">'+(f?'<div class="seg"><button type="button" class="'+(v?"":"on")+'" data-report-action="setAcc" data-report-value="overall">'+s(t("viewOverall"))+'</button><button type="button" class="'+(v?"on":"")+'" data-report-action="setAcc" data-report-value="recent">'+s(t("viewRecent"))+"</button></div>":"")+(X?'<span style="font-size:10.5px;color:var(--muted);font-weight:500">'+s(t(v?"winRecent":"winOverall").replace("{y}",A.backtest_years!=null?A.backtest_years:"?").replace("{d}",A.recent_days!=null?A.recent_days:252))+"</span>":"")+"</div>"+(v?'<div style="font-size:10.5px;color:var(--muted);margin:-4px 0 10px">'+s(t("recentCaveat"))+"</div>":""),k=oe.filter(d=>{const u=(e.targets||[]).indexOf(d.k);return u>=0&&Math.abs(e.pred_pct[u]||0)<.005&&(i[d.k]||{}).winner==="rw"}),z=(a.horizon_td||[]).map((d,u)=>{const g=[].concat(a.outer_up_pct||[],a.outer_dn_pct||[]).map(Math.abs),_=Math.max.apply(null,g.concat([1])),x=Q=>(Q+_)/(2*_)*100,B=x(a.outer_dn_pct[u]),W=x(a.outer_up_pct[u]),Z=x(a.inner_dn_pct[u]),Y=x(a.inner_up_pct[u]);return'<div class="rr'+(T.risk===d?" on":"")+'" data-report-action="pickR" data-report-value="'+d+'"><span class="h">'+s(I(Ue[d]||{en:d+"d",cn:d+"天"}))+'</span><div class="tk"><span class="out" style="left:'+B+"%;width:"+Math.max(W-B,1)+'%"></span><span class="inn" style="left:'+Z+"%;width:"+Math.max(Y-Z,1)+'%"></span><span class="zero" style="left:50%"></span></div><div class="vs"><span class="d">'+V(a.outer_dn_pct[u],1)+'</span><span class="u">'+V(a.outer_up_pct[u],1)+"</span></div></div>"}).join(""),K=r.dates&&r.dates.length?r.dates.length/252||0:null;return'<div class="chartwrap"><div id="fc-chart" style="height:220px"></div></div>'+(r.dates&&r.dates.length?'<div class="chartcap"><span>'+te(r.dates[0])+" · â"+K.toFixed(1)+(F==="cn"?"å¹´":"yr")+"</span><span>"+te(r.dates[r.dates.length-1])+" â +3mo</span></div>":"")+'<div class="sec-sub" style="margin:6px 0 0">'+s(t("scaleBreakNote"))+'</div><div class="legend"><span><i class="sw" style="background:#0a8a3e"></i>'+s(t("lnHistory"))+'</span><span><i class="sw" style="background:rgba(10,138,62,.45)"></i>'+s(t("lnCone"))+" ("+c+'%)</span><span><i class="sw" style="background:#8a5cf6"></i>'+s(t("lnRisk"))+"</span></div>"+o+'<div class="subhd">
7'+s(t("hzForecast"))+"</div>"+(k.length?'<div class="sec-sub" style="margin-bottom:10px">'+s(t("flatNote"))+"</div>":"")+'<div class="fcgrid">'+l+'</div><div class="subhd">'+s(t("hzAccuracy"))+'</div><div class="sec-sub" style="margin-bottom:10px">'+s(t("hzAccuracySub"))+"</div>"+L+P+j+(H.length?'<div class="sec-sub" style="margin-top:9px">'+s(t("noDirNote").replace("{h}",H.map(d=>I(d)).join(F==="cn"?"ã":", ")))+"</div>":"")+'<div class="subhd">'+s(t("riskTitle"))+'</div><div class="sec-sub" style="margin-bottom:12px">'+s(t("riskSub"))+'</div><div class="riskrows">'+z+'</div><div class="legend"><span><i class="sw" style="background:rgba(215,0,21,.55)"></i>'+s(t("down"))+'</span><span><i class="sw" style="background:rgba(10,138,62,.55)"></i>'+s(t("up"))+"</span></div>"+$n(a)},$n=function(n){const e=n&&n.lookback||{},a=Object.keys(e).map(Number).filter(b=>((e[String(b)]||{}).rows||{}).dates).sort((b,S)=>b-S);if(!a.length)return"";const i=a.indexOf(T.risk)>=0?T.risk:a[0],r=e[String(i)],c=Un(r);if(c.n<2)return"";const o=r.coverage||{},l=b=>I(Ue[b]||{en:b+"d",cn:b+"天"}),f=a.length>1?'<div class="seg bdseg">'+a.map(b=>'<button type="button" class="'+(b===i?"on":"")+'" data-report-action="pickR" data-report-value="'+b+'">'+s(l(b))+"</button>").join("")+"</div>":"",v=b=>b==null?"â":Math.round(b*100)+"%",h=o.ml!=null?'<div class="bdcov"><span><b>'+v(o.ml)+"</b> "+s(t("bdCovMl"))+"</span>"+(o.ml_inner!=null?"<span><b>"+v(o.ml_inner)+"</b> "+s(t("bdCovInner"))+"</span>":"")+"<span><b>"+v(o.naive)+"</b> "+s(t("bdCovNaive"))+'</span><span class="n">'+s(t("bdCovN").replace("{n}",o.n||0))+"</span></div>":"",p=c.resolved?t("bdBreachCnt").replace("{n}",c.breaches).replace("{t}",c.resolved).replace("{p}",Math.round(c.breaches/c.resolved*100)):"";return'<div class="subhd" style="margin-top:22px">'+s(t("bdTitle"))+'</div><div class="sec-sub" style="margin-bottom:11px">'+s(t("bdSub").replace("{h}",l(i)))+"</div>"+f+'<div class="bdwrap"><div class="bdplot" id="bd-plot" data-h="'+i+'"></div></div><div class="legend"><span><i class="sw" style="background:var(--purple)"></i>'+s(t("bdLnMl"))+"</span>"+(c.hasInner?'<span><i class="sw" style="background:rgba(88,86,214,.28)"></i>'+s(t("bdLnInner"))+"</span>":"")+'<span><i class="sw" style="background:var(--muted2)"></i>'+s(t("bdLnNaive"))+'</span><span><i class="sw dot" style="background:var(--red)"></i>'+s(t("bdLnUp"))+'</span><span><i class="sw dot" style="background:var(--green)"></i>'+s(t("bdLnDn"))+'</span><span><i class="sw dot ring" style="background:var(--red)"></i>'+s(t("bdLnBreach"))+"</span></div>"+h+'<div class="volnote">'+s(t("bdNote").replace("{h}",l(i)))+(p?" "+s(p):"")+(c.unresolved?" "+s(t("bdUnresolved").replace("{n}",c.unresolved).replace("{h}",l(i))):"")+"</div>"},Xn=function(){const n=R("sp-plot");if(!n||typeof J>"u")return;const e=O((ee.data[ce]||{}).spot_curve),a=e&&e.dates||[];if(a.length<2){be&&(be.dispose(),be=null),n.innerHTML="";return}be||(be=D.chart(J,n,null,{renderer:"canvas"}));const i=e.futures||[],r=e.near_spot||[],c=e.far_spot||[],o=(l,f)=>l[f]==null||i[f]==null||!isFinite(l[f])||!isFinite(i[f])?null:l[f]-i[f];be.setOption({animation:!1,backgroundColor:"transparent",grid:{left:52,right:12,top:14,bottom:46},tooltip:{trigger:"axis",confine:!0,axisPointer:{type:"line"},formatter:function(l){const f=l[0]?l[0].dataIndex:null;if(f==null)return"";const v=p=>p==null||!isFinite(p)?"â":w(p,0),h=p=>p==null?"":" ("+(p>=0?"+":"")+w(p,0)+")";return s(te(a[f]))+"<br/>"+s(t("spLnFut"))+" "+v(i[f])+"<br/>"+s(t("spLnNear"))+" "+v(r[f])+h(o(r,f))+"<br/>"+s(t("spLnFar"))+" "+v(c[f])+h(o(c,f))}},xAxis:{type:"category",data:a,boundaryGap:!1,axisLine:{lineStyle:{color:"#e4e9f0"}},axisLabel:{color:"#9ca3af",fontSize:10,formatter:te,hideOverlap:!0}},yAxis:{type:"value",scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10,formatter:function(l){return w(l,0)}}},dataZoom:[{type:"inside",start:0,end:100},{type:"slider",bottom:2,height:14,borderColor:"#e4e9f0",fillerColor:"rgba(99,102,241,.12)"}],series:[{name:t("spLnFar"),type:"line",data:c,symbol:"none",connectNulls:!0,lineStyle:{color:Je.far,width:1.5}},{name:t("spLnNear"),type:"line",data:r,symbol:"none",connectNulls:!0,lineStyle:{color:Je.near,width:1.5}},{name:t("spLnFut"),type:"line",data:i,symbol:"none",connectNulls:!0,lineStyle:{color:Je.futures,width:1.8}}]},!0)},Zn=function(n){const e=n.spot_curve||{};if(e.status!=="ok")return"";const a=O(e);
7if(!a||!(a.dates||[]).length)return"";const i=a.latest||{},r=(l,f,v)=>'<div class="spchip"><i style="background:'+v+'"></i><span class="k">'+s(l)+'</span><span class="v">'+w(f,0)+"</span></div>",c=i.near_spot!=null&&i.futures!=null?i.near_spot-i.futures:null,o=i.far_spot!=null&&i.futures!=null?i.far_spot-i.futures:null;return'<div class="sec" id="s-spot"><div class="sec-hd"><span class="sec-t"><span class="em">ð¢</span>'+s(t("spTitle"))+"</span>"+(a.as_of?'<span class="sec-x"><span class="tag">'+s(t("asOf"))+" "+s(a.as_of)+"</span></span>":"")+'</div><div class="sec-sub">'+s(t("spSub"))+'</div><div class="spchips">'+r(t("spLnFut"),i.futures,Fe.futures)+r(t("spLnNear"),i.near_spot,Fe.near)+r(t("spLnFar"),i.far_spot,Fe.far)+'</div><div class="bdwrap"><div class="bdplot" id="sp-plot"></div></div><div class="legend"><span><i class="sw" style="background:'+Fe.futures+'"></i>'+s(t("spLnFut"))+'</span><span><i class="sw" style="background:'+Fe.near+'"></i>'+s(t("spLnNear"))+'</span><span><i class="sw" style="background:'+Fe.far+'"></i>'+s(t("spLnFar"))+'</span></div><div class="volnote">'+s(t("spNote"))+(c!=null||o!=null?" "+s(t("spBasis").replace("{near}",(c>=0?"+":"")+w(c,0)).replace("{far}",(o>=0?"+":"")+w(o,0))):"")+' <span class="sp-contnote">'+s(t("spContNote"))+"</span></div></div>"},Qn=function(){ge&&!ge.isDisposed()&&ge.dispose(),ge=null},es=function(n,e){if(!n||!n.length)return[];const a=Jn[e]||90,r=new Date(n[n.length-1].t).getTime()-a*864e5;return n.filter(c=>new Date(c.t).getTime()>=r)},hn=function(n){const e=new Date(n);if(isNaN(e))return n;const a=(e.getMonth()+1+"").padStart(2,"0"),i=(e.getDate()+"").padStart(2,"0"),r=(e.getHours()+"").padStart(2,"0");return r!=="00"?a+"/"+i+" "+r+":00":a+"/"+i},en=function(){const n=R("ph-chart");if(!n||!Qe||typeof J>"u")return;ge||(ge=D.chart(J,n,null,{renderer:"canvas"}));const e=Qe.series[fe.gran]||{bars:[]},a=es(e.bars||[],fe.win);if(!a.length){ge.clear();return}const i=a.map(l=>l.t),r=a.map(l=>[l.o,l.c,l.l,l.h]),c=a.map(l=>({value:l.v||0,itemStyle:{color:l.c>=l.o?"#0d7a4e":"#b91c1c"}})),o=window.innerWidth<560;ge.setOption({animation:!1,backgroundColor:"transparent",grid:[{left:o?44:58,right:10,top:10,height:"58%"},{left:o?44:58,right:10,top:"74%",height:"16%"}],axisPointer:{link:[{xAxisIndex:[0,1]}]},tooltip:{trigger:"axis",confine:!0,axisPointer:{type:"cross"},formatter:function(l){const f=l.find(h=>h.seriesName==="K");if(!f)return"";const v=f.data;return hn(f.axisValue)+"<br/>O "+w(v[0],2)+" C "+w(v[1],2)+"<br/>L "+w(v[2],2)+" H "+w(v[3],2)}},xAxis:[{type:"category",data:i,boundaryGap:!0,axisLine:{lineStyle:{color:"#e4e9f0"}},axisLabel:{color:"#9ca3af",fontSize:10,formatter:hn,hideOverlap:!0}},{type:"category",gridIndex:1,data:i,boundaryGap:!0,axisLabel:{show:!1},axisTick:{show:!1}}],yAxis:[{scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10}},{scale:!0,gridIndex:1,splitNumber:2,axisLabel:{show:!1},splitLine:{show:!1}}],dataZoom:[{type:"inside",xAxisIndex:[0,1],start:0,end:100},{type:"slider",xAxisIndex:[0,1],bottom:2,height:14,borderColor:"#e4e9f0",fillerColor:"rgba(99,102,241,.12)"}],series:[{name:"K",type:"candlestick",data:r,itemStyle:{color:"#0d7a4e",color0:"#b91c1c",borderColor:"#0d7a4e",borderColor0:"#b91c1c"}},{name:"V",type:"bar",xAxisIndex:1,yAxisIndex:1,data:c,barMaxWidth:o?4:7}]},!0)},ns=function(n){fe.gran=n;const e=R("ph-gran");e&&e.querySelectorAll(".ph-btn").forEach(a=>a.classList.toggle("on",a.dataset.g===n)),en()},ss=function(n){fe.win=n;const e=R("ph-win");e&&e.querySelectorAll(".ph-btn").forEach(a=>a.classList.toggle("on",a.dataset.w===n)),en()},cs=function(){ke&&!ke.isDisposed()&&ke.dispose(),ke=null},os=function(n){const e=n.spread_gauge||{},a=O(e);if(e.status!=="ok"||!a)return"";const i=a.severity||"normal",r=a.direction||"flat",c=i==="normal"?"flat":"amber",o=ts[i]||"ð",l=(as[i]||{})[r]||"sgHeadNormal",f=(is[i]||{})[r]||"sgTradeNormal",v=rs[r]||"sgHedgeNormal",h=a.percentile!=null?Math.round(a.percentile):null,p=h!=null&&h>=50,b=h!=null?s(t("sgSubToday"))+" <b>"+V(a.spread_pct,2)+"</b> â "+s(t(p?"sgSubWider":"sgSubNarrower"))+" <b>"+(p?h:100-h)+"%</b>
7 "+s(t("sgSubOfDays"))+" "+w(a.coverage_days,0)+" "+s(t("sgSubDays")):"",S=h!=null?'<div class="sg-bar"><div class="mark" style="left:'+h+'%"></div></div><div class="sg-bar-lbl"><span>'+s(t("sgBarLow"))+"</span><span>"+s(t("sgBarMid"))+"</span><span>"+s(t("sgBarHigh"))+"</span></div>":"",m='<div class="kpis c3" style="margin-top:2px"><div class="kpi"><div class="k">'+s(t("sgKpiGap"))+'</div><div class="v '+(r==="near_premium"?"pos":r==="near_discount"?"neg":"")+'">'+V(a.spread_pct,2)+'</div><div class="s">'+s(t("sgKpiContract"))+" "+s(a.hot_contract||"â")+'</div></div><div class="kpi"><div class="k">'+s(t("sgKpiPercentile"))+'</div><div class="v">'+(h!=null?h+"th":"â")+'</div><div class="s">z '+w(a.z,2)+'</div></div><div class="kpi"><div class="k">'+s(t("sgKpiHistory"))+'</div><div class="v">'+w(a.coverage_days,0)+'</div><div class="s">'+w(a.window_days,0)+"d "+s(t("sgKpiWindow"))+"</div></div></div>",C='<div class="sg-angles"><div class="sg-angle"><div class="at">'+s(t("sgTradeTitle"))+'</div><div class="ab">'+s(t(f))+'</div></div><div class="sg-angle"><div class="at">'+s(t("sgHedgeTitle"))+'</div><div class="ab">'+s(t(v))+"</div></div></div>";return'<div class="sec" id="s-spreadgauge"><div class="sec-hd"><span class="sec-n">2</span><span class="sec-t"><span class="em">ð</span>'+s(t("secSpreadGauge"))+'</span><span class="sec-x"><span class="badge '+(i==="normal"?"flat":"info")+'">'+s(t(i==="normal"?"sgBadgeNormal":"sgBadgeWatch"))+'</span></span></div><div class="sec-sub">'+s(t("secSpreadGaugeSub"))+'</div><div class="hero '+c+'"><div class="hic">'+o+'</div><div class="hbd"><div class="htl">'+s(t(l))+"</div>"+(b?'<div class="hsb">'+b+"</div>":"")+"</div></div>"+S+m+C+'<div class="subhd">'+s(t("sgChartTitle"))+'</div><div class="sec-sub" style="margin-bottom:9px">'+s(t("sgChartSub"))+'</div><div id="sg-chart" style="height:180px"></div>'+Me("sg-why",t("sgWhyTitle"),'<div class="sec-sub" style="max-width:68ch;margin:0">'+s(t("sgWhyBody"))+"</div>")+"</div>"},ls=function(n){const e=R("sg-chart"),a=n.spread_gauge||{},i=O(a);if(!e||!i||!i.history||typeof J>"u")return;ke||(ke=D.chart(J,e,null,{renderer:"canvas"}));const r=i.history.dates||[],c=i.history.spread_pct||[];ke.setOption({animation:!1,backgroundColor:"transparent",grid:{left:44,right:12,top:14,bottom:26},tooltip:{trigger:"axis",confine:!0,formatter:function(o){const l=o[0].dataIndex;return te(r[l])+"<br/>"+V(c[l],2)}},xAxis:{type:"category",data:r,axisLabel:{color:"#9ca3af",fontSize:10,formatter:te,hideOverlap:!0},axisLine:{lineStyle:{color:"#e4e9f0"}}},yAxis:{type:"value",scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10,formatter:function(o){return o+"%"}}},series:[{type:"line",data:c,symbol:"none",lineStyle:{color:"#0071e3",width:1.6},markLine:{silent:!0,symbol:"none",lineStyle:{color:"#c7c7cc",type:"dashed"},data:[{yAxis:0}]},markPoint:{symbol:"circle",symbolSize:9,itemStyle:{color:"#0071e3",borderColor:"#fff",borderWidth:2},data:[{coord:[r.length-1,c[c.length-1]]}]}}]},!0)},us=function(n){const e=O(n.ohlc_bars);if(!e||!e.series)return"";Qe=e,e.default&&(fe.gran=e.default.granularity||"1d",fe.win=e.default.window||"3M");const a=["1h","1d"].filter(c=>e.series[c]&&e.series[c].bars&&e.series[c].bars.length);a.includes(fe.gran)||(fe.gran=a[0]||"1d");const i=a.map(c=>'<button type="button" class="ph-btn'+(fe.gran===c?" on":"")+'" data-g="'+c+'" data-report-action="phGran" data-report-value="'+c+'">'+s(t("phGran_"+c))+"</button>").join(""),r=["1M","3M","6M","1Y","ALL"].map(c=>'<button type="button" class="ph-btn'+(fe.win===c?" on":"")+'" data-w="'+c+'" data-report-action="phWin" data-report-value="'+c+'">'+s(t("phWin_"+c))+"</button>").join("");return'<div class="sec" id="s-pricehist"><div class="sec-hd"><span class="sec-n">1</span><span class="sec-t"><span class="em">ð</span>'+s(t("phTitle"))+(e.contract?'<span class="tag" style="margin-left:2px">'+s(t("phContract"))+" "+s(e.contract)+"</span>":"")+'</span><div class="ph-segs">'+(a.length>1?'<div class="ph-seg" id="ph-gran">'+i+"</div>":"")+'<div class="ph-seg" id="ph-win">'+r+'</div></div></div><div class="sec-sub">'+s(t("phSub"))+'</div><div id="ph-chart" style="height:clamp(200px,44vw,320px)"></div><div style="font-size:11px;color:var(--muted);margin-top:4px">'+s(t("phSrc"))+"</div></div>"},ds=function(n){const e=O(n.trading_analysis)||{},a=Ye(e.fundamentals_report)||{},i=Se(Ye(de(e,"fundamentals_report")),a,["summary","physical","drivers"]);let r;if(!i)r='<div class="empty">'+s(t("noData"))+"</div>";else{const c='<div class="chips">'+(a.supply?Ce(t("fSupply"),a.supply):"")+(a.outlook?Ce(t("fOutlook"),a.outlook):"")+(a.pvf?Ce(t("fPvF"),a.pvf):"")+(a.conf?'<span class="chip flat"><span class="lab">'+s(t("fConf"))+"</span>"+s(q(a.conf))+" "+un(a.conf)+"</span>":"")+"</div>";let o="";if(i.drivers){const l=a.drivers&&a.drivers.rows.length===i.drivers.rows.length?a.drivers:i.drivers,f=S=>{const m=l.head.findIndex(C=>new RegExp(S,"i").test(C));return m>=0?m:i.drivers.head.findIndex(C=>new RegExp(S,"i").test(C))},v=f("driver"),h=f("evidence"),p=f("assess"),b=f("confid");o='<div class="subhd">'+s(t("fDrivers"))+'</div><div class="drv">'+i.drivers.rows.map((S,m)=>{const C=l.rows[m]||S,P=p>=0?C[p]:"",j=b>=0?C[b]:"";return'<div class="drv-r"><div class="nm">'+s(v>=0?S[v]:S[0])+"</div>"+(P?'<div class="bd"><span class="badge '+ne(P)+'">'+s(q(P))+"</span></div>":'<div class="bd"></div>')+(h>=0&&S[h]?'<div class="ev">'+s(S[h])+"</div>":"")+(j?'<div class="cf">
7'+un(j)+s(q(j))+" "+s(t("fConf"))+"</div>":"")+"</div>"}).join("")+"</div>"}r=c+(i.summary?'<div class="subhd">'+s(t("fSummary"))+"</div>"+_e(i.summary):"")+o+Me("fund-full",t("fullFund"),_e(i.full))}return'<div class="sec" id="s-fund"><div class="sec-hd"><span class="sec-n">5</span><span class="sec-t"><span class="em">ð</span>'+s(t("secFund"))+"</span>"+pe(we(e,"fundamentals_report"))+'</div><div class="sec-sub">'+s(t("secFundSub"))+"</div>"+r+"</div>"+ps(n)},ps=function(n){const e=(O(n.spread_arb)||{}).supporting_data,a=e&&e.series||{},i=["on_warrant","deliverable","roll_yield_ann","spread","lme_stock","scfis","basis_near","dominant_close"],r=i.filter(o=>a[o]).concat(Object.keys(a).filter(o=>!i.includes(o)&&o!=="cost_carry_ann_pct")).slice(0,4);if(!r.length)return"";const c=r.map(o=>{const l=a[o],f=l.momentum||{},v=Tn(o,l.label),h=f.last!=null?f.last:(l.values||[]).slice(-1)[0],p=vn(l.unit,h),b=vn(l.unit,f.chg_1m),S=b.value>0?"â²":b.value<0?"â¼":"â",m=b.value>0?"up":b.value<0?"dn":"",C=f.percentile_1y;return'<div class="phys"><div class="tp"><span class="ic">'+v.icon+'</span><span class="nm">'+s(I(v))+'</span></div><div class="lv">'+(p.value!=null?w(p.value,p.currency?0:2):"â")+p.suffix+' <span class="un">'+s(p.unitKey?t(p.unitKey):l.unit||"")+'</span></div><div class="cg"><span class="'+m+'">'+S+"</span> "+s(t("vs1m"))+" "+(b.value!=null?w(b.value,b.currency?0:2)+b.suffix:"â")+(f.chg_1m_pct!=null?" ("+V(f.chg_1m_pct)+")":"")+"</div>"+(C!=null?'<div class="rb"><i style="left:'+Math.max(2,Math.min(98,C))+'%"></i></div><div class="rl">'+Math.round(C)+"% "+s(t("of1y"))+"</div>":"")+(l.stale_days!=null&&l.stale_days>7?'<div class="cg" style="color:var(--amber);margin-top:6px">â ï¸ '+s(t("staleWarn"))+"</div>":"")+"</div>"}).join("");return'<div class="sec"><div class="sec-hd"><span class="sec-t"><span class="em">ð</span>'+s(t("secPhys"))+"</span>"+(e.as_of?'<span class="sec-x"><span class="tag">'+s(t("asOf"))+" "+s(e.as_of)+"</span></span>":"")+'</div><div class="sec-sub">'+s(t("secPhysSub"))+'</div><div class="physgrid">'+c+"</div></div>"},vn=function(n,e){const a=String(n||"").toLowerCase();return e==null||!isFinite(+e)?{value:null,suffix:"",unitKey:null}:a==="decimal/yr"?{value:e*100,suffix:"%",unitKey:"unitPerYear"}:a==="log ratio"?{value:e*100,suffix:"%",unitKey:"unitPriceGap"}:a==="%/yr"||a==="pct"||a==="%"?{value:e,suffix:"%",unitKey:"unitPerYear"}:a==="t"?{value:e,suffix:"",unitKey:"unitTonnes",currency:!1}:a==="cny/t"?{value:e,suffix:"",unitKey:"unitCnyPerTonne",currency:!0}:a==="cny"?{value:e,suffix:"",unitKey:"unitCny",currency:!0}:a==="index pt"?{value:e,suffix:"",unitKey:"unitIndexPt"}:{value:e,suffix:"",unitKey:null}},fs=function(n){const e=O(n.trading_analysis)||{},a=Se(Pe(de(e,"bull_arguments")),Pe(e.bull_arguments),["headline","crux"]),i=Se(Pe(de(e,"bear_arguments")),Pe(e.bear_arguments),["headline","crux"]),r=Se(dn(de(e,"investment_decision")),dn(e.investment_decision),["verdict","crux"]),c=n.market_outlook||{},o=Ve(c,"bull_points"),l=Ve(c,"bear_points");if(!a&&!i&&!r&&!o.length)return"";const f=(p,b,S,m)=>p?'<div class="side '+b+'"><div class="hd"><span class="ic">'+S+'</span><span class="tl">'+s(m)+'</span></div><div class="hv">'+Oe(p.headline)+"</div>"+(p.crux?'<div class="cx"><div class="cl">'+s(t("theCrux"))+'</div><div class="ct">'+Oe(p.crux)+"</div></div>":"")+"</div>":"",v=o.length||l.length?'<div class="subhd">'+s(t("newsWeb"))+pe(qe(c,"bull_points")||qe(c,"bear_points"))+'</div><div class="oplist"><div><div class="badge up" style="margin-bottom:8px">'+s(t("newsBull"))+'</div><ul class="bull">'+o.map(p=>"<li>"+s(p)+"</li>").join("")+'</ul></div><div><div class="badge dn" style="margin-bottom:8px">'+s(t("newsBear"))+'</div><ul class="bear">'+l.map(p=>"<li>"+s(p)+"</li>").join("")+"</ul></div></div>":"",h=we(e,"bull_arguments")||we(e,"bear_arguments")||we(e,"investment_decision")||!!(r&&r.enFallback)||!!(a&&a.enFallback)||!!(i&&i.enFallback);return'<div class="sec" id="s-debate"><div class="sec-hd"><span class="sec-n">6</span><span class="sec-t"><span class="em">âï¸</span>'+s(t("secDebate"))+"</span>"+pe(h)+'</div><div class="sec-sub">'+s(t("secDebateSub"))+"</div>"+(a||i?'<div class="debate">'+f(a,"bull","ð",t("bullCase"))+f(i,"bear","ð»",t("bearCase"))+"</div>":"")+(r&&(r.verdict||r.crux)?'<div class="resolve"><div class="tl">'+s(t("resolution"))+'</div><div class="bd">'+Oe(Be(r.verdict||r.crux,420))+"</div></div>":"")+v+"</div>"},hs=function(n){const e=O(n.trading_analysis)||{},a=$e(e.news_report),i=Se($e(de(e,"news_report")),a,["lede","summary","top"]),r=(a||{}).sentiment,c=n.market_outlook||{},o=Ve(c,"summary"),l=c.sources||[];return!i&&!o&&!l.length?"":'<div class="sec" id="s-news"><div class="sec-hd"><span class="sec-n">7</span><span class="sec-t"><span class="em">ð°</span>'+s(t("secNews"))+"</span>"+pe(we(e,"news_report"))+(r?'<span class="sec-x"><span class="badge '+ne(r)+'">'+s(t("newsSent"))+": "+s(q(r))+"</span></span>":"")+'</div><div class="sec-sub">'+s(t("secNewsSub"))+"</div>"+(i&&i.lede?'<div class="lede">'+s(i.lede)+"</div>":"")+(i&&i.summary?'<div class="subhd">'+s(t("newsDesk"))+"</div>"+_e(i.summary):"")+(o?'<div class="subhd">'+s(t("newsWeb"))+pe(qe(c,"summary"))+'</div><div class="md"><p class="md-p">'+s(o)+"</p></div>":"")+(l.length?'<div class="subhd">'+s(t("newsSources"))+" ("+l.length+')</div><div class="srcs">'+l.map((f,v)=>{const h=F==="cn",p=(h?f.title_zh||f.title:f.title_en||f.title)||f.url,b=Be(jn(h?f.abstract_zh||f.abstract:f.abstract_en||f.abstract),220);return'<a class="src" href="'+s(f.url)+'" target="_blank" rel="noopener"><span class="n">'+(v+1)+'</span><span class="bd"><span class="ti">'+s(p)+"</span>"+(b?'<span class="ab">'+s(b)+"</span>":"")+'<span class="dm">'+s(zn(f.url))+"</span></span></a>"}).join("")+"</div>":"")+(i?Me("news-full",t("fullNews"),_e(i.full)):"")+"</div>"},vs=function(n){const e=n.spread_arb||{},a=O(e);
7if(e.status!=="ok"||!a)return"";const i=!!a.tradeable,r=O(n.trading_analysis)||{},c=Ze(r.spread_report)||{},o=Se(Ze(de(r,"spread_report")),c,["conds","horizons","risks"]),l=Array.isArray(a.date_range)?a.date_range.join(" â "):"";let f="";if(i&&a.strategy){const p=a.strategy.current||{},b=a.strategy.metrics||{},S=p.contracts||{};if(p.error)f='<div class="subhd">'+s(t("todaysCall"))+'</div><div class="hero flat"><div class="hic">â ï¸</div><div class="hbd"><div class="htl">'+s(t("noSignal"))+'</div><div class="hsb">'+s(p.error)+"</div></div></div>";else{const m=kn(p.decision_action),C=xn[p.position]||{en:p.position||"â",cn:p.position||"â"},P=p.confidence!=null?Math.round(p.confidence*100):null;f='<div class="subhd">'+s(t("todaysCall"))+'</div><div class="hero '+m.tone+'"><div class="hic">'+m.icon+'</div><div class="hbd"><div class="htl">'+s(I(m))+'</div><div class="hsb">'+s(I(C))+(p.target_lots!=null?" · "+w(p.target_lots,0)+" "+s(t("lots")):"")+"</div></div></div>"+(P!=null?'<div class="barline"><span class="lb">'+s(t("confidence"))+'</span><span class="bar"><i style="width:'+P+'%"></i></span><span class="pv">'+P+"%</span></div>":"")+'<div class="chips" style="margin-top:11px"><span class="chip flat"><span class="lab">'+s(t("nearLeg"))+"</span>"+s(S.near||"â")+'</span><span class="chip flat"><span class="lab">'+s(t("farLeg"))+"</span>"+s(S.far||"â")+"</span></div>"}(b.sharpe!=null||b.avg_annual_return_pct!=null)&&(f+='<div class="subhd">'+s(t("trackRecord"))+'</div><div class="sec-sub" style="margin-bottom:10px">'+s(t("trackSub"))+(a.strategy.status?" · "+s(t("studyStatus"))+": "+s(q(a.strategy.status)):"")+'</
7div><div class="kpis c4"><div class="kpi"><div class="k">'+s(t("mYear"))+'</div><div class="v '+(b.avg_annual_return_pct>0?"pos":b.avg_annual_return_pct<0?"neg":"")+'">'+V(b.avg_annual_return_pct)+'</div></div><div class="kpi"><div class="k">'+s(t("mSharpe"))+'</div><div class="v">'+w(b.sharpe,2)+'</div></div><div class="kpi"><div class="k">'+s(t("mDraw"))+'</div><div class="v neg">'+V(b.max_drawdown_pct)+'</div></div><div class="kpi"><div class="k">'+s(t("mWin"))+'</div><div class="v">'+(b.win_rate_pct!=null?w(b.win_rate_pct,1)+"%":"â")+'</div></div></div><div class="sparkcard"><div class="t">'+s(t("equityChart"))+'</div><div class="cv"><div id="spark" style="width:100%;height:100%"></div></div><div class="f"><span>'+s(t("totalPnl"))+": "+U(b.total_pnl)+"</span><span>"+s(t("overDays"))+" "+w(b.n_days,0)+" "+s(t("tdays"))+"</span></div></div>")}else if(a.indicator){const p=a.indicator.current||{},b=Cn[p.state]||{en:p.state||"â",cn:p.state||"â",tone:"flat"};f='<div class="subhd">'+s(t("marketSignal"))+'</div><div class="sec-sub" style="margin-bottom:10px">'+s(t("marketSignalSub"))+'</div><div class="hero '+b.tone+'"><div class="hic">ð</div><div class="hbd"><div class="htl">'+s(I(b))+'</div><div class="hsb">'+s(t("domestic"))+": "+w(p.shfe_close,0)+" · "+s(t("overseas"))+": "+w(p.foreign_usd,0)+" · "+s(t("fx"))+": "+w(p.usdcny,3)+"</div></div></div>"+(p.ratio!=null?'<div class="kpis c3" style="margin-top:12px"><div class="kpi"><div class="k">'+s(t("ratioLine"))+'</div><div class="v">'+w(p.ratio,3)+'Ã</div><div class="s">z = '+w(p.z_score,2)+"</div></div></div>":"")+'<div class="sparkcard"><div class="t">'+s(t("ratioLine"))+'</div><div class="cv"><div id="spark" style="width:100%;height:100%"></div></div><div class="note">'+s(t("ratioNote"))+"</div></div>"}const h=!!(r.spread_report||r.zh&&r.zh.spread_report)?'<div class="subhd">'+s(t("spreadReview"))+pe(we(r,"spread_report"))+"</div>"+(c.posture||o.posture?(()=>{const p=c.posture||o.posture;return'<div class="chips" style="margin-bottom:11px">'+Ce(t("posture"),ln(p)||p,ne(p))+"</div>"})():"")+((o.conds||[]).length?(()=>{const p=c.conds&&c.conds.length===o.conds.length?c.conds:o.conds;return'<div class="drv">'+o.conds.map((b,S)=>{const m=(p[S]||b).v;return'<div class="drv-r"><div class="nm">'+s(b.k)+'</div><div class="bd">'+(m?'<span class="badge '+ne(m)+'">'+s(q(m))+"</span>":"")+"</div>"+(b.note?'<div class="ev">'+s(b.note)+"</div>":"")+"</div>"}).join("")+"</div>"})():"")+Me("spread-full",t("fullSpread"),_e(o.full)):"";return'<div class="sec" id="s-spread"><div class="sec-hd"><span class="sec-n">8</span><span class="sec-t"><span class="em">âï¸</span>'+s(t("secSpread"))+'</span><span class="sec-x"><span class="badge '+(i?"up":"flat")+'">'+(i?"â
"+s(t("tradeableY")):"â¹ï¸ "+s(t("tradeableN")))+'</span></span></div><div class="sec-sub">'+s(t("secSpreadSub"))+(l?" · "+s(t("dataRange"))+": "+s(l):"")+"</div>"+f+h+"</div>"},bs=function(n){const e=O(n.trading_analysis)||{},a=Xe(e.statistical_analysis)||{},i=pn(e.market_report)||{},r=Se(Xe(de(e,"statistical_analysis")),a,["profile","mods","rec"]),c=Se(pn(de(e,"market_report")),i,["horizons","risks","net"]),o=!!(e.statistical_analysis||e.zh&&e.zh.statistical_analysis),l=!!(e.market_report||e.zh&&e.zh.market_report);if(!o&&!l)return"";let f="";if(r&&o){const h=a.kv||r.kv||{},p=a.mods&&a.mods.length===r.mods.length?a.mods:r.mods;f='<div class="kpis c5"><div class="kpi"><div class="k">'+s(t("sRec"))+'</div><div class="v" style="color:var(--'+(ne(h.recommendation)==="up"?"green":ne(h.recommendation)==="dn"?"red":"ink2")+')">'+s(q(h.recommendation))+'</div></div><div class="kpi"><div class="k">'+s(t("sRegime"))+'</div><div class="v">'+s(q(h.regime))+'</div></div><div class="kpi"><div class="k">'+s(t("sRisk"))+'</div><div class="v">'+s(q(h.risk))+'</div></div><div class="kpi"><div class="k">'+s(t("sPTrade"))+'</div><div class="v">'+(h.p_trade!=null?Math.round(parseFloat(h.p_trade)*100)+"%":"â")+'</div></div><div class="kpi"><div class="k">'+s(t("sPSwitch"))+'</div><div class="v">'+(h.p_regime_switch!=null?Math.round(parseFloat(h.p_regime_switch)*100)+"%":"â")+"</div></div></div>"+(r.profile?'<div class="wellnote" style="margin-top:12px"><b>'+s(t("sProfile"))+":</b> "+s(r.profile)+"</div>":"")+(r.mods.length?'<div class="subhd">'+s(t("sModules"))+'</div><div class="mods">'+r.mods.map((b,S)=>{const m=p[S]||b;return'<div class="mod"><span class="nm">'+s(q(m.name))+'</span><span><span class="badge '+ne(m.signal)+'">'+s(q(m.signal))+'</span></span><span class="sm">'+s(b.summary)+"</span></div>"}).join("")+"</div>":"")+Me("stats-full",t("fullStats"),_e(r.full))}const v=c&&l?'<div class="sec"><div class="sec-hd"><span class="sec-t"><span class="em">ð</span>'+s(t("secMarket"))+"</span>"+pe(we(e,"market_report"))+'</div><div class="sec-sub">'+s(t("secMarketSub"))+'</div><div class="chips">'+(i.rec||c.rec?Ce(t("sRec"),i.rec||c.rec):"")+(i.bias||c.bias?Ce(t("mrBias"),i.bias||c.bias):"")+(i.regime||c.regime?Ce(t("mrRegime"),i.regime||c.regime):"")+(c.conf!=null?'<span class="chip flat"><span class="lab">'+s(t("mrConf"))+"</span>"+c.conf.toFixed(2)+"</span>":"")+"</div>"+Me("market-full",t("fullMarket"),_e(c.full))+"</div>":"";return(r&&o?'<div class="sec" id="s-stats"><div class="sec-hd"><span class="sec-n">
79</span><span class="sec-t"><span class="em">ð§®</span>'+s(t("secStats"))+"</span>"+pe(we(e,"statistical_analysis"))+'</div><div class="sec-sub">'+s(t("secStatsSub"))+"</div>"+f+"</div>":"")+v},gs=function(n){const e=(O(n.spread_arb)||{}).supporting_data;if(!e)return"";const a=e.cost_model||{},i=e.contract_terms||{};let r;if(!a.available)r='<div class="empty">'+s(t("costNone"))+"</div>";else if(!a.deliverable)r='<div class="wellnote">'+s(t("costCash"))+"</div>";else{const o=a.ref_price!=null&&a.lot_size!=null?a.ref_price*a.lot_size:null,l=p=>o!=null&&p!=null?p/100*o:null,f=cn[F]||cn.en,v=(a.warrant_cancel_months||[]).map(p=>f[(p-1+12)%12]).join(F==="cn"?"ã":", "),h=[];h.push(v?t("cancelPre")+" "+v+" "+t("cancelMid")+" "+a.reregister_days+" "+t("cancelSuf"):t("noExpiry")),a.vat_haircut_on_spread_pct!=null&&h.push(t("vatNote")+" "+w(a.vat_haircut_on_spread_pct,1)+"% "+t("vatSuffix")),r='<div class="costhero"><div class="r1"><div><div class="big">'+(a.full_cost_ann_pct!=null?w(a.full_cost_ann_pct,2)+"%":"â")+'</div><div class="bl">'+s(t("costPerYear"))+'</div></div><div><div class="big sm">'+U(l(a.full_cost_ann_pct))+'</div><div class="bl">'+s(t("costTotal"))+" · 1 "+s(t("lots"))+" · "+s(I(En[a.exchange]||a.exchange))+'</div></div></div><div class="mth">'+s(t("costMethod"))+": "+w(a.full_cost_ann_pct,2)+"% à "+U(a.ref_price)+" à "+w(a.lot_size,0)+" = "+U(l(a.full_cost_ann_pct))+'</div></div><div class="cost3"><div class="cost1"><div class="n">ð³ '+s(t("costFin"))+'</div><div class="v">'+(a.financing_ann_pct!=null?w(a.financing_ann_pct,2)+"%":"â")+"<small>"+U(l(a.financing_ann_pct))+" / "+s(t("lots"))+'</small></div><div class="src">'+s(t("costFinSrc"))+(a.funding_rate_pct!=null?" ("+w(a.funding_rate_pct,2)+"%)":"")+'</div></div><div class="cost1"><div class="n">ð '+s(t("costSto"))+'</div><div class="v">'+(a.storage_ann_pct!=null?w(a.storage_ann_pct,2)+"%":"â")+"<small>"+U(l(a.storage_ann_pct))+" / "+s(t("lots"))+'</small></div><div class="src">'+s(t("costStoSrc"))+(a.storage_per_unit_per_day!=null?" ("+U(a.storage_per_unit_per_day,2)+")":"")+'</div></div><div class="cost1"><div class="n">ð§¾ '+s(t("costFee"))+'</div><div class="v">'+(a.fees_ann_pct!=null?w(a.fees_ann_pct,3)+"%":"â")+"<small>"+U(l(a.fees_ann_pct),1)+" / "+s(t("lots"))+'</small></div><div class="src">'+s(t("costFeeSrc"))+'</div></div></div><div class="wellnote">'+s(h.join(" "))+"</div>"}let c;if(!i.available)c='<div class="empty">'+s(t("noContract"))+"</div>";else{const o=i.open_fee_yuan,l=i.close_fee_yuan,f=i.close_today_fee_yuan,v=o!=null&&l!=null?o+l:i.round_trip_fee_yuan,h=o!=null&&f!=null?o+f:null,p=l!=null&&f!=null&&Math.abs(f-l)>.01;c='<div class="ctgrid"><div class="ct"><span class="n">ð° '+s(t("ctMargin"))+'</span><span class="v">'+U(i.margin_per_lot)+"<small>"+w(i.margin_buy_pct,1)+"% "+s(t("ofValue"))+'</small></span></div><div class="ct"><span class="n">ð '+s(t("ctMult"))+'</span><span class="v">'+w(i.multiplier,2)+'Ã</span></div><div class="ct"><span class="n">ð¯ '+s(t("ctTick"))+'</span><span class="v">'+U(i.tick_value,1)+'</span></div><div class="ct"><span class="n">ð
'+s(t("ctRef"))+'</span><span class="v">'+U(i.price)+'</span></div></div><div class="subhd">'+s(t("feesTitle"))+'</div><div class="fees"><div class="fee"><span class="n">'+s(t("feeOpen"))+'</span><span class="v">'+U(o,1)+'</span></div><div class="fee"><span class="n">'+s(t("feeCloseOld"))+'</span><span class="v">'+U(l,1)+'</span></div><div class="fee'+(p?" hot":"")+'"><span class="n">'+s(t("feeCloseNew"))+'</span><span class="v">'+U(f,1)+'</span></div><div class="fee"><span class="n">'+s(t("feeRtOld"))+'</span><span class="v">'+U(v,1)+'</span></div><div class="fee'+(p?" hot":"")+'"><span class="n">'+s(t("feeRtNew"))+'</span><span class="v">'+U(h,1)+"</span></div></div>"+(p&&v?'<div class="wellnote warn">â ï¸ '+s(t("feeDiff"))+" "+w(h/v,1)+s(t("feeDiffSuf"))+"</div>":'<div class="wellnote">â¹ï¸ '+s(t("feeSame"))+"</div>")}return'<div class="sec" id="s-cost"><div class="sec-hd"><span class="sec-n">10</span><span class="sec-t"><span class="em">ð°</span>'+s(t("secCost"))+'</span></div><div class="sec-sub">'+s(t("secCostSub"))+"</div>"+r+'</div><div class="sec"><div class="sec-hd"><span class="sec-t"><span class="em">ð</span>'+s(t("secContract"))+'</span></div><div class="sec-sub">'+s(t("secContractSub"))+"</div>"+c+"</div>"}
7,ms=function(n){const e=n.hedge_calc;if(!e||e.status!=="ok"||!e.data||!e.data.bundle)return"";const a=e.data.bundle,i=bn(a),r=!!e.data.has_study,c='<div class="sec" id="s-hedgecalc"><div class="sec-hd"><span class="sec-n">11</span><span class="sec-t"><span class="em">ð§®</span>'+s(t("secHedgeCalc"))+"</span>"+(r?'<span class="sec-x"><span class="hc-badge">'+s(t("hcStudyBadge"))+"</span></span>":"")+"</div>";if(!i){const p=(a.market_params_status||{}).reason==="symbol_not_profiled"?t("rcNotProfiled"):t("rcNoParams");return c+'<div class="sec-sub">'+s(t("secHedgeCalcSub"))+'</div><div class="hc-note">'+s(p)+"</div></div>"}const o=F==="cn"?i.unit||"å¨":i.unit_en||i.unit||"t",l=a.params||{},f=(l.monthly_usage_tons||{}).value||0,v=(l.inventory_tons||{}).value||0;return c+'<div class="sec-sub">'+s(t("secHedgeCalcSub"))+'</div><div class="hc-form"><div class="hc-field"><label>'+s(t("rcInv"))+' <span class="u">('+s(o)+')</span></label><input class="hc-input" id="rc-inv" type="number" min="0" step="any" value="'+v+'" data-rc-input></div><div class="hc-field"><label>'+s(t("rcUse"))+' <span class="u">('+s(o)+')</span></label><input class="hc-input" id="rc-use" type="number" min="0" step="any" value="'+f+'" data-rc-input></div><div class="hc-field"><label>'+s(t("rcMonths"))+'</label><input class="hc-input" id="rc-months" type="number" min="1" max="6" step="1" value="3" data-rc-input></div><div class="hc-field"><label>'+s(t("rcCapital"))+' <span class="u">'+s(t("rcCapitalU"))+'</span></label><input class="hc-input" id="rc-cap" type="number" min="0" step="any" value="0" data-rc-input></div><div class="hc-field"><label>'+s(t("rcTol"))+' <span class="u">'+s(t("rcTolU"))+'</span></label><input class="hc-input" id="rc-tol" type="number" min="0" step="0.5" value="3" data-rc-input></div><div class="hc-field"><label>'+s(t("rcFunding"))+'</label><div class="hc-seg" id="rc-fund-seg"><button type="button" data-report-action="rcSetFunding" data-report-value="easy">'+s(t("rcFundEasy"))+'</button><button type="button" class="on" data-report-action="rcSetFunding" data-report-value="slow">'+s(t("rcFundSlow"))+'</button><button type="button" data-report-action="rcSetFunding" data-report-value="none">'+s(t("rcFundNone"))+'</button></div></div><div class="hc-slider-wrap"><div class="hc-slider-hd"><label>'+s(t("rcRatio"))+'</label><span class="v" id="rc-ratio-val">50%</span></div><input class="hc-range" id="rc-ratio" type="range" min="0" max="100" step="1" value="50" data-rc-input><div class="hc-note">'+s(t("rcRatioHint"))+'</div></div></div><div class="hc-outputs" id="rc-out"></div><div id="rc-verdict"></div><div class="subhd">'+s(t("rcBandTitle"))+'</div><div class="sec-sub">'+s(t("rcBandSub"))+'</div><div class="rc-chart"><div id="rc-band" style="height:220px"></div><div id="rc-band-legend"></div></div><table class="hc-table"><thead><tr><th>'+s(t("rcColRatio"))+"</th><th>"+s(t("rcColLo"))+"</th><th>"+s(t("rcColMid"))+"</th><th>"+s(t("rcColHi"))+"</th><th>"+s(t("rcColWidth"))+'</th></tr></thead><tbody id="rc-table-body"></tbody></table><div class="subhd">'+s(t("rcPlanTitle"))+'</div><div id="rc-legs"></div><div id="rc-notes"></div><div class="wellnote">'+s(t("hcDisclaimer"))+"</div></div>"},bn=function(n){const e=n&&n.market_params;return!e||!e.symbols?null:e.symbols[e.scope]||null},ys=function(n){const e=n&&n.restock_kernel_source,a=n&&n.restock_kernel_version;if(Ie&&nn===e&&sn===a||(Ie=null,nn=null,sn=null,typeof e!="string"||!e.trim()))return;const i=G.ownerDocument.defaultView,r=Object.prototype.hasOwnProperty.call(i,"RestockKernel"),c=i.RestockKernel,o=G.ownerDocument.createElement("script");try{i.RestockKernel=void 0,o.textContent=e,G.ownerDocument.head.appendChild(o);const l=i.RestockKernel;if(!l||typeof l.compute!="function"||typeof l.costAt!="function"||!l.Z)return;Ie=l,nn=e,sn=a}catch(l){console.warn("restock calc: failed to load kernel from hedge-advisor",l)}finally{o.remove(),r?i.RestockKernel=c:delete i.RestockKernel}},ws=function(n,e,a,i){const r=R("rc-band");if(!r||typeof J>"u")return;const c=n.band.ratios,o=n.band.series;if(!c||!c.length){se&&(se.dispose(),se=null),r.innerHTML="";return}const l=Math.max(0,Math.min(c.length-1,Math.round((n.at_current_ratio.ratio!=null?n.at_current_ratio.ratio:i)/5))),f=n.at_current_ratio.ceiling,v=[{xAxis:l}],h=Math.min.apply(null,o.p05),p=Math.max.apply(null,o.p95);f>h&&f<p&&v.push({yAxis:f,lineStyle:{color:"#d70015",type:"dashed",width:1.3}});
7const b=[ce,F,c.length,o.p50.map(m=>m.toFixed(1)).join(","),f].join("|");se||(se=D.chart(J,r,null,{renderer:"canvas"}),Te=null),b!==Te?(Te=b,se.setOption({animation:!1,backgroundColor:"transparent",grid:{left:56,right:14,top:14,bottom:30},tooltip:{trigger:"axis",confine:!0,formatter:function(m){const C=m[0]?m[0].dataIndex:null;return C==null?"":c[C]+"%<br/>"+s(t("rcColLo"))+" "+w(o.p05[C],0)+"<br/>"+s(t("rcColMid"))+" "+w(o.p50[C],0)+"<br/>"+s(t("rcColHi"))+" "+w(o.p95[C],0)}},xAxis:{type:"category",data:c,axisLabel:{color:"#9ca3af",fontSize:10,formatter:function(m){return m+"%"},interval:function(m){return c[m]%25===0}},axisLine:{lineStyle:{color:"#e4e9f0"}}},yAxis:{type:"value",scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10}},series:[{name:"p05lo",type:"line",data:o.p05,stack:"outer",symbol:"none",lineStyle:{opacity:0},areaStyle:{opacity:0},silent:!0},{name:t("rcLegRare"),type:"line",data:o.p05.map((m,C)=>o.p95[C]-m),stack:"outer",symbol:"none",lineStyle:{opacity:0},areaStyle:{color:"rgba(0,113,227,.13)"},silent:!0},{name:"p25lo",type:"line",data:o.p25,stack:"inner",symbol:"none",lineStyle:{opacity:0},areaStyle:{opacity:0},silent:!0},{name:t("rcLegCommon"),type:"line",data:o.p25.map((m,C)=>o.p75[C]-m),stack:"inner",symbol:"none",lineStyle:{opacity:0},areaStyle:{color:"rgba(0,113,227,.26)"},silent:!0},{id:"median",name:t("rcLegMedian"),type:"line",data:o.p50,symbol:"none",lineStyle:{color:"#1d1d1f",width:2},markLine:{silent:!0,symbol:"none",lineStyle:{color:"#0071e3",width:1.6},data:v},markPoint:{symbol:"circle",symbolSize:8,itemStyle:{color:"#0071e3",borderColor:"#fff",borderWidth:1.5},data:[{coord:[l,o.p50[l]]}]}}]},!0)):se.setOption({series:[{id:"median",markLine:{data:v},markPoint:{data:[{coord:[l,o.p50[l]]}]}}]});const S=R("rc-band-legend");S&&(S.innerHTML='<div class="rc-legend"><span><i style="background:rgba(0,113,227,.26)"></i>'+s(t("rcLegCommon"))+'</span><span><i style="background:rgba(0,113,227,.13)"></i>'+s(t("rcLegRare"))+'</span><span><i style="background:var(--ink)"></i>'+s(t("rcLegMedian"))+'</span><span><i style="background:var(--blue)"></i>'+s(t("rcLegHere"))+'</span></div><div class="hc-note">'+s(t("rcBandAxis").replace("{u}",a))+"</div>")},_s=function(n,e){tn=n;const a=R("rc-fund-seg");a&&(a.querySelectorAll("button").forEach(i=>i.classList.remove("on")),e&&e.classList.add("on")),an()},Ss=function(n){const e=n&&n.hedge_calc;if(He=e&&e.status==="ok"&&e.data&&e.data.bundle?e.data.bundle:null,!He||(ie=bn(He),!ie))return;tn="slow",Te=null,ys(He);const a=R("s-hedgecalc");a&&(a.querySelectorAll("[data-rc-input]").forEach(i=>{i.oninput=an}),an())},an=function(){if(!He||!ie)return;const n=Ie,e=R("rc-out");if(!e)return;const a=()=>{se&&(se.dispose(),se=null),e.innerHTML='<div class="hc-note">'+s(t("rcNoKernel"))+"</div>",["rc-verdict","rc-band","rc-band-legend","rc-table-body","rc-legs","rc-notes"].forEach(u=>{const g=R(u);g&&(g.innerHTML="")}),Te=null};if(!n||typeof n.compute!="function"){a();return}const i=u=>R(u),r=i("rc-inv"),c=i("rc-use"),o=i("rc-months"),l=i("rc-cap"),f=i("rc-tol"),v=i("rc-ratio");if(!r||!c||!o||!l||!f||!v)return;const h=parseFloat(v.value)||0,p={inventory:parseFloat(r.value)||0,usage:parseFloat(c.value)||0,sold_months:Math.max(1,Math.min(6,parseInt(o.value,10)||3)),capital:(parseFloat(l.value)||0)*1e4,tol:Math.max(0,(parseFloat(f.value)||0)/100),funding:tn,ratio:h};let b;try{b=n.compute(ie,p)}catch(u){console.warn("restock calc: kernel threw",u),a();return}if(!b){a();return}const S=F==="cn"?ie.unit||"å¨":ie.unit_en||ie.unit||"t",m=b.plan,C=b.at_current_ratio;i("rc-ratio-val").textContent=Math.round(h)+"%";const P=u=>F==="cn"?U(u/1e4,1)+"ä¸":Math.abs(u)>=1e6?U(u/1e6,2)+"M":U(u,0);e.innerHTML=[{n:t("rcOutExposure"),v:w(m.exposure,0)+" "+S},{n:t("rcOutPhysical"),v:w(m.physical_tons,0)+" "+S},{n:t("rcOutFutures"),v:w(m.futures_tons,0)+" "+S},{n:t("rcOutCash"),v:m.cash_committed>0?P(m.cash_committed):"â"}].map(u=>'<div class="hc-out"><div class="n">'+s(u.n)+'</div><div class="v">'+u.v+"</div></div>").join("");const j=b.recommendation.min_ratio_for_ceiling;let H;m.exposure<=0?H=t("rcAdviceCovered"):j==null?H=t("rcAdviceUnreachable"):j<=h/100?H=t("rcAdviceOk").replace("{n}",Math.ceil(j*100)):H=t("rcAdviceShort").replace("{n}",Math.ceil(j*100));const A=[];m.open_by_cause.cash>.5&&A.push(t("rcCauseCash")+" "+w(m.open_by_cause.cash,0)+" "+S),m.open_by_cause.lot_rounding>.5&&A.push(t("rcCauseLot")+" "+w(m.open_by_cause.lot_rounding,0)+" "+S),m.open_by_cause.choice>.5&&A.push(t("rcCauseChoice")+" "+w(m.open_by_cause.choice,0)+" "+S),i("rc-verdict").innerHTML='<div class="rc-verdict'+(C.within_ceiling?"":" warn")+'"><div class="rc-vline"><b>'+s(w(C.cheap_side,0))+"</b> â <b>"+s(w(C.expensive_side,0))+'</b> <span class="u">'+s(F==="cn"?"å
":"CNY")+"/"+s(S)+'</span><span class="rc-gap">'+s(t("rcGap"))+" "+s(w(C.width,0))+'</span></div><div class="rc-vsub">'+s(H)+"</div>"+(A.length?'<div class="rc-vsub">'+s(t("rcOpenBy"))+" "+s(A.join(" · "))+"</div>":"")+"</div>",ws(b,ie,S,h);const X=[0,25,50,75,100],L=X.map(u=>({p:u,i:b.band.ratios.indexOf(u),here:!1})).filter(u=>u.i>=0);X.indexOf(h)<0?(L.push({p:h,i:-1,here:!0}),L.sort((u,g)=>u.p-g.p)):L.forEach(u=>{u.p===h&&(u.here=!0)});const k=n.Z;i("rc-table-body").innerHTML=L.map(u=>{let g,_,x;return u.i>=0?(g=b.band.series.p05[u.i],_=b.band.series.p50[u.i],x=b.band.series.p95[u.i]):(g=n.costAt(ie,p,u.p/100,k.p05),_=n.costAt(ie,p,u.p/100,k.p50),x=n.costAt(ie,p,u.p/100,k.p95)),'<tr class="'+(u.here?"hc-current":"")+'"><td>'+u.p+"%"+(u.here?' <span class="rc-tag">'+s(t("rcLegHere"))+"</span>":"")+"</td><td>"+w(g,0)+"</td><td>"+w(_,0)+"</td><td>"+w(x,0)+"</td><td>"+w(x-g,0)+"</td></tr>"}).join("");const z=(m.legs||[]).filter(u=>u.tons>0||u.open_tons>0);i("rc-legs").innerHTML=z.length?'<table class="hc-table"><thead><tr><th>
7'+s(t("rcLegMonth"))+"</th><th>"+s(t("rcLegContract"))+"</th><th>"+s(t("rcLegLots"))+"</th><th>"+s(t("rcLegTons"))+"</th><th>"+s(t("rcLegMargin"))+"</th><th>"+s(t("rcLegBuffer"))+"</th></tr></thead><tbody>"+z.map(u=>"<tr><td>"+s(t("rcMonthN").replace("{n}",u.month))+"</td><td>"+s(t("rcMonthN").replace("{n}",u.contract))+(u.parked?' <span class="rc-tag">'+s(t("rcParked"))+"</span>":"")+"</td><td>"+w(u.lots,0)+"</td><td>"+w(u.tons,0)+"</td><td>"+P(u.margin)+"</td><td>"+P(u.buffer)+"</td></tr>").join("")+'</tbody></table><div class="hc-note">'+s(t("rcBufferNote").replace("{p}",(100*(m.buffer_rate_blended||0)).toFixed(0)))+"</div>":'<div class="hc-note">'+s(t("rcNoLegs"))+"</div>";const K=ie.evidence||{},d=(b.treatments||[]).map(u=>{const g=K[u];return g?"<li><b>"+s(u)+"</b> â "+s(F==="cn"?g.cn||g.en:g.en||g.cn)+"</li>":""}).filter(Boolean);i("rc-notes").innerHTML=d.length?'<div class="subhd">'+s(t("rcQuirks"))+'</div><ul class="rc-notes">'+d.join("")+"</ul>":""},ks=function(n){var K;Ee=[];const a=(O(n.futures_risk)||{}).eu_ports_context;if(!a)return"";const i={BEANR:"#007AFF",FRLEH:"#34C759",GBFXT:"#FF9500",NLRTM:"#AF52DE",DEHAM:"#FF2D55"},r={CMA:"CMA CGM",MSC:"MSC",MSK:"Maersk",OOCL:"OOCL"},c=(a.spot_curve||{}).ports||[],o=(a.mq_carrier_quotes||{}).ports||[],f=(a.portwatch||{}).ports||[];function v(d,u,g,_){if(d.filter(W=>W!=null&&isFinite(W)).length<2)return"";const B="sh-mini-"+Ee.length;return Ee.push({id:B,kind:"mini",values:d,dates:u,color:g}),'<div id="'+B+'" style="width:100%;height:'+_+'px"></div>'}const h=c.map(d=>{const u=d.route_code,g=d.curve||[];if(!g.length)return"";const _=g.map(M=>M.avg_price),x=g.map(M=>M.date),B=_.length,W=_[B-1],Z=_[Math.max(0,B-2)],Y=Z?(W-Z)/Z*100:0,Q=i[u]||"#007AFF",me=Y>=0?"var(--green)":"var(--red)",y=d.spot_route?d.spot_route.replace("CNSHA_",""):u,N=g[B-1]?g[B-1].date:"";return'<div class="sh-chart-wrap"><div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px"><div><div style="font-size:10.5px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em">'+s(y)+'</div><div style="font-size:22px;font-weight:750;color:var(--ink);letter-spacing:-.02em">$'+w(W,0)+'<span style="font-size:11px;font-weight:500;color:var(--muted);margin-left:3px">/40ft</span></div></div><div style="font-size:12.5px;font-weight:700;color:'+me+';">'+(Y>=0?"â²":"â¼")+" "+Math.abs(Y).toFixed(1)+"%</div></div>"+v(_,x,Q,64)+'<div class="sh-chart-cap">'+s(N)+(d.n_quotes?" · "+d.n_quotes+" quotes":"")+"</div></div>"}).filter(Boolean);function p(d,u,g,_){if(!d.flatMap(W=>W.values).filter(W=>W!=null&&isFinite(W)).length)return"";const B="sh-multi-"+Ee.length;return Ee.push({id:B,kind:"multi",lines:d,dates:_}),'<div id="'+B+'" style="width:100%;height:'+g+'px"></div>'}function b(d){return'<div style="display:flex;flex-wrap:wrap;gap:12px;margin-top:8px">'+d.map(u=>'<span style="display:flex;align-items:center;gap:5px;font-size:11px;font-weight:650;color:var(--ink2)"><span style="width:9px;height:9px;border-radius:50%;background:'+u.color+';display:inline-block"></span>'+s(u.label)+"</span>").join("")+"</div>"}const S={CMA:"#007AFF",MSC:"#FF9500",MSK:"#34C759",OOCL:"#AF52DE"},m=[...new Set(o.flatMap(d=>Object.keys(d.carriers||{})))],C=[];m.forEach(d=>{o.forEach(u=>{if(u.has_data===!1)return;const g=(u.carriers||{})[d];!g||!g.some(_=>_!=null)||C.push({color:S[d]||"#8E8E93",values:g,width:1.6,opacity:.8})})});const P=((K=o.find(d=>d.week_ends))==null?void 0:K.week_ends)||[];function j(d){const u=o.filter(y=>y.has_data!==!1&&(y.carriers||{})[d]);if(!u.length)return"";const g=[],_=[];let x=null;if(u.forEach(y=>{const N=y.carriers[d];for(let M=N.length-1;M>=0;M--)if(N[M]!=null){g.push(N[M]),(!x||P[M]>x)&&(x=P[M]);for(let E=M-1;E>=0;E--)if(N[E]!=null){_.push(N[E]);break}break}}),!g.length)return"";const B=y=>y.reduce((N,M)=>N+M,0)/y.length,W=B(g),Z=_.length?B(_):null,Y=Z?(W-Z)/Z*100:null,Q=S[d]||"#8E8E93",me=Y==null?"var(--muted)":Y>=0?"var(--green)":"var(--red)";return'<div class="carrier-card"><div class="cc-name" style="display:flex;align-items:center;gap:5px"><span style="width:8px;height:8px;border-radius:50%;background:'+Q+';display:inline-block"></span>
7'+s(r[d]||d)+'</div><div class="cc-px">$'+w(W,0)+'<span class="cc-unit">/40ft</span></div>'+(Y!=null?'<div style="font-size:11px;font-weight:700;color:'+me+';margin-top:3px">'+(Y>=0?"â²":"â¼")+" "+Math.abs(Y).toFixed(1)+"% "+s(t("shChgWeek"))+"</div>":"")+'<div class="cc-date">'+s(x||"")+"</div></div>"}const H=m.map(j).filter(Boolean);function A(d,u){return(d.series||{})[u]||[]}const X=f.filter(d=>d.has_data!==!1).map(d=>({color:i[d.route_code]||"#8E8E93",values:A(d,"portcalls"),width:1.8})),L=f.filter(d=>d.has_data!==!1).map(d=>{const u=d.route_code,g=i[u]||"var(--blue)",_=Q=>A(d,Q).filter(me=>me!=null&&isFinite(me)),x=Q=>Q.length?Q[Q.length-1]:null,B=x(_("portcalls")),W=x(_("portcalls_container")),Z=x(_("import_total")),Y=x(_("export"));return'<div class="port-stat" style="border-top:3px solid '+g+'"><div class="ps-label"><span style="width:8px;height:8px;border-radius:50%;background:'+g+';display:inline-block;margin-right:5px"></span>'+s(d.portname||u)+(d.undercount_risk?" â ":"")+"</div>"+(B!=null?'<div class="ps-val">'+w(B,0)+'</div><div class="ps-sub">'+s(t("shPortCalls"))+"</div>":"")+(W!=null?'<div style="font-size:11px;color:var(--ink2);margin-top:5px"><span style="font-weight:700">'+w(W,0)+"</span> "+s(t("shContainer"))+"</div>":"")+(Z!=null?'<div style="font-size:11px;color:var(--ink2)"><span style="font-weight:700">'+w(Z,0)+"</span> "+s(t("shImport"))+"</div>":"")+(Y!=null?'<div style="font-size:11px;color:var(--ink2)"><span style="font-weight:700">'+w(Y,0)+"</span> "+s(t("shExport"))+"</div>":"")+"</div>"}),k=f.some(d=>d.undercount_risk),z=Object.fromEntries(f.map(d=>[d.route_code,d.portname||d.route_code]));return'<div class="sec" id="s-shipping"><div class="sec-hd"><span class="sec-n">â´</span><span class="sec-t"><span class="em">ð¢</span>'+s(t("secShipping"))+'</span></div><div class="sec-sub">'+s(t("secShippingSub"))+"</div>"+(h.length?'<div class="subhd">'+s(t("shSpot"))+'</div><div class="sec-sub" style="margin-bottom:12px">'+s(t("shSpotSub"))+'</div><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px">'+h.join("")+"</div>":"")+(C.length?'<div class="subhd">'+s(t("shCarrier"))+'</div><div class="sec-sub" style="margin-bottom:12px">'+s(t("shCarrierSub"))+'</div><div class="sh-chart-wrap" style="padding:18px 18px 14px">'+p(C,900,240,P)+b(m.map(d=>({color:S[d]||"#8E8E93",label:r[d]||d})))+"</div>"+(H.length?'<div class="carrier-grid" style="margin-top:10px">'+H.join("")+"</div>":""):"")+(X.length?'<div class="subhd">'+s(t("shPort"))+'</div><div class="sec-sub" style="margin-bottom:12px">'+s(t("shPortSub"))+'</div><div class="sh-chart-wrap" style="padding:18px 18px 14px">'+p(X,900,220)+b(f.filter(d=>d.has_data!==!1).map(d=>({color:i[d.route_code]||"#8E8E93",label:z[d.route_code]})))+"</div>"+(L.length?'<div class="port-stat-grid" style="margin-top:10px">'+L.join("")+"</div>":"")+(k?'<div style="font-size:10.5px;color:var(--amber);margin-top:8px">'+s(t("shUndercountNote"))+"</div>":""):"")+"</div>"},xs=function(){Re.forEach(n=>{try{n.dispose()}catch{}}),Re=[],!(typeof J>"u")&&Ee.forEach(n=>{const e=R(n.id);if(!e)return;const a=D.chart(J,e,null,{renderer:"canvas"});if(Re.push(a),n.kind==="mini"){const i=n.dates,r=n.values,c=i?r.map((o,l)=>[i[l],o==null?null:Number(o)]):r.map((o,l)=>[l,o==null?null:Number(o)]);a.setOption({animation:!1,backgroundColor:"transparent",grid:{left:2,right:2,top:4,bottom:2},tooltip:{trigger:"axis",confine:!0,formatter:function(o){const l=o[0].data,f=l&&l[1];return s(te(l&&l[0]))+": "+(f==null?"â":"$"+w(f,0))}},xAxis:{type:n.dates?"time":"category",data:n.dates?void 0:n.values.map((o,l)=>l),show:!1,boundaryGap:!1},yAxis:{type:"value",scale:!0,show:!1},series:[{type:"line",data:c,symbol:"none",smooth:!0,connectNulls:!0,lineStyle:{color:n.color,width:2},areaStyle:{color:n.color+"22"}}]},!0)}else{const i=Math.max.apply(null,n.lines.map(o=>o.values.length).concat([1])),r=n.dates,c=Array.from({length:i},(o,l)=>r&&r[l]?r[l]:String(l+1));a.setOption({animation:!1,backgroundColor:"transparent",grid:{left:40,right:10,top:10,bottom:38},tooltip:{trigger:"axis",confine:!0},xAxis:{type:"category",data:c,axisLabel:{color:"#9ca3af",fontSize:10,hideOverlap:!0,formatter:r?te:void 0}
7,axisLine:{lineStyle:{color:"#e4e9f0"}}},yAxis:{type:"value",scale:!0,splitLine:{lineStyle:{color:"#f0f2f5"}},axisLabel:{color:"#9ca3af",fontSize:10}},dataZoom:[{type:"inside"},{type:"slider",height:12,bottom:2}],series:n.lines.map(o=>({type:"line",data:o.values,symbol:"none",connectNulls:!1,lineStyle:{color:o.color,width:o.width||2,opacity:o.opacity!=null?o.opacity:1}}))},!0)}})},Cs=function(n){const e=O(n.futures_risk)||{},a=e.meta||{},i=rn(n.symbol),r=F==="cn"?a.name_zh||n.name_zh||I(i):a.name_en||n.name_en||I(i),c=O(n.ohlc_bars),o=(c&&c.series&&c.series["1d"]&&c.series["1d"].bars||[]).slice(-1)[0],l=o?String(o.t).slice(0,10):null,f=e.as_of||null,v=!!(l&&o.c!=null&&(!f||l>f)),h=v?o.c:e.price_now,p=v?l:f,b=wn[n.symbol]||a.currency||"";return'<div class="mast"><div class="mast-top"><div class="mast-ic">'+i.icon+'</div><div class="mast-id"><div class="mast-nm">'+s(r)+'<span class="code">'+s(n.symbol)+'</span></div><div class="mast-tags">'+(a.exchange?'<span class="tag">'+s(F==="cn"&&a.exchange_zh||a.exchange)+"</span>":"")+(a.unit_en?'<span class="tag">'+s(F==="cn"&&a.unit_zh||a.unit_en)+"</span>":"")+'<span class="tag">'+s(q((O(n.spread_arb)||{}).strategy_family||""))+"</span></div></div>"+(h!=null?'<div class="mast-px"><div class="v">'+w(h,2)+'<span class="u">'+s(b)+'</span></div><div class="a">'+s(t("asOf"))+" "+te(p)+"</div></div>":"")+"</div></div>"},Ls=function(n){const e=O(n.trading_analysis)||{};return'<div class="foot">'+(e.trade_date?'<div class="r"><span>'+s(t("tradeDate"))+": "+s(e.trade_date)+"</span></div>":"")+'<div class="dis">'+s(t("disclaimer"))+"</div></div>"},Ns=function(){R("brand-eyebrow").textContent=t("eyebrow"),R("brand-prepared").textContent=t("prepared")+" "+Hn(ee.prepared_at)+" · "+re.length+" "+t("symbols"),R("shareBtnLabel").textContent=t("share"),R("downloadBtnLabel").textContent=t("download"),R("shareBtn").title=t("share"),R("downloadBtn").title=t("download"),R("symtabs").innerHTML=re.map(r=>{const c=ee.data[r]||{},o=rn(r);return'<button type="button" class="symtab'+(r===ce?" on":"")+'" data-report-action="pickSym" data-report-value="'+r+'"><span class="ic">'+o.icon+'</span><span class="tx"><span class="sy">'+s(r)+'</span><span class="nm">'+s(I(o))+'</span></span><span class="st '+s(c.status||"error")+'"></span></button>'}).join("");const n={"s-shipping":new Set(["EC"])},a=(ee.data[ce]||{}).hedge_calc,i=!!(a&&a.status==="ok"&&a.data&&a.data.bundle);R("secnav").innerHTML=gn.filter(([r])=>{const c=n[r];return c?c.has(ce):r==="s-hedgecalc"?i:!0}).map(([r,c],o)=>'<a href="#'+r+'" class="'+(o===0?"on":"")+'" data-sec="'+r+'">'+s(t(c))+"</a>").join("")},Ms=function(){[ae,he,be,ve,se,...Re].forEach(n=>{n&&!n.isDisposed()&&n.dispose()}),ae=null,he=null,be=null,ve=null,se=null,Re=[],Te=null},xe=function(){Ns();const n=ee.data[ce],e=R("report");if(!n){e.innerHTML='<div class="panel"><div class="sec"><div class="empty">'+s(t("noData"))+"</div></div></div>";return}Qn(),cs(),Ms();let a='<div class="panel">'+Cs(n)+us(n)+os(n)+Vn(n)+qn(n)+Zn(n)+ds(n)+fs(n)+hs(n)+vs(n)+bs(n)+gs(n)+ms(n)+ks(n)+Ls(n)+"</
7div>",i=0;a=a.replace(/<span class="sec-n">\d+<\/span>/g,()=>'<span class="sec-n">'+ ++i+"</span>"),e.innerHTML=a,D.frame(()=>{Fs(n),Gn(),Xn(),en(),ls(n),Kn(n),xs(),Ts(),Ss(n)})},Fs=function(n){const e=R("spark");if(!e)return;const a=O(n.spread_arb)||{};if(a.tradeable&&a.strategy&&a.strategy.history)fn(e,a.strategy.history.equity_curve||[],"#0a8a3e",null);else if(a.indicator&&a.indicator.history){const i=(a.indicator.history.level||[]).filter(c=>c!=null&&isFinite(c)),r=i.length?i.reduce((c,o)=>c+o,0)/i.length:null;fn(e,(a.indicator.history.level||[]).map(c=>c==null?null:Math.exp(c)),"#0071e3",r!=null?Math.exp(r):null)}},Ts=function(){We&&We.disconnect();const n=[].slice.call(G.querySelectorAll("#secnav a"));We=D.observe(e=>{e.forEach(a=>{a.isIntersecting&&n.forEach(i=>i.classList.toggle("on",i.dataset.sec===a.target.id))})},{rootMargin:"-160px 0px -70% 0px"}),gn.forEach(([e])=>{const a=R(e);a&&We.observe(a)})},je=function(n){const e=R("toastWrap"),a=G.ownerDocument.createElement("div");a.className="toast",a.textContent=n,e.appendChild(a),D.frame(()=>a.classList.add("show")),D.timeout(()=>{a.classList.remove("show"),D.timeout(()=>a.remove(),300)},2600)},ee=Ae.report||{data:{},symbols:[]};const re=["AL"];let F=Ae.language==="zh"?"cn":"en",ce=re[0];const T={horizon:null,risk:null,accView:"overall",open:{}},yn={navSpreadGauge:{en:"Spread Check",cn:"ä»·å·®é·è¾¾"},secSpreadGauge:{en:"Spread Check â buy now or wait?",cn:"ä»·å·®é·è¾¾ â ç°å¨ä¹°è¿æ¯çï¼"},secSpreadGaugeSub:{en:"Compares todayâs near-term price with the price roughly 3 months further down the curve, then checks whether that gap is wider or narrower than usual for this market.",cn:"æ¯è¾å½åè¿æä»·æ ¼ä¸å¤§çº¦3个æåå约çä»·æ ¼ï¼å¹¶æ£æ¥è¿ä¸å·®è·æ¯å¦æ¯è¯¥åç§çå岿£å¸¸æ°´å¹³æ´å®½ææ´çªã"},sgBadgeWatch:{en:"ð Worth a look",cn:"ð å¼å¾å
³æ³¨"},sgBadgeNormal:{en:"Nothing unusual",cn:"ææ å¼å¸¸"},sgHeadExtremePrem:{en:"Buying now costs noticeably MORE than buying 3 months out",cn:"ç°å¨ä¹°å
¥æ¯3个æåä¹°å
¥ææ¾æ´è´µ"},sgHeadExtremeDisc:{en:"Buying now costs noticeably LESS than buying 3 months out",cn:"ç°å¨ä¹°å
¥æ¯3个æåä¹°å
¥ææ¾æ´ä¾¿å®"},sgHeadNotablePrem:{en:"Buying now costs a little more than buying 3 months out",cn:"ç°å¨ä¹°å
¥æ¯3个æåä¹°å
¥ç¥è´µ"},sgHeadNotableDisc:{en:"Buying now costs a little less than buying 3 months out",cn:"ç°å¨ä¹°å
¥æ¯3个æåä¹°å
¥ç¥ä¾¿å®"},sgHeadNormal:{en:"Near-term and 3-months-out prices are lined up normally",cn:"è¿æä¸3个æåçä»·å·®å¤äºæ£å¸¸æ°´å¹³"},sgSubToday:{en:"Todayâs gap:",cn:"å½åä»·å·®ï¼"},sgSubWider:{en:"wider than",cn:"é«äº"},sgSubNarrower:{en:"narrower than",cn:"ä½äº"},sgSubOfDays:{en:"of the past",cn:"è¿å»"},sgSubDays:{en:"trading days",cn:"ä¸ªäº¤ææ¥"},sgBarLow:{en:"Unusually low",cn:"å¼å¸¸åä½"},sgBarMid:{en:"Normal range",cn:"æ£å¸¸åºé´"},sgBarHigh:{en:"Unusually high",cn:"å¼å¸¸åé«"},sgKpiGap:{en:"Todayâs gap",cn:"å½åä»·å·®"},sgKpiContract:{en:"Priced off",cn:"åèå约"},sgKpiPercentile:{en:"Percentile vs history",cn:"åå²ç¾åä½"},sgKpiHistory:{en:"Days of history used",cn:"å岿°æ®å¤©æ°"},sgKpiWindow:{en:"window",cn:"çªå£"},sgTradeTitle:{en:"ð° Trading angle",cn:"ð° 交æè§åº¦"},sgTradeExtremePrem:{en:"This gap is wider than almost all of its recent history. Some traders would sell the near-term contract and buy the further-out one, betting it snaps back toward normal.",cn:"该价差已é«äºè¿æç»å¤§å¤æ°å岿°´å¹³ãé¨å交æè
å¯è½ä¼ååºè¿æå约ãä¹°å
¥è¿æåçº¦ï¼æ¼æ³¨ä»·å·®åæ£å¸¸æ°´å¹³åå½ã"},sgTradeExtremeDisc:{en:"This gap is narrower (or more negative) than almost all of its recent history. Some traders would buy the near-term contract and sell the further-out one, betting it snaps back toward normal.",cn:"该价差已ä½äºï¼ææ´è´äºï¼è¿æç»å¤§å¤æ°å岿°´å¹³ãé¨å交æè
å¯è½ä¼ä¹°å
¥è¿æå约ãååºè¿æåçº¦ï¼æ¼æ³¨ä»·å·®åæ£å¸¸æ°´å¹³åå½ã"},sgTradeNotablePrem:{en:"This gap is a bit wider than usual â worth keeping an eye on, but not yet extreme.",cn:"该价差ç¥é«äºæ£å¸¸æ°´å¹³ââå¼å¾å
³æ³¨ï¼ä½å°æªè¾¾å°æç«¯æ°´å¹³ã"},sgTradeNotableDisc:{en:"This gap is a bit narrower than usual â worth keeping an eye on, but not yet extreme.",cn:"该价差ç¥ä½äºæ£å¸¸æ°´å¹³ââå¼å¾å
³æ³¨ï¼ä½å°æªè¾¾å°æç«¯æ°´å¹³ã"},sgTradeNormal:{en:"Nothing stands out right now â this isnât a market where a spread trade looks especially attractive at the moment.",cn:"ç®åæ²¡æææ¾ä¿¡å·ââç°å¨å¹¶éè¿è¡ä»·å·®äº¤æçç¹å«æå©æ¶æºã"},sgHedgeTitle:{en:"ð¡ï¸ Hedging angle",cn:"ð¡ï¸ å¥ä¿è§åº¦"},sgHedgePrem:{en:"If you need to buy soon, near-term supply is pricier than usual right now â locking in a purchase further out may work out cheaper.",cn:"妿æ¨è¿æéè¦éè´ï¼å½åè¿æä»·æ ¼åè´µââé宿´è¿æçéè´å¯è½æ´åç®ã"},sgHedgeDisc:{en:"If you need to buy soon, near-term supply is cheaper than usual right now â buying now may work out cheaper than waiting.",cn:"妿æ¨è¿æéè¦éè´ï¼å½åè¿æä»·æ ¼åå®ââç°å¨éè´å¯è½æ¯çå¾
æ´åç®ã"},sgHedgeNormal:{en:"No unusual timing advantage either way right now.",cn:"ç®åä¹°æ©ä¹°æå¨æ¶é´éæ©ä¸æ²¡æææ¾ä¼å¿ã"},sgChartTitle:{en:"How the gap has moved",cn:"价差走å¿"},sgChartSub:{en:"Positive = near-term pricier than 3-months-out; negative = cheaper. Each point is one trading day â the highlighted dot is today.",cn:"æ£å¼è¡¨ç¤ºè¿æä»·æ ¼é«äº3个æåå约ï¼
7è´å¼åç¸åãæ¯ä¸ªç¹ä»£è¡¨ä¸ä¸ªäº¤ææ¥ï¼é«äº®ç¹ä¸ºå½æ¥æ°æ®ã"},sgWhyTitle:{en:"Why not just compare to a simple average?",cn:"为ä»ä¹ä¸ç´æ¥ä¸ç®åå¹³å弿¯è¾ï¼"},sgWhyBody:{en:'This gap doesnât drift like a gentle wave â it can sit quiet for weeks, then jump hard in a single day (a supply scare, a delivery squeeze, a policy change). A simple "how many standard deviations from average" trick assumes gentle waves, so sudden jumps fool it â it either cries wolf too often or misses the real ones. Instead we directly rank todayâs gap against its own recent history ("wider than X% of days"), which isnât fooled by those occasional jumps.',cn:"è¿ä¸ä»·å·®çååå¹¶ä¸åå¹³ç¼ç波浪ââå®å¯è½è¿ç»æ°å¨ä¿æå¹³éï¼éå卿ä¸å¤©çªç¶å¤§å¹
è·³å¨ï¼ä¾åºæ
å¿§ã交å²ç´§å¼ ãæ¿çååçï¼ãç®åçâè·ç¦»å¹³åå¼å 个æ åå·®âç®æ³åè®¾çæ¯å¹³ç¼æ³¢å¨ï¼å æ¤å®¹æè¢«è¿ç±»çªç¶è·³å¨è¯¯å¯¼ââè¦ä¹é¢ç¹è¯¯æ¥ï¼è¦ä¹éè¿çæ£çå¼å¸¸ãæä»¬æ¹ç¨ç´æ¥æåºçæ¹å¼ï¼æä»å¤©çä»·å·®ä¸å
¶èªèº«è¿æå岿¯è¾ï¼âé«äºç¾åä¹å çäº¤ææ¥âï¼ï¼å æ¤ä¸ä¼è¢«å¶åçè·³å¨æè¯¯å¯¼ã"},eyebrow:{en:"Futures Intelligence Report",cn:"æè´§ç»¼åç ç©¶æ¥å"},prepared:{en:"Prepared",cn:"çææ¶é´"},symbols:{en:"symbols",cn:"个åç§"},asOf:{en:"as of",cn:"æªè³"},dataRange:{en:"Data range",cn:"æ°æ®åºé´"},share:{en:"Share",cn:"å享"},download:{en:"Download image",cn:"ä¸è½½å¾ç"},downloading:{en:"Renderingâ¦",cn:"çæä¸â¦"},shareToast:{en:"Sharing isnât wired up yet â coming soon.",cn:"å享åè½å°æªæ¥å
¥ï¼æ¬è¯·æå¾
ã"},downloadOk:{en:"Image saved",cn:"å¾çå·²ä¿å"},downloadFail:{en:"Couldnât generate the image â try again.",cn:"å¾ççæå¤±è´¥ï¼è¯·éè¯ã"},navVerdict:{en:"Verdict",cn:"ç»è®º"},navForecast:{en:"Forecast & Risk",cn:"颿µä¸é£é©"},navFund:{en:"Fundamentals",cn:"åºæ¬é¢"},navDebate:{en:"Bull vs Bear",cn:"å¤ç©ºè¾©è®º"},navNews:{en:"News",cn:"æ°é»"},navSpread:{en:"Spread Strategy",cn:"ä»·å·®çç¥"},navStats:{en:"Statistics",cn:"ç»è®¡æ¨¡å"},navCost:{en:"Cost & Contract",cn:"ææ¬ä¸å约"},navShipping:{en:"Shipping Market",cn:"è¿è´¹å¸åº"},secShipping:{en:"EC Shipping Market",cn:"éè¿å¸åºè¡æ
"},secShippingSub:{en:"Spot rates (CNSHAâEU, 40ft), carrier online quotes and daily port data for the five major European hub ports.",cn:"峿è¿ä»·ï¼ä¸å½è³æ¬§æ´²ï¼40è±å°ºï¼ãåæ¿è¿äººç½ä¸æ¥ä»·å欧洲äºå¤§æ¢çº½æ¸¯å£æ¯æ¥æ°æ®ã"},shSpot:{en:"Spot Rates",cn:"峿è¿ä»·"},shSpotSub:{en:"All-in median ocean freight, CNSHA â EU port, 40ft.",cn:"å
¨ç¨ç»¼åä¸ä½è¿ä»·ï¼ä¸å½â欧洲港å£ï¼40è±å°ºã"},shCarrier:{en:"Carrier Online Quotes",cn:"æ¿è¿äººç½ä¸æ¥ä»·"},shCarrierSub:{en:"Base ocean freight only (surcharges excluded), CNSHA â EU port, 40ft. Weekly quotes published on carrier websites, one line per route, colored by carrier.",cn:"ä»
å«åºæ¬æµ·è¿è´¹ï¼ä¸å«éå è´¹ï¼ï¼ä¸å½â欧洲港å£ï¼40è±å°ºãåæ¿è¿äººå®ç½æ¯å¨æ¥ä»·ï¼æèªçº¿ç»å¶ãææ¿è¿äººçè²ã"},shChgWeek:{en:"vs last week",cn:"è¾ä¸å¨"},shPort:{en:"Daily Port Data",cn:"æ¸¯å£æ¯æ¥æ°æ®"},shPortSub:{en:"Daily port calls, 90-day window, one line per port. Rotterdamâs count may run low relative to its true traffic.",cn:"æ¯æ¥ææ¸¯æ¬¡æ°ï¼90天çªå£ï¼ææ¸¯å£çè²ã鹿ç¹ä¸¹ç计æ°ç¸å¯¹å
¶ç宿µéå¯è½åä½ã"},shPortCalls:{en:"Port calls",cn:"ææ¸¯æ¬¡æ°"},shContainer:{en:"Container calls",cn:"éè£
ç®±ææ¸¯"},shImport:{en:"Import volume",cn:"è¿å£é"},shExport:{en:"Export volume",cn:"åºå£é"},shLatest:{en:"Latest",cn:"ææ°"},shUndercountNote:{en:"â Rotterdamâs port-call count may run low relative to its true traffic.",cn:"â 鹿ç¹ä¸¹çææ¸¯è®¡æ°ç¸å¯¹å
¶ç宿µéå¯è½åä½ã"},secVerdict:{en:"The call",cn:"å½åç»è®º"},secVerdictSub:{en:"One consolidated view, then the same question answered independently by five engines. Where they disagree matters more than where they agree.",cn:"å
ç»åºç»¼åç
7»è®ºï¼åååºäºä¸ªå¼æåèªç¬ç«ç夿ãåæ§ä¹å¤æ¯ä¸è´ä¹å¤æ´å¼å¾å
³æ³¨ã"},consFore:{en:"Forecast",cn:"ä»·æ ¼é¢æµ"},consFund:{en:"Fundamentals",cn:"åºæ¬é¢"},consNews:{en:"News",cn:"æ°é»æ
绪"},consSpread:{en:"Spread",cn:"ä»·å·®"},consStats:{en:"Statistics",cn:"ç»è®¡æ¨¡å"},consFore1M:{en:"1-month point forecast",cn:"1个æé¢æµå¼"},consFundH:{en:"Supply/demand outlook",cn:"ä¾é屿"},consNewsH:{en:"Todayâs news sentiment",cn:"彿¥æ°é»æ
绪"},consSpreadH:{en:"Calendar-spread posture",cn:"è·¨æä»·å·®å»ºè®®"},consStatsH:{en:"Statistical recommendation",cn:"ç»è®¡æ¨¡å建议"},agreeLead:{en:"Across the five engines",cn:"äºä¸ªå¼æå½ä¸"},agreeBull:{en:"bullish",cn:"çå¤"},agreeBear:{en:"bearish",cn:"ç空"},agreeFlat:{en:"neutral",cn:"䏿§"},agreeStrong:{en:"Signals broadly agree, which raises confidence in the headline call.",cn:"ä¿¡å·æ¹ååºæ¬ä¸è´ï¼ç»è®ºå¯ä¿¡åº¦è¾é«ã"},agreeMixed:{en:"Signals are split, so treat the headline call with cautious optimism â size positions conservatively until they align.",cn:"ä¿¡å·åå¨åæ§ï¼å»ºè®®å¯¹ç»è®ºä¿æè°¨æ
ä¹è§ââæ§å¶ä»ä½è§æ¨¡ï¼å¾
ä¿¡å·è¿ä¸æ¥ç»ä¸ååå 大å度ã"},agreeNeutral:{en:"Most engines see no tradable edge right now.",cn:"夿°å¼æè®¤ä¸ºå½å没æå¯äº¤æçæºä¼ã"},secForecast:{en:"Price forecast & risk range",cn:"ä»·æ ¼é¢æµä¸é£é©åºé´"},secForecastSub:{en:'Two different questions, two different widths. The 80% forecast band answers "where is price most likely to go" â it is our tightest, best-estimate range. The wider risk corridor answers a different question â "how far could price move under a larger, less likely shock" â and is not itself a prediction.',cn:'两个ä¸åçé®é¢ï¼å¯¹åºä¸¤ç§ä¸åç宽度ã80%颿µåºé´åççæ¯"ä»·æ ¼æå¯è½è½å¨åªé"ââè¿æ¯æä»¬ç»åºçæç´§å¯ãæä½³ä¼°è®¡åºé´ãæ´å®½çé£é©åºé´åççæ¯å¦ä¸ä¸ªé®é¢ââ"å¨è¾å¤§ä½æ¦çæ´ä½çå²å»ä¸ï¼ä»·æ ¼æè¿å¯è½å°åªé"ââ宿¬èº«å¹¶ä¸æ¯ä¸ä¸ªé¢æµã'},lnHistory:{en:"Price history",cn:"åå²ä»·æ ¼"},lnCone:{en:"Forecast band (most likely)",cn:"颿µåºé´ï¼æå¯è½ï¼"},lnRisk:{en:"Risk corridor (worst-case, wider)",cn:"é£é©åºé´ï¼æåæ
å½¢ï¼è¾å®½ï¼"},tapHint:{en:"Tap a horizon or risk row below to inspect it on the chart.",cn:"ç¹å»ä¸æ¹ä»»ä¸å¨ææé£é©è¡ï¼å¯å¨å¾è¡¨ä¸æ¥çã"},hzForecast:{en:"By horizon",cn:"å卿颿µ"},flatNote:{en:"0.00% here means the winning model for that horizon is the no-change (random-walk) baseline â it isnât predicting a move either way, only that the band width shown is the normal day-to-day uncertainty around todayâs price.",cn:'æ¤å¤ç0.00%è¡¨ç¤ºè¯¥å¨æçæä¼æ¨¡åæ¯"é¶åå¨"ï¼éæºæ¼«æ¥ï¼åºçº¿æ¨¡åââå®å¹¶æªé¢æµæ¶¨è·æ¹åï¼ææ¾ç¤ºçåºé´å®½åº¦åªåæ å´ç»å½åä»·æ ¼çæ£å¸¸æ¥å¸¸æ³¢å¨ä¸ç¡®å®æ§ã'},hzAccuracy:{en:"Model accuracy",cn:"模ååç¡®ç"},hzAccuracySub:{en:"Measured on a walk-forward backtest, entirely on held-out data the model never trained on.",cn:"以æ»å¨åæµæ¹å¼æµç®ï¼å
¨é¨åºäºæ¨¡åè®ç»æ¶ä»æªè§è¿çæµè¯æ°æ®ã"},noDirNote:{en:"No direction score for {h}: over the backtest the best-performing model at those horizons was the no-change baseline, and a flat call has no up or down to be right or wrong about.",cn:'{h}æ²¡ææ¹ååç¡®çï¼å¨åæµä¸ï¼è¿äºå¨æè¡¨ç°æå¥½çæ¯"é¶åå¨"åºçº¿æ¨¡åï¼èæå¹³ç颿µæ¬èº«ä¸å«æ¶¨è·æ¹åï¼å æ¤æ ä»å¤æå¯¹éã'},colDir:{en:"Direction",cn:"æ¹å"},colDirH:{en:"Up/down correct",cn:"æ¶¨è·æ£ç¡®ç"},colPt:{en:"Typical miss",cn:"ä»·æ ¼è¯¯å·®"},colPtH:{en:"Avg % off (MAPE)",cn:"å¹³ååå·®ï¼MAPEï¼"},colBand:{en:"Band cover",cn:"åºé´è¦ç"},colBandH:{en:"Inside 80% band",cn:"è½å¨80%åºé´å
"},viewOverall:{en:"Overall",cn:"æ´ä½"},viewRecent:{en:"Recent",cn:"è¿æ"},winOverall:{en:"Full {y}-year backtest",cn:"宿´{y}å¹´åæµ"},winRecent:{en:"Trailing ~{d} sessions",cn:"æè¿çº¦{d}ä¸ªäº¤ææ¥"},recentCaveat:{en:"Recent uses fewer independent windows at longer horizons â read as a directional signal, not a precise figure.",cn:"è¾é¿å¨æä¸ï¼ãè¿æãçªå£å
ç¬ç«æ ·æ¬è¾å°ï¼è¯·ä½ä¸ºè¶å¿åèèé精确æ°å¼ã"},beatsRw:{en:"Verified",cn:"å·²éªè¯"},refOnly:{en:"Reference",cn:"åè"},vsRw:{en:"vs random walk",cn:"ä¼äºåºçº¿"},riskTitle:{en:"Risk corridors",cn:"é£é©åºé´"},riskSub:{en:"A separate, wider boundary for rare, larger moves you should still plan for â not itself a forecast.",cn:"é对å°è§ä½å¹
度æ´å¤§çæ³¢å¨åå®çå¦ä¸æ¡æ´å®½è¾¹çï¼ç¨äºè§ååºå¯¹ââ宿¬èº«å¹¶ä¸æ¯é¢æµã"},down:{en:"downside",cn:"ä¸è¡"},up:{en:"upside",cn:"ä¸è¡"},expChange:{en:"expected change",cn:"é¢ææ¶¨è·"},likelyRange:{en:"80% likely range",cn:"80%å¯è½åºé´"},histAcc:{en:"historical direction accuracy",cn:"å岿¹ååç¡®ç"},riskPlan:{en:"the wider risk corridor to plan around is",cn:"éè§åçè¾å®½é£é©åºé´ä¸º"},notPrediction:{en:"This is a risk boundary for rare, larger moves â not a prediction of what will happen.",cn:"è¿æ¯é对å°è§å¤§å¹
æ³¢å¨åå®çé£é©è¾¹çï¼èéå¯¹æªæ¥èµ°å¿ç颿µã"},bdTitle:{en:"How the corridor held up",cn:"é£é©åºé´çåå²è¡¨ç°"},bdSub:{en:"The same {h} corridor, published on each past day and scored against the move price actually went on to make from that day. Everything is measured as % from that dayâs close, so the corridor sits level and every dot is comparable.",cn:"åä¸{h}é£é©åºé´å¨è¿å»æ¯ä¸å¤©çåå¸å¼ï¼ä¸è¯¥æ¥èµ·ä»·æ ¼å®é
åççæ³¢å¨å¯¹æ¯ãå
¨é¨ä»¥å½æ¥æ¶çä»·ç%è¡¡éï¼å æ¤åºé´ä¿ææ°´å¹³ãæ¯ä¸ªç¹å¯ç´æ¥æ¯è¾ã"},bdLnMl:{en:"ML corridor (outer)",cn:"MLåºé´ï¼å¤å±ï¼"},bdLnInner:{en:"ML corridor (inner)",cn:"MLåºé´ï¼å
å±ï¼"},bdLnNaive:{en:"Naive ±1.645Ï (baseline)",cn:"æ´ç´ ±1.645Ïï¼åºåï¼"},bdLnUp:{en:"Realized rise",cn:"å®é
涨å¹
"},bdLnDn:{en:"Realized drop",cn:"å®é
è·å¹
"},bdLnBreach:{en:"Escaped the corridor",cn:"çªç ´åºé´"},bdBreach:{en:"escaped the corridor",cn:"çªç ´åºé´"},bdToday:{en:"today â forward corridor",cn:"仿¥ â æªæ¥åºé´"},bdNow:{en:"today",cn:"仿¥"}
7,bdTipReal:{en:"Realized move",cn:"å®é
æ³¢å¨"},bdTipPending:{en:"window not finished",cn:"çªå£æªç»æ"},bdCovMl:{en:"outer corridor held",cn:"å¤å±åºé´å½ä¸"},bdCovInner:{en:"inner corridor held",cn:"å
å±åºé´å½ä¸"},bdCovNaive:{en:"naive baseline held",cn:"æ´ç´ åºåå½ä¸"},bdCovN:{en:"over {n} scored days",cn:"å
±{n}个å¯è¯ä¼°äº¤ææ¥"},bdBreachCnt:{en:"In the window shown, {n} of {t} days escaped the outer corridor ({p}%).",cn:"å¾ä¸çªå£å
ï¼{t}天䏿{n}天çªç ´å¤å±åºé´ï¼{p}%ï¼ã"},bdUnresolved:{en:"ð The last {n} trading days show no dot yet â a {h} outcome can only be scored once that many trading days have actually passed. Thatâs expected, not missing data.",cn:"ð æè¿{n}ä¸ªäº¤ææ¥å°æ å®é
ç¹ââ{h}çç»æåªè½å¨å¯¹åºçäº¤ææ¥çæ£è¿å»åæè½ç¡®å®ãè¿æ¯æ£å¸¸ç°è±¡ï¼å¹¶éæ°æ®ç¼ºå¤±ã"},bdNote:{en:"Coverage percentages are measured over all scored days in the modelâs history, not only the window drawn. The corridor is a risk boundary, not a forecast of direction.",cn:"å½ä¸çåºäºæ¨¡åå
¨é¨åå²å¯è¯ä¼°äº¤ææ¥è®¡ç®ï¼èéä»
å¾ä¸çªå£ã该åºé´æ¯é£é©è¾¹çï¼èéæ¹å颿µã"},spTitle:{en:"Spot vs future â near & far",cn:"ç°è´§ä¸æè´§ â è¿ç«¯ä¸è¿ç«¯"},spSub:{en:"The future settles on the underlying spot index. Shown here on one price scale: the traded future against the near-dated and far-dated spot series, so the gap you see is the basis itself.",cn:"æè´§ä»¥æ çç°è´§ææ°ç»ç®ãæ¤å¤ä»¥åä¸ä»·æ ¼å»åº¦å±ç¤ºï¼äº¤æçæè´§ä¸è¿ç«¯ãè¿ç«¯ç°è´§åºåï¼å¾ä¸å·®è·å³ä¸ºåºå·®ã"},spLnFut:{en:"Future",cn:"æè´§"},spLnNear:{en:"Near spot",cn:"è¿ç«¯ç°è´§"},spLnFar:{en:"Far spot",cn:"è¿ç«¯ç°è´§"},spNote:{en:"Prices are in index points. Near vs far spot reflects the settlement window; the number beside each spot value is its gap to the future (its basis).",cn:"ä»·æ ¼åä½ä¸ºææ°ç¹ãè¿ç«¯ä¸è¿ç«¯ç°è´§å¯¹åºä¸åç»ç®çªå£ï¼æ¯ä¸ªç°è´§å¼æçæ°å为å
¶ä¸æè´§çå·®ï¼åºå·®ï¼ã"},spContNote:{en:"The âFutureâ line is a continuous back-adjusted series â it splices successive front-month contracts into one unbroken price path for visual continuity, and is not the actual traded contract price.",cn:"âæè´§âæ²çº¿ä¸ºè¿ç»å¤æåºåââå°å次主ååçº¦æ¼æ¥ä¸ºä¸æ¡è¿ç»ä»·æ ¼è·¯å¾ä»¥ä¾¿å¯è§åï¼å¹¶éå®é
交æåçº¦ä»·æ ¼ã"},spBasis:{en:"Latest basis: near {near}, far {far} vs the future.",cn:"ææ°åºå·®ï¼è¿ç«¯ {near}ï¼è¿ç«¯ {far}ï¼ç¸å¯¹æè´§ï¼ã"},navPriceHist:{en:"Price Bars",cn:"K线å¾"},phTitle:{en:"Price History",cn:"è¡æ
K线"},phSub:{en:"Candlestick bars from the actual traded contract currently dominant by open interest â the real print, not a spliced continuous series. This contract rolls periodically; the code beside the title is the one plotted below.",cn:"以å½åæä»éæé«ï¼ä¸»åï¼ççå®å约ç»å¶K线ââ为å®é
æäº¤ä»·ï¼éæ¼æ¥çè¿ç»åºåã该å约ä¼å®ææ»å¨ï¼æ 颿ç代ç å³ä¸ºä¸æ¹æç»å约ã"},phContract:{en:"Contract",cn:"å约"},phSrc:{en:"Source: market data (akshare)",cn:"æ¥æºï¼è¡æ
æ°æ®ï¼akshareï¼"},phGran_1h:{en:"1 h",cn:"1å°æ¶"},phGran_1d:{en:"Daily",cn:"æ¥çº¿"},phWin_1M:{en:"1 M",cn:"1æ"},phWin_3M:{en:"3 M",cn:"3æ"},phWin_6M:{en:"6 M",cn:"6æ"},phWin_1Y:{en:"1 Y",cn:"1å¹´"},phWin_ALL:{en:"All",cn:"å
¨é¨"},phNoData:{en:"No price history available.",cn:"ææ è¡æ
æ°æ®ã"},secFund:{en:"Fundamentals",cn:"åºæ¬é¢"},secFundSub:{en:"Physical supply and demand read off measured data â inventories, curve structure, treatment charges â not sentiment.",cn:"åºäºå¯éæµæ°æ®ï¼åºåãæ²çº¿ç»æãå 工费çï¼çå®é
ä¾é夿ï¼èéæ
绪ã"},fSupply:{en:"Supply / demand",cn:"ä¾é"},fOutlook:{en:"Outlook",cn:"屿"},fPvF:{en:"Price vs fundamental",cn:"ä»·æ ¼ vs åºæ¬é¢"},fConf:{en:"confidence",cn:"置信度"},fDrivers:{en:"Key drivers",cn:"æ ¸å¿é©±å¨"},fSummary:{en:"What this means",cn:"解读"},fullFund:{en:"Read the full fundamentals report",cn:"æ¥ç宿´åºæ¬é¢æ¥å"},secPhys:{en:"Measured market data",cn:"宿µå¸åºæ°æ®"},secPhysSub:{en:"Hard, observable facts behind the fundamental call.",cn:"æ¯æåºæ¬é¢å¤æç客è§å¯è§æµæ°æ®ã"},vs1m:{en:"vs 1 month ago",cn:"è¾1个æå"},unitPerYear:{en:"per year",cn:"æ¯å¹´ï¼å¹´åï¼"}
7,unitPriceGap:{en:"price gap",cn:"ä»·å·®æ¯ä¾"},unitTonnes:{en:"tonnes",cn:"å¨"},unitCnyPerTonne:{en:"CNY/tonne",cn:"å
/å¨"},unitCny:{en:"CNY",cn:"å
"},unitIndexPt:{en:"index points",cn:"ææ°ç¹"},of1y:{en:"of 1-year range",cn:"å¤äºè¿ä¸å¹´åºé´"},staleWarn:{en:"Not updated recently",cn:"æ°æ®æªåæ¶æ´æ°"},secDebate:{en:"Bull vs bear",cn:"å¤ç©ºè¾©è®º"},secDebateSub:{en:"Two analysts argue the same evidence to opposite conclusions, then a third resolves which crux actually wins.",cn:"两ä½åæå¸åºäºç¸åè¯æ®å¾åºç¸åç»è®ºï¼åç±ç¬¬ä¸æ¹è£å®åªä¸æ¹çå
³é®è®ºç¹æç«ã"},bullCase:{en:"Bull case",cn:"çå¤è§ç¹"},bearCase:{en:"Bear case",cn:"ç空è§ç¹"},theCrux:{en:"The crux",cn:"å
³é®åæ§"},resolution:{en:"Resolution",cn:"è£å®ç»è®º"},traderView:{en:"Traderâs view",cn:"交æåè§ç¹"},fullBull:{en:"Read the full bull argument",cn:"æ¥ç宿´çå¤è®ºè¯"},fullBear:{en:"Read the full bear argument",cn:"æ¥ç宿´ç空论è¯"},fullDecision:{en:"Read the full investment decision",cn:"æ¥ç宿´æèµå³ç"},secNews:{en:"News & market sentiment",cn:"æ°é»ä¸å¸åºæ
绪"},secNewsSub:{en:"Two independent passes: the deskâs own news analyst on todayâs tape, and a fresh Chinese + global web sweep summarised into bull and bear bullets.",cn:"两æ¡ç¬ç«æ¥æºï¼ä¸æ¯å
鍿°é»åæå¸å¯¹å½æ¥çé¢ç解读ï¼äºæ¯ä¸è±æç½ç»å®æ¶æ£ç´¢åå½çº³çå¤ç©ºè¦ç¹ã"},newsDesk:{en:"Desk news analysis",cn:"å
鍿°é»åæ"},newsSent:{en:"Overall sentiment",cn:"æ´ä½æ
绪"},newsWeb:{en:"Web sweep (CN + global)",cn:"ç½ç»æ£ç´¢ï¼ä¸æ+å
¨çï¼"},newsBull:{en:"Bullish takeaways",cn:"å©å¤è¦ç¹"},newsBear:{en:"Bearish takeaways",cn:"å©ç©ºè¦ç¹"},newsSources:{en:"Sources",cn:"ä¿¡æ¯æ¥æº"},fullNews:{en:"Read the full news report",cn:"æ¥ç宿´æ°é»æ¥å"},secSpread:{en:"Spread strategy",cn:"ä»·å·®çç¥"},secSpreadSub:{en:"The calendar-spread engine: what it suggests doing right now, and how it has performed in testing.",cn:"è·¨æä»·å·®å¼æï¼å½åæä½å»ºè®®ï¼ä»¥ååå²åæµè¡¨ç°ã"},tradeableY:{en:"Tradeable strategy",cn:"å¯äº¤æçç¥"},tradeableN:{en:"Reference only",cn:"ä»
ä¾åè"},todaysCall:{en:"Todayâs call",cn:"仿¥å»ºè®®"},noSignal:{en:"No signal produced today",cn:"仿¥æªçæä¿¡å·"},zhUnavailable:{en:'Chinese translation for this analysis has not been generated yet â sections below marked "EN" are showing the original English text until the next refresh.',cn:'æ¬æ¬¡åæçä¸æç¿»è¯å°æªçæââ䏿¹æ æ"EN"çåºåå¨ä¸ä¸æ¬¡å·æ°åå°æ¾ç¤ºè±æåæã'},enSourceHint:{en:"Chinese translation not yet available for this section; showing the English original.",cn:"该åºåææ ä¸æç¿»è¯ï¼æ¾ç¤ºä¸ºè±æåæã"},scaleBreakNote:{en:"ð The forecast leg (right of the dashed âtodayâ line) is spaced on a square-root-of-time scale, so each horizon stays clearly separated instead of crowding into a sliver next to 1â2 years of daily history.",cn:'ð 颿µé¨åï¼è线"仿¥"å³ä¾§ï¼ææ¶é´å¹³æ¹æ ¹æ¯ä¾å±å¼ï¼ä½¿åæéä¿ææ¸
æ°é´è·ï¼é¿å
ä¸1â2å¹´çå岿°æ®æ¤å¨ä¸èµ·ç䏿¸
ã'},confidence:{en:"Confidence",cn:"ä¿¡å¿æ°´å¹³"},nearLeg:{en:"Near",cn:"è¿æ"},farLeg:{en:"Far",cn:"è¿æ"},lots:{en:"lots",cn:"æ"},trackRecord:{en:"Track record",cn:"åå²è¡¨ç°"},studyStatus:{en:"Study status",cn:"ç ç©¶ç¶æ"},trackSub:{en:"Backtested performance. Past results do not guarantee future ones.",cn:"åå²åæµè¡¨ç°ï¼ä¸ä»£è¡¨æªæ¥æ¶çã"},mYear:{en:"Yearly return",cn:"å¹´åæ¶ç"},mSharpe:{en:"Risk-adjusted score",cn:"é£é©è°æ´å¾å"},mDraw:{en:"Worst drop",cn:"æå¤§åæ¤"},mWin:{en:"Winning days",cn:"çå©å¤©æ°"},equityChart:{en:"Cumulative profit",cn:"累计çäº"},totalPnl:{en:"Total P&L",cn:"累计çäº"},overDays:{en:"over",cn:"å
±"},tdays:{en:"trading days",cn:"ä¸ªäº¤ææ¥"},marketSignal:{en:"Cross-market signal",cn:"è·¨å¸åºä¿¡å·"},marketSignalSub:{en:"Not a strategy â it only measures whether the domestic price and the FX-adjusted overseas price line up.",cn:"è¿ä¸æ¯çç¥ï¼ä»
è¡¡éå½å
ä»·æ ¼ä¸æ±çè°æ´åçæµ·å¤ä»·æ ¼æ¯å¦ä¸è´ã"},domestic:{en:"Domestic",cn:"å½å
ä»·æ ¼"},overseas:{en:"Overseas (USD)",cn:"æµ·å¤ä»·æ ¼ï¼ç¾å
ï¼"},fx:{en:"USDâCNY",cn:"ç¾å
å
人æ°å¸"},ratioLine:{en:"Domestic price ÷ FX-adjusted overseas price",cn:"å½å
ä»·æ ¼ ÷ æ±çè°æ´åæµ·å¤ä»·æ ¼"},ratioNote:{en:"This ratio normally sits above 1 (import cost, VAT). The dashed line is its own long-run average â above it means pricier than usual, not simply expensive.",cn:"该æ¯å¼é常大äº1ï¼è¿å£ææ¬ãå¢å¼ç¨ï¼ãè线æ¯å
¶èªèº«é¿æåå¼ââé«äºè线表示æ¯å¹³æ¶æ´è´µï¼èéç»å¯¹æè´µã"},spreadReview:{en:"Spread desk review",cn:"ä»·å·®å°è¯ä¼°"},posture:{en:"Recommended posture",cn:"建议姿æ"},fullSpread:{en:"Read the full spread review",cn:"æ¥ç宿´ä»·å·®è¯ä¼°"},secStats:{en:"Statistical & ML models",cn:"ç»è®¡ä¸æºå¨å¦ä¹ 模å"},secStatsSub:{en:"Seven independent quantitative modules vote, then a fusion layer turns the votes into one action.",cn:"ä¸ä¸ªç¬ç«é忍¡ååèªæç¥¨ï¼åç±èåå±ç»åºç»ä¸æä½å»ºè®®ã"},sRec:{en:"Recommendation",cn:"模å建议"},sRegime:{en:"Regime",cn:"å¸åºç¶æ"},sRisk:{en:"Risk level",cn:"é£é©æ°´å¹³"},sPTrade:{en:"Trade probability",cn:"äº¤ææ¦ç"},sPSwitch:{en:"Regime-switch risk",cn:"ç¶æåæ¢é£é©"},sModules:{en:"Module votes",cn:"模åæç¥¨"},sProfile:{en:"Fusion profile",cn:"èåç»å"},fullStats:{en:"Read the full statistical analysis",cn:"æ¥ç宿´ç»è®¡åæ"},fullMarket:{en:"Read the full market/technical report",cn:"æ¥ç宿´å¸åºææ¯æ¥å"},secMarket:{en:"Technical read",cn:"ææ¯é¢è§£è¯»"},secMarketSub:{en:"Multi-horizon trend, structure and participation.",cn:"å¤å¨æè¶å¿ãç»æä¸åä¸åº¦ã"},mrBias:{en:"Aggregate bias",cn:"综ååå"}
7,mrConf:{en:"Confidence",cn:"ä¿¡å¿"},mrRegime:{en:"Regime",cn:"ç¶æ"},secCost:{en:"Cost to hold",cn:"æä»ææ¬"},secCostSub:{en:"What holding this position actually costs â financing, storage and fees, as both a rate and a cash amount.",cn:"ææè¯¥ä»ä½çç宿æ¬ï¼èµéå ç¨ãä»å¨ä¸æç»è´¹ï¼åæ¶ç»åºè´¹çä¸ç°ééé¢ã"},costPerYear:{en:"per year, per lot",cn:"æ¯ææ¯å¹´"},costTotal:{en:"Total holding cost",cn:"æ»æä»ææ¬"},costMethod:{en:"Calculated as rate à reference price à lot size",cn:"è®¡ç®æ¹å¼ï¼è´¹ç à åèä»· à åçº¦ä¹æ°"},costFin:{en:"Cost of money",cn:"èµéææ¬"},costFinSrc:{en:"3-month SHIBOR",cn:"3个æSHIBOR"},costSto:{en:"Warehouse storage",cn:"ä»å¨è´¹"},costStoSrc:{en:"Warehouse rent",cn:"ä»å¨ç§é"},costFee:{en:"Delivery & transfer",cn:"交å²ä¸è¿æ·"},costFeeSrc:{en:"Exchange fee schedule",cn:"äº¤æææ¶è´¹æ å"},costCash:{en:"This contract is cash-settled â there is no physical warehouse, so no storage cost applies. Only exchange margin and trading fees below are relevant.",cn:"该å约为ç°éç»ç®ï¼ä¸æ¶åå®ç©ä»å¨ï¼å æ¤æ²¡æä»å¨ææ¬ï¼ä»
æ¶å䏿¹ä¿è¯é䏿ç»è´¹ã"},costNone:{en:"Cost data is not available for this symbol yet.",cn:"该åç§ææ ææ¬æ°æ®ã"},vatNote:{en:"On top of holding cost, any spread you actually capture also loses",cn:"餿仿æ¬å¤ï¼å®é
è·åçä»·å·®è¿é缴纳"},vatSuffix:{en:"to VAT.",cn:"çå¢å¼ç¨ã"},cancelPre:{en:"Warehouse warrants are cancelled every",cn:"ä»åæ¯å¹´"},cancelMid:{en:"and must be re-registered within",cn:"注éï¼éå¨"},cancelSuf:{en:"days.",cn:"天å
éæ°æ³¨åã"},noExpiry:{en:"Warehouse warrants for this contract never expire.",cn:"该å约ä»åæ å°æéå¶ã"},secContract:{en:"Trading logistics",cn:"交æé¡»ç¥"},secContractSub:{en:"What it takes to actually place the trade.",cn:"å®é
ä¸åæéäºè§£çä¿¡æ¯ã"},ctMargin:{en:"Deposit (1 lot)",cn:"æ¯æä¿è¯é"},ctMult:{en:"Contract size",cn:"åçº¦ä¹æ°"},ctTick:{en:"Min price move",cn:"æå°åå¨ä»·ä½"},ctRef:{en:"Reference price",cn:"åèä»·æ ¼"},ofValue:{en:"of contract value",cn:"å å约价å¼"},feesTitle:{en:"Fees per lot, one side",cn:"æ¯æåè¾¹æç»è´¹"},feeOpen:{en:"Open",cn:"å¼ä»"},feeCloseOld:{en:"Close overnight position",cn:"å¹³æ¨ä»"},feeCloseNew:{en:"Close same-day position",cn:"å¹³ä»ä»"},feeRtOld:{en:"Round trip, held overnight",cn:"éå¤å¾è¿å计"},feeRtNew:{en:"Round trip, same day",cn:"彿¥å¾è¿å计"},feeDiff:{en:"Day-trading this contract costs",cn:"彿¥å¼å¹³çæç»è´¹æ¯éå¤ç"},feeDiffSuf:{en:"à more in fees.",cn:"åã"},feeSame:{en:"Same-day and overnight closes cost the same.",cn:"å¹³ä»ä»ä¸å¹³æ¨ä»æç»è´¹ç¸åã"},noContract:{en:"Contract details are not available for this symbol yet.",cn:"该åç§ææ å约æç»ã"},navHedgeCalc:{en:"Pricing Calculator",cn:"éè´å®ä»·è®¡ç®å¨"},secHedgeCalc:{en:"Procurement pricing calculator",cn:"éè´å®ä»·è®¡ç®å¨"},secHedgeCalcSub:{en:"Given what is in the yard and what is already sold, how much of the price do you fix today â and what cost range does that buy? Every number recomputes in your browser as you type.",cn:"ç»åå¨åºæ°éä¸å·²æ¥è®¢åï¼ç°å¨æå¤å°æ¯ä¾çä»·æ ¼å®ä¸æ¥ï¼æ¢æ¥å¤å¤§çææ¬åºé´ï¼ä¿®æ¹ä»»æè¾å
¥ï¼æææ°å¼å¨æµè§å¨ä¸å³æ¶éç®ã"},hcStudyBadge:{en:"Backtested track record available",cn:"å«åå²åæµæ°æ®"},rcInv:{en:"Stock on hand (incl. in transit)",cn:"å½ååºåï¼å«å¨éï¼"},rcUse:{en:"Monthly usage",cn:"æåº¦ç¨é"},rcMonths:{en:"Months already sold",cn:"å·²æ¥è®¢åææ°"},rcCapital:{en:"Cash available",cn:"å¯ç¨éè´èµé"},rcCapitalU:{en:"(10k CNY, 0 = unlimited)",cn:"ï¼ä¸å
ï¼0 = ä¸éï¼"},rcRatio:{en:"Share of the price fixed today",cn:"ç°å¨å®ä¸å¤å°æ¯ä¾çä»·æ ¼"},rcRatioHint:{en:"Slide to see what fixing more or less of the price does to your cost range. Fixing nothing leaves every unit at whatever spot turns out to be.",cn:"æå¨æ¥çï¼ç°å¨å®ä»·è¶å¤ï¼ææ¬åºé´è¶çªï¼å®å
7
¨ä¸å®ä»·ï¼åæ¯ä¸å¨é½éè¡å°±å¸ã"},rcTol:{en:"Cost ceiling",cn:"坿¥åææ¬ä¸é"},rcTolU:{en:"(% above todayâs spot)",cn:"ï¼æ¯ç°ä»·é«ä¸è¶
è¿ %ï¼"},rcFunding:{en:"Speed you can fund a margin call",cn:"追ä¿èµéå°ä½é度"},rcFundEasy:{en:"Same day",cn:"å½å¤©"},rcFundSlow:{en:"A few days",cn:"å 天å
"},rcFundNone:{en:"Tight",cn:"ç´§å¼ "},rcOutExposure:{en:"Exposure to price",cn:"å¾
å®ä»·æå£"},rcOutPhysical:{en:"Buy physical",cn:"ä¹°ç°è´§"},rcOutFutures:{en:"Fix on the board",cn:"æè´§éä»·"},rcOutCash:{en:"Cash tied up",cn:"å ç¨èµé"},rcGap:{en:"spread",cn:"åºé´"},rcOpenBy:{en:"Left open:",cn:"æªå®ä»·é¨åï¼"},rcCauseCash:{en:"cash short",cn:"èµéä¸è¶³"},rcCauseLot:{en:"lot size",cn:"æ´æåæ´"},rcCauseChoice:{en:"your choice",cn:"主å¨ä¿ç"},rcAdviceOk:{en:"This clears your cost ceiling â {n}% priced would already have been enough.",cn:"å½åæ¯ä¾å·²å®ä½ææ¬ä¸éââå
¶å®å®ä»· {n}% å°±å¤äºã"},rcAdviceShort:{en:"Above your cost ceiling on the expensive side. You would need about {n}% priced to stay inside it.",cn:"åè´µæ
形已è¶
åºææ¬ä¸éï¼å¤§çº¦éè¦å®ä»· {n}% æè½å®ä½ã"},rcAdviceUnreachable:{en:"Even fully priced the range stays above the ceiling â the ceiling itself is below what this market offers today.",cn:"å³ä½¿ 100% å®ä»·ä¹è¶
åºä¸éââä¸éæ¬èº«å·²ä½äºå½åå¸åºå¯å¾çæ°´å¹³ã"},rcAdviceCovered:{en:"Stock on hand already covers what is sold â nothing needs pricing today.",cn:"ç°æåºåå·²è¦çå·²æ¥è®¢åââä»å¤©æ éå®ä»·ã"},rcBandTitle:{en:"Cost range by share priced",cn:"ææ¬åºé´éå®ä»·æ¯ä¾çåå"},rcBandSub:{en:"The median barely moves â pricing is not a bet on direction. What moves is the WIDTH: the more you fix today, the narrower the band you will actually land in, converging to a single number at 100%.",cn:"ä¸ä½æ°å ä¹ä¸å¨ââå®ä»·å¹¶ä¸æ¯å¨èµæ¶¨è·ãååçæ¯å®½åº¦ï¼ç°å¨å®å¾è¶å¤ï¼æç»è½ç¹çåºé´è¶çªï¼100% æ¶æ¶æä¸ºä¸ä¸ªç¡®å®çæ°ã"},rcBandAxis:{en:"Horizontal: share of the price fixed today. Vertical: landed cost, CNY per {u}.",cn:"横轴ï¼ç°å¨å®ä»·çæ¯ä¾ã纵轴ï¼å°åææ¬ï¼å
/{u}ã"},rcLegCommon:{en:"Common range (25â75%)",cn:"常è§èå´ï¼25â75%ï¼"},rcLegRare:{en:"Rare extremes (5â95%)",cn:"å°è§çæç«¯èå´ï¼5â95%ï¼"},rcLegMedian:{en:"Median cost",cn:"ä¸ä½ææ¬"},rcLegHere:{en:"You are here",cn:"ä½ å¨è¿é"},rcColRatio:{en:"Priced",cn:"å®ä»·æ¯ä¾"},rcColLo:{en:"Cheap side",cn:"å便å®"},rcColMid:{en:"Median",cn:"ä¸ä½"},rcColHi:{en:"Expensive side",cn:"åè´µ"},rcColWidth:{en:"Spread",cn:"åºé´å®½åº¦"},rcPlanTitle:{en:"How the position is placed",cn:"æä»æä¹æ"},rcLegMonth:{en:"Delivery",cn:"交货æ"},rcLegContract:{en:"Contract",cn:"æç¨å约"},rcLegLots:{en:"Lots",cn:"ææ°"},rcLegTons:{en:"Quantity",cn:"æ°é"},rcLegMargin:{en:"Margin",cn:"ä¿è¯é"},rcLegBuffer:{en:"Call reserve",cn:"追ä¿å¤ç¨é"},rcMonthN:{en:"M+{n}",cn:"{n} æå"},rcParked:{en:"parked",cn:"坿¾"},rcBufferNote:{en:"The call reserve is cash set aside against margin calls, sized at {p}% of notional from this contractâs own worst historical drawdown over the same holding period â it is a reserve, not a loss.",cn:"追ä¿å¤ç¨éæ¯ä¸ºåºå¯¹è¿½å ä¿è¯éé¢ççç°éï¼æåä¹ä»·å¼ç {p}% 计ï¼åèªè¯¥å约åçæææå
çå岿大忤ââæ¯é¢çï¼ä¸æ¯äºæã"},rcNoLegs:{en:"No futures leg at this setting.",cn:"å½å设置ä¸ä¸éè¦æè´§å¤´å¯¸ã"},rcQuirks:{en:"What makes this contract different",cn:"è¿ä¸ªåç§çç¹æ®ä¹å¤"},rcNotProfiled:{en:"This contract is not profiled yet, so the pricing calculator is unavailable for it. The profile needs a price, roll and basis history pass before the section can render.",cn:"该åç§å°æªå»ºæ¡£ï¼æä¸æä¾å®ä»·è®¡ç®ã建档éè¦å
å®æä»·æ ¼ã屿ä¸åºå·®çå岿µç®ã"},rcNoParams:{en:"Instrument parameters did not load for this contract.",cn:"该åç§çåæ°æªè½å è½½ã"},rcNoKernel:{en:"The calculation engine did not load from the hedge advisor service. Reload the page; if it persists the upstream service is unavailable.",cn:"计ç®å¼ææªè½ä»å¥ä¿é¡¾é®æå¡å è½½ãè¯·å·æ°é¡µé¢ï¼è¥æç»åºç°ï¼è¯´æä¸æ¸¸æå¡æä¸å¯ç¨ã"},hcDisclaimer:{en:"Illustrative procurement math from this contractâs own measured history â not a price forecast or investment advice. Edit the inputs to match your real position.",cn:"以ä¸ä¸ºåºäºè¯¥åç§å岿µç®çç¤ºææ§éè´è®¡ç®ï¼ä¸ææä»·æ ¼é¢æµææèµå»ºè®®ãè¯·æ ¹æ®å®é
æ
åµè°æ´è¾å
¥æ°å¼ã"},hcUnavailable:{en:"No calculator data available for this symbol yet.",cn:"该åç§ææ 计ç®å¨æ°æ®ã"},noData:{en:"Not available for this symbol.",cn:"该åç§ææ æ¤æ°æ®ã"},srcFailed:{en:"This source failed to load",cn:"è¯¥æ°æ®æºå 载失败"},models:{en:"Models",cn:"ä½¿ç¨æ¨¡å"},analysisKey:{en:"Analysis key",cn:"åæç¼å·"},tradeDate:{en:"Trade date",cn:"äº¤ææ¥"},disclaimer:{en:"For research and decision support only. Not investment advice. Forecasts are statistical estimates from historical data and are not guarantees of future performance.",cn:"ä»
ç¨äºç ç©¶ä¸å³çåèï¼ä¸æææèµå»ºè®®ã颿µåºäºå岿°æ®çç»è®¡ä¼°ç®ï¼ä¸ä»£è¡¨æªæ¥è¡¨ç°ã"}},wn={EC:"pts"},_n={EC:{en:"Container Shipping, Europe",cn:"éè¿ææ°ï¼æ¬§çº¿ï¼",icon:"ð¢"},CU:{en:"Copper",cn:"é",icon:"ð"},AL:{en:"Aluminium",cn:"é",icon:"ðª©"},LC:{en:"Lithium Carbonate",cn:"碳é
¸é",icon:"ð"},SC:{en:"Crude Oil (Shanghai)",cn:"䏿µ·åæ²¹",icon:"ð¢ï¸"},JM:{en:"Coking Coal",cn:"ç¦ç
¤",icon:"âï¸"},A:{en:"Soybean No.1",cn:"è±ä¸",icon:"ð«"},C:{en:"Corn",cn:"çç±³",icon:"ð½"}},Sn={hold:{en:"Hold â no change needed",cn:"ç»´æä»ä½ï¼æ éæä½",tone:"flat",icon:"â"},open_long_spread:{en:"Open a long-spread position",cn:"建ç«å¤å¤´ä»·å·®ä»ä½",tone:"up",icon:"ð"},open_short_spread:{en:"Open a short-spread position",cn:"建ç«ç©ºå¤´ä»·å·®ä»ä½",tone:"dn",icon:"ð"},flatten:{en:"Close the position",cn:"å¹³ä»ç¦»åº",tone:"flat",icon:"âï¸"},reverse:{en:"Flip to the other side",cn:"ååè°æ´ä»ä½",tone:"dn",icon:"ð"}
7,increase:{en:"Add to the position",cn:"å ä»",tone:"up",icon:"â"},reduce:{en:"Trim the position",cn:"åä»",tone:"dn",icon:"â"},unavailable:{en:"No signal right now",cn:"ææ ä¿¡å·",tone:"flat",icon:"â"}},xn={short_spread:{en:"Short spread â expects the gap to narrow",cn:"空头价差ï¼é¢æä»·å·®æ¶çªï¼"},long_spread:{en:"Long spread â expects the gap to widen",cn:"å¤å¤´ä»·å·®ï¼é¢æä»·å·®æ©å¤§ï¼"},flat:{en:"No position",cn:"空ä»"}},Cn={shanghai_rich:{en:"Domestic price is running ABOVE the FX-adjusted overseas price",cn:"å½å
ä»·æ ¼é«äºæ±çè°æ´åçæµ·å¤ä»·æ ¼",tone:"dn"},shanghai_cheap:{en:"Domestic price is running BELOW the FX-adjusted overseas price",cn:"å½å
ä»·æ ¼ä½äºæ±çè°æ´åçæµ·å¤ä»·æ ¼",tone:"up"},in_line:{en:"Domestic and overseas prices are roughly in line",cn:"å½å
䏿µ·å¤ä»·æ ¼åºæ¬ä¸è´",tone:"flat"}},Ln={no_trade:{en:"No trade",cn:"ä¸äº¤æ"},long_spread:{en:"Long spread",cn:"åå¤ä»·å·®"},short_spread:{en:"Short spread",cn:"å空价差"},wait:{en:"Wait",cn:"è§æ"},flat:{en:"Flat",cn:"空ä»"},in_line:{en:"In line",cn:"åºæ¬ä¸è´"},shanghai_rich:{en:"Domestic rich",cn:"å½å
åè´µ"},shanghai_cheap:{en:"Domestic cheap",cn:"å½å
åå®"}},Nn=22,Fn={on_warrant:{en:"Registered warehouse stock",cn:"注åä»åé",icon:"ð¦"},deliverable:{en:"Deliverable inventory",cn:"å¯äº¤å²åºå",icon:"ð¢"},roll_yield_ann:{en:"Near-vs-far price gap (annualised)",cn:"è¿è¿æä»·å·®ï¼å¹´åï¼",icon:"ð"},spread:{en:"Calendar spread",cn:"è·¨æä»·å·®",icon:"âï¸"},lme_stock:{en:"LME warehouse stock",cn:"伦æ¦éå±äº¤ææåºå",icon:"ð"},scfis:{en:"Container freight index",cn:"éè£
ç®±è¿ä»·ææ°",icon:"ð¢"},basis_near:{en:"Futures vs spot gap",cn:"æç°ä»·å·®",icon:"ð"},cost_carry_ann_pct:{en:"Break-even holding cost",cn:"ä¿æ¬æä»ææ¬",icon:"ð§®"},dominant_close:{en:"Main contract price",cn:"主ååçº¦ä»·æ ¼",icon:"ð°"}},En={SHFE:{en:"SHFE",cn:"䏿æ"},GFEX:{en:"GFEX",cn:"广ææ"},INE:{en:"INE",cn:"ä¸æè½æº"},DCE:{en:"DCE",cn:"大åæ"},CZCE:{en:"CZCE",cn:"éåæ"},CFFEX:{en:"CFFEX",cn:"ä¸éæ"}},Xs={"CNY/t":{en:"CNY/tonne",cn:"å
/å¨"},"index pt":{en:"index points",cn:"ææ°ç¹"},CNY:{en:"CNY",cn:"å
"}},cn={en:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],cn:["1æ","2æ","3æ","4æ","5æ","6æ","7æ","8æ","9æ","10æ","11æ","12æ"]},oe=[{k:"d1",en:"1 Day",cn:"1天"},{k:"d5",en:"1 Week",cn:"1å¨"},{k:"d21",en:"1 Month",cn:"1个æ"},{k:"d63",en:"3 Months",cn:"3个æ"}],Ue={10:{en:"10 Days",cn:"10天"},30:{en:"30 Days",cn:"30天"},90:{en:"90 Days",cn:"90天"}},Rn=/^(bull|bullish|slightly_bullish|very_bullish|tighten|tightening|tight|long|buy|up|rising|cheap|strong|positive|improving)/,An=/^(bear|bearish|slightly_bearish|very_bearish|loosen|loosening|loose|short|sell|down|falling|rich|weak|negative|deteriorating)/,Dn={"regime probability":"è¡æ
ç¶ææ¦ç","volatility risk":"æ³¢å¨çé£é©","continuation reversal":"å»¶ç» / å转","structure stats":"ç»æç»è®¡","spread state stats":"ä»·å·®ç¶æç»è®¡",seasonality:"å£èæ§","event risk":"äºä»¶é£é©","trend indicator":"è¶å¿ææ ",participation:"å¸åºåä¸åº¦","cross market indicator":"è·¨å¸åºææ ","calendar spread":"è·¨æä»·å·®","trend up":"ä¸è¡è¶å¿","trend down":"ä¸è¡è¶å¿","shanghai cheap":"沪å¸åä½","shanghai rich":"沪å¸åé«","mean reversion":"åå¼åå½",momentum:"å¨é","slightly bullish":"å°å¹
çå¤","slightly bearish":"å°å¹
ç空","mildly bullish":"å°å¹
çå¤","mildly bearish":"å°å¹
ç空","cautious follow":"è°¨æ
è·é",cautious:"è°¨æ
","follow narrowing":"è·éèµ°çª","no trade":"ä¸äº¤æ","stand aside":"è§æ",observe:"è§å¯",avoid:"è§é¿",mixed:"åå",inconclusive:"æ å®è®º","insufficient data":"æ°æ®ä¸è¶³",validated:"å·²éªè¯","not validated":"æªéªè¯",pending:"å¾
å®",backwardation:"ç°è´§åæ°´",contango:"æè´§åæ°´",destocking:"å»åºå",restocking:"è¡¥åºå","in line":"æå¹³",tightening:"æ¶ç´§",loosening:"æ¾æ¾",balanced:"平衡",tight:"ç´§",loose:"宽æ¾",bullish:"çå¤",bearish:"ç空",neutral:"䏿§",confirming:"ç¸äºéªè¯",diverging:"è离",high:"é«",medium:"ä¸",low:"ä½",up:"ä¸è¡",down:"ä¸è¡",wait:"è
7§æ",hold:"ææ",buy:"ä¹°å
¥",sell:"ååº",long:"åå¤",short:"å空",range:"åºé´éè¡",trend:"è¶å¿",transition:"è¿æ¸¡æ",breakout:"çªç ´",normal:"æ£å¸¸",elevated:"åé«",cheap:"å便å®",rich:"åè´µ",fair:"åç",contraction:"æ¶ç¼©",expansion:"æ©å¼ ",positive:"æ£é¢",negative:"è´é¢",strong:"强",weak:"å¼±",increasing:"ä¸å",decreasing:"ä¸é",stable:"稳å®",flat:"æå¹³",overbought:"è¶
ä¹°",oversold:"è¶
å",follow:"è·é",fade:"åå","inside range":"åºé´å
",none:"æ ",compressed:"å缩","extreme cheap":"æåº¦å便å®","extreme rich":"æåº¦åè´µ",good:"è¯å¥½",poor:"è¾å·®",moderate:"éä¸","not configured":"æªé
ç½®",unknown:"æªç¥"},Ne={wait:{en:"Wait / no trade",cn:"è§æ / ä¸äº¤æ"},narrow:{en:"Follow narrowing",cn:"è·éèµ°çª"},widen:{en:"Follow widening",cn:"è·éèµ°é"},fade:{en:"Fade",cn:"ååæä½"},long:{en:"Long spread",cn:"åå¤ä»·å·®"},short:{en:"Short spread",cn:"å空价差"}},Pn=48;let ae=null,he=null,ve=null;const Fe={futures:"var(--blue)",near:"var(--green)",far:"var(--amber)"},Je={futures:"#0071e3",near:"#0a8a3e",far:"#c76b00"};let be=null;const Jn={"1M":30,"3M":90,"6M":182,"1Y":365,ALL:9999};let ge=null,fe={gran:"1d",win:"3M"},Qe=null;const ts={extreme:"â¡",notable:"ð",normal:"â
"},as={extreme:{near_premium:"sgHeadExtremePrem",near_discount:"sgHeadExtremeDisc",flat:"sgHeadNormal"},notable:{near_premium:"sgHeadNotablePrem",near_discount:"sgHeadNotableDisc",flat:"sgHeadNormal"},normal:{near_premium:"sgHeadNormal",near_discount:"sgHeadNormal",flat:"sgHeadNormal"}},is={extreme:{near_premium:"sgTradeExtremePrem",near_discount:"sgTradeExtremeDisc",flat:"sgTradeNormal"},notable:{near_premium:"sgTradeNotablePrem",near_discount:"sgTradeNotableDisc",flat:"sgTradeNormal"},normal:{near_premium:"sgTradeNormal",near_discount:"sgTradeNormal",flat:"sgTradeNormal"}},rs={near_premium:"sgHedgePrem",near_discount:"sgHedgeDisc",flat:"sgHedgeNormal"};let ke=null,Ie=null,nn=null,sn=null,se=null,Te=null,tn="slow",He=null,ie=null,Ee=[],Re=[];const gn=[["s-pricehist","navPriceHist"],["s-spreadgauge","navSpreadGauge"],["s-verdict","navVerdict"],["s-forecast","navForecast"],["s-fund","navFund"],["s-debate","navDebate"],["s-news","navNews"],["s-spread","navSpread"],["s-stats","navStats"],["s-cost","navCost"],["s-hedgecalc","navHedgeCalc"],["s-shipping","navShipping"]];let We=null;const Es=function(n){ce=n,T.horizon=null,T.risk=null,T.open={},xe(),G.scrollIntoView({block:"start",behavior:"smooth"})},Rs=function(n){T.horizon=T.horizon===n?null:n,T.risk=null,xe()},As=function(n){T.risk=T.risk===n?null:n,T.horizon=null,xe()},Ds=function(n){T.accView=n,xe()},Hs=function(n){T.open[n]=!T.open[n],xe()};G.querySelectorAll("#langseg button").forEach(n=>n.addEventListener("click",()=>{G.querySelectorAll("#langseg button").forEach(e=>e.classList.toggle("on",e===n)),F=n.dataset.lang,G.lang=F==="cn"?"zh":"en",xe()})),D.onWindow("resize",()=>{[ge,ke,ae,he,be,ve,se,...Re].forEach(n=>{n&&!n.isDisposed()&&n.resize()})}),R("shareBtn").addEventListener("click",()=>{je(t("shareToast"))});async function zs(){const n=R("downloadBtn"),e=R("downloadBtnLabel"),a=e.textContent,i=R("report");if(!i){je(t("downloadFail"));return}n.classList.add("busy"),e.textContent=t("downloading");try{const r=await Bs(i,{backgroundColor:"#f5f5f7",scale:2,useCORS:!0}),c=await new Promise(f=>r.toBlob(f,"image/png"));if(!c)throw new Error("canvas.toBlob returned null (tainted canvas?)");const o=G.ownerDocument.createElement("a"),l=D.objectUrl(c);o.href=l,o.download=ce+"_"+F+"_report.png",G.appendChild(o),o.click(),o.remove(),D.timeout(()=>D.revokeUrl(l),1e3),je(t("downloadOk"))}catch(r){console.error("downloadImage failed:",r),je(t("downloadFail"))}finally{n.classList.remove("busy"),e.textContent=a}}return R("downloadBtn").addEventListener("click",zs),G.querySelectorAll("#langseg button").forEach(n=>n.classList.toggle("on",n.dataset.lang===F)),G.lang=F==="cn"?"zh":"en",xe(),D.actions({pickSym:Es,pickH:Rs,pickR:n=>As(Number(n)),setAcc:Ds,tgl:Hs,phGran:ns,phWin:ss,rcSetFunding:_s}),{update(n){ee=n.report,F=n.language==="zh"?"cn":"en",G.querySelectorAll("#langseg button").forEach(e
7=>e.classList.toggle("on",e.dataset.lang===F)),G.lang=F==="cn"?"zh":F,xe()},destroy:()=>D.destroy()}}catch(ee){throw D.destroy(),ee}}const $s={class:"topbar"},st=Ps({name:"FuturesALReport",__name:"Report",props:{report:{},preparedAt:{},language:{}},emits:["reload","error"],setup(G,{emit:Ae}){const D=G,R=Ae,ee=qs(null);let re=null;const F=()=>({report:{prepared_at:D.preparedAt||D.report.prepared_at,symbols:["AL"],data:{AL:D.report}},language:D.language.startsWith("zh")?"zh":"en",onReload:()=>R("reload"),onError:()=>R("error")});return Is(()=>{if(ee.value)try{re=Ys(ee.value,F())}catch{R("error")}}),Ws(()=>[D.report,D.preparedAt,D.language],()=>{try{re==null||re.update(F())}catch{R("error")}},{flush:"post"}),js(()=>re==null?void 0:re.destroy()),(ce,T)=>(Ks(),Us("article",{ref_key:"root",ref:ee,class:"subscription-futures-report subscription-futures-al-report"},[Ke("div",$s,[Gs(ce.$slots,"navigation"),T[0]||(T[0]=Vs('<div class="topbar-in"><div class="tb-row"><div class="brand"><span class="eyebrow" id="brand-eyebrow">Futures Intelligence Report</span><span class="prepared" id="brand-prepared"></span></div><div class="seg" id="langseg"><button type="button" data-lang="en" class="on">EN</button><button type="button" data-lang="cn">䏿</button></div><div class="tb-actions"><button type="button" class="icon-btn" id="shareBtn" title="Share"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7"></path><polyline points="16 6 12 2 8 6"></polyline><line x1="12" y1="2" x2="12" y2="15"></line></svg><span id="shareBtnLabel">Share</span></button><button type="button" class="icon-btn" id="downloadBtn" title="Download image"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg><span id="downloadBtnLabel">Download image</span></button></div></div><div class="symtabs" id="symtabs"></div><nav class="secnav" id="secnav"></nav></div>',1))]),T[1]||(T[1]=Ke("div",{class:"shell"},[Ke("div",{id:"report"})],-1)),T[2]||(T[2]=Ke("div",{class:"toast-wrap",id:"toastWrap"},null,-1))],512))}});export{st as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.