@openduo/finflow 1.10.1 → 1.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/finflow.js +6 -6
- package/package.json +1 -1
package/dist/bin/finflow.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
2
|
+
import $c from"yargs";import{hideBin as jc}from"yargs/helpers";function J(n){return(n||"").replace(/<[^>]+>/g,"")}function R(){let n=new Date;return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function Ea(n,t=!1){console.log(t?JSON.stringify(n,null,2):JSON.stringify(n))}function Pa(n,t,e){return{data:n,meta:{source:e,timestamp:new Date().toISOString(),command:t}}}function l(n){let{data:t,command:e,source:r,toJSON:o}=n;Ea(Pa(o?o(t):t,e,r))}import Be from"https";import se from"crypto";var te=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"}),va=Object.freeze({os:"web",sv:"8.7.9",app:"CailianpressWeb"});function Wt(n){return Object.keys(n).sort().map(t=>`${t}=${n[t]}`).join("&")}function Ae(n){let t={...te,...n},e=Wt(t);return e?se.createHash("md5").update(se.createHash("sha1").update(e).digest("hex")).digest("hex"):se.createHash("md5").update(se.createHash("sha1").update("").digest("hex")).digest("hex")}function Qt(n){return{...te,...n,sign:Ae(n)}}var Vt=se.createHash("md5").update(se.createHash("sha1").update(Wt(va)).digest("hex")).digest("hex");var U=n=>n.trim().toLowerCase(),Ca="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",de={"User-Agent":Ca,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"};function Xe(n,t,e,r,o,a){return new Promise((s,i)=>{let c=Be.request({hostname:n,path:t,method:e,timeout:a,headers:o},u=>{let m=[];u.on("data",d=>m.push(d)),u.on("end",()=>{let d=Buffer.concat(m).toString("utf-8");try{let p=JSON.parse(d);u.statusCode>=400&&(p._statusCode=u.statusCode),s(p)}catch{s(d)}})});c.on("error",i),c.on("timeout",()=>{c.destroy(),i(new Error("timeout"))}),c.end(r)})}function q(n,t,e={},r={}){let o=r.timeout??1e4,a=new URLSearchParams(Qt(e)).toString();return Xe(n,`${t}?${a}`,"GET",void 0,{...de,host:n,Referer:`https://${n}/`},o)}var qa={...de,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"};async function $a(){return new Promise(n=>{let t=Be.request({hostname:"www.cls.cn",path:"/",method:"GET",timeout:8e3,headers:{...de}},e=>{e.on("end",()=>{let r=(e.headers["set-cookie"]||[]).map(o=>o.split(";")[0]).join("; ");n(r)}),e.on("data",()=>{})});t.on("error",()=>n("")),t.on("timeout",()=>{t.destroy(),n("")}),t.end()})}async function De(n,t={}){let e=t.type??"all",r=t.rn??20,o=t.page??0,a={type:e,keyword:n,rn:r,page:o,os:"web",sv:"8.7.9",app:"CailianpressWeb"},s=await $a(),i={...qa};return s&&(i.Cookie=s),Xe("www.cls.cn",`/api/sw?app=CailianpressWeb&os=web&sv=8.7.9&sign=${Vt}`,"POST",JSON.stringify(a),i,1e4)}function Ge(n={}){let t=n.lastTime??Math.floor(Date.now()/1e3),e={lastTime:t,last_time:t,refresh_type:1,rn:n.rn??20};return n.category&&n.category!=="all"&&(e.category=n.category),q("www.cls.cn","/v1/roll/get_roll_list",e)}async function Zt(n){let e=(await new Promise((r,o)=>{let a=Be.request({hostname:"www.cls.cn",path:`/detail/${n}`,method:"GET",timeout:1e4,headers:{...de,Referer:"https://www.cls.cn/"}},s=>{let i=[];s.on("data",c=>i.push(c)),s.on("end",()=>r(Buffer.concat(i).toString("utf-8")))});a.on("error",o),a.on("timeout",()=>{a.destroy(),o(new Error("timeout"))}),a.end()})).match(/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/);if(!e)return{data:{roll_data:[]}};try{let r=JSON.parse(e[1]),o=(s,i=0)=>{if(i>12||!s||typeof s!="object")return null;if(s.content&&s.brief&&String(s.id)===String(n))return s;for(let c of Object.keys(s)){let u=o(s[c],i+1);if(u)return u}return null},a=o(r);return{data:{roll_data:a?[a]:[]}}}catch{return{data:{roll_data:[]}}}}function Ke(n){return q("www.cls.cn",`/v3/depth/home/assembled/${n}`)}function en(n,t){return q("www.cls.cn",`/v3/depth/list/${n}`,{id:n,last_time:t.lastTime,rn:t.rn??20})}function tn(){return q("www.cls.cn","/v2/article/hot/list")}function nn(){return q("www.cls.cn","/api/subject/hotAndNewestSubject")}function ze(n={}){return q("x-quote.cls.cn","/web_quote/plate/hot_plate",{type:n.type??"industry",way:n.way??"change",rever:1,num:50})}function rn(n){return q("x-quote.cls.cn","/quote/stock/basic",{secu_code:U(n),fields:"open_px,av_px,high_px,low_px,change,change_px,change_3,change_5,qrr,entrust_rate,tr,amp,TotalShares,mc,NetAssetPS,cmc,business_amount,business_balance,pe,ttm_pe,pb,secu_name,secu_code,trade_status,secu_type,preclose_px,up_price,last_px"})}function We(n){return q("x-quote.cls.cn","/quote/stock/volume",{secu_code:U(n),field:"five"})}function Qe(n){return q("x-quote.cls.cn","/quote/stock/volume",{secu_code:U(n),field:"vol"})}function Ve(n){return q("x-quote.cls.cn","/v2/quote/a/tline",{secu_code:U(n)})}function on(n,t={}){let e={code:U(n),period:t.period??"d",fq_type:t.fq_type??1,limit:t.limit??200};return t.start_date&&(e.start_date=t.start_date),q("x-quote.cls.cn","/v2/quote/a/kline",e)}function Ze(n){return q("x-quote.cls.cn","/web_quote/stock/assoc_plate",{secu_code:U(n)})}function et(n,t={}){return q("x-quote.cls.cn","/web_quote/plate/stocks",{secu_code:U(n),way:t.way??"change",rever:t.rever??1})}function an(n){return q("x-quote.cls.cn","/quote/stock/fundflow",{secu_code:U(n)})}function sn(n,t={}){let e=Math.floor(Date.now()/1e3);return q("www.cls.cn","/es/quotes/articles",{keyword:n,lastTime:e,rn:t.rn??10})}function cn(){return q("x-quote.cls.cn","/v2/quote/a/stock/emotion")}function un(n){return q("www.cls.cn","/v3/transaction/anchor",{cdate:n.date})}function ln(n,t={}){return q("x-quote.cls.cn","/quote/index/ann",{secu_code:U(n),page:t.page??1})}function mn(n,t={}){let e=t.page??1,r=t.pageSize??15,o=t.keyWord??"",a={page:e,pageSize:r,stocksCode:U(n),keyWord:o},s={...a,...te,sign:Ae(a)},i=new URLSearchParams({app:te.app,os:te.os,sv:te.sv,sign:Ae({})}).toString();return Xe("x-api.cls.cn",`/tool/interaction/getDataByParam?${i}`,"POST",JSON.stringify(s),{...de,"Content-Type":"application/json",Origin:"https://www.cls.cn",Referer:"https://www.cls.cn/"},1e4)}var ie=Object.freeze({headline:{id:1e3,name:"\u5934\u6761"},ashare:{id:1003,name:"A\u80A1"},world:{id:1007,name:"\u73AF\u7403"},company:{id:1005,name:"\u516C\u53F8"},realestate:{id:1006,name:"\u5730\u4EA7"},finance_ch:{id:1032,name:"\u91D1\u878D"},hkstock:{id:1135,name:"\u6E2F\u80A1"},fund:{id:1110,name:"\u57FA\u91D1\xB7ETF"},broker:{id:1118,name:"\u5238\u5546"},auto:{id:1119,name:"\u6C7D\u8F66"},tech:{id:1111,name:"\u79D1\u521B"},pinjian:{id:1160,name:"\u54C1\u89C1"}}),tt=Object.freeze({all:{category:"all",name:"\u5168\u90E8"},red:{category:"red",name:"\u52A0\u7EA2"},announcement:{category:"announcement",name:"\u516C\u53F8"},watch:{category:"watch",name:"\u770B\u76D8"},hk_us:{category:"hk_us",name:"\u6E2F\u7F8E\u80A1"},fund:{category:"fund",name:"\u57FA\u91D1"},remind:{category:"remind",name:"\u63D0\u9192"}});function dn(n){return tt[n]?tt[n]:Object.values(tt).find(t=>t.name===n||t.category===n)||null}function pn(n){if(ie[n])return ie[n];let t=parseInt(n,10);return isNaN(t)?Object.values(ie).find(e=>e.name===n||e.name.includes(n))||null:Object.values(ie).find(e=>e.id===t)||null}import Za from"https";import es from"http";import{homedir as ja}from"os";import{mkdirSync as Ia,readFileSync as Ra,statSync as Ma,writeFileSync as Ja}from"fs";import{join as gn}from"path";import{gunzipSync as La}from"zlib";var Ua="https://app-server.jin10.com/symbolist_hero_web.txt",Fa=24*3600*1e3;function hn(){return gn(ja(),".finflow","cache")}function bn(){return gn(hn(),"symbolist-web.json")}var fn=["FUTURES","FOREX","ST_OTHER","INDEX","MAIN","PLATE","LINK","METAL","BOND","SHARES","FUND","NIGHT","OPTION"];function yn(n){let t=fn.indexOf(n);return t===-1?fn.length:t}function Pe(n,t){return/(?:888|9888)$/.test(n)&&["FUTURES","MAIN","PLATE","LINK"].includes(t)}function Ha(n,t){return t!=="FUTURES"||Pe(n,t)||/(?:000|9000)$/.test(n)?!1:/\d{2}$/.test(n)}function Ee(n,t=Date.now()){let e=JSON.parse(n),r=[],o=new Map,a=new Map,s=m=>/[\u4e00-\u9fa5]/.test(m);for(let m of e.all_stock??[]){if(!m?.c||!m?.m)continue;let d=`${m.c}.${m.m}`,p={code:m.c,exchange:m.m,name:m.n??"",digits:m.d??2,type:m.t??"",currency:m.r,full:d};if(p.name&&s(p.name)){let y=m.c.toUpperCase(),h=a.get(y)??[];h.includes(p.name)||h.push(p.name),a.set(y,h)}let g=o.get(d);g===void 0?(o.set(d,r.length),r.push(p)):yn(p.type)<yn(r[g].type)&&(r[g]=p)}let i={};for(let m of e.all_exchange??[])m?.name&&(i[m.name]=m.cn??m.name);let c=new Map,u=new Map;for(let m of r){c.set(m.full.toUpperCase(),m);let d=m.code.toUpperCase(),p=u.get(d)??[];p.push(m),u.set(d,p)}return{stocks:r,exchangeNames:i,byFullUpper:c,byCodeUpper:u,aliasNames:a,fetchedAt:t}}function Sn(){try{let n=bn(),t=Ma(n);return{text:Ra(n,"utf8"),fetchedAt:t.mtimeMs}}catch{return null}}function Ya(n){try{Ia(hn(),{recursive:!0}),Ja(bn(),n)}catch{}}async function Ba(){let n=await fetch(Ua,{headers:{"User-Agent":"Mozilla/5.0",Accept:"*/*"}});if(!n.ok)throw new Error(`symbolist \u4E0B\u8F7D\u5931\u8D25 HTTP ${n.status}`);let t=Buffer.from(await n.arrayBuffer());return La(t).toString("utf8")}function nt(){let n=Sn();return n?Ee(n.text,n.fetchedAt):null}async function wn(){let n=Sn();if(n&&Date.now()-n.fetchedAt<Fa)return Ee(n.text,n.fetchedAt);try{n?process.stderr.write(`finflow: \u54C1\u79CD\u5E93\u7F13\u5B58\u5DF2\u8FC7\u671F\uFF0C\u6B63\u5728\u5237\u65B0\u2026
|
|
3
3
|
`):process.stderr.write(`finflow: \u9996\u6B21\u4F7F\u7528\uFF0C\u6B63\u5728\u4E0B\u8F7D\u54C1\u79CD\u5E93 (~6MB\uFF0C\u4EC5\u6B64\u4E00\u6B21)\u2026
|
|
4
|
-
`);let t=await
|
|
5
|
-
`),Ee(n.text,n.fetchedAt);throw new Error(`\u54C1\u79CD\u5E93\u4E0D\u53EF\u7528\u4E14\u65E0\u672C\u5730\u7F13\u5B58: ${t.message}`)}}var La={FUTURES:0,MAIN:0,PLATE:0,LINK:0,FOREX:1,ST_OTHER:2,INDEX:2,METAL:2,BOND:3,SHARES:4,FUND:5,NIGHT:0,OPTION:6};function Ua(n){return La[n]??3}function Sn(n,t,e={}){let r=t.trim().toUpperCase();if(!r)return[];let o=e.limit??20,a=e.typeFilter?.trim(),s=[];for(let i of n.stocks){let c=i.code.toUpperCase(),u=`${c}.${i.exchange.toUpperCase()}`,m=i.name.toUpperCase(),p=(n.aliasNames.get(c)??[]).map(N=>N.toUpperCase()),d=m.includes(r)||p.some(N=>N.includes(r));if(!c.includes(r)&&!u.includes(r)&&!d||a&&!n.patternToTypes.get(`${i.exchange}-${i.type}`)?.includes(a))continue;let g=0;for(let N of[m,...p]){let k=N.indexOf(r);if(k!==-1){let P=k===0?N===r?100:80:50-Math.min(k,40);P>g&&(g=P)}}let y=0;if(u===r)y=100;else if(c===r)y=96;else if(c.startsWith(r))y=80;else{let N=c.indexOf(r);N!==-1&&(y=50-Math.min(N,40))}let h=tt(i.code,i.type)?1:0,S=i.type==="FUTURES"&&/\d{2}$/.test(i.code)&&!h?1:0,w=Ua(i.type),_=y*1e6+g*1e4+h*5e3-S*2500+(10-Math.min(w,10))*100+(30-Math.min(i.code.length,30));s.push({code:i.full,name:i.name,type:i.type,exchange:i.exchange,exchangeName:n.exchangeNames[i.exchange]??i.exchange,currency:i.currency,digits:i.digits,score:_})}return s.sort((i,c)=>c.score-i.score),s.slice(0,o)}var Fa={GOLD:"XAUUSD.GOODS",XAU:"XAUUSD.GOODS",SPOTGOLD:"XAUUSD.GOODS",SILVER:"XAGUSD.GOODS",XAG:"XAGUSD.GOODS",SPOTSILVER:"XAGUSD.GOODS",WTI:"USOIL.GOODS",USO:"USOIL.GOODS",CRUDE:"USOIL.GOODS",BRENT:"UKOIL.GOODS",UKO:"UKOIL.GOODS",COPPER:"COPPER.GOODS",DXY:"DXY.NYF",USDX:"DXY.NYF",DOLLARINDEX:"DXY.NYF","^GSPC":"SPX.INDEX",GSPC:"SPX.INDEX",SP500:"SPX.INDEX",SPX500:"SPX.INDEX",US500:"SPX.INDEX",INX:"SPX.INDEX",SPP500:"SPX.INDEX","^DJI":"DJI.INDEX",DJI:"DJI.INDEX",DJI30:"DJI.INDEX",DJIA:"DJI.INDEX",US30:"DJI.INDEX",DOW:"DJI.INDEX",DOWJONES:"DJI.INDEX","^NDX":"NDX.INDEX",NDX100:"NDX.INDEX",US100:"NDX.INDEX",NASDAQ:"NDX.INDEX",NASDAQ100:"NDX.INDEX","^HSI":"HSI.INDEX",HSI:"HSI.INDEX",HANGSENG:"HSI.INDEX","^N225":"N225.INDEX",N225:"N225.INDEX",NIKKEI:"N225.INDEX",NIKKEI225:"N225.INDEX",KOSPI:"KS11.INDEX",KOSPI200:"KS11.INDEX","^GDAXI":"GDAXI.INDEX",GDAXI:"GDAXI.INDEX",DAX:"GDAXI.INDEX",GER30:"GDAXI.INDEX","^FCHI":"FCHI.INDEX",FCHI:"FCHI.INDEX",CAC:"FCHI.INDEX",CAC40:"FCHI.INDEX","^FTSE":"FTSE.INDEX",FTSE:"FTSE.INDEX",UK100:"FTSE.INDEX","^STOXX50E":"SX5E.INDEX",SX5E:"SX5E.INDEX",EU50:"SX5E.INDEX",CNH:"USDCNH.FXCM"},Ha={XAUUSD:"XAUUSD.GOODS",XAGUSD:"XAGUSD.GOODS",USOIL:"USOIL.GOODS",UKOIL:"UKOIL.GOODS",COPPER:"COPPER.GOODS",DXY:"DXY.NYF",USDCNH:"USDCNH.FXCM",EURUSD:"EURUSD.FXCM",GBPUSD:"GBPUSD.FXCM",USDJPY:"USDJPY.FXCM",USDCAD:"USDCAD.FXCM",AUDUSD:"AUDUSD.FXCM",NZDUSD:"NZDUSD.FXCM",USDCHF:"USDCHF.FXCM",SPX:"SPX.INDEX",DJI:"DJI.INDEX",NDX:"NDX.INDEX",HSI:"HSI.INDEX",N225:"N225.INDEX",KS11:"KS11.INDEX",GDAXI:"GDAXI.INDEX",FCHI:"FCHI.INDEX",FTSE:"FTSE.INDEX"},Ya=["GOODS","INDEX","FXCM","NYF","BANK","CMX","NYM"];function Ba(n){if(!n.length)return null;let t=null,e=1/0;for(let r of n){let o=Ya.indexOf(r.exchange);o===-1&&(o=50),tt(r.code,r.type)&&(o-=10),o<e&&(e=o,t=r)}return t}function ne(n,t){let e=n.trim();if(!e)return e;let r=/^([A-Z]{3,6})\/([A-Z]{3})$/i.exec(e);r&&(e=r[1]+r[2]);let o=e.toUpperCase(),a=Fa[o];if(a)return a;let s=t===void 0?nt():t;if(!e.includes(".")){let c=s?.byCodeUpper.get(o)??[],u=Ba(c);return u?u.full:Ha[o]??e}let i=s?.byFullUpper.get(o);return i?i.full:e}function wn(n,t){let e=t===void 0?nt():t;return n.map(r=>ne(r,e))}function _n(n){return n.replace(/[0-9]+$/,"")||n}var rt={all:-1,oil:19,steel:20,coal:21,gas:22,metal:23,nonferrous:24,chemical:25,sugar:27,grain:28,pig:29,macro:30},pe=["DCE","CZC","SHF","INE","CF","GFEX"];var Ka="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",za={"User-Agent":Ka,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},Wa={"flash-api.jin10.com":{id:"bVBF4FyRTn5NJF5n",version:"1.0.0"},"search-open-api.jin10.com":{id:"SRvUdAEfVxLO5NAd",version:"1.0.1"},"common-open-api.jin10.com":{id:"zP6WFH7WKz2vrw4Q",version:"1.0.0"},"uc-api.jin10.com":{id:"YDcStOzjliuTJUvh",version:"1.0.0"},"qh-flash-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.0.0",referer:"https://qihuo.jin10.com/"},"futures-report-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.3.0",referer:"https://qihuo.jin10.com/"},"qhcal-api.jin10.com":{id:"1coXNOi34tU5TDTl",version:"1.0",referer:"https://qihuo.jin10.com/"}};function O(n,t,e={},r={}){let o=r.timeout??1e4,a=Object.keys(e).length?"?"+new URLSearchParams(e).toString():"",s=`${t}${a}`,i={...za,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},c=Wa[n];return c&&(i["x-app-id"]=c.id,i["x-version"]=c.version,i.handleerror="true",c.referer&&(i.Referer=c.referer,i.Origin=new URL(c.referer).origin)),r.cookie&&(i.Cookie=r.cookie),r.extraHeaders&&Object.assign(i,r.extraHeaders),new Promise((u,m)=>{let d=(n.startsWith("localhost")?Ga:Xa).request({hostname:n,path:s,method:"GET",timeout:o,headers:i},g=>{if(g.statusCode>=300&&g.statusCode<400&&g.headers.location){let h=new URL(g.headers.location,`https://${n}`);return u(O(h.hostname,h.pathname+h.search,e,r))}let y=[];g.on("data",h=>y.push(h)),g.on("end",()=>{let h=Buffer.concat(y).toString("utf-8");try{let S=JSON.parse(h);g.statusCode>=400&&(S._statusCode=g.statusCode),u(S)}catch{u(h)}})});d.on("error",m),d.on("timeout",()=>{d.destroy(),m(new Error("timeout"))}),d.end()})}function xn(n={},t){let e={};return n.max_read_id&&(e.max_read_id=n.max_read_id),n.channel&&(e.channel=n.channel),O("flash-api.jin10.com","/get_flash_list",e,t)}function Nn(n,t){return O("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},t)}function On(n,t){return O("flash-api.jin10.com","/get_flash_detail",{id:n},t)}function An(n,t){return O("flash-api.jin10.com","/get_flash_list_by_date",{date:n},t)}function ot(n,t){return O("search-open-api.jin10.com","/offset/search",{keyword:n.keyword,type:n.type??"flash",rank:n.rank??"hot",order:n.order??1,offset:n.offset??0,rewrite:1},t)}async function Dn(n,t){let e=ne(n);return O("search-open-api.jin10.com","/market",{vip:0,type:"flash",symbol:e,offset:0},t)}function Tn(){return O("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function En(){return O("cdn.jin10.com","/json/index/slide_204.json")}function Pn(){return O("cdn.jin10.com","/json/index/flir.json")}var at="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",Qa={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function st(n){return{extraHeaders:Qa,...n}}function it(n,t="cj",e){return O(at,"/get/data",{date:n,category:t},st(e))}function Cn(n,t="cj",e){return O(at,"/get/event",{date:n,category:t},st(e))}function vn(n,t="cj",e){return O(at,"/page/holiday",{date:n,category:t,page:1,pagesize:50},st(e))}function kn(n=-1,t={},e){let r={channel:n};return t.max_time&&(r.max_time=t.max_time),O("qh-flash-api.jin10.com","/get_flash_list",r,e)}async function qn(n,t){let e=new Set,r=[],o=await kn(n);for(let i of o?.data||[])e.has(i.id)||(e.add(i.id),r.push(i));let a=0,s=50;for(;r.length<t&&a++<s;){let i=r[r.length-1];if(!i)break;let u=(await kn(n,{max_time:i.time}))?.data||[];if(!u.length)break;let m=0;for(let p of u)e.has(p.id)||(e.add(p.id),r.push(p),m++);if(m===0)break;r.length<t&&await new Promise(p=>setTimeout(p,200))}return{...o,data:r.slice(0,t)}}function $n(n){return O("futures-report-api.jin10.com","/api/headline",{},n)}var jn={"x-app-id":"JECyg2NjIfH2QouV","x-version":"1.0.0"};function In(n,t,e){return O("futures-report-api.jin10.com","/api/f10/types/details",{subcode:n,exchange:t},{...e,extraHeaders:jn})}function Mn(n,t){return O("futures-report-api.jin10.com","/api/category/chart",{tag_id:n},{...t,extraHeaders:jn})}function Rn(n){let t=ne(n),e=t.lastIndexOf(".");if(e<=0||e===t.length-1)return{ok:!1,error:"\u8BF7\u7528 CODE.EXCHANGE \u5F62\u5F0F\uFF0C\u5982: price f10 i9888.DCE\uFF08\u53EF\u7528 price search \u94C1\u77FF \u67E5\u4EE3\u7801\uFF09"};let r=t.slice(e+1).toUpperCase();return pe.includes(r)?{ok:!0,code:t,subcode:_n(t.slice(0,e)),exchange:r}:{ok:!1,error:`F10 \u4EC5\u56FD\u5185\u671F\u8D27\u54C1\u79CD\u6709\u57FA\u672C\u9762\u6863\u6848\uFF08${pe.join("/")}\uFF09\uFF0C${t} \u4E0D\u5728\u8303\u56F4\u5185`}}function ct(n){return n.replace(/-/g,"")}function Jn(n,t){return O("qhcal-api.jin10.com","/data",{date:ct(n)},t)}function Ln(n,t){return O("qhcal-api.jin10.com","/event",{date:ct(n)},t)}function Un(n,t){return O("qhcal-api.jin10.com","/holiday",{date:ct(n)},t)}function Fn(n,t){return O("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...t,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function Pe(){return O("cdn.jin10.com","/json/index/all_topics.json")}function Hn(n,t={},e){let r={id:n};return t.page&&(r.page=t.page),t.page_size&&(r.page_size=t.page_size),O("reference-api.jin10.com","/topic/getById",r,{...e,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import Va from"https";var ut="www.gelonghui.com",Za="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";function Ce(n,t=1e4){return new Promise((e,r)=>{let o=new URL(n,`https://${ut}`),a=Va.get({hostname:ut,path:o.pathname+o.search,headers:{"User-Agent":Za,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9",Referer:`https://${ut}/live/`,"client-lang":"zh-cn",platform:"web",shortversion:"10.7.0"}},s=>{let i=[];s.on("data",c=>i.push(c)),s.on("end",()=>{let c=Buffer.concat(i).toString();try{e(JSON.parse(c))}catch{e(c)}})});a.setTimeout(t,()=>{a.destroy(),r(new Error("timeout"))}),a.on("error",r)})}function fe(n={}){let t=new URLSearchParams({category:n.category??"all",limit:String(n.limit??15),timestamp:String(Date.now())});return n.liveId&&t.set("liveId",String(n.liveId)),Ce(`/api/live-channels/${n.channel??"all"}/lives/v4?${t}`)}function Yn(n={}){return fe({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function Bn(n={}){return fe({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function Xn(n={}){return Ce(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function lt(){return Ce("/hq/home-page-data")}function ye(){return Ce("/hq/quote/api/market/flow/entrance/data/v2")}var mt=Object.freeze([{id:"all",name:"\u5168\u90E8"},{id:"popular",name:"\u6700\u70ED"},{id:"fundLive",name:"\u57FA\u91D1"},{id:"ai",name:"AI"},{id:"international",name:"\u56FD\u9645"},{id:"chineseMainland",name:"\u4E2D\u56FD\u5927\u9646"},{id:"hongkongMacaoTaiwan",name:"\u6E2F\u6FB3\u53F0"},{id:"HKStock",name:"\u6E2F\u80A1"},{id:"AStock",name:"A\u80A1"},{id:"USStock",name:"\u7F8E\u80A1"},{id:"virtualAssets",name:"\u865A\u62DF\u8D44\u4EA7"},{id:"exchangeCommodity",name:"\u5546\u54C1\u5916\u6C47"},{id:"house",name:"\u697C\u5E02"},{id:"debenture",name:"\u503A\u5238"}]),dt=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function ve(n){return n?mt.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??mt[0]:mt[0]}function Gn(n){return n?dt.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??dt[0]:dt[0]}import pt from"fs";import B from"path";import X from"os";import{execSync as ft}from"child_process";import Kn from"crypto";function ts(){return ft('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function ns(n){let t=n.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(t?.[1])return t[1];let e=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let r of e){let o=n.match(r);if(o&&o[1])return o[1]}return n}function rs(n,t,e=0){let r=n.slice(0,3).toString("ascii");if(!/^v\d\d$/.test(r))return n.toString("utf-8");let o=n.slice(3);if(o.length===0||o.length%16!==0)return n.toString("utf-8");let a=Kn.pbkdf2Sync(t,"saltysalt",1003,16,"sha1"),s=Buffer.alloc(16,32),i=Kn.createDecipheriv("aes-128-cbc",a,s);i.setAutoPadding(!1);let c=Buffer.concat([i.update(o),i.final()]),u=c[c.length-1];return u&&u<=16&&(c=c.slice(0,-u)),e>=24&&c.length>32&&(c=c.slice(32)),ns(c.toString("utf-8"))}var os=[B.join(X.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function as(n){for(let t of os){if(!pt.existsSync(t))continue;let e=B.join(X.tmpdir(),`finflow_cookies_${Date.now()}.db`);pt.copyFileSync(t,e);try{let r=0;try{let s=ft(`sqlite3 "${e}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();r=parseInt(s,10)||0}catch{}let o=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(ft(`sqlite3 -json "${e}" "${o}"`,{encoding:"utf-8"})).map(s=>({name:s.name,value:Buffer.from(s["hex(encrypted_value)"],"hex"),domain:s.host_key,_metaVersion:r}))}finally{try{pt.unlinkSync(e)}catch{}}}return[]}function qe(n,t){if(process.platform!=="darwin")throw new Error("\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie \u4EC5\u652F\u6301 macOS");let e;try{e=ts()}catch{throw new Error(`\u65E0\u6CD5\u4ECE Keychain \u83B7\u53D6 Chrome \u5BC6\u7801\u3002
|
|
6
|
-
\u8BF7\u786E\u4FDD\u5DF2\u5B89\u88C5 Google Chrome\u3002`)}let r=
|
|
7
|
-
`,"utf-8");try{ce.chmodSync(e,384)}catch{}return e}function ge(n){let t=ht(n),e=t?(process.env[t.env]||"").trim():"";if(e)return{key:e,origin:"env"};try{let r=ce.readFileSync(ue(n),"utf-8").trim();if(r)return{key:r,origin:"file"}}catch{}return null}function Zn(n){try{return ce.unlinkSync(ue(n)),!0}catch{return!1}}function bt(n){let t=n.trim();return t.length<=16?t.slice(0,4)+"\u2026":`${t.slice(0,12)}\u2026${t.slice(-4)}`}var us="https://fuyao.aicubes.cn";function he(){return ge("fuyao")}var $e=class extends Error{constructor(e,r,o){super(r);this.code=e;this.requestId=o;this.name="FuyaoApiError"}code;requestId};async function b(n,t={}){let e=he();if(!e)throw new $e(2001,"\u672A\u914D\u7F6E\u6276\u6447(\u540C\u82B1\u987A) API key\uFF1A\u8FD0\u884C `finflow key set fuyao <sk-fuyao-\u2026>` \u4FDD\u5B58\u5230\u672C\u5730\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF FUYAO_API_KEY");let r=new URLSearchParams;for(let[c,u]of Object.entries(t))u!=null&&u!==""&&r.set(c,String(u));let o=r.toString(),a=`${us}${n}${o?`?${o}`:""}`,s;try{s=await fetch(a,{headers:{"X-api-key":e.key,Accept:"application/json"}})}catch(c){throw new Error(`\u6276\u6447\u63A5\u53E3\u7F51\u7EDC\u9519\u8BEF\uFF1A${c.message}`)}let i;try{i=await s.json()}catch{i=null}if(!i||typeof i.code!="number")throw new Error(`\u6276\u6447\u63A5\u53E3\u54CD\u5E94\u5F02\u5E38\uFF08HTTP ${s.status}\uFF0C\u975E JSON \u4FE1\u5C01\uFF09`);if(i.code!==0)throw new $e(i.code,`\u6276\u6447 API ${i.code}\uFF1A${i.message||"\u672A\u77E5\u9519\u8BEF"}`,i.request_id);return i.data}function ls(n){return/^88/.test(n)?"TI":/^92/.test(n)||/^[48]/.test(n)?"BJ":/^[0123]/.test(n)?"SZ":/^[569]/.test(n)?"SH":"SZ"}function A(n){let t=n.trim().toUpperCase(),e=t.match(/^(SH|SZ|BJ)(\d{6})$/);return e&&(t=`${e[2]}.${e[1]}`),/^\d{6}$/.test(t)&&(t=`${t}.${ls(t)}`),t}function er(n){return/\.TI$/i.test(n.trim())}function be(n,t={}){return b("/api/a-share/prices/snapshot",{thscodes:n.length?n.map(A).join(","):void 0,limit:t.limit,offset:t.offset})}function tr(n,t){return b("/api/a-share/prices/historical",{thscode:A(n),interval:t.interval||"1d",start:t.start,end:t.end,adjust:t.adjust&&t.adjust!=="none"?t.adjust:void 0})}function nr(n){return b("/api/a-share-index/prices/snapshot",{thscodes:n.map(A).join(",")})}function rr(n,t){return b("/api/a-share-index/prices/historical",{thscode:A(n),interval:t.interval||"1d",start:t.start,end:t.end})}function or(n="cn_concept"){return b("/api/a-share-index/catalog/ths-index-list",{tag:n})}function St(n){return b("/api/a-share-index/constituents/ths-stock-list",{thscode:A(n)})}function ar(n,t={}){return b("/api/meta/tickers/search",{q:n,exchange:t.exchange,asset_type:t.assetType,limit:t.limit})}function sr(n={}){return b("/api/meta/tickers/list",{asset_type:n.assetType,limit:n.limit,offset:n.offset})}function ir(){return b("/api/a-share/calendar/trading-days")}function cr(n,t={}){return b("/api/a-share/corporate-actions/adjustment-factors",{thscode:A(n),from:t.from,to:t.to})}function wt(n,t){return{thscode:A(n),period:t.period||"annual",...t.start!==void 0&&t.end!==void 0?{start:t.start,end:t.end}:{limit:t.limit}}}function ur(n,t={}){return b("/api/a-share/financials/income-statements",wt(n,t))}function lr(n,t={}){return b("/api/a-share/financials/balance-sheets",wt(n,t))}function mr(n,t={}){return b("/api/a-share/financials/cash-flow-statements",wt(n,t))}function dr(n,t){return b("/api/a-share/financials/indicators",{thscode:A(n),report:t})}function pr(n){return b("/api/a-share/valuations/snapshot",{thscodes:n.map(A).join(",")})}function re(n){return n=j(n),{items:n.map(t=>({time:t.time,content:zn(t.data?.content||t.data?.title||"",t),title:t.data?.title||"",importance:t.important??0,source:t.data?.source||"",tags:yt(t.remark)?yt(t.remark).split(" "):[]})),total:n.length}}function ms(n){let t=n?.data?.list||[];return{items:t.map(e=>({title:e.title||"",hot:!!e.hot,updatedAt:e.updated_at||""})),total:t.length}}async function fr(n,t=10){let r=((await Dn(n))?.data?.list??[]).slice(0,t);l({data:r,command:`info flash symbol ${n}`,source:"jin10 market",toJSON:re})}async function ds(n,t){let e=rt[n];if(e===void 0)return l({data:{error:`\u4E0D\u652F\u6301\u7684\u9891\u9053 "${n}"\uFF0C\u53EF\u9009: ${Object.keys(rt).join(", ")}`},command:"info flash -s qihuo",source:"jin10"});let r=await qn(e,t);l({data:r?.data??[],command:"info flash -s qihuo",source:"jin10",toJSON:re})}function ps(n){return n=j(n),{items:n.map(t=>({time:new Date(t.ctime*1e3).toISOString(),content:J(t.content||t.brief||""),title:t.title||"",importance:0,source:"cls",tags:(t.subjects||[]).map(e=>`#${e.subject_name}`)})),total:n.length}}function kt(n){return n=j(n),{items:n.map(t=>({time:new Date(t.createTimestamp*1e3).toISOString(),content:J(t.content||""),title:t.title||"",importance:t.level===1?1:0,source:"glh",tags:[...(t.relatedStocks||[]).map(e=>e.name),...(t.relatedInfos||[]).map(e=>`#${e.name}`)],readCount:t.count?.read||0})),total:n.length}}function fs(n){let t=n?.list||(Array.isArray(n)?n:[]),e=[];if(Array.isArray(t)&&Array.isArray(t[0]))for(let r of t)for(let o of r)e.push(o);else Array.isArray(t)&&(e=t);return e=j(e),{items:e.map(r=>({title:r.title||"",badge:r.ndata?.badge||"",redirectUrl:r.web_redirect_url||""})),total:e.length}}function ys(n){let t=[],e=n?.list||(Array.isArray(n)?n:[]);if(Array.isArray(e)&&e.length&&Array.isArray(e[0]))for(let r of e)t.push(...r);else Array.isArray(e)&&(t=e);return t=j(t),{items:t.map(r=>({title:r.title||"",introduction:r.introduction||"",displayDatetime:r.display_datetime||"",tags:(r.reveal_tags||[]).map(o=>o.name||o),vip:!!r.vip,source:r.source||""})),total:t.length}}function yr(n){let t=n?.data?.top_article||[],e=n?.data?.depth_list||[],r=j([...t,...e]);return{items:r.map(o=>({time:o.ctime?new Date(o.ctime*1e3).toISOString():"",title:o.title||"",brief:J(o.brief||""),source:o.source||"",subjects:(o.subjects||[]).map(a=>a.subject_name||a.name||""),readingNum:o.reading_num||0})),total:r.length}}function gs(n){let t=j(n?.data||[]);return{items:t.map(e=>({title:e.title||"",readingNum:e.readNum||0})),total:t.length}}function hs(n){let t=j(n?.data||[]);return{items:t.map(e=>({time:e.ctime?new Date(e.ctime*1e3).toISOString():"",title:e.title||"",source:e.source||""})),total:t.length}}function gr(n){return{items:n.map(t=>({id:t.id,title:t.title||"",shortName:t.short_name||"",introduction:(t.introduction||"").trim().slice(0,200),categoryName:t.category_name||"",subscribeNum:t.subscribe_num||0})),total:n.length}}function bs(n){let t=n?.data?.hot_subjects||[],e=n?.data?.newest_subjects||[];return{hotSubjects:t.map(r=>({name:r.name||"",attentionNum:r.attention_num||0,newestArticleTitle:J(r.newest_article_title||"")})),newestSubjects:e.map(r=>({name:r.name||""}))}}function Ss(n){let t=Array.isArray(n)?n:n?.data||[],e=new Map;for(let o of t){let a=o.category_name||"\u672A\u5206\u7C7B";e.set(a,(e.get(a)||0)+1)}let r=Array.from(e,([o,a])=>({name:o,count:a}));return{items:r,total:r.length}}var ws=new Set(["stock","telegram","featured","depth","eoe_article"]),_s={stock:"\u80A1\u7968",telegram:"\u7535\u62A5",featured:"\u8981\u95FB",depth:"\u6DF1\u5EA6",eoe_article:"\u6587\u7AE0"};function hr(n){let t=n?.data||{},e=[],r=0;for(let[o,a]of Object.entries(t))if(ws.has(o)&&!(!a||typeof a!="object"||!Array.isArray(a.data))){r+=a.total_num||a.data.length;for(let s of a.data){let i=s.stock_category==="stock"||/^s[hz]\d+$/i.test(s.descr||""),c=s.descr?J(s.descr):"",u=J(s.title||s.featuredTitle||""),m=c;if(!u&&c){let p=c.search(/[。!?\n]/);u=p>0?c.slice(0,p):c.slice(0,60),m=c}m&&m.length>200&&(m=m.slice(0,200)),!(!u&&!m&&!i)&&e.push({kind:_s[o]||o,type:i||s.type===1?"stock":"article",title:u,brief:m,code:i&&(s.stock_id||s.descr)||"",name:i?J(s.title||""):"",price:s.last||null,percent:s.raise||null,time:s.time?new Date(s.time*1e3).toISOString():"",author:s.author||"",id:s.id,url:s.external_link||""})}}return{items:e,total:r}}function ks(n){let t=n?.data?.roll_data?.[0];return t?{item:{id:t.id,time:t.ctime?new Date(t.ctime*1e3).toISOString():"",title:J(t.title||""),content:J(t.content||t.brief||""),subjects:(t.subjects||[]).map(e=>e.subject_name||"").filter(Boolean),stocks:(t.stock_list||[]).map(e=>e.name||e.stock_name||"").filter(Boolean),url:`https://www.cls.cn/detail/${t.id}`}}:{item:null}}function br(n){let t=(n?.data?.list||[]).filter(e=>!e.vip);return{items:t.map(e=>({kind:e.type||"",type:e.type==="flash"?"flash":e.type==="news"?"article":e.type||"",title:e.title||e.data?.title||"",brief:e.data?.content?J(e.data.content).slice(0,200):e.introduction||"",time:e.display_datetime||e.time||"",important:e.important??0,id:e.id})),total:t.length}}async function xt(n){let t=ee(),e=t?{cookie:t}:void 0,r=new Set,o=[],a=await xn({},e);for(let c of a?.data||[])r.has(c.id)||(r.add(c.id),o.push(c));let s=0,i=50;for(;o.length<n&&s++<i;){let c=o[o.length-1];if(!c)break;let m=(await Nn(c.time,e))?.data||[];if(!m.length)break;let p=0;for(let d of m)r.has(d.id)||(r.add(d.id),o.push(d),p++);if(p===0)break;o.length<n&&await new Promise(d=>setTimeout(d,200))}return o}function Sr(n){return n.command({command:"info",describe:"\u4FE1\u606F\u6D41",builder:t=>t.strictCommands(!1).command("codes [asset_type]","\u8BC1\u5238\u4EE3\u7801\u8868\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1AA\u80A1/\u6307\u6570/\u57FA\u91D1 \u5168\u91CF\u4EE3\u7801",e=>e.positional("asset_type",{type:"string",default:"a-share",choices:["a-share","a-share-index","fund-otc","fund-etf","fund-lof"],describe:"\u8D44\u4EA7\u7C7B\u578B\uFF08\u53EF\u9017\u53F7\u5206\u9694\u591A\u503C\uFF09"}),async e=>{let{n:r=30}=e,o=e.asset_type||"a-share",a=await sr({assetType:o,limit:Math.min(r,1e4)});l({data:a,command:`info codes ${o}`,source:"fuyao",toJSON:s=>({items:(s?.item||[]).map(i=>({code:i.thscode||"",name:i.name||"",type:i.asset_type||"",exchange:i.exchange??null})),total:s?.item?.length??0})})}).command("flash","\u5FEB\u8BAF",e=>e.option("src",{alias:"s",type:"string",choices:["cls","jin10","glh","qihuo"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08qihuo=\u671F\u8D27\u5782\u76F4\u5FEB\u8BAF\uFF09"}).option("category",{alias:"c",type:"string",describe:"cls \u680F\u76EE / glh \u9891\u9053 / qihuo \u671F\u8D27\u9891\u9053"}).option("symbol",{type:"string",describe:"\u6309\u54C1\u79CD\u8FC7\u6EE4\uFF08jin10 per-symbol \u5FEB\u8BAF\u6D41\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u8BBE\u7F6E\u540E\u5FFD\u7565 src/category\uFF09"}).strictCommands(!1).command("important","\u91CD\u8981\u5FEB\u8BAF\uFF08glh \u6570\u636E\u6E90\uFF09",r=>r.option("channel",{alias:"c",type:"string",describe:"\u9891\u9053"}),async r=>{let{n:o=10,channel:a}=r,s=a?ve(a):ve("popular"),i=await Yn({channel:s.id,limit:o}),c=j(i.result||[]);l({data:c,command:"info flash important",source:"glh",toJSON:()=>kt(c)})}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",r=>r,async r=>{let{n:o=10}=r,a=await Bn({limit:o}),s=j(a.result||[]);l({data:s,command:"info flash popular",source:"glh",toJSON:()=>kt(s)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",r=>r,async r=>{let o=r.id,a=await On(o);l({data:a,command:"info flash detail",source:"jin10",toJSON:s=>re(s?.data?[s]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",r=>r,async r=>{let o=r.date,a;try{a=qe("jin10.com")}catch(i){console.error(i.message),console.error("\u6309\u65E5\u671F\u67E5\u770B\u5FEB\u8BAF\u9700\u8981\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55 jin10.com"),process.exit(1)}let s=await An(o,{cookie:a});s?._statusCode===403&&(console.error("\u6B64\u529F\u80FD\u9700\u8981\u5F00\u901A\u4F1A\u5458\uFF0C\u8BF7\u5728 jin10.com \u5347\u7EA7"),process.exit(1)),l({data:s,command:"info flash date",source:"jin10",toJSON:i=>re(i?.data||[])})}).command("symbol <code>","\u67D0\u54C1\u79CD\u76F8\u5173\u5FEB\u8BAF\uFF08jin10 per-symbol \u6D41\uFF09",r=>r.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE \u6216\u88F8\u7801\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u522B\u540D\u81EA\u52A8\u5F52\u4E00\u5316\uFF09"}),async r=>{await fr(r.code,r.n??10)}),async e=>{let{n:r=10,src:o="cls",category:a,symbol:s}=e;if(s){await fr(s,r);return}let i=a||"all",c=[];if(o==="qihuo"){await ds(i,r);return}else o==="jin10"?c.push({name:"jin10",fn:d=>xt(r).then(g=>l({data:g,command:"info flash",source:d,toJSON:re}))},{name:"cls",fn:d=>m(d,i,r)},{name:"glh",fn:d=>p(d,i,r)}):o==="glh"?c.push({name:"glh",fn:d=>p(d,i,r)},{name:"cls",fn:d=>m(d,i,r)},{name:"jin10",fn:d=>xt(r).then(g=>l({data:g,command:"info flash",source:d,toJSON:re}))}):i==="all"?c.push({name:"cls",fn:d=>m(d,i,r)},{name:"jin10",fn:d=>xt(r).then(g=>l({data:j(g),command:"info flash",source:d,toJSON:re}))},{name:"glh",fn:d=>p(d,i,r)}):c.push({name:"cls",fn:d=>m(d,i,r)});let u;for(let d=0;d<c.length;d++){let{name:g,fn:y}=c[d],h=d===0?g:`${g} fallback`;try{await y(h);return}catch(S){u=S,d<c.length-1&&console.error(`Source ${g} failed: ${S?.message||S}, trying next...`)}}throw u;async function m(d,g,y){let h=ln(g);if(!h)return l({data:{error:`\u672A\u77E5\u680F\u76EE: ${g}\u3002\u53EF\u7528: all/red/announcement/watch/hk_us/fund/remind\uFF0C\u6216\u7528 --src jin10|glh`},command:"info flash",source:"cls"});let S=new Set,w=[],_=20,N=50,k=0,P=h.category,Q=(await Xe({rn:_,category:P}))?.data?.roll_data||[];for(let L of Q)S.has(L.id)||(S.add(L.id),w.push(L));for(;w.length<y&&k++<N;){let L=w.reduce((Z,Gt)=>(Gt.ctime||0)<(Z.ctime||0)?Gt:Z,w[0]);if(!L?.ctime)break;let xa=(await Xe({lastTime:L.ctime,rn:_,category:P}))?.data?.roll_data||[],Xt=0;for(let Z of xa)S.has(Z.id)||(S.add(Z.id),w.push(Z),Xt++);if(!Xt)break;w.length<y&&await new Promise(Z=>setTimeout(Z,200))}let V=w.slice(0,y);l({data:V,command:"info flash",source:d,toJSON:ps})}async function p(d,g,y){let h=g&&g!=="all"?ve(g):{id:"all"},S=new Set,w=[],_=15,N=50,k=0,P=await fe({channel:h.id,limit:_});for(let q of P?.result||[])S.has(q.id)||(S.add(q.id),w.push(q));for(;w.length<y&&k++<N;){let q=w[w.length-1];if(!q?.id)break;let Q=await fe({channel:h.id,limit:_,liveId:q.id}),V=0;for(let L of Q?.result||[])S.has(L.id)||(S.add(L.id),w.push(L),V++);if(!V)break;w.length<y&&await new Promise(L=>setTimeout(L,200))}l({data:w,command:"info flash",source:d,toJSON:kt})}}).command("news","\u6DF1\u5EA6\u6587\u7AE0",e=>e.strictCommands(!1).command("slide","\u5E7B\u706F\u7247/\u91CD\u8981\u4E8B\u4EF6\uFF08jin10\uFF09",r=>r,async()=>{let r=await En();l({data:r,command:"info news slide",source:"jin10",toJSON:fs})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async()=>{let r=await Pn();l({data:r,command:"info news feature",source:"jin10",toJSON:ys})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.channel||"headline",s=mn(a);if(!s){let u=Object.entries(ie).map(([m,p])=>` ${m.padEnd(12)} ${p.name} (${p.id})`).join(`
|
|
4
|
+
`);let t=await Ba();return Ya(t),Ee(t)}catch(t){if(n)return process.stderr.write(`finflow: \u54C1\u79CD\u5E93\u5237\u65B0\u5931\u8D25\uFF08${t.message}\uFF09\uFF0C\u4F7F\u7528\u672C\u5730\u7F13\u5B58
|
|
5
|
+
`),Ee(n.text,n.fetchedAt);throw new Error(`\u54C1\u79CD\u5E93\u4E0D\u53EF\u7528\u4E14\u65E0\u672C\u5730\u7F13\u5B58: ${t.message}`)}}var Xa={FUTURES:0,MAIN:0,PLATE:0,LINK:0,NIGHT:0,FOREX:1,ST_OTHER:2,INDEX:2,METAL:2,BOND:3,SHARES:4,FUND:5,OPTION:6};function Ga(n){return Xa[n]??3}function Ka(n){return n==="OPTION"?0:n==="SHARES"||n==="FUND"||n==="BOND"?1:2}function _n(n,t,e={}){let r=t.trim().toUpperCase();if(!r)return[];let o=[];for(let i of n.stocks){let c=i.code.toUpperCase(),u=`${c}.${i.exchange.toUpperCase()}`,m=i.name.toUpperCase(),d=(n.aliasNames.get(c)??[]).map(h=>h.toUpperCase()),p=m.includes(r)||d.some(h=>h.includes(r));if(!c.includes(r)&&!u.includes(r)&&!p)continue;let g=0;for(let h of[m,...d]){let b=h.indexOf(r);if(b!==-1){let w=b===0?h===r?100:80:50-Math.min(b,40);w>g&&(g=w)}}let y=0;if(u===r)y=100;else if(c===r)y=96;else if(c.startsWith(r))y=80;else{let h=c.indexOf(r);h!==-1&&(y=50-Math.min(h,40))}o.push({code:i.full,name:i.name,type:i.type,exchange:i.exchange,exchangeName:n.exchangeNames[i.exchange]??i.exchange,currency:i.currency,digits:i.digits,bucket:Ka(i.type),month:Ha(i.code,i.type)?1:0,sCode:y,sName:g,main:Pe(i.code,i.type)?1:0,typeRank:Ga(i.type),brevity:30-Math.min(i.code.length,30)})}o.sort((i,c)=>c.bucket-i.bucket||i.month-c.month||c.sCode-i.sCode||c.sName-i.sName||c.main-i.main||i.typeRank-c.typeRank||c.brevity-i.brevity);let a=o.map(({code:i,name:c,type:u,exchange:m,exchangeName:d,currency:p,digits:g})=>({code:i,name:c,type:u,exchange:m,exchangeName:d,currency:p,digits:g})),s=e.limit;return s!=null&&s>0?a.slice(0,s):a}var za={GOLD:"XAUUSD.GOODS",XAU:"XAUUSD.GOODS",SPOTGOLD:"XAUUSD.GOODS",SILVER:"XAGUSD.GOODS",XAG:"XAGUSD.GOODS",SPOTSILVER:"XAGUSD.GOODS",WTI:"USOIL.GOODS",USO:"USOIL.GOODS",CRUDE:"USOIL.GOODS",BRENT:"UKOIL.GOODS",UKO:"UKOIL.GOODS",COPPER:"COPPER.GOODS",DXY:"DXY.NYF",USDX:"DXY.NYF",DOLLARINDEX:"DXY.NYF","^GSPC":"SPX.INDEX",GSPC:"SPX.INDEX",SP500:"SPX.INDEX",SPX500:"SPX.INDEX",US500:"SPX.INDEX",INX:"SPX.INDEX",SPP500:"SPX.INDEX","^DJI":"DJI.INDEX",DJI:"DJI.INDEX",DJI30:"DJI.INDEX",DJIA:"DJI.INDEX",US30:"DJI.INDEX",DOW:"DJI.INDEX",DOWJONES:"DJI.INDEX","^NDX":"NDX.INDEX",NDX100:"NDX.INDEX",US100:"NDX.INDEX",NASDAQ:"NDX.INDEX",NASDAQ100:"NDX.INDEX","^HSI":"HSI.INDEX",HSI:"HSI.INDEX",HANGSENG:"HSI.INDEX","^N225":"N225.INDEX",N225:"N225.INDEX",NIKKEI:"N225.INDEX",NIKKEI225:"N225.INDEX",KOSPI:"KS11.INDEX",KOSPI200:"KS11.INDEX","^GDAXI":"GDAXI.INDEX",GDAXI:"GDAXI.INDEX",DAX:"GDAXI.INDEX",GER30:"GDAXI.INDEX","^FCHI":"FCHI.INDEX",FCHI:"FCHI.INDEX",CAC:"FCHI.INDEX",CAC40:"FCHI.INDEX","^FTSE":"FTSE.INDEX",FTSE:"FTSE.INDEX",UK100:"FTSE.INDEX","^STOXX50E":"SX5E.INDEX",SX5E:"SX5E.INDEX",EU50:"SX5E.INDEX",CNH:"USDCNH.FXCM"},Wa={XAUUSD:"XAUUSD.GOODS",XAGUSD:"XAGUSD.GOODS",USOIL:"USOIL.GOODS",UKOIL:"UKOIL.GOODS",COPPER:"COPPER.GOODS",DXY:"DXY.NYF",USDCNH:"USDCNH.FXCM",EURUSD:"EURUSD.FXCM",GBPUSD:"GBPUSD.FXCM",USDJPY:"USDJPY.FXCM",USDCAD:"USDCAD.FXCM",AUDUSD:"AUDUSD.FXCM",NZDUSD:"NZDUSD.FXCM",USDCHF:"USDCHF.FXCM",SPX:"SPX.INDEX",DJI:"DJI.INDEX",NDX:"NDX.INDEX",HSI:"HSI.INDEX",N225:"N225.INDEX",KS11:"KS11.INDEX",GDAXI:"GDAXI.INDEX",FCHI:"FCHI.INDEX",FTSE:"FTSE.INDEX"},Qa=["GOODS","INDEX","FXCM","NYF","BANK","CMX","NYM"];function Va(n){if(!n.length)return null;let t=null,e=1/0;for(let r of n){let o=Qa.indexOf(r.exchange);o===-1&&(o=50),Pe(r.code,r.type)&&(o-=10),o<e&&(e=o,t=r)}return t}function ne(n,t){let e=n.trim();if(!e)return e;let r=/^([A-Z]{3,6})\/([A-Z]{3})$/i.exec(e);r&&(e=r[1]+r[2]);let o=e.toUpperCase(),a=za[o];if(a)return a;let s=t===void 0?nt():t;if(!e.includes(".")){let c=s?.byCodeUpper.get(o)??[],u=Va(c);return u?u.full:Wa[o]??e}let i=s?.byFullUpper.get(o);return i?i.full:e}function rt(n,t){let e=t===void 0?nt():t;return n.map(r=>ne(r,e))}function kn(n){return n.replace(/[0-9]+$/,"")||n}var ot={all:-1,oil:19,steel:20,coal:21,gas:22,metal:23,nonferrous:24,chemical:25,sugar:27,grain:28,pig:29,macro:30},pe=["DCE","CZC","SHF","INE","CF","GFEX"];var ts="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",ns={"User-Agent":ts,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},rs={"flash-api.jin10.com":{id:"bVBF4FyRTn5NJF5n",version:"1.0.0"},"search-open-api.jin10.com":{id:"SRvUdAEfVxLO5NAd",version:"1.0.1"},"common-open-api.jin10.com":{id:"zP6WFH7WKz2vrw4Q",version:"1.0.0"},"uc-api.jin10.com":{id:"YDcStOzjliuTJUvh",version:"1.0.0"},"qh-flash-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.0.0",referer:"https://qihuo.jin10.com/"},"futures-report-api.jin10.com":{id:"KxBcVoDHStE6CUkQ",version:"1.3.0",referer:"https://qihuo.jin10.com/"},"qhcal-api.jin10.com":{id:"1coXNOi34tU5TDTl",version:"1.0",referer:"https://qihuo.jin10.com/"}};function N(n,t,e={},r={}){let o=r.timeout??1e4,a=Object.keys(e).length?"?"+new URLSearchParams(e).toString():"",s=`${t}${a}`,i={...ns,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},c=rs[n];return c&&(i["x-app-id"]=c.id,i["x-version"]=c.version,i.handleerror="true",c.referer&&(i.Referer=c.referer,i.Origin=new URL(c.referer).origin)),r.cookie&&(i.Cookie=r.cookie),r.extraHeaders&&Object.assign(i,r.extraHeaders),new Promise((u,m)=>{let p=(n.startsWith("localhost")?es:Za).request({hostname:n,path:s,method:"GET",timeout:o,headers:i},g=>{if(g.statusCode>=300&&g.statusCode<400&&g.headers.location){let h=new URL(g.headers.location,`https://${n}`);return u(N(h.hostname,h.pathname+h.search,e,r))}let y=[];g.on("data",h=>y.push(h)),g.on("end",()=>{let h=Buffer.concat(y).toString("utf-8");try{let b=JSON.parse(h);g.statusCode>=400&&(b._statusCode=g.statusCode),u(b)}catch{u(h)}})});p.on("error",m),p.on("timeout",()=>{p.destroy(),m(new Error("timeout"))}),p.end()})}function Nn(n={},t){let e={};return n.max_read_id&&(e.max_read_id=n.max_read_id),n.channel&&(e.channel=n.channel),N("flash-api.jin10.com","/get_flash_list",e,t)}function On(n,t){return N("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},t)}function An(n,t){return N("flash-api.jin10.com","/get_flash_detail",{id:n},t)}function Dn(n,t){return N("flash-api.jin10.com","/get_flash_list_by_date",{date:n},t)}function at(n,t){return N("search-open-api.jin10.com","/offset/search",{keyword:n.keyword,type:n.type??"flash",rank:n.rank??"hot",order:n.order??1,offset:n.offset??0,rewrite:1},t)}async function Tn(n,t){let e=ne(n);return N("search-open-api.jin10.com","/market",{vip:0,type:"flash",symbol:e,offset:0},t)}function En(){return N("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function Pn(){return N("cdn.jin10.com","/json/index/slide_204.json")}function vn(){return N("cdn.jin10.com","/json/index/flir.json")}var st="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",os={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function it(n){return{extraHeaders:os,...n}}function ct(n,t="cj",e){return N(st,"/get/data",{date:n,category:t},it(e))}function Cn(n,t="cj",e){return N(st,"/get/event",{date:n,category:t},it(e))}function qn(n,t="cj",e){return N(st,"/page/holiday",{date:n,category:t,page:1,pagesize:50},it(e))}function xn(n=-1,t={},e){let r={channel:n};return t.max_time&&(r.max_time=t.max_time),N("qh-flash-api.jin10.com","/get_flash_list",r,e)}async function $n(n,t){let e=new Set,r=[],o=await xn(n);for(let i of o?.data||[])e.has(i.id)||(e.add(i.id),r.push(i));let a=0,s=50;for(;r.length<t&&a++<s;){let i=r[r.length-1];if(!i)break;let u=(await xn(n,{max_time:i.time}))?.data||[];if(!u.length)break;let m=0;for(let d of u)e.has(d.id)||(e.add(d.id),r.push(d),m++);if(m===0)break;r.length<t&&await new Promise(d=>setTimeout(d,200))}return{...o,data:r.slice(0,t)}}function jn(n){return N("futures-report-api.jin10.com","/api/headline",{},n)}var In={"x-app-id":"JECyg2NjIfH2QouV","x-version":"1.0.0"};function Rn(n,t,e){return N("futures-report-api.jin10.com","/api/f10/types/details",{subcode:n,exchange:t},{...e,extraHeaders:In})}function Mn(n,t){return N("futures-report-api.jin10.com","/api/category/chart",{tag_id:n},{...t,extraHeaders:In})}function Jn(n){let t=ne(n),e=t.lastIndexOf(".");if(e<=0||e===t.length-1)return{ok:!1,error:"\u8BF7\u7528 CODE.EXCHANGE \u5F62\u5F0F\uFF0C\u5982: price f10 i9888.DCE\uFF08\u53EF\u7528 price search \u94C1\u77FF \u67E5\u4EE3\u7801\uFF09"};let r=t.slice(e+1).toUpperCase();return pe.includes(r)?{ok:!0,code:t,subcode:kn(t.slice(0,e)),exchange:r}:{ok:!1,error:`F10 \u4EC5\u56FD\u5185\u671F\u8D27\u54C1\u79CD\u6709\u57FA\u672C\u9762\u6863\u6848\uFF08${pe.join("/")}\uFF09\uFF0C${t} \u4E0D\u5728\u8303\u56F4\u5185`}}function ut(n){return n.replace(/-/g,"")}function Ln(n,t){return N("qhcal-api.jin10.com","/data",{date:ut(n)},t)}function Un(n,t){return N("qhcal-api.jin10.com","/event",{date:ut(n)},t)}function Fn(n,t){return N("qhcal-api.jin10.com","/holiday",{date:ut(n)},t)}function Hn(n,t){return N("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...t,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function ve(){return N("cdn.jin10.com","/json/index/all_topics.json")}function Yn(n,t={},e){let r={id:n};return t.page&&(r.page=t.page),t.page_size&&(r.page_size=t.page_size),N("reference-api.jin10.com","/topic/getById",r,{...e,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import as from"https";var lt="www.gelonghui.com",ss="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";function Ce(n,t=1e4){return new Promise((e,r)=>{let o=new URL(n,`https://${lt}`),a=as.get({hostname:lt,path:o.pathname+o.search,headers:{"User-Agent":ss,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9",Referer:`https://${lt}/live/`,"client-lang":"zh-cn",platform:"web",shortversion:"10.7.0"}},s=>{let i=[];s.on("data",c=>i.push(c)),s.on("end",()=>{let c=Buffer.concat(i).toString();try{e(JSON.parse(c))}catch{e(c)}})});a.setTimeout(t,()=>{a.destroy(),r(new Error("timeout"))}),a.on("error",r)})}function fe(n={}){let t=new URLSearchParams({category:n.category??"all",limit:String(n.limit??15),timestamp:String(Date.now())});return n.liveId&&t.set("liveId",String(n.liveId)),Ce(`/api/live-channels/${n.channel??"all"}/lives/v4?${t}`)}function Bn(n={}){return fe({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function Xn(n={}){return fe({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function Gn(n={}){return Ce(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function mt(){return Ce("/hq/home-page-data")}function ye(){return Ce("/hq/quote/api/market/flow/entrance/data/v2")}var dt=Object.freeze([{id:"all",name:"\u5168\u90E8"},{id:"popular",name:"\u6700\u70ED"},{id:"fundLive",name:"\u57FA\u91D1"},{id:"ai",name:"AI"},{id:"international",name:"\u56FD\u9645"},{id:"chineseMainland",name:"\u4E2D\u56FD\u5927\u9646"},{id:"hongkongMacaoTaiwan",name:"\u6E2F\u6FB3\u53F0"},{id:"HKStock",name:"\u6E2F\u80A1"},{id:"AStock",name:"A\u80A1"},{id:"USStock",name:"\u7F8E\u80A1"},{id:"virtualAssets",name:"\u865A\u62DF\u8D44\u4EA7"},{id:"exchangeCommodity",name:"\u5546\u54C1\u5916\u6C47"},{id:"house",name:"\u697C\u5E02"},{id:"debenture",name:"\u503A\u5238"}]),pt=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function qe(n){return n?dt.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??dt[0]:dt[0]}function Kn(n){return n?pt.find(t=>t.id.toLowerCase()===n.toLowerCase()||t.name===n)??pt[0]:pt[0]}import ft from"fs";import B from"path";import X from"os";import{execSync as yt}from"child_process";import zn from"crypto";function cs(){return yt('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function us(n){let t=n.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(t?.[1])return t[1];let e=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let r of e){let o=n.match(r);if(o&&o[1])return o[1]}return n}function ls(n,t,e=0){let r=n.slice(0,3).toString("ascii");if(!/^v\d\d$/.test(r))return n.toString("utf-8");let o=n.slice(3);if(o.length===0||o.length%16!==0)return n.toString("utf-8");let a=zn.pbkdf2Sync(t,"saltysalt",1003,16,"sha1"),s=Buffer.alloc(16,32),i=zn.createDecipheriv("aes-128-cbc",a,s);i.setAutoPadding(!1);let c=Buffer.concat([i.update(o),i.final()]),u=c[c.length-1];return u&&u<=16&&(c=c.slice(0,-u)),e>=24&&c.length>32&&(c=c.slice(32)),us(c.toString("utf-8"))}var ms=[B.join(X.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),B.join(X.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function ds(n){for(let t of ms){if(!ft.existsSync(t))continue;let e=B.join(X.tmpdir(),`finflow_cookies_${Date.now()}.db`);ft.copyFileSync(t,e);try{let r=0;try{let s=yt(`sqlite3 "${e}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();r=parseInt(s,10)||0}catch{}let o=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(yt(`sqlite3 -json "${e}" "${o}"`,{encoding:"utf-8"})).map(s=>({name:s.name,value:Buffer.from(s["hex(encrypted_value)"],"hex"),domain:s.host_key,_metaVersion:r}))}finally{try{ft.unlinkSync(e)}catch{}}}return[]}function $e(n,t){if(process.platform!=="darwin")throw new Error("\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie \u4EC5\u652F\u6301 macOS");let e;try{e=cs()}catch{throw new Error(`\u65E0\u6CD5\u4ECE Keychain \u83B7\u53D6 Chrome \u5BC6\u7801\u3002
|
|
6
|
+
\u8BF7\u786E\u4FDD\u5DF2\u5B89\u88C5 Google Chrome\u3002`)}let r=ds(n);if(!r.length)throw new Error(`\u672A\u627E\u5230 ${n} Cookie\uFF0C\u8BF7\u786E\u4FDD\u5DF2\u5728 Chrome \u4E2D\u767B\u5F55 ${n}`);let o=t?[t,`.${t}`]:[`.${n}`,n],a=[];for(let s of r)if(o.includes(s.domain))try{let i=ls(s.value,e,s._metaVersion);if(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(i))continue;a.push(`${s.name}=${i}`)}catch{}if(!a.length)throw new Error("Cookie \u89E3\u5BC6\u5168\u90E8\u5931\u8D25");return a.join("; ")}function ee(){try{return $e("jin10.com")}catch{return null}}function gt(n){return n?.length?n.filter(t=>t.type==="quotes").map(t=>t.title).join(" "):""}function Wn(n,t){return!n&&t?.data?.vip_title?`[VIP] ${t.data.vip_title}`:n?J(n).replace(/^金十数据\d{4}年\d{1,2}月\d{1,2}日讯[,,]?\s*/,""):""}var Qn=[],ps=["content","title","brief","data.content","data.title","indicator_name","name","subject_name"];function fs(n){return ps.map(t=>t.split(".").reduce((r,o)=>r?.[o],n)||"").filter(Boolean).join(" ").toLowerCase()}function $(n){if(!Qn.length||!Array.isArray(n))return n;let t=Qn.map(e=>e.toLowerCase());return n.filter(e=>{let r=fs(e);return!t.some(o=>r.includes(o))})}import ce from"fs";import Vn from"path";import ys from"os";var F=[{id:"fuyao",name:"\u6276\u6447(\u540C\u82B1\u987A\u5B98\u65B9\u6570\u636E)",env:"FUYAO_API_KEY",describe:"\u590D\u6743\u65E5K/\u6DA8\u505C\u6C60/\u70ED\u699C/\u9F99\u864E\u699C/THS\u6307\u6570/\u4F30\u503C/\u8D22\u62A5/\u57FA\u91D1,\u5E76\u4F5C A\u80A1 quote/kline \u515C\u5E95"}];function bt(n){return F.find(t=>t.id===n.toLowerCase())}function ht(){return Vn.join(ys.homedir(),".finflow","keys")}function ue(n){return Vn.join(ht(),n.toLowerCase())}function Zn(n,t){let e=ue(n);ce.mkdirSync(ht(),{recursive:!0});try{ce.chmodSync(ht(),448)}catch{}ce.writeFileSync(e,t.trim()+`
|
|
7
|
+
`,"utf-8");try{ce.chmodSync(e,384)}catch{}return e}function ge(n){let t=bt(n),e=t?(process.env[t.env]||"").trim():"";if(e)return{key:e,origin:"env"};try{let r=ce.readFileSync(ue(n),"utf-8").trim();if(r)return{key:r,origin:"file"}}catch{}return null}function er(n){try{return ce.unlinkSync(ue(n)),!0}catch{return!1}}function St(n){let t=n.trim();return t.length<=16?t.slice(0,4)+"\u2026":`${t.slice(0,12)}\u2026${t.slice(-4)}`}var gs="https://fuyao.aicubes.cn";function he(){return ge("fuyao")}var je=class extends Error{constructor(e,r,o){super(r);this.code=e;this.requestId=o;this.name="FuyaoApiError"}code;requestId};async function S(n,t={}){let e=he();if(!e)throw new je(2001,"\u672A\u914D\u7F6E\u6276\u6447(\u540C\u82B1\u987A) API key\uFF1A\u8FD0\u884C `finflow key set fuyao <sk-fuyao-\u2026>` \u4FDD\u5B58\u5230\u672C\u5730\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF FUYAO_API_KEY");let r=new URLSearchParams;for(let[c,u]of Object.entries(t))u!=null&&u!==""&&r.set(c,String(u));let o=r.toString(),a=`${gs}${n}${o?`?${o}`:""}`,s;try{s=await fetch(a,{headers:{"X-api-key":e.key,Accept:"application/json"}})}catch(c){throw new Error(`\u6276\u6447\u63A5\u53E3\u7F51\u7EDC\u9519\u8BEF\uFF1A${c.message}`)}let i;try{i=await s.json()}catch{i=null}if(!i||typeof i.code!="number")throw new Error(`\u6276\u6447\u63A5\u53E3\u54CD\u5E94\u5F02\u5E38\uFF08HTTP ${s.status}\uFF0C\u975E JSON \u4FE1\u5C01\uFF09`);if(i.code!==0)throw new je(i.code,`\u6276\u6447 API ${i.code}\uFF1A${i.message||"\u672A\u77E5\u9519\u8BEF"}`,i.request_id);return i.data}function hs(n){return/^88/.test(n)?"TI":/^92/.test(n)||/^[48]/.test(n)?"BJ":/^[0123]/.test(n)?"SZ":/^[569]/.test(n)?"SH":"SZ"}function O(n){let t=n.trim().toUpperCase(),e=t.match(/^(SH|SZ|BJ)(\d{6})$/);return e&&(t=`${e[2]}.${e[1]}`),/^\d{6}$/.test(t)&&(t=`${t}.${hs(t)}`),t}function tr(n){return/\.TI$/i.test(n.trim())}function be(n,t={}){return S("/api/a-share/prices/snapshot",{thscodes:n.length?n.map(O).join(","):void 0,limit:t.limit,offset:t.offset})}function nr(n,t){return S("/api/a-share/prices/historical",{thscode:O(n),interval:t.interval||"1d",start:t.start,end:t.end,adjust:t.adjust&&t.adjust!=="none"?t.adjust:void 0})}function rr(n){return S("/api/a-share-index/prices/snapshot",{thscodes:n.map(O).join(",")})}function or(n,t){return S("/api/a-share-index/prices/historical",{thscode:O(n),interval:t.interval||"1d",start:t.start,end:t.end})}function ar(n="cn_concept"){return S("/api/a-share-index/catalog/ths-index-list",{tag:n})}function wt(n){return S("/api/a-share-index/constituents/ths-stock-list",{thscode:O(n)})}function sr(n,t={}){return S("/api/meta/tickers/search",{q:n,exchange:t.exchange,asset_type:t.assetType,limit:t.limit})}function ir(n={}){return S("/api/meta/tickers/list",{asset_type:n.assetType,limit:n.limit,offset:n.offset})}function cr(){return S("/api/a-share/calendar/trading-days")}function ur(n,t={}){return S("/api/a-share/corporate-actions/adjustment-factors",{thscode:O(n),from:t.from,to:t.to})}function _t(n,t){return{thscode:O(n),period:t.period||"annual",...t.start!==void 0&&t.end!==void 0?{start:t.start,end:t.end}:{limit:t.limit}}}function lr(n,t={}){return S("/api/a-share/financials/income-statements",_t(n,t))}function mr(n,t={}){return S("/api/a-share/financials/balance-sheets",_t(n,t))}function dr(n,t={}){return S("/api/a-share/financials/cash-flow-statements",_t(n,t))}function pr(n,t){return S("/api/a-share/financials/indicators",{thscode:O(n),report:t})}function fr(n){return S("/api/a-share/valuations/snapshot",{thscodes:n.map(O).join(",")})}function re(n){return n=$(n),{items:n.map(t=>({time:t.time,content:Wn(t.data?.content||t.data?.title||"",t),title:t.data?.title||"",importance:t.important??0,source:t.data?.source||"",tags:gt(t.remark)?gt(t.remark).split(" "):[]})),total:n.length}}function bs(n){let t=n?.data?.list||[];return{items:t.map(e=>({title:e.title||"",hot:!!e.hot,updatedAt:e.updated_at||""})),total:t.length}}async function yr(n,t=10){let r=((await Tn(n))?.data?.list??[]).slice(0,t);l({data:r,command:`info flash symbol ${n}`,source:"jin10 market",toJSON:re})}async function Ss(n,t){let e=ot[n];if(e===void 0)return l({data:{error:`\u4E0D\u652F\u6301\u7684\u9891\u9053 "${n}"\uFF0C\u53EF\u9009: ${Object.keys(ot).join(", ")}`},command:"info flash futures",source:"jin10"});let r=await $n(e,t);l({data:r?.data??[],command:`info flash futures${n!=="all"?" -c "+n:""}`,source:"jin10",toJSON:re})}function ws(n){return n=$(n),{items:n.map(t=>({time:new Date(t.ctime*1e3).toISOString(),content:J(t.content||t.brief||""),title:t.title||"",importance:0,source:"cls",tags:(t.subjects||[]).map(e=>`#${e.subject_name}`)})),total:n.length}}function xt(n){return n=$(n),{items:n.map(t=>({time:new Date(t.createTimestamp*1e3).toISOString(),content:J(t.content||""),title:t.title||"",importance:t.level===1?1:0,source:"glh",tags:[...(t.relatedStocks||[]).map(e=>e.name),...(t.relatedInfos||[]).map(e=>`#${e.name}`)],readCount:t.count?.read||0})),total:n.length}}function _s(n){let t=n?.list||(Array.isArray(n)?n:[]),e=[];if(Array.isArray(t)&&Array.isArray(t[0]))for(let r of t)for(let o of r)e.push(o);else Array.isArray(t)&&(e=t);return e=$(e),{items:e.map(r=>({title:r.title||"",badge:r.ndata?.badge||"",redirectUrl:r.web_redirect_url||""})),total:e.length}}function ks(n){let t=[],e=n?.list||(Array.isArray(n)?n:[]);if(Array.isArray(e)&&e.length&&Array.isArray(e[0]))for(let r of e)t.push(...r);else Array.isArray(e)&&(t=e);return t=$(t),{items:t.map(r=>({title:r.title||"",introduction:r.introduction||"",displayDatetime:r.display_datetime||"",tags:(r.reveal_tags||[]).map(o=>o.name||o),vip:!!r.vip,source:r.source||""})),total:t.length}}function gr(n){let t=n?.data?.top_article||[],e=n?.data?.depth_list||[],r=$([...t,...e]);return{items:r.map(o=>({time:o.ctime?new Date(o.ctime*1e3).toISOString():"",title:o.title||"",brief:J(o.brief||""),source:o.source||"",subjects:(o.subjects||[]).map(a=>a.subject_name||a.name||""),readingNum:o.reading_num||0})),total:r.length}}function xs(n){let t=$(n?.data||[]);return{items:t.map(e=>({title:e.title||"",readingNum:e.readNum||0})),total:t.length}}function Ns(n){let t=$(n?.data||[]);return{items:t.map(e=>({time:e.ctime?new Date(e.ctime*1e3).toISOString():"",title:e.title||"",source:e.source||""})),total:t.length}}function hr(n){return{items:n.map(t=>({id:t.id,title:t.title||"",shortName:t.short_name||"",introduction:(t.introduction||"").trim().slice(0,200),categoryName:t.category_name||"",subscribeNum:t.subscribe_num||0})),total:n.length}}function Os(n){let t=n?.data?.hot_subjects||[],e=n?.data?.newest_subjects||[];return{hotSubjects:t.map(r=>({name:r.name||"",attentionNum:r.attention_num||0,newestArticleTitle:J(r.newest_article_title||"")})),newestSubjects:e.map(r=>({name:r.name||""}))}}function As(n){let t=Array.isArray(n)?n:n?.data||[],e=new Map;for(let o of t){let a=o.category_name||"\u672A\u5206\u7C7B";e.set(a,(e.get(a)||0)+1)}let r=Array.from(e,([o,a])=>({name:o,count:a}));return{items:r,total:r.length}}var Ds=new Set(["stock","telegram","featured","depth","eoe_article"]),Ts={stock:"\u80A1\u7968",telegram:"\u7535\u62A5",featured:"\u8981\u95FB",depth:"\u6DF1\u5EA6",eoe_article:"\u6587\u7AE0"};function br(n){let t=n?.data||{},e=[],r=0;for(let[o,a]of Object.entries(t))if(Ds.has(o)&&!(!a||typeof a!="object"||!Array.isArray(a.data))){r+=a.total_num||a.data.length;for(let s of a.data){let i=s.stock_category==="stock"||/^s[hz]\d+$/i.test(s.descr||""),c=s.descr?J(s.descr):"",u=J(s.title||s.featuredTitle||""),m=c;if(!u&&c){let d=c.search(/[。!?\n]/);u=d>0?c.slice(0,d):c.slice(0,60),m=c}m&&m.length>200&&(m=m.slice(0,200)),!(!u&&!m&&!i)&&e.push({kind:Ts[o]||o,type:i||s.type===1?"stock":"article",title:u,brief:m,code:i&&(s.stock_id||s.descr)||"",name:i?J(s.title||""):"",price:s.last||null,percent:s.raise||null,time:s.time?new Date(s.time*1e3).toISOString():"",author:s.author||"",id:s.id,url:s.external_link||""})}}return{items:e,total:r}}function Es(n){let t=n?.data?.roll_data?.[0];return t?{item:{id:t.id,time:t.ctime?new Date(t.ctime*1e3).toISOString():"",title:J(t.title||""),content:J(t.content||t.brief||""),subjects:(t.subjects||[]).map(e=>e.subject_name||"").filter(Boolean),stocks:(t.stock_list||[]).map(e=>e.name||e.stock_name||"").filter(Boolean),url:`https://www.cls.cn/detail/${t.id}`}}:{item:null}}function Sr(n){let t=(n?.data?.list||[]).filter(e=>!e.vip);return{items:t.map(e=>({kind:e.type||"",type:e.type==="flash"?"flash":e.type==="news"?"article":e.type||"",title:e.title||e.data?.title||"",brief:e.data?.content?J(e.data.content).slice(0,200):e.introduction||"",time:e.display_datetime||e.time||"",important:e.important??0,id:e.id})),total:t.length}}async function Nt(n){let t=ee(),e=t?{cookie:t}:void 0,r=new Set,o=[],a=await Nn({},e);for(let c of a?.data||[])r.has(c.id)||(r.add(c.id),o.push(c));let s=0,i=50;for(;o.length<n&&s++<i;){let c=o[o.length-1];if(!c)break;let m=(await On(c.time,e))?.data||[];if(!m.length)break;let d=0;for(let p of m)r.has(p.id)||(r.add(p.id),o.push(p),d++);if(d===0)break;o.length<n&&await new Promise(p=>setTimeout(p,200))}return o}function wr(n){return n.command({command:"info",describe:"\u4FE1\u606F\u6D41",builder:t=>t.strictCommands(!1).command("codes [asset_type]","\u8BC1\u5238\u4EE3\u7801\u8868\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1AA\u80A1/\u6307\u6570/\u57FA\u91D1 \u5168\u91CF\u4EE3\u7801",e=>e.positional("asset_type",{type:"string",default:"a-share",choices:["a-share","a-share-index","fund-otc","fund-etf","fund-lof"],describe:"\u8D44\u4EA7\u7C7B\u578B\uFF08\u53EF\u9017\u53F7\u5206\u9694\u591A\u503C\uFF09"}),async e=>{let{n:r=30}=e,o=e.asset_type||"a-share",a=await ir({assetType:o,limit:Math.min(r,1e4)});l({data:a,command:`info codes ${o}`,source:"fuyao",toJSON:s=>({items:(s?.item||[]).map(i=>({code:i.thscode||"",name:i.name||"",type:i.asset_type||"",exchange:i.exchange??null})),total:s?.item?.length??0})})}).command("flash","\u5FEB\u8BAF",e=>e.option("src",{alias:"s",type:"string",choices:["cls","jin10","glh"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u5E73\u53F0\uFF09"}).option("category",{alias:"c",type:"string",describe:"cls \u680F\u76EE / glh \u9891\u9053 / \u671F\u8D27\u9891\u9053\uFF08futures\uFF09"}).option("symbol",{type:"string",describe:"\u6309\u54C1\u79CD\u8FC7\u6EE4\uFF08jin10 per-symbol \u5FEB\u8BAF\u6D41\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u8BBE\u7F6E\u540E\u5FFD\u7565 src/category\uFF09"}).strictCommands(!1).command("important","\u91CD\u8981\u5FEB\u8BAF\uFF08glh \u6570\u636E\u6E90\uFF09",r=>r.option("channel",{alias:"c",type:"string",describe:"\u9891\u9053"}),async r=>{let{n:o=10,channel:a}=r,s=a?qe(a):qe("popular"),i=await Bn({channel:s.id,limit:o}),c=$(i.result||[]);l({data:c,command:"info flash important",source:"glh",toJSON:()=>xt(c)})}).command("futures","\u671F\u8D27\u5782\u76F4\u5FEB\u8BAF\uFF08-c: all/oil/steel/coal/gas/metal/nonferrous/chemical/sugar/grain/pig/macro\uFF09",r=>r,async r=>{let{n:o=10,c:a="all"}=r;await Ss(a,o)}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",r=>r,async r=>{let{n:o=10}=r,a=await Xn({limit:o}),s=$(a.result||[]);l({data:s,command:"info flash popular",source:"glh",toJSON:()=>xt(s)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",r=>r,async r=>{let o=r.id,a=await An(o);l({data:a,command:"info flash detail",source:"jin10",toJSON:s=>re(s?.data?[s]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",r=>r,async r=>{let o=r.date,a;try{a=$e("jin10.com")}catch(i){console.error(i.message),console.error("\u6309\u65E5\u671F\u67E5\u770B\u5FEB\u8BAF\u9700\u8981\u767B\u5F55\uFF0C\u8BF7\u5148\u767B\u5F55 jin10.com"),process.exit(1)}let s=await Dn(o,{cookie:a});s?._statusCode===403&&(console.error("\u6B64\u529F\u80FD\u9700\u8981\u5F00\u901A\u4F1A\u5458\uFF0C\u8BF7\u5728 jin10.com \u5347\u7EA7"),process.exit(1)),l({data:s,command:"info flash date",source:"jin10",toJSON:i=>re(i?.data||[])})}).command("symbol <code>","\u67D0\u54C1\u79CD\u76F8\u5173\u5FEB\u8BAF\uFF08jin10 per-symbol \u6D41\uFF09",r=>r.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE \u6216\u88F8\u7801\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u522B\u540D\u81EA\u52A8\u5F52\u4E00\u5316\uFF09"}),async r=>{await yr(r.code,r.n??10)}),async e=>{let{n:r=10,src:o="cls",category:a,symbol:s}=e;if(s){await yr(s,r);return}let i=a||"all",c=[];o==="jin10"?c.push({name:"jin10",fn:p=>Nt(r).then(g=>l({data:g,command:"info flash",source:p,toJSON:re}))},{name:"cls",fn:p=>m(p,i,r)},{name:"glh",fn:p=>d(p,i,r)}):o==="glh"?c.push({name:"glh",fn:p=>d(p,i,r)},{name:"cls",fn:p=>m(p,i,r)},{name:"jin10",fn:p=>Nt(r).then(g=>l({data:g,command:"info flash",source:p,toJSON:re}))}):i==="all"?c.push({name:"cls",fn:p=>m(p,i,r)},{name:"jin10",fn:p=>Nt(r).then(g=>l({data:$(g),command:"info flash",source:p,toJSON:re}))},{name:"glh",fn:p=>d(p,i,r)}):c.push({name:"cls",fn:p=>m(p,i,r)});let u;for(let p=0;p<c.length;p++){let{name:g,fn:y}=c[p],h=p===0?g:`${g} fallback`;try{await y(h);return}catch(b){u=b,p<c.length-1&&console.error(`Source ${g} failed: ${b?.message||b}, trying next...`)}}throw u;async function m(p,g,y){let h=dn(g);if(!h)return l({data:{error:`\u672A\u77E5\u680F\u76EE: ${g}\u3002\u53EF\u7528: all/red/announcement/watch/hk_us/fund/remind\uFF0C\u6216\u7528 --src jin10|glh`},command:"info flash",source:"cls"});let b=new Set,w=[],_=20,I=50,k=0,v=h.category,Q=(await Ge({rn:_,category:v}))?.data?.roll_data||[];for(let L of Q)b.has(L.id)||(b.add(L.id),w.push(L));for(;w.length<y&&k++<I;){let L=w.reduce((Z,zt)=>(zt.ctime||0)<(Z.ctime||0)?zt:Z,w[0]);if(!L?.ctime)break;let Ta=(await Ge({lastTime:L.ctime,rn:_,category:v}))?.data?.roll_data||[],Kt=0;for(let Z of Ta)b.has(Z.id)||(b.add(Z.id),w.push(Z),Kt++);if(!Kt)break;w.length<y&&await new Promise(Z=>setTimeout(Z,200))}let V=w.slice(0,y);l({data:V,command:"info flash",source:p,toJSON:ws})}async function d(p,g,y){let h=g&&g!=="all"?qe(g):{id:"all"},b=new Set,w=[],_=15,I=50,k=0,v=await fe({channel:h.id,limit:_});for(let C of v?.result||[])b.has(C.id)||(b.add(C.id),w.push(C));for(;w.length<y&&k++<I;){let C=w[w.length-1];if(!C?.id)break;let Q=await fe({channel:h.id,limit:_,liveId:C.id}),V=0;for(let L of Q?.result||[])b.has(L.id)||(b.add(L.id),w.push(L),V++);if(!V)break;w.length<y&&await new Promise(L=>setTimeout(L,200))}l({data:w,command:"info flash",source:p,toJSON:xt})}}).command("news","\u6DF1\u5EA6\u6587\u7AE0",e=>e.strictCommands(!1).command("slide","\u5E7B\u706F\u7247/\u91CD\u8981\u4E8B\u4EF6\uFF08jin10\uFF09",r=>r,async()=>{let r=await Pn();l({data:r,command:"info news slide",source:"jin10",toJSON:_s})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async()=>{let r=await vn();l({data:r,command:"info news feature",source:"jin10",toJSON:ks})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.channel||"headline",s=pn(a);if(!s){let u=Object.entries(ie).map(([m,d])=>` ${m.padEnd(12)} ${d.name} (${d.id})`).join(`
|
|
8
8
|
`);console.error(`\u672A\u77E5\u680F\u76EE: ${a}
|
|
9
9
|
\u53EF\u7528\u680F\u76EE:
|
|
10
|
-
${u}`),process.exit(1)}let i=await Ge(s.id),c=j(i?.data?.depth_list||[]);if(c.length<o){let u=c[c.length-1]?.ctime;if(u){let m=await Vt(s.id,{lastTime:u,rn:o-c.length}),p=j(m?.data?.depth_list||m?.data||[]);c=[...c,...p]}}l({data:i,command:"info news depth",source:"cls",toJSON:yr})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",r=>r,async()=>{let r=await Zt();l({data:r,command:"info news hot",source:"cls",toJSON:gs})}).command("futures","\u671F\u8D27\u5934\u6761\uFF08jin10 qihuo\uFF09",r=>r,async()=>{let r=await $n();l({data:r,command:"info news futures",source:"jin10",toJSON:ms})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF0Ccode \u6216\u540D\u79F0\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.code.trim(),s=a;if(!/^(s[hz]\d+|\d{6})$/i.test(a)){let u=(await De(a,{type:"stock",rn:1}))?.data?.stock?.data?.[0];s=u?.stock_id||u?.descr||a}let i=await on(s,{rn:o});l({data:i,command:"info news stock",source:"cls",toJSON:hs})}),async()=>{let e=await Ge(1e3);l({data:e,command:"info news",source:"cls",toJSON:yr})}).command("topic","\u4E13\u9898",e=>e.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",r=>r,async r=>{let{n:o=10}=r,a=r.keyword,s=await Pe(),i=Array.isArray(s)?s:s?.data||[],c=a.toLowerCase(),u=i.filter(p=>(p.title||"").toLowerCase().includes(c)||(p.short_name||"").toLowerCase().includes(c)||(p.introduction||"").toLowerCase().includes(c));if(!u.length)return l({data:{items:[],total:0,message:`\u672A\u627E\u5230\u5339\u914D "${a}" \u7684\u4E13\u9898`},command:"info topic search",source:"jin10"});let m=j(u.slice(0,o));l({data:m,command:"info topic search",source:"jin10",toJSON:gr})}).command("groups","\u8BDD\u9898\u5206\u7EC4",r=>r,async()=>{let r=await Pe();l({data:r,command:"info topic groups",source:"jin10",toJSON:Ss})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",r=>r,async()=>{let r=await en();l({data:r,command:"info topic hot",source:"cls",toJSON:o=>bs(j(o))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.id,s=ee(),i=s?{cookie:s}:void 0,c=new Set,u=[],m=1,p=50;for(;u.length<o&&m<=p;){let y=(await Hn(a,{page:m},i))?.data?.list||[];if(!y.length)break;let h=0;for(let S of y)c.has(S.id)||(c.add(S.id),u.push(S),h++);if(h===0)break;m++,u.length<o&&await new Promise(S=>setTimeout(S,200))}let d=j(u);l({data:d,command:"info topic show",source:"jin10",toJSON:g=>({items:g.map(y=>({time:y.display_datetime,title:y.title,author:y.author?.nick,vip:y.vip})),total:g.length})})}),async e=>{let{n:r=10}=e,o=await Pe(),a=j(Array.isArray(o)?o:o?.data||[]);if(a=a.slice(0,r),!a.length)return l({data:{items:[],total:0},command:"info topic",source:"jin10"});l({data:a,command:"info topic",source:"jin10",toJSON:gr})}).command("search","\u5168\u7AD9\u641C\u7D22\uFF08cls \u591A\u7C7B\u76EE / jin10 \u5FEB\u8BAF+\u65B0\u95FB\uFF09",e=>e.command("$0 <keyword>","\u641C\u7D22\u8D44\u8BAF",r=>r.option("src",{alias:"s",type:"string",choices:["cls","jin10"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("type",{alias:"t",type:"string",describe:"cls \u7C7B\u76EE\uFF08\u9ED8\u8BA4 all\uFF09"}).positional("keyword",{type:"string",describe:"\u5173\u952E\u8BCD"}),async r=>{let{n:o=20,src:a="cls",type:s}=r,i=r.keyword;if(a==="jin10"){let u=await ot({keyword:i,type:s&&s!=="all"?s:"all",offset:0});l({data:u,command:"info search",source:"jin10",toJSON:br})}else{let u=await De(i,{type:s||"all",rn:Math.max(o,20)});l({data:u,command:"info search",source:"cls",toJSON:hr})}}).command("detail <id>","\u641C\u7D22\u7ED3\u679C\u8BE6\u60C5\uFF08cls \u7535\u62A5\u5168\u6587\uFF09",r=>r.positional("id",{type:"string",describe:"\u641C\u7D22\u7ED3\u679C item.id\uFF08cls \u7535\u62A5\uFF09"}),async r=>{let o=r.id,a=await Qt(o);l({data:a,command:"info search detail",source:"cls",toJSON:ks})}),async e=>{let{n:r=20,src:o="cls",type:a}=e,s=e.keyword||e._?.[2];if(!s)return l({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(o==="jin10"){let c=await ot({keyword:s,type:a&&a!=="all"?a:"all",offset:0});l({data:c,command:"info search",source:"jin10",toJSON:br})}else{let c=await De(s,{type:a||"all",rn:Math.max(r,20)});l({data:c,command:"info search",source:"cls",toJSON:hr})}}),handler:async()=>{l({data:{error:"\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4: flash / news / topic / search\u3002\u8FD0\u884C finflow info --help \u67E5\u770B\u5168\u90E8"},command:"info",source:"cls"})}})}import _r from"fs";import xs from"path";import Ns from"os";var kr=xs.join(Ns.homedir(),".xueqiu-anon-cookie"),xr="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",E="stock.xueqiu.com",Os="xueqiu.com";function C(n){let t=n.trim().toUpperCase();return t?/^\d{6}$/.test(t)?t.startsWith("6")||t.startsWith("9")?`SH${t}`:t.startsWith("4")||t.startsWith("8")||t.startsWith("920")?`BJ${t}`:`SZ${t}`:/^(SH|SZ|BJ)\d{6}$/i.test(t)?t.toUpperCase():/^\d{4}$/.test(t)?`0${t}`:t:""}var As="https://xueqiu.com/hq";function Ds(){try{let n=_r.readFileSync(kr,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function Ts(n){let t=n.headers;return typeof t.getSetCookie=="function"?t.getSetCookie():(t.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function Es(n){let t=n.map(e=>{let r=e.indexOf("=");if(r<0)return"";let o=e.slice(0,r).trim();if(!o)return"";let a=e.slice(r+1).split(";")[0];return`${o}=${a}`}).filter(Boolean);return t.length?t.join("; "):null}async function wr(){let n=await fetch(As,{headers:{"User-Agent":xr,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});if(!n.ok)throw new Error(`\u83B7\u53D6\u96EA\u7403\u533F\u540D\u4EE4\u724C\u5931\u8D25\uFF1A/hq \u8FD4\u56DE HTTP ${n.status}\uFF08\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u662F\u5426\u88AB WAF \u62E6\u622A\uFF09`);let t=Es(Ts(n));if(!t||!/xq_a_token=/.test(t))throw new Error("\u65E0\u6CD5\u4ECE\u96EA\u7403\u83B7\u53D6\u533F\u540D\u4EE4\u724C (xq_a_token)\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5");try{_r.writeFileSync(kr,t,"utf-8")}catch{}return t}function Ps(n){return String(n?.error_code??n?.code)==="400016"}async function Cs(n,t,e,r,{token:o=!0,ua:a}={}){let s=o?Ds()??await wr():null,i=0,c=async m=>{let p={Accept:"application/json","Accept-Language":"zh-Hans-CN;q=1, ja-JP;q=0.9","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive","User-Agent":a||xr,Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};m&&(p.Cookie=m);let d={method:n,headers:p,redirect:"follow"};r&&(d.body=new URLSearchParams(r).toString(),p["Content-Type"]="application/x-www-form-urlencoded");let g=await fetch(`https://${t}${e}`,d);i=g.status;try{return await g.json()}catch{return null}},u=await c(s);if(o&&(Ps(u)||u===null||i===401)&&(u=await c(await wr())),u===null)throw new Error(`\u96EA\u7403\u63A5\u53E3\u8FD4\u56DE\u975E JSON \u54CD\u5E94\uFF08HTTP ${i}\uFF09\uFF0C\u53EF\u80FD\u88AB WAF \u62E6\u622A\u6216\u533F\u540D\u4EE4\u724C\u5931\u6548`);return u}function D(n,t,e={}){return Cs("GET",n,t,null,e)}function Nt(n){return D(E,`/v5/stock/realtime/quotec.json?symbol=${n.map(C).join(",")}`,{token:!1})}function Ot(n){return D(E,`/v5/stock/realtime/pankou.json?symbol=${C(n)}`)}var vs={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Nr(n,{period:t="day",count:e=284}={}){let r=vs[t]||t,o=Date.now();return D(E,`/v5/stock/chart/kline.json?symbol=${C(n)}&begin=${o}&period=${r}&type=before&count=-${e}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function At(n,{period:t="1d"}={}){return D(E,`/v5/stock/chart/minute.json?symbol=${C(n)}&period=${t}`)}function Dt(n,{count:t=50}={}){return D(E,`/v5/stock/history/trade.json?symbol=${C(n)}&count=${t}`)}function Or(n){return D(E,`/v5/stock/quote/relevant.json?symbol=${C(n)}`)}function Ar(n){return D(Os,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function Dr({category:n="cn"}={}){return D(E,`/v5/stock/screener/industries.json?category=${n}`)}function Tr(n={}){let{page:t=1,size:e=30,order:r="desc",order_by:o="percent",market:a="CN"}=n,s=new URLSearchParams({page:String(t),size:String(e),order:r,order_by:o,market:a});return n.ind_code&&s.set("ind_code",n.ind_code),n.type&&s.set("type",n.type),D(E,`/v5/stock/screener/quote/list.json?${s.toString()}`)}function Er(n){return D(E,`/v5/stock/hq/longhu.json?date=${n}`)}function Pr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return D(E,`/v5/stock/finance/${a}/indicator.json?symbol=${C(n)}&type=${r}&is_detail=${o}&count=${e}`)}function Cr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return D(E,`/v5/stock/finance/${a}/cash_flow.json?symbol=${C(n)}&type=${r}&is_detail=${o}&count=${e}`)}function vr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return D(E,`/v5/stock/finance/${a}/income.json?symbol=${C(n)}&type=${r}&is_detail=${o}&count=${e}`)}function qr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return D(E,`/v5/stock/finance/${a}/balance.json?symbol=${C(n)}&type=${r}&is_detail=${o}&count=${e}`)}function Tt(n,{circula:t=1}={}){return D(E,`/v5/stock/f10/cn/top_holders.json?symbol=${C(n)}&circula=${t}`)}function Se(n){return D(E,`/v5/stock/f10/cn/indicator.json?symbol=${C(n)}`)}function $r(n){return D(E,`/v5/stock/f10/cn/industry.json?symbol=${C(n)}`)}function Et(n,{page:t=1,size:e=10}={}){return D(E,`/v5/stock/f10/cn/bonus.json?symbol=${C(n)}&page=${t}&size=${e}`)}function Pt(n){return D(E,`/v5/stock/capital/flow.json?symbol=${C(n)}`)}function jr(n,{count:t=20}={}){return D(E,`/v5/stock/capital/history.json?symbol=${C(n)}&count=${t}`)}function Ir(n,{page:t=1,size:e=180}={}){return D(E,`/v5/stock/capital/margin.json?symbol=${C(n)}&page=${t}&size=${e}`)}function Mr(n){return D(E,`/v5/stock/batch/quote.json?symbol=${n.map(C).join(",")}&extend=detail&is_delay_hk=true`)}function je(n,t){let e=n.filter(p=>typeof p=="number"&&Number.isFinite(p)&&p>0).sort((p,d)=>p-d);if(!e.length)return null;let r=t!=null&&Number.isFinite(t)&&t>0?t:e[e.length-1],o=e.filter(p=>p<r).length,a=Math.round(o/e.length*1e4)/100,s=e[0],i=e[e.length-1],c=Math.round(e.reduce((p,d)=>p+d,0)/e.length*100)/100,u=p=>{let d=Math.min(e.length-1,Math.max(0,Math.floor(p/100*(e.length-1))));return Math.round(e[d]*100)/100},m="fair";return a<20?m="deep_value":a<40?m="undervalued":a<60?m="fair":a<80?m="overvalued":m="high_risk",{current:Math.round(r*100)/100,percentile:a,status:m,min:Math.round(s*100)/100,max:Math.round(i*100)/100,mean:c,median:u(50),opportunity:u(20),danger:u(80)}}async function Rr(n,t=5){let e=C(n);if(!e)return null;let r=Math.min(2500,Math.max(30,Math.round(t*250))),o=await D(E,`/v5/stock/chart/kline.json?symbol=${e}&begin=${Date.now()}&period=day&type=before&count=-${r}&indicator=kline,pe,pb,ps,pcf`),a=o?.data?.item||[];if(!a.length)return null;let s=a[0],i=a[a.length-1],c=new Date(s[0]).toISOString().slice(0,10),u=new Date(i[0]).toISOString().slice(0,10),m=a.map(_=>_[12]),p=a.map(_=>_[13]),d=a.map(_=>_[14]),g=a.map(_=>_[15]),y=je(m,m[m.length-1]),h=je(p,p[p.length-1]),S=je(d,d[d.length-1]),w=je(g,g[g.length-1]);return{code:e,name:o?.data?.symbol?e:void 0,years:t,tradeDays:a.length,startDate:c,endDate:u,pe:y,pb:h,ps:S,pcf:w}}function we(n){let t=n.result||{},e=(r,o)=>({label:r,netBuy:o?.netBuyTurnover??null,netBuyText:o?.netBuyTurnoverText||null,turnover:o?.tradValSum??null,status:o?.tradeStatus||null});return{northbound:{shanghai:e("\u5317\u5411\u8D44\u91D1(\u6CAA)",t.shMarketFlowDetail),shenzhen:e("\u5317\u5411\u8D44\u91D1(\u6DF1)",t.szMarketFlowDetail),total:e("\u5317\u5411\u5408\u8BA1",t.shSZTotalMarketFlowDetail)},southbound:{shanghai:e("\u5357\u5411\u8D44\u91D1(\u6CAA)",t.hkSHMarketFlowDetail),shenzhen:e("\u5357\u5411\u8D44\u91D1(\u6DF1)",t.hkSZMarketFlowDetail),total:e("\u5357\u5411\u5408\u8BA1",t.hkSHSZTotalMarketFlowDetail)},source:"glh"}}var Ur="https://query1.finance.yahoo.com/v8/finance/chart",qs="https://query1.finance.yahoo.com/v1/finance/search",$s="https://finance.yahoo.com/quote",js={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9"},vt={"User-Agent":"Mozilla/5.0"},Ct={"KS11.INDEX":"^KS11","KQ11.INDEX":"^KQ11"};function Lr(n){let t=n;for(;t.length>4&&t.startsWith("0");)t=t.slice(1);return`${t}.HK`}function oe(n){let t=n.trim().toUpperCase();return t?Ct[t]?Ct[t]:/^(SH|SZ)\d{6}$/.test(t)?t.startsWith("SH")?`${t.slice(2)}.SS`:`${t.slice(2)}.SZ`:/^\d{6}\.(SS|SH)$/.test(t)?`${t.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(t)?t:/^\d{6}$/.test(t)?t.startsWith("6")?`${t}.SS`:`${t}.SZ`:/^\d{4,5}\.HK$/.test(t)?Lr(t.slice(0,-3)):/^\d{1,5}$/.test(t)?Lr(t.padStart(4,"0")):(/^\d{4}\.T$/.test(t)||/^\d{6}\.(KS|KQ)$/.test(t),t):""}function qt(n){let t=n.trim().toUpperCase();return Ct[t]||t.startsWith("^")?!0:/^\d{6}\.(KS|KQ)$/.test(t)||/^\d{4}\.T$/.test(t)}function f(n){return n==null?null:typeof n=="object"?"raw"in n?n.raw??null:null:n}function Is(n){return n==null?null:typeof n=="object"?"fmt"in n?n.fmt??null:null:String(n)}function Ie(n){let t=f(n);if(!t||typeof t!="number")return Is(n)||null;let e=t>1e11?t:t*1e3;try{return new Date(e).toISOString().slice(0,10)}catch{return null}}async function Fr(n){let t=oe(n),e=`${$s}/${encodeURIComponent(t)}/`;try{let r=await fetch(e,{headers:js});if(r.status!==200)return null;let a=[...(await r.text()).matchAll(/<script[^>]*>(.*?)<\/script>/gs)],s=null,i=null;for(let c of a){let u=c[1].trim();if(u.startsWith('{"status":200'))try{let m=JSON.parse(u);if(m.body){let p=JSON.parse(m.body);if(p.quoteSummary?.result?.[0]&&(s=p.quoteSummary.result[0]),Array.isArray(p.quoteResponse?.result)){let d=p.quoteResponse.result.find(g=>g.symbol?.toUpperCase()===t.toUpperCase());d&&(i=d)}}}catch{}}return{quoteSummary:s,quoteResponse:i}}catch{return null}}function Hr(n,t){let e=n.quoteSummary?.price||{},r=n.quoteSummary?.summaryDetail||{},o=n.quoteResponse||{},a=f(e.regularMarketPrice)??f(o.regularMarketPrice)??0,s=f(e.regularMarketPreviousClose)??f(r.regularMarketPreviousClose)??f(o.regularMarketPreviousClose)??0,i=f(e.regularMarketChange)??a-s,c=f(e.regularMarketChangePercent)!=null?f(e.regularMarketChangePercent)*100:s===0?0:i/s*100;if(!a&&!s)return null;let u=f(e.preMarketPrice)??f(o.preMarketPrice),m=f(e.preMarketChange)??f(o.preMarketChange),p=f(e.preMarketChangePercent)??f(o.preMarketChangePercent),d=f(e.preMarketTime)??f(o.preMarketTime),g=f(e.postMarketPrice)??f(o.postMarketPrice),y=f(e.postMarketChange)??f(o.postMarketChange),h=f(e.postMarketChangePercent)??f(o.postMarketChangePercent),S=f(e.postMarketTime)??f(o.postMarketTime),w=u!=null?{price:u,change:m!=null?Math.round(m*100)/100:s?Math.round((u-s)*100)/100:null,changePercent:p!=null?Math.round(p*(Math.abs(p)<1?1e4:100))/100:0,time:d?new Date(d*1e3).toISOString():null}:null,_=g!=null?{price:g,change:y!=null?Math.round(y*100)/100:a?Math.round((g-a)*100)/100:null,changePercent:h!=null?Math.round(h*(Math.abs(h)<1?1e4:100))/100:0,time:S?new Date(S*1e3).toISOString():null}:null;return{symbol:e.symbol||o.symbol||t,name:e.shortName||e.longName||o.shortName||o.longName||"",price:a,prevClose:s,change:i,changePercent:c,open:f(e.regularMarketOpen)??f(r.open),high:f(e.regularMarketDayHigh)??f(r.dayHigh),low:f(e.regularMarketDayLow)??f(r.dayLow),volume:f(e.regularMarketVolume)??f(r.volume),avgVolume:f(r.averageVolume),marketCap:f(e.marketCap)??f(r.marketCap),pe:f(r.trailingPE),forwardPE:f(r.forwardPE),beta:f(r.beta),fiftyTwoWeekHigh:f(r.fiftyTwoWeekHigh),fiftyTwoWeekLow:f(r.fiftyTwoWeekLow),dividendYield:f(r.dividendYield)!=null?f(r.dividendYield)*100:null,preMarket:w,postMarket:_,currency:e.currency||r.currency||o.currency||"",exchange:e.exchangeName||o.fullExchangeName||"",marketState:e.marketState||o.marketState||"",quoteType:e.quoteType||o.quoteType||""}}function Ms(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary.summaryProfile||{},r=n.quoteSummary.price||{},o=Array.isArray(e.companyOfficers)?e.companyOfficers.map(a=>({name:a.name||"",title:a.title||"",age:f(a.age),totalPay:f(a.totalPay)})):[];return{symbol:r.symbol||t,name:r.shortName||r.longName||"",sector:e.sector||e.sectorDisp||null,industry:e.industry||e.industryDisp||null,website:e.website||null,phone:e.phone||null,address:e.address1||null,city:e.city||null,state:e.state||null,country:e.country||null,zip:e.zip||null,employees:f(e.fullTimeEmployees),description:e.longBusinessSummary||null,officers:o}}function Rs(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.defaultKeyStatistics||{},o=e.summaryDetail||{},a=e.financialData||{},s=e.price||{};return{symbol:s.symbol||t,name:s.shortName||s.longName||"",marketCap:f(s.marketCap)??f(o.marketCap),enterpriseValue:f(r.enterpriseValue),trailingPE:f(o.trailingPE),forwardPE:f(r.forwardPE)??f(o.forwardPE),pegRatio:f(r.pegRatio),priceToBook:f(r.priceToBook),priceToSales:f(r.priceToSalesTrailing12Months)??f(o.priceToSalesTrailing12Months),enterpriseToRevenue:f(r.enterpriseToRevenue),enterpriseToEbitda:f(r.enterpriseToEbitda),profitMargins:f(r.profitMargins)!=null?f(r.profitMargins)*100:f(a.profitMargins)!=null?f(a.profitMargins)*100:null,operatingMargins:f(a.operatingMargins)!=null?f(a.operatingMargins)*100:null,grossMargins:f(a.grossMargins)!=null?f(a.grossMargins)*100:null,ebitdaMargins:f(a.ebitdaMargins)!=null?f(a.ebitdaMargins)*100:null,returnOnAssets:f(a.returnOnAssets)!=null?f(a.returnOnAssets)*100:null,returnOnEquity:f(a.returnOnEquity)!=null?f(a.returnOnEquity)*100:null,totalRevenue:f(a.totalRevenue),revenuePerShare:f(a.revenuePerShare),quarterlyRevenueGrowth:f(a.revenueGrowth)!=null?f(a.revenueGrowth)*100:null,grossProfits:f(a.grossProfits),ebitda:f(a.ebitda),netIncome:f(r.netIncomeToCommon),dilutedEps:f(r.trailingEps),quarterlyEarningsGrowth:f(a.earningsGrowth)!=null?f(a.earningsGrowth)*100:null,totalCash:f(a.totalCash),totalCashPerShare:f(a.totalCashPerShare),totalDebt:f(a.totalDebt),debtToEquity:f(a.debtToEquity),currentRatio:f(a.currentRatio),quickRatio:f(a.quickRatio),bookValuePerShare:f(r.bookValue),operatingCashflow:f(a.operatingCashflow),freeCashflow:f(a.freeCashflow),sharesOutstanding:f(r.sharesOutstanding),floatShares:f(r.floatShares),sharesShort:f(r.sharesShort),shortRatio:f(r.shortRatio),shortPercentOfFloat:f(r.shortPercentOfFloat)!=null?f(r.shortPercentOfFloat)*100:null,heldPercentInsiders:f(r.heldPercentInsiders)!=null?f(r.heldPercentInsiders)*100:null,heldPercentInstitutions:f(r.heldPercentInstitutions)!=null?f(r.heldPercentInstitutions)*100:null,beta:f(r.beta)??f(o.beta),dividendRate:f(o.dividendRate),dividendYield:f(o.dividendYield)!=null?f(o.dividendYield)*100:null,exDividendDate:Ie(o.exDividendDate),payoutRatio:f(o.payoutRatio)!=null?f(o.payoutRatio)*100:null,fiveYearAvgDividendYield:f(o.fiveYearAvgDividendYield),currency:a.financialCurrency||s.currency||"USD"}}function Js(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.financialData||{},o=e.recommendationTrend||{},a=e.upgradeDowngradeHistory||{},s=e.price||{},i=(Array.isArray(o.trend)?o.trend:[]).map(m=>({period:m.period||"",strongBuy:Number(m.strongBuy??0),buy:Number(m.buy??0),hold:Number(m.hold??0),sell:Number(m.sell??0),strongSell:Number(m.strongSell??0)})),u=(Array.isArray(a.history)?a.history:[]).slice(0,30).map(m=>({date:Ie(m.epochGradeDate)||"",firm:m.firm||"",action:m.action||"",toGrade:m.toGrade||"",fromGrade:m.fromGrade||"",priceTargetAction:m.priceTargetAction||null,currentPriceTarget:f(m.currentPriceTarget),priorPriceTarget:f(m.priorPriceTarget)}));return{symbol:s.symbol||t,name:s.shortName||s.longName||"",targetPrice:{current:f(r.currentPrice)??f(s.regularMarketPrice),high:f(r.targetHighPrice),low:f(r.targetLowPrice),mean:f(r.targetMeanPrice),median:f(r.targetMedianPrice),analystsCount:f(r.numberOfAnalystOpinions)},recommendation:{key:r.recommendationKey||null,mean:f(r.recommendationMean)},trend:i,upgradesDowngrades:u}}function Ls(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.calendarEvents||{},o=e.earnings||{},a=e.price||{},s=[],i=r.earnings?.earningsDate||o.earningsChart?.earningsDate||[];Array.isArray(i)&&(s=i.map(y=>Ie(y)).filter(Boolean));let c=o.earningsChart?.quarterly||[],u=(Array.isArray(c)?c:[]).map(y=>({quarter:y.date||"",calendarQuarter:y.calendarQuarter||void 0,reportedDate:Ie(y.reportedDate)||void 0,actual:f(y.actual),estimate:f(y.estimate),difference:typeof y.difference=="string"?Number(y.difference):f(y.difference),surprisePct:typeof y.surprisePct=="string"?Number(y.surprisePct):f(y.surprisePct)})),m=o.financialsChart?.yearly||[],p=(Array.isArray(m)?m:[]).map(y=>({year:Number(y.date||0),revenue:f(y.revenue),earnings:f(y.earnings),profitMargin:f(y.profitMargin)!=null?f(y.profitMargin)*100:null})),d=o.financialsChart?.quarterly||[],g=(Array.isArray(d)?d:[]).map(y=>({quarter:y.date||"",revenue:f(y.revenue),earnings:f(y.earnings),profitMargin:f(y.profitMargin)!=null?f(y.profitMargin)*100:null}));return{symbol:a.symbol||t,name:a.shortName||a.longName||"",currency:o.financialCurrency||a.currency||"USD",earningsDates:s,isEarningsDateEstimate:r.earnings?.isEarningsDateEstimate??o.earningsChart?.isEarningsDateEstimate,quarterlyHistory:u,financialsYearly:p,financialsQuarterly:g}}async function _e(n){let t=oe(n);if(!t)return null;try{let r=await Fr(t);if(r?.quoteSummary||r?.quoteResponse){let o=Hr(r,t);if(o)return o}}catch{}let e=`${Ur}/${encodeURIComponent(t)}?interval=1d&range=1d&includePrePost=true`;try{let r=await fetch(e,{headers:vt});if(r.ok||r.status===200||!r.status){let s=(await r.json())?.chart?.result?.[0]?.meta;if(s?.symbol){let i=Number(s.regularMarketPrice??0),c=Number(s.chartPreviousClose??0),u=i-c,m=c===0?0:u/c*100,p={symbol:s.symbol,name:s.shortName||s.longName||"",price:i,prevClose:c,change:u,changePercent:m,currency:s.currency||"",exchange:s.exchangeName||"",marketState:s.marketState||""};if(s.regularMarketOpen!=null&&(p.open=Number(s.regularMarketOpen)),s.regularMarketDayHigh!=null&&(p.high=Number(s.regularMarketDayHigh)),s.regularMarketDayLow!=null&&(p.low=Number(s.regularMarketDayLow)),s.regularMarketVolume!=null&&(p.volume=Number(s.regularMarketVolume)),s.fiftyTwoWeekHigh!=null&&(p.fiftyTwoWeekHigh=Number(s.fiftyTwoWeekHigh)),s.fiftyTwoWeekLow!=null&&(p.fiftyTwoWeekLow=Number(s.fiftyTwoWeekLow)),s.instrumentType&&(p.quoteType=s.instrumentType),s.preMarketPrice!=null){let d=Number(s.preMarketPrice);p.preMarket={price:d,change:c?d-c:null,changePercent:c?(d-c)/c*100:0,time:s.preMarketTime?new Date(Number(s.preMarketTime)*1e3).toISOString():null}}if(s.postMarketPrice!=null){let d=Number(s.postMarketPrice);p.postMarket={price:d,change:i?d-i:null,changePercent:i?(d-i)/i*100:0,time:s.postMarketTime?new Date(Number(s.postMarketTime)*1e3).toISOString():null}}return p}}}catch{return null}return null}async function ae(n){let t=oe(n);if(!t)return null;let e=await Fr(t),r=e?Hr(e,t):null;if(r||(r=await _e(t)),!r)return null;let o=e?Ms(e,t):null,a=e?Rs(e,t):null,s=e?Js(e,t):null,i=e?Ls(e,t):null;return{symbol:r.symbol,name:r.name,quote:r,profile:o,stats:a,analysis:s,earnings:i}}async function ke(n,t="1d",e=120){let r=oe(n);if(!r)return null;let o="1d",a="1y";switch(t.toLowerCase()){case"1m":o="1m",a="5d";break;case"5m":o="5m",a="1mo";break;case"15m":o="15m",a="1mo";break;case"30m":o="30m",a="1mo";break;case"60m":case"1h":o="60m",a="3mo";break;case"d":case"1d":o="1d",a=e>250?"5y":e>60?"1y":"6mo";break;case"w":case"1w":o="1wk",a="5y";break;case"m":case"1m_month":case"1mo":o="1mo",a="10y";break;default:o="1d",a="1y"}let s=`${Ur}/${encodeURIComponent(r)}?interval=${o}&range=${a}&includePrePost=false`;try{let i=await fetch(s,{headers:vt});if(i.status!==200)return null;let u=(await i.json())?.chart?.result?.[0];if(!u?.timestamp||!u?.indicators?.quote?.[0])return null;let m=u.timestamp,p=u.indicators.quote[0],d=p.open||[],g=p.high||[],y=p.low||[],h=p.close||[],S=p.volume||[],w=[],_=["1m","5m","15m","30m","60m"].includes(o);for(let k=0;k<m.length;k++){let P=h[k];if(P==null||!Number.isFinite(P))continue;let q=m[k]*1e3,Q=new Date(q),V=_?Q.toISOString():Q.toISOString().slice(0,10);w.push({date:V,open:d[k]??P,high:g[k]??P,low:y[k]??P,close:P,volume:S[k]??0,change:k>0&&h[k-1]!=null?P-h[k-1]:0})}let N=w.slice(-e);return{symbol:u.meta?.symbol||r,period:t,items:N,total:N.length}}catch{return null}}async function $t(n,t=10){let e=`${qs}?q=${encodeURIComponent(n)}"esCount=${t}&newsCount=5&enableFuzzyQuery=true`;try{let r=await fetch(e,{headers:vt});if(r.status!==200)return null;let o=await r.json(),a=(o.quotes||[]).map(i=>({symbol:i.symbol||"",name:i.shortname||i.longname||"",exchange:i.exchange||i.exchDisp||"",quoteType:i.quoteType||"",industry:i.industry||null,sector:i.sector||null,score:i.score??null})).filter(i=>i.symbol),s=(o.news||[]).map(i=>({uuid:i.uuid||"",title:i.title||"",publisher:i.publisher||"",link:i.link||"",publishTime:i.providerPublishTime?new Date(i.providerPublishTime*1e3).toISOString():"",thumbnail:i.thumbnail?.resolutions?.[0]?.url||null}));return{quotes:a,news:s,total:a.length}}catch{return null}}var Yr={d:"d",day:"d",daily:"d",w:"w",week:"w",weekly:"w",m:"m",month:"m",monthly:"m",y:"y",year:"y",yearly:"y",annual:"y",annually:"y"},Br=new Set(["d","w","m","y","5d","1m","5m","10m","15m","30m","60m","120m"]);function Me(n){let t=String(n??"").trim().toLowerCase();if(Yr[t])return Yr[t];if(Br.has(t))return t;let e=t.match(/^(\d+)\s*(?:min|minute|minutes)$/);if(e){let r=`${e[1]}m`;if(Br.has(r))return r}throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F "${n}"\uFF1B\u652F\u6301 d/w/m/y \u6216 1m/5m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly/monthly/yearly \u7B49\u5168\u8BCD\uFF0C\u6216 5min \u8FD9\u79CD\u5199\u6CD5\uFF09`)}var Xr="Asia/Shanghai";function G(n){return new Date(n).toLocaleDateString("en-CA",{timeZone:Xr})}function xe(n){return new Date(n).toLocaleString("sv-SE",{timeZone:Xr,hour12:!1}).replace(" ","T")+"+08:00"}function Gr(n={}){return b("/api/a-share/special-data/limit-up-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function Kr(n={}){return b("/api/a-share/special-data/limit-down-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function zr(n={}){return b("/api/a-share/special-data/limit-break-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function Wr(){return b("/api/a-share/special-data/limit-up-ladder")}function Qr(n="day"){return b("/api/a-share/special-data/skyrocket-list",{period:n})}function Vr(n="day"){return b("/api/a-share/special-data/hot-stock-list",{period:n})}function Zr(n){return b("/api/a-share/special-data/hot-stock-list-history",{date:n})}function eo(n,t,e){return b("/api/a-share/special-data/hot-stock-rank-trend",{thscode:A(n),start_date:t,end_date:e})}function to(n){return b("/api/a-share/special-data/anomaly-analysis-list",{tag_codes:n?.join(",")})}function no(n){return b("/api/a-share/special-data/anomaly-analysis-stock",{thscodes:n.map(A).join(",")})}function ro(n={}){return b("/api/a-share/special-data/dragon-tiger-list",{board_type:n.boardType,date:n.date})}function oo(n,t="final"){return b("/api/a-share/auction/snapshot",{thscodes:n.map(A).join(","),stage:t})}function ao(n){return b("/api/a-share/auction/short-term-benchmark",{date:n})}function Fs(n){let t=n?.data||{};return{code:t.secu_code||"",name:t.secu_name||"",price:Number(t.last_px||0),change:Number(t.change_px||0),changePercent:Math.round(Number(t.change||0)*1e4)/100,open:Number(t.open_px||0),high:Number(t.high_px||0),low:Number(t.low_px||0),preclose:Number(t.preclose_px||0),volume:Number(t.business_amount||0),amount:Number(t.business_balance||0),turnoverRate:Number(t.tr||0),amplitude:Number(t.amp||0),avgPrice:Number(t.av_px||0),volumeRatio:Number(t.qrr||0),pe:t.pe!=null?Number(t.pe):null,pb:t.pb!=null?Number(t.pb):null,marketCap:Number(t.mc||0),change3d:t.change_3!=null?Number(t.change_3):null,change5d:t.change_5!=null?Number(t.change_5):null,status:t.trade_status==="TRADE"?"trading":"closed",source:"cls"}}function Hs(n){return{items:n.map(t=>{let e=t.quote||t;return{code:e.symbol||"",name:e.name||"",price:e.current??0,change:e.chg??0,changePercent:Math.round((e.percent??0)*100)/100,volume:e.volume??0,amount:e.amount??0,turnoverRate:e.turnover_rate??0,marketCap:e.market_capital??0,high:e.high??0,low:e.low??0,open:e.open??0}}),total:n.length}}function Ys(n){let t=n?.data||{},e=Number(t.last_px??0);return!!(t.secu_name||t.secu_code)&&Number.isFinite(e)&&e!==0}function Bs(n){if(!n)return!1;let t=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(t)&&t!==0}function _o(n){let t=n.toUpperCase();return t.startsWith("SH")||t.startsWith("SZ")?t:/^\d{6}$/.test(n)?n.startsWith("6")?"SH"+n:"SZ"+n:t}async function ko(n){let t=n.map(_o),e,r;try{e=await Mr(t),r=e?.data?.items||[],r.length&&r[0]?.quote&&(r=r.map(o=>({...o.quote,market:o.market})))}catch{e=await Nt(t),r=e?.data||e?.items||[]}return r}async function Xs(n){let t=await ko([n]);return t[0]?.quote||t[0]||null}function Mt(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent!=null?Math.round(n.changePercent*100)/100:0,open:n.open??null,high:n.high??null,low:n.low??null,preclose:n.prevClose,volume:n.volume??null,avgVolume:n.avgVolume??null,marketCap:n.marketCap??null,pe:n.pe??null,forwardPE:n.forwardPE??null,eps:n.eps??null,beta:n.beta??null,fiftyTwoWeekHigh:n.fiftyTwoWeekHigh??null,fiftyTwoWeekLow:n.fiftyTwoWeekLow??null,dividendYield:n.dividendYield??null,preMarket:n.preMarket?{price:n.preMarket.price,change:n.preMarket.change??null,changePercent:n.preMarket.changePercent!=null?Math.round(n.preMarket.changePercent*100)/100:0,time:n.preMarket.time??null,volume:n.preMarket.volume??null}:null,postMarket:n.postMarket?{price:n.postMarket.price,change:n.postMarket.change??null,changePercent:n.postMarket.changePercent!=null?Math.round(n.postMarket.changePercent*100)/100:0,time:n.postMarket.time??null,volume:n.postMarket.volume??null}:null,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}function Gs(n){return{code:n.symbol,name:n.name,quote:Mt(n.quote),profile:n.profile?{sector:n.profile.sector,industry:n.profile.industry,website:n.profile.website,phone:n.profile.phone,address:[n.profile.address,n.profile.city,n.profile.state,n.profile.country].filter(Boolean).join(", "),employees:n.profile.employees,description:n.profile.description,officers:n.profile.officers}:null,stats:n.stats,analysis:n.analysis,earnings:n.earnings,source:"yahoo"}}function K(){return!!he()}function Rt(n){return er(n)||/^88\d{4}$/.test(n.trim())}function jt(n){return/^((sh|sz|bj)\d{6}|\d{6}(\.(sh|sz|bj|ti))?)$/i.test(n.trim())}var H=n=>n==null?null:Math.round(n*100)/100;function It(n,t="fuyao fallback"){return{code:n.thscode||"",name:"",price:n.last_price??0,change:n.price_change??0,changePercent:H(n.price_change_ratio_pct)??0,open:n.open_price??0,high:n.high_price??0,low:n.low_price??0,preclose:n.prev_price??0,volume:n.volume??0,amount:n.turnover??0,change3d:null,change5d:null,status:"trading",source:t}}function so(n,t,e){return{code:A(n),period:"d",adjust:e||"none",items:t.map(r=>({date:G(r.date_ms),open:r.open_price??null,high:r.high_price??null,low:r.low_price??null,close:r.close_price??null,volume:r.volume??0,amount:r.turnover??0})),total:t.length}}async function io(n,t,e){let r=Date.now(),o=r-t*1.6*864e5;return((Rt(n)?await rr(n,{start:o,end:r}):await tr(n,{start:o,end:r,adjust:e}))?.item||[]).slice(-t)}var xo=new Set(["1m","5m","15m","30m","60m","120m"]);function Ks(n){if(n==null||n==="")return null;let t=String(n);return/^\d{8}$/.test(t)?`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}`:t}function zs(n,t,e){return{code:n,period:t,items:e.map(r=>({date:Ks(r.trade_date),open:Number(r.open_px),high:Number(r.high_px),low:Number(r.low_px),close:Number(r.close_px),volume:Number(r.business_amount||0),change:Number(r.change||0)})),total:e.length}}function Ws(n,t,e){let r=xo.has(t);return{code:n,period:t,items:e.map(o=>({date:r?xe(o[0]):G(o[0]),open:Number(o[2]),high:Number(o[3]),low:Number(o[4]),close:Number(o[5]),volume:Number(o[1]),amount:Number(o[9]||0),turnoverRate:Number(o[8]||0)})),total:e.length}}function co(n,t){return{code:n,preclose:Number(t.preclose_px||0),asks:[5,4,3,2,1].map(e=>({price:Number(t[`s_px_${e}`]||0),volume:Number(t[`s_amount_${e}`]||0)})),bids:[1,2,3,4,5].map(e=>({price:Number(t[`b_px_${e}`]||0),volume:Number(t[`b_amount_${e}`]||0)})),source:"cls"}}function uo(n,t){let e=t.current??0,r=t.percent??0,o=r!==0?e/(1+r/100):0;return{code:n,current:e,preclose:o,asks:[1,2,3,4,5].map(a=>({price:Number(t[`sp${a}`]||0),volume:Number(t[`sc${a}`]||0)})),bids:[5,4,3,2,1].map(a=>({price:Number(t[`bp${a}`]||0),volume:Number(t[`bc${a}`]||0)})),buyPercent:t.buypct??null,sellPercent:t.sellpct??null,buySellRatio:t.ratio??null,source:"xq"}}function lo(n,t){let e=t?.data?.volume||[],r=t?.data?.end||e.length;return{code:n,items:e.map(o=>{let a=String(o.minute),s=a.length<=3?"0"+a[0]:a.slice(0,2),i=a.length<=3?a.slice(1):a.slice(2),c=a.slice(-2);return{time:`${s}:${i}:${c}`,price:Number(o.last_px||0),volume:Number(o.change_vol||0),side:o.change_vol_color===1?"buy":"sell"}}),total:r}}function mo(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,50).map(r=>({time:xe(r.timestamp),price:Number(r.current||r.price||0),volume:Number(r.trade_volume||r.volume||0),side:r.side==="buy"||r.side===1?"buy":"sell"})),total:e.length}}function po(n,t){let e=t?.data||{},r=e.line||[],o=Number(e.preclose_px||0);return{code:n,preclose:o,items:r.map(a=>{let s=String(a.minute),i=s.length<=3?"0"+s[0]:s.slice(0,2),c=s.length<=3?s.slice(1):s.slice(2),u=Number(a.last_px||0);return{time:`${i}:${c}`,price:u,avgPrice:Number(a.av_px||0),changePercent:o>0?(u-o)/o*100:0,amount:Number(a.business_balance||0)}}),total:r.length}}function fo(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,240).map(r=>({time:xe(r.timestamp),price:Number(r.current||0),volume:Number(r.volume||0),avgPrice:Number(r.avg_price||0)})),total:e.length}}function Qs(n){let t=n?.data||{},e=t.company||{};return{name:e.org_name_cn||"",industry:(t.industry||[]).map(r=>r.ind_name),concept:(t.concept||[]).map(r=>r.ind_name),companyType:e.classi_name||"",region:e.provincial_name||"",listedDate:e.listed_date||"",controller:e.actual_controller||"",mainBusiness:e.main_operation_business||""}}function Vs(n){let t=n?.data||{};return{mainInflow:Number(t.main_fund_in||0),mainOutflow:Number(t.main_fund_out||0),mainNet:Number(t.main_fund_diff||0),superNet:Number(t.super_fund_diff||0),largeNet:Number(t.large_fund_diff||0),mediumNet:Number(t.medium_fund_diff||0),smallNet:Number(t.little_fund_diff||0),mainNet3d:t.main_fund_3!=null?Number(t.main_fund_3):null,mainNet5d:t.main_fund_5!=null?Number(t.main_fund_5):null,mainNet10d:t.main_fund_10!=null?Number(t.main_fund_10):null,mainNet20d:t.main_fund_20!=null?Number(t.main_fund_20):null,source:"cls"}}function yo(n){let t=n?.data||{},e=t.items||[];return{items:e.map(r=>({time:r.timestamp?G(r.timestamp):"",amount:Number(r.amount||0)})),total:e.length,summary:t.sum3!=null?{sum3:Number(t.sum3),sum5:Number(t.sum5),sum10:Number(t.sum10),sum20:Number(t.sum20)}:null}}function Zs(n){let t=n?.data?.items||[];return{items:t.map(e=>({date:e.td_date?G(e.td_date):"",marginBalance:Number(e.margin_trading_amt_balance||0),shortBalance:Number(e.short_selling_amt_balance||0),marginNetBuy:Number(e.margin_trading_net_buy_amt||0),marginBuy:Number(e.margin_trading_buy_amt||0)})),total:t.length}}function ei(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.title||"",date:e.time||(e.timestamp?G(e.timestamp):""),url:e.url||"",source:"cls"})),total:t.length}}function ti(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.anncTitle||"",question:e.words||"",answer:e.anncContent||"",date:e.anncDate1?G(e.anncDate1):e.anncDate2||"",source:e.source||"\u6295\u8D44\u8005\u4E92\u52A8"})),total:n?.total??t.length}}function go(n){let t=n?.data?.items||n?.data||[];return{items:t.map((e,r)=>({rank:r+1,holderName:e.holder_name||"",shares:Number(e.held_num||0),ratio:Number(e.held_ratio||0),change:e.chg_amount??e.change??null})),total:t.length}}function ho(n){let t=n?.data?.items||n?.data||[];return Array.isArray(t)?{items:t.map(e=>({period:e.dividend_year||"",exDividendDate:e.ashare_ex_dividend_date?G(e.ashare_ex_dividend_date):"",equityDate:e.equity_date?G(e.equity_date):"",plan:e.plan_explain||""})),total:t.length}:{items:[],total:0}}function Ne(n){return Array.isArray(n)?n[0]:n}function ni(n){let t=n?.data||{},e=t.list||[];return{name:t.quote_name||"",items:e.map(r=>({report:r.report_name||"",roe:Ne(r.avg_roe),eps:Ne(r.basic_eps),grossMargin:Ne(r.gross_selling_rate),revenueYoy:Ne(r.operating_income_yoy)})),total:e.length}}function Re(n){let t=n?.data?.items?.[0];if(!t)return{items:[],total:0};let e=r=>r==null||r===""?null:Number(r);return{items:[{report:t.report_date||"",peTtm:e(t.pe_ttm),pb:e(t.pb),roe:e(t.avg_roe),eps:e(t.basic_eps),netProfitPerShare:e(t.np_per_share),grossMargin:e(t.gross_selling_rate),netMargin:e(t.net_selling_rate),dividendYield:e(t.dividend_yield),revenue:e(t.total_revenue),netProfit:e(t.net_profit_atsopc),revenueYoy:e(t.operating_income_yoy),netProfitYoy:e(t.net_profit_atsopc_yoy),assetLiabRatio:e(t.asset_liab_ratio),pledgeRatio:e(t.pledge_ratio),marketCap:e(t.market_capital),currency:t.currency||"CNY"}],total:1}}function ri(n,t){let e=n?.data||{},r=e.list||[],o={cashflow:["report_name","ncf_from_oa","ncf_from_ia","ncf_from_fa","net_increase_in_cce"],income:["report_name","total_revenue","net_profit","net_profit_atsopc","net_profit_after_nrgal_atsolc"],balance:["report_name","total_assets","total_liab","asset_liab_ratio","total_quity_atsopc"]},a={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},s=o[t]||o.cashflow,i=a[t]||a.cashflow;return{name:e.quote_name||"",type:t,items:r.map(c=>{let u={report:c.report_name||""};for(let m=1;m<s.length;m++)u[i[m]]=Ne(c[s[m]]);return u}),total:r.length}}function bo(n){let t=n?.data||n?.list||[],e={1:"stock",2:"fund",3:"index"};return{items:t.map(r=>({code:r.code||r.symbol||"",name:r.query||r.name||r.cn_name||"",type:r.type?e[r.type]||String(r.type):""})),total:t.length}}function oi(n){let e=(n?.data||{}).items||[];return{items:e.map(r=>({time:r.timestamp?xe(r.timestamp):"",amount:Number(r.amount||0)})),total:e.length}}function ai(n){let t=(n?.data?.industries||[]).map(e=>({code:e.encode||"",name:e.name||"",pinyin:e.pinyin||""}));return{items:t,total:t.length}}function So(n,t){return{items:n.map(e=>({code:e.symbol||"",name:e.name||"",price:e.current??null,changePercent:Math.round((e.percent??0)*100)/100,amount:e.amount??null,volume:e.volume??null,marketCap:e.market_capital??null,pe:e.pe_ttm??null,pb:e.pb??null,turnoverRate:e.turnover_rate??null})),total:t??n.length}}async function wo(n){let t=[],e,r=1,o=12;for(;t.length<n.n&&r<=o;){let a=await Tr({page:r,size:Math.min(90,n.n-t.length),order:n.order,order_by:n.order_by,market:n.market,ind_code:n.ind_code,type:n.type});if(a?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);let s=a?.data?.list||[];if(e=a?.data?.count??e,!s.length)break;t.push(...s),r++}return{list:t,count:e}}function No(n){return n.command({command:"quote [codes...]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF1B\u591A\u53EA\u4E00\u8D77\u4F20\uFF0C\u81EA\u52A8\u6279\u91CF\uFF09",builder:t=>t.positional("codes",{type:"string",array:!0,describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09\uFF1B\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\u67E5\u8BE2"}).strictCommands(!1).command("detail <code>","\u6DF1\u5EA6\u7EFC\u5408\u8BE6\u60C5\uFF08\u516C\u53F8\u6982\u51B5/\u6838\u5FC3\u4F30\u503C/\u5206\u6790\u5E08\u8BC4\u7EA7/\u4E1A\u7EE9\u5386\u53F2\uFF0CYahoo\uFF09",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 AAPL / NVDA / TSLA / 0700.HK"}),async e=>{let r=e.code,o=await ae(r);if(!o)throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${r} \u7684\u6DF1\u5EA6\u8BE6\u60C5`);l({data:o,command:`quote detail ${r}`,source:"yahoo",toJSON:()=>Gs(o)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",e=>e,async e=>{let r=e.code,a=await Or(r),s=a?.data?.items||a?.data||[];l({data:a,command:`quote related ${r}`,source:"xq",toJSON:()=>({items:s.map(i=>({code:i.symbol||"",name:i.name||"",price:i.current??0,changePercent:Math.round((i.percent??0)*100)/100,relation:i.relation||""}))})})}).command("search <keyword>","\u641C\u7D22\u80A1\u7968\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1/\u5168\u7403\u8BC1\u5238\uFF1Bxq / fuyao / yahoo \u591A\u6E90\u515C\u5E95\uFF09",e=>e,async e=>{let r=e.keyword,o;try{o=await Ar(r)}catch(i){if(!K())throw i;o=null}if((o?.data?.stocks||o?.data||[]).length){l({data:o,command:`quote search ${r}`,source:"xq",toJSON:bo});return}if(K())try{let i=await ar(r,{limit:20});if(i?.item?.length){l({data:i,command:`quote search ${r}`,source:"fuyao fallback",toJSON:c=>({items:(c?.item||[]).map(u=>({code:u.thscode||"",name:u.name||"",type:u.asset_type||"",exchange:u.exchange??null})),total:c?.item?.length??0})});return}}catch{}let s=await $t(r,20);if(s&&s.quotes.length){l({data:s,command:`quote search ${r}`,source:"yahoo fallback",toJSON:i=>({items:i.quotes.map(c=>({code:c.symbol,name:c.name,type:c.quoteType,exchange:c.exchange})),total:i.quotes.length})});return}l({data:o,command:`quote search ${r}`,source:"xq",toJSON:bo})}).command("industry [ind_code]","\u884C\u4E1A\uFF08\u96EA\u7403\uFF09\uFF1A\u5217\u51FA\u884C\u4E1A\u6216\u67D0\u884C\u4E1A\u6210\u5206\u80A1\uFF08A\u80A1\u7533\u4E07/\u7F8E\u80A1GICS/\u6E2F\u80A1\u6052\u751F\uFF09",e=>e.positional("ind_code",{type:"string",describe:"\u884C\u4E1A\u4EE3\u7801\uFF08\u677F\u5757ID\uFF09\uFF1B\u6CE8\u610F\u4E0D\u662F\u80A1\u7968\u4EE3\u7801\u3002\u7701\u7565\u5219\u5217\u51FA\u5168\u90E8\u884C\u4E1A\u3002\u5404\u5E02\u573A\u4EE3\u7801\u4F53\u7CFB\u4E0D\u540C\uFF1Acn=\u7533\u4E07(S2701=\u534A\u5BFC\u4F53) / us=GICS(453010=\u534A\u5BFC\u4F53) / hk=\u6052\u751F(7030=\u5DE5\u4E1A\u5DE5\u7A0B)"}).option("market",{type:"string",default:"cn",choices:["cn","us","hk"],describe:"\u5E02\u573A\uFF1Acn(A\u80A1\u7533\u4E07) / us(\u7F8E\u80A1GICS) / hk(\u6E2F\u80A1\u6052\u751F)"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async e=>{let{n:r=30}=e,o=e.ind_code,a=String(e.market??"cn").toLowerCase(),s=e["order-by"]??"percent",i=e.order??"desc";if(!o){let m=await Dr({category:a});if(m?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${m.error_description||m.error_code}`);return l({data:m,command:`quote industry --market ${a}`,source:"xq",toJSON:ai})}let{list:c,count:u}=await wo({n:r,order:i,order_by:s,market:a.toUpperCase(),ind_code:o});l({data:{list:c},command:`quote industry ${o} --market ${a}`,source:"xq",toJSON:()=>So(c,u)})}).command("industry-profile <code>","\u4E2A\u80A1\u884C\u4E1A\u753B\u50CF\uFF08\u96EA\u7403 F10\uFF09\uFF1A\u6240\u5C5E\u884C\u4E1A/\u6982\u5FF5/\u4E3B\u8425/\u5B9E\u63A7\u4EBA",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async e=>{let r=e.code,o=r.length<=6?r.toUpperCase().startsWith("SH")||r.toUpperCase().startsWith("SZ")?r:r.toUpperCase():r,a=await $r(o);l({data:a,command:`quote industry-profile ${r}`,source:"xq",toJSON:Qs})}).command("board <type>","\u677F\u5757/\u5E02\u573A\u4E00\u89C8\u6210\u5206\u80A1\uFF08\u96EA\u7403\uFF09",e=>e.positional("type",{type:"string",describe:"\u677F\u5757/\u5E02\u573A\uFF1AA\u80A1 sh_sz/sha/sza/cyb/kcb/shb/szb/zxb/xsbno/xsbin\uFF1B\u7F8E\u80A1 us\uFF1B\u6E2F\u80A1 hk\uFF1B\u4E2D\u6982\u80A1 us_china"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async e=>{let{n:r=30}=e,o=e.type,a=e["order-by"]??"percent",s=e.order??"desc",i=o==="hk"?"HK":o==="us"||o==="us_china"?"US":"CN",{list:c,count:u}=await wo({n:r,order:s,order_by:a,market:i,type:o});l({data:{list:c},command:`quote board ${o}`,source:"xq",toJSON:()=>So(c,u)})}).command("kline [code]","K\u7EBF",e=>e.positional("code",{type:"string"}).option("period",{alias:"p",type:"string",default:"d"}).option("number",{alias:"n",type:"number",default:120}).option("src",{type:"string",choices:["cls","xq","fuyao","yahoo"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u53EF\u7528 xq \u6216 yahoo\uFF1B\u590D\u6743\u65E5\u7EBF/\u540C\u82B1\u987A\u6307\u6570\u7528 fuyao\uFF09"}).option("adjust",{alias:"a",type:"string",default:"none",choices:["none","forward","backward"],describe:"\u590D\u6743\uFF08\u4EC5 fuyao \u65E5\u7EBF\uFF1Aforward \u524D\u590D\u6743 / backward \u540E\u590D\u6743\uFF09"}),async e=>{let{p:r="d",n:o=120,src:a}=e,s=e.adjust||e.a||"none",i=e.code,c;try{c=Me(r)}catch(y){return l({data:{error:y.message},command:`quote kline ${i} -p ${r}`,source:"finflow"})}let u=xo.has(c);if(a==="yahoo"){let y=await ke(i,c,o);if(y&&y.items.length)return l({data:y.items,command:`quote kline ${i} -p ${c} --src yahoo`,source:"yahoo",toJSON:()=>({code:y.symbol,period:c,items:y.items,total:y.total})});throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${i} \u7684 K \u7EBF\u6570\u636E`)}if(a==="fuyao"||s!=="none"||Rt(i)){if(!K())throw new Error("\u6276\u6447\u5B98\u65B9\u6E90\u672A\u914D\u7F6E\uFF1A\u590D\u6743\u65E5K/\u540C\u82B1\u987A\u6307\u6570K\u7EBF\u9700\u8981\u5148\u8FD0\u884C finflow key set fuyao <sk-fuyao-\u2026>");if(u)throw new Error("\u6276\u6447 K \u7EBF\u4EC5\u652F\u6301\u65E5\u7EBF\uFF08interval=1d\uFF09\uFF1B\u5206\u949F\u7EBF\u8BF7\u7528\u9ED8\u8BA4\u6E90\uFF08xq\uFF09");let y=await io(i,o,s!=="none"?s:void 0);l({data:y,command:`quote kline ${i} -p d${s!=="none"?` --adjust ${s}`:""}`,source:"fuyao",toJSON:()=>so(i,y,s)});return}if(!a&&qt(i)){let y=await ke(i,c,o);if(y&&y.items.length)return l({data:y.items,command:`quote kline ${i} -p ${c}`,source:"yahoo",toJSON:()=>({code:y.symbol,period:c,items:y.items,total:y.total})});throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${i} \u7684 K \u7EBF\u6570\u636E`)}let p=a==="xq"||!a&&u,d=async y=>{if(y){let P=await Nr(_o(i),{period:c,count:o}),q=P?.data?.item||P?.data||[];return{items:q,toJSON:()=>Ws(i,c,q),source:"xq"}}let h=c==="w"?"w":c==="m"?"m":c==="y"?"y":"d",S=[],w,_=0,N=50;for(;S.length<o&&_++<N;){let q=(await nn(i,{period:h,limit:Math.min(o-S.length,200),start_date:w}))?.data||[];if(!q.length)break;S=[...q,...S],w=String(q[0].trade_date)}let k=S.slice(-o);return{items:k,toJSON:()=>zs(i,h,k),source:"cls"}},g=(y,h)=>!Array.isArray(y.items)||!y.items.length?!1:(l({data:y.items,command:`quote kline ${i} -p ${c}`,source:h,toJSON:y.toJSON}),!0);try{let y=await d(p);if(g(y,y.source))return;throw new Error("empty kline")}catch(y){if(!u){try{let h=await d(!p);if(g(h,`${h.source} fallback`))return}catch{}if(K()&&jt(i))try{let h=await io(i,o);if(h?.length){l({data:h,command:`quote kline ${i} -p d`,source:"fuyao fallback",toJSON:()=>so(i,h)});return}}catch{}}try{let h=await ke(i,c,o);if(h&&h.items.length){l({data:h.items,command:`quote kline ${i} -p ${c}`,source:"yahoo fallback",toJSON:()=>({code:h.symbol,period:c,items:h.items,total:h.total})});return}}catch{}throw y}}).command("depth [code]","\u4E94\u6863\u76D8\u53E3",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await Ot(o);return l({data:s,command:`quote depth ${o} --src xq`,source:"xq",toJSON:i=>uo(o,i?.data||{})})}else{let s=await ze(o);return l({data:s,command:`quote depth ${o}`,source:"cls",toJSON:i=>co(o,i?.data||{})})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await Ot(o);l({data:i,command:`quote depth ${o} --src xq`,source:"xq fallback",toJSON:c=>uo(o,c?.data||{})})}else{let i=await ze(o);l({data:i,command:`quote depth ${o}`,source:"cls fallback",toJSON:c=>co(o,c?.data||{})})}}}).command("ticks [code]","\u9010\u7B14\u6210\u4EA4",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await Dt(o);return l({data:s,command:`quote ticks ${o} --src xq`,source:"xq",toJSON:i=>mo(o,i)})}else{let s=await We(o);return l({data:s,command:`quote ticks ${o}`,source:"cls",toJSON:i=>lo(o,i)})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await Dt(o);l({data:i,command:`quote ticks ${o} --src xq`,source:"xq fallback",toJSON:c=>mo(o,c)})}else{let i=await We(o);l({data:i,command:`quote ticks ${o}`,source:"cls fallback",toJSON:c=>lo(o,c)})}}}).command("timeline [code]","\u5206\u65F6\u7EBF",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await At(o,{period:"1d"});return l({data:s,command:`quote timeline ${o} --src xq`,source:"xq",toJSON:i=>fo(o,i)})}else{let s=await Qe(o);return l({data:s,command:`quote timeline ${o}`,source:"cls",toJSON:i=>po(o,i)})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await At(o,{period:"1d"});l({data:i,command:`quote timeline ${o} --src xq`,source:"xq fallback",toJSON:c=>fo(o,c)})}else{let i=await Qe(o);l({data:i,command:`quote timeline ${o}`,source:"cls fallback",toJSON:c=>po(o,c)})}}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",r=>r,async()=>{let r=await ye();l({data:r,command:"quote flow market",source:"glh",toJSON:we})}).command("history <code>","\u5386\u53F2\u8D44\u91D1\u6D41",r=>r.option("count",{alias:"c",type:"number",default:20}),async r=>{let{c:o=20}=r,a=r.code,s=await jr(a,{count:o});l({data:s,command:`quote flow history ${a}`,source:"xq",toJSON:yo})}).command("margin <code>","\u878D\u8D44\u878D\u5238",r=>r,async r=>{let o=r.code,a=await Ir(o);l({data:a,command:`quote flow margin ${o}`,source:"xq",toJSON:Zs})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",r=>r,async r=>{let o=r.code,s=await Pt(o);l({data:s,command:`quote flow intraday ${o}`,source:"xq",toJSON:yo})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",r=>r,async r=>{let o=r.code,s=await Pt(o);l({data:s,command:`quote flow xq ${o}`,source:"xq",toJSON:oi})}),async e=>{let{code:r}=e;if(r){let o=await rn(r);l({data:o,command:`quote flow ${r}`,source:"cls",toJSON:Vs})}else{let o=await ye();l({data:o,command:"quote flow market",source:"glh",toJSON:we})}}).command("f10 [code]","\u57FA\u672C\u9762\uFF08\u9ED8\u8BA4\u4E3B\u8981\u6307\u6807\uFF0C\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",r=>r,async r=>{let o=r.code;try{let s=await Tt(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 holders ${o}`,source:"xq",toJSON:go})}catch{}let a=await Tt(o);l({data:a,command:`quote f10 holders ${o}`,source:"xq",toJSON:go})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",r=>r,async r=>{let o=r.code;try{let s=await Et(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 bonus ${o}`,source:"xq",toJSON:ho})}catch{}try{let s=await ae(o);if(s?.stats)return l({data:s.stats,command:`quote f10 bonus ${o}`,source:"yahoo fallback",toJSON:()=>({items:[{dividendRate:s.stats?.dividendRate,dividendYield:s.stats?.dividendYield,exDividendDate:s.stats?.exDividendDate,payoutRatio:s.stats?.payoutRatio}],total:1})})}catch{}let a=await Et(o);l({data:a,command:`quote f10 bonus ${o}`,source:"xq",toJSON:ho})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",r=>r,async r=>{let o=r.code;try{let s=await Se(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 indicator ${o}`,source:"xq",toJSON:Re})}catch{}try{let s=await ae(o);if(s?.stats)return l({data:s.stats,command:`quote f10 indicator ${o}`,source:"yahoo fallback",toJSON:()=>({items:[{report:"latest",peTtm:s.stats?.trailingPE,pb:s.stats?.priceToBook,roe:s.stats?.returnOnEquity,eps:s.stats?.dilutedEps,grossMargin:s.stats?.grossMargins,netMargin:s.stats?.profitMargins,dividendYield:s.stats?.dividendYield,revenue:s.stats?.totalRevenue,netProfit:s.stats?.netIncome,revenueYoy:s.stats?.quarterlyRevenueGrowth,netProfitYoy:s.stats?.quarterlyEarningsGrowth,marketCap:s.stats?.marketCap,currency:s.stats?.currency}],total:1})})}catch{}let a=await Se(o);l({data:a,command:`quote f10 indicator ${o}`,source:"xq",toJSON:Re})}).command("profile <code>","\u516C\u53F8\u8D44\u6599\u4E0E\u9AD8\u7BA1",r=>r,async r=>{let o=r.code,a=await ae(o);if(!a?.profile)throw new Error(`\u65E0\u6CD5\u83B7\u53D6 ${o} \u7684\u516C\u53F8\u8D44\u6599`);l({data:a.profile,command:`quote f10 profile ${o}`,source:"yahoo",toJSON:s=>({code:s.symbol,name:s.name,sector:s.sector,industry:s.industry,website:s.website,phone:s.phone,address:[s.address,s.city,s.state,s.country].filter(Boolean).join(", "),employees:s.employees,description:s.description,officers:s.officers,source:"yahoo"})})}),async e=>{let r=e.code;if(!r)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote f10 sh600519"},command:"quote f10",source:"xq"});try{let a=await Se(r);if(a?.data?.items?.length)return l({data:a,command:`quote f10 indicator ${r}`,source:"xq",toJSON:Re})}catch{}try{let a=await ae(r);if(a?.stats)return l({data:a.stats,command:`quote f10 indicator ${r}`,source:"yahoo fallback",toJSON:()=>({items:[{report:"latest",peTtm:a.stats?.trailingPE,pb:a.stats?.priceToBook,roe:a.stats?.returnOnEquity,eps:a.stats?.dilutedEps,grossMargin:a.stats?.grossMargins,netMargin:a.stats?.profitMargins,dividendYield:a.stats?.dividendYield,revenue:a.stats?.totalRevenue,netProfit:a.stats?.netIncome,revenueYoy:a.stats?.quarterlyRevenueGrowth,netProfitYoy:a.stats?.quarterlyEarningsGrowth,marketCap:a.stats?.marketCap,currency:a.stats?.currency}],total:1})})}catch{}let o=await Se(r);l({data:o,command:`quote f10 indicator ${r}`,source:"xq",toJSON:Re})}).command("auction <codes...>","\u96C6\u5408\u7ADE\u4EF7\u5FEB\u7167\uFF08\u7ADE\u4EF7\u4EF7\u683C/\u91CF\u6BD4/\u672A\u5339\u914D\u91CF\uFF0C\u6276\u6447\u5B98\u65B9\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 600519 000001"}).option("live",{type:"boolean",default:!1,describe:"\u5B9E\u65F6\u9636\u6BB5\uFF08\u9ED8\u8BA4\u7EC8\u6001 final\uFF09"}),async e=>{let r=e.codes,o=e.live?"live":"final",a=await oo(r,o),s=a?.item||[];l({data:a,command:`quote auction ${r.join(" ")}`,source:"fuyao",toJSON:()=>({phase:a?.auction_phase||"",dataStatus:a?.data_status||"",items:s.map(i=>({code:i.thscode||"",name:i.name||"",price:i.auction_price??null,changePercent:H(i.auction_pct),volume:i.auction_volume??null,amount:i.auction_amount??null,unmatched:i.auction_unmatched??null,turnoverRate:H(i.auction_turnover_pct),volumeRatio:i.auction_volume_ratio??null,preClose:i.pre_close_price??null,floatMarketCap:i.float_market_cap??null})),total:a?.total??s.length})})}).command("announcement <code>","\u4E2A\u80A1\u516C\u544A\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6700\u65B0\u516C\u544A\u5217\u8868",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}),async e=>{let r=e.code,o=e.p??1,a=await cn(r,{page:o});l({data:a,command:`quote announcement ${r}`,source:"cls",toJSON:ei})}).command("interaction <code>","\u4E92\u52A8\u6613\u95EE\u7B54\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6295\u8D44\u8005\u63D0\u95EE\u4E0E\u516C\u53F8\u56DE\u590D",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}).option("size",{alias:"s",type:"number",default:15,describe:"\u6BCF\u9875\u6761\u6570"}).option("keyword",{alias:"k",type:"string",default:"",describe:"\u5173\u952E\u8BCD\u7B5B\u9009"}),async e=>{let r=e.code,o=e.p??1,a=e.s??15,s=e.k??"",i=await un(r,{page:o,pageSize:a,keyWord:s});l({data:i,command:`quote interaction ${r}`,source:"cls",toJSON:ti})}).command("finance [code]","\u8D22\u52A1\u62A5\u8868",e=>e.positional("code",{type:"string"}).option("type",{alias:"t",type:"string",choices:["indicator","cashflow","income","balance"],default:"indicator"}).option("src",{type:"string",choices:["xq","fuyao"],default:"xq",describe:"\u6570\u636E\u6E90\uFF1Bfuyao \u4E3A\u5B98\u65B9\u591A\u671F\u5E8F\u5217\uFF08--period annual|quarterly\uFF0C\u652F\u6301 --limit/--start/--end \u65E5\u671F YYYY-MM-DD\uFF09"}).option("period",{type:"string",choices:["annual","quarterly"],default:"annual",describe:"fuyao \u62A5\u544A\u671F\u7C7B\u578B"}).option("limit",{type:"number",default:4,describe:"fuyao \u6700\u8FD1 N \u671F\uFF081..20\uFF09"}).option("start",{type:"string",describe:"fuyao \u533A\u95F4\u8D77\u59CB\u65E5 YYYY-MM-DD\uFF08\u4E0E --end \u540C\u4F20\uFF09"}).option("end",{type:"string",describe:"fuyao \u533A\u95F4\u622A\u6B62\u65E5 YYYY-MM-DD"}),async e=>{let{t:r="indicator",src:o="xq"}=e,a=e.code;if(o==="fuyao"){let{period:s="annual",limit:i=4}=e,{start:c,end:u}=e,m=c&&u?{period:s,start:Date.parse(`${c}T00:00:00+08:00`),end:Date.parse(`${u}T00:00:00+08:00`)}:{period:s,limit:i},p=r==="income"?ur:r==="balance"?lr:r==="cashflow"?mr:null;if(!p)return l({data:{error:"\u6276\u6447\u6E90\u7684\u8D22\u52A1\u6307\u6807\u8BF7\u7528: finflow quote indicators <code> <report>\uFF08report \u5982 2025-4\uFF09"},command:`quote finance ${r} ${a} --src fuyao`,source:"fuyao"});let d=await p(a,m);l({data:d,command:`quote finance ${r} ${a} --src fuyao --period ${s}`,source:"fuyao",toJSON:g=>({code:A(a),type:r,period:s,items:(g?.item||[]).map(y=>({fiscalYear:y.fiscal_year??null,fiscalPeriod:y.fiscal_period||"",reportDate:y.report_date_ms?new Date(y.report_date_ms).toISOString():null,periodEnd:y.period_end_ms?new Date(y.period_end_ms).toISOString():null,...Object.fromEntries(Object.entries(y).filter(([h])=>!h.endsWith("_ms")&&!["thscode","ticker","period","fiscal_year","fiscal_period","currency"].includes(h)))})),total:g?.item?.length??0})});return}if(r==="indicator"){let s=await Pr(a);l({data:s,command:`quote finance indicator ${a}`,source:"xq",toJSON:ni})}else{let i={cashflow:Cr,income:vr,balance:qr}[r];if(!i)return l({data:{error:`\u672A\u77E5\u7C7B\u578B: ${r}\uFF0C\u53EF\u9009 indicator/cashflow/income/balance`},command:`quote finance ${r}`,source:"xq"});let c=await i(a);l({data:c,command:`quote finance ${r} ${a}`,source:"xq",toJSON:u=>ri(u,r)})}}).command("valuation <codes...>","\u5386\u53F2\u4F30\u503C\u5206\u4F4D\u6570\u5206\u6790\uFF08PE/PB/PS/PCF \u5206\u4F4D\u3001\u9AD8\u4F4E\u503C\u3001\u4E2D\u4F4D\u6570\u4E0E\u4F30\u503C\u72B6\u6001\uFF1B\u591A\u53EA\u4E3A\u6279\u91CF\u5FEB\u7167\u5BF9\u6BD4\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519 \u6216 600519 000651"}).option("years",{alias:"y",type:"number",default:5,describe:"\u5386\u53F2\u5206\u4F4D\u6570\u8BA1\u7B97\u5E74\u9650\uFF081/3/5/10\uFF0C\u9ED8\u8BA4 5 \u5E74\uFF09"}).option("batch",{type:"boolean",default:!1,describe:"\u5F3A\u5236\u4F7F\u7528\u6A2A\u5411\u6279\u91CF\u5FEB\u7167\u6A21\u5F0F"}),async e=>{let r=e.codes,o=Number(e.years||e.y||5),a=!!e.batch;if(r.length===1&&!a){let c=r[0],u=await Rr(c,o);if(u)return l({data:u,command:`quote valuation ${c}${o!==5?` -y ${o}`:""}`,source:"xq",toJSON:m=>m})}if(r.length>100)throw new Error("\u4F30\u503C\u5FEB\u7167\u5355\u6B21\u6700\u591A 100 \u53EA");if(K()){let c=await pr(r);return l({data:c,command:`quote valuation ${r.join(" ")}`,source:"fuyao",toJSON:u=>({items:(u?.item||[]).map(m=>({code:m.thscode||"",name:m.name??null,peTtm:H(m.pe_ttm),peMrq:H(m.pe_mrq),pb:H(m.pb_mrq),ps:H(m.ps_ttm),pcf:H(m.pcf_ttm)})),total:u?.total??u?.item?.length??0})})}let s=await Nt(r),i=Array.isArray(s?.data?.items)?s.data.items:[];l({data:s,command:`quote valuation ${r.join(" ")}`,source:"xq fallback",toJSON:()=>({items:i.map(c=>({code:c.symbol||c.code,name:c.name||"",price:c.current??c.price,peTtm:H(c.pe_ttm),pb:H(c.pb),marketCap:c.market_capital})),total:i.length})})}).command("indicators <code> [report]","\u8D22\u52A1\u6307\u6807\uFF08\u6276\u6447\u5B98\u65B9\uFF0C\u4E94\u7EF4\uFF09\uFF1A\u6210\u957F/\u76C8\u5229/\u507F\u503A/\u8425\u8FD0/\u73B0\u91D1\u6D41\uFF1Breport \u5982 2025-4\uFF08\u9ED8\u8BA4\u6700\u8FD1\u5E74\u62A5\uFF09",e=>e.positional("code",{type:"string",describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519"}).positional("report",{type:"string",describe:"\u62A5\u544A\u671F yyyy-1|2|3|4\uFF081 \u4E00\u5B63\u62A5 / 4 \u5E74\u62A5\uFF09\uFF0C\u9ED8\u8BA4 <\u4ECA\u5E74>-4"}),async e=>{let r=e.code,o=`${new Date().getFullYear()-1}-4`,a=e.report||o,s=await dr(r,a),i={growth:"\u6210\u957F",profitability:"\u76C8\u5229",solvency:"\u507F\u503A",operation:"\u8425\u8FD0","cash-flow":"\u73B0\u91D1\u6D41"};l({data:s,command:`quote indicators ${r} ${a}`,source:"fuyao",toJSON:c=>({code:c?.thscode||A(r),report:a,abilities:(c?.abilities||[]).map(u=>({ability:i[u.ability]||u.ability,indicators:(u.indicators||[]).map(m=>({id:m.index_id,value:m.value}))}))})})}).command("adjust <code>","\u590D\u6743\u56E0\u5B50\u4E8B\u4EF6\u6D41\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1A\u6BCF\u80A1\u5206\u7EA2/\u9001\u8F6C\uFF0C\u6309\u9664\u6743\u65E5\u964D\u5E8F",e=>e.positional("code",{type:"string",describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519"}).option("from",{type:"string",describe:"\u8D77\u59CB\u65E5 YYYY-MM-DD"}).option("to",{type:"string",describe:"\u622A\u6B62\u65E5 YYYY-MM-DD"}),async e=>{let r=e.code,{from:o,to:a}=e,s=await cr(r,{from:o,to:a});l({data:s,command:`quote adjust ${r}`,source:"fuyao",toJSON:i=>({code:i?.thscode||A(r),items:(i?.item||[]).map(c=>({exDate:c.ex_date_ms?new Date(c.ex_date_ms).toISOString().slice(0,10):null,dividendPerShare:c.dividend_per_share??null,perShareBonus:c.per_share_bonus??null})),total:i?.item?.length??0})})}),handler:async t=>{let e=t.codes||[];if(!e.length)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL\uFF08\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\uFF09"},command:"quote",source:"cls"});let r=["search","related","industry","industry-profile","board","kline","depth","ticks","timeline","sector","flow","f10","finance","valuation","indicators","adjust","detail"];if(e.length===1&&r.includes(e[0]))return l({data:{error:`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${e[0]} <code>`},command:`quote ${e[0]}`,source:"cls"});if(e.every(u=>Rt(u))){if(!K())throw new Error("\u540C\u82B1\u987A\u6307\u6570(88xxxx.TI)\u884C\u60C5\u6765\u81EA\u6276\u6447\u5B98\u65B9\u6E90\uFF0C\u8BF7\u5148\u8FD0\u884C finflow key set fuyao <sk-fuyao-\u2026>");let u=await nr(e),m=u?.item||[];l({data:u,command:`quote ${e.join(" ")}`,source:"fuyao",toJSON:()=>({items:m.map(p=>It(p,"fuyao")),total:m.length})});return}if(e.length>1){let u=[];try{u=await ko(e)}catch{u=[]}if(u.length){l({data:u,command:`quote ${e.join(" ")}`,source:"xq",toJSON:()=>Hs(u)});return}if(K()&&e.every(jt)){let m=await be(e),p=m?.item||[];l({data:m,command:`quote ${e.join(" ")}`,source:"fuyao fallback",toJSON:()=>({items:p.map(d=>It(d)),total:p.length})});return}throw new Error(`\u96EA\u7403\u65E0\u6CD5\u83B7\u53D6 ${e.join(" ")} \u7684\u6279\u91CF\u884C\u60C5${K()?"":"\uFF08\u914D\u7F6E\u6276\u6447 key \u53EF\u542F\u7528 A \u80A1\u515C\u5E95\uFF1Afinflow key set fuyao\uFF09"}`)}let o=e[0],a=o.trim().toUpperCase();if(/^[A-Z]{1,5}$/.test(a)&&!a.startsWith("SH")&&!a.startsWith("SZ"))try{let u=await _e(a);if(u){l({data:u,command:`quote ${o}`,source:"yahoo",toJSON:()=>Mt(u)});return}}catch{}try{let u=await tn(o);if(Ys(u)){l({data:u,command:`quote ${o}`,source:"cls",toJSON:Fs});return}}catch{}let i=null;try{i=await Xs(o)}catch{}if(Bs(i)){l({data:i,command:`quote ${o}`,source:"xq fallback",toJSON:u=>({code:u.symbol||"",name:u.name||"",price:u.current??0,change:u.chg??0,changePercent:Math.round((u.percent??0)*100)/100,open:u.open??0,high:u.high??0,low:u.low??0,preclose:u.last_close??0,volume:u.volume??0,amount:u.amount??0,turnoverRate:u.turnover_rate??0,amplitude:u.amplitude??0,avgPrice:u.avg_price??0,volumeRatio:u.volume_ratio??0,pe:u.pe_ttm??null,pb:u.pb??null,marketCap:u.market_capital??0,change3d:null,change5d:null,status:u.status===1?"trading":"closed",source:"xq fallback"})});return}if(K()&&jt(o))try{let m=(await be([o]))?.item?.[0];if(m&&m.last_price!=null){l({data:m,command:`quote ${o}`,source:"fuyao fallback",toJSON:It});return}}catch{}let c=oe(o);if(c){let u=await _e(c);if(u){l({data:u,command:`quote ${o}`,source:"yahoo fallback",toJSON:()=>Mt(u)});return}}if(i){l({data:i,command:`quote ${o}`,source:"xq fallback",toJSON:u=>({code:u.symbol||"",name:u.name||"",price:u.current??0,change:u.chg??0,changePercent:Math.round((u.percent??0)*100)/100,open:u.open??0,high:u.high??0,low:u.low??0,preclose:u.last_close??0,volume:u.volume??0,amount:u.amount??0,turnoverRate:u.turnover_rate??0,amplitude:u.amplitude??0,avgPrice:u.avg_price??0,volumeRatio:u.volume_ratio??0,pe:u.pe_ttm??null,pb:u.pb??null,marketCap:u.market_capital??0,change3d:null,change5d:null,status:u.status===1?"trading":"closed",source:"xq fallback"})});return}throw new Error(`cls\u3001xq \u548C Yahoo \u5747\u65E0\u6CD5\u83B7\u53D6 ${o} \u7684\u884C\u60C5\u6570\u636E`)}})}function si(n){let t=n?.data||{},e=t.limit_up_board||{},r=t.up_down_dis||{};return{marketDegree:Number(t.market_degree)||0,limitUp:Number(t.up_ratio_num||0),limitOpen:Number(t.up_open_num||0),sealRate:parseFloat(t.up_ratio)||0,turnover:t.shsz_balance||"",turnoverChange:t.shsz_balance_change_px||"",limitUpBoard:e.row2?{total:e.row2[0]||0,first:e.row2[1]||0,second:e.row2[2]||0,third:e.row2[3]||0,promoteRate:e.row3?{first:e.row3[1]||"",second:e.row3[2]||"",third:e.row3[3]||""}:{}}:null,prevPerformance:t.performance||"",gapUpRate:t.up_open_ratio||"",profitRate:t.profit_ratio||"",distribution:r.status?{limitUp:Number(r.up_num||0),limitDown:Number(r.down_num||0),rise:Number(r.rise_num||0),fall:Number(r.fall_num||0),flat:Number(r.flat_num||0),suspend:Number(r.suspend_num||0)}:null,source:"cls"}}function Oo(n){let t=n.result||[],e=t.filter(o=>o.category==="\u6307\u6570"),r=t.filter(o=>o.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:e.map(o=>({name:o.name,value:Number(o.value||0),change:Number(o.change||0),changePercent:Math.round(Number(o.netChange||0)*1e4)/100})),capitalFlow:r.map(o=>({name:o.name,shanghai:o.sh??null,shenzhen:o.sz??null})),source:"glh"}}function ii(n){let t=n.result||[];return{items:t.map(e=>({name:e.stockName||"",code:(e.stockType||"")+(e.stockCode||""),price:e.currentPrice??null,changePercent:e.netChange!=null?Math.round(Number(e.netChange)*1e4)/100:null})),total:t.length}}function ci(n){let t=(n?.data?.items||[]).map(e=>({code:e.symbol||"",name:e.name||"",close:e.close??null,changePercent:Math.round((e.percent??0)*100)/100,volume:e.volume??null,amount:e.amount??null,reasons:e.type_name||[]}));return{items:t,total:n?.data?.items_size??t.length}}function Jt(n){return Date.parse(`${n}T00:00:00+08:00`)}var z=n=>n==null?null:Math.round(n*100)/100;function ui(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:z(e.price_change_ratio_pct),limitUpTime:e.limit_up_time||"",reason:e.limit_up_reason??null,continueDays:e.continue_day_cnt??null,continueText:e.continue_day_text||"",sealMoney:e.seal_money??null,maxSealMoney:e.max_seal_money??null,isSt:!!e.is_st,isNew:!!e.is_new})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function li(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:z(e.price_change_ratio_pct),firstLimitTime:e.first_limit_time||"",lastLimitTime:e.last_limit_time||"",turnoverRate:z(e.turnover_ratio_pct)})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function mi(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:z(e.price_change_ratio_pct),openTimes:e.open_times??null,turnoverRate:z(e.turnover_ratio_pct),amount:e.turnover??null})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}var di=[["two_board","2\u677F"],["three_board","3\u677F"],["four_board","4\u677F"],["five_board","5\u677F"],["six_board","6\u677F"],["seven_over","7\u677F+"]];function pi(n){let t=n?.item||[];return{windowDays:n?.window?.length??null,items:t.map(e=>({date:(e.date||"").replace(/^(\d{4})(\d{2})(\d{2})$/,"$1-$2-$3"),boards:Object.fromEntries(di.map(([r,o])=>[o,(e.boards?.[r]||[]).map(a=>({code:a.thscode||"",name:a.name||"",boardNum:a.board_num??null,sealNextday:a.seal_nextday??null}))]))})),total:t.length}}function Ao(n){let t=n?.item||[];return{items:t.map(e=>({rank:e.rank??null,code:e.thscode||"",name:e.name||"",heat:e.heat??null,rankChange:e.rank_change??null,rankTrend:e.rank_trend||""})),total:t.length}}function fi(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({rank:e.rank??null,code:e.thscode||"",name:e.name||""})),total:t.length}}function yi(n){let t=n?.item||[];return{items:t.map(e=>({date:e.date||"",rank:e.rank??null})),total:t.length}}function gi(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||"",tag:e.tag_name||"",analysis:e.analysis_content||"",keywords:e.keyword_list||[]})),total:t.length}}function hi(n){let t=n?.stock_items||[],e=n?.hot_money_items||[];return{tradeDate:n?.trade_date||"",boardType:n?.board_type||"all",items:t.map(r=>({code:r.thscode||"",name:r.name||"",changePercent:z((r.change??0)*100),netBuy:r.net_value??null,netRate:z((r.net_rate??0)*100),buy:r.buy_value??null,sell:r.sell_value??null,orgNetBuy:r.org_net_value??null,orgBuyNum:r.org_buy_num??null,orgSellNum:r.org_sell_num??null,hotRank:r.hot_rank??null,reason:r.limit_reason??null,rangeDays:r.range_days??null,concepts:(r.concept_list||[]).map(o=>o.name||"")})),hotMoneyItems:e.map(r=>({name:r.name||"",netBuy:r.buying??null,stocks:(r.rows||[]).map(o=>({code:o.thscode||"",name:o.name||"",changePercent:z((o.change??0)*100)}))})),total:n?.stock_count??t.length}}function bi(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({code:e.thscode||"",name:e.name||"",changePercent:z(e.auction_pct),tags:e.tags||[]})),total:t.length}}function Si(n,t){let e=(n?.data?.list||[]).map(r=>({name:r.name||"",items:(r.data||[]).filter(o=>o.published===1).map(o=>({category:o.category||"",city:o.city||"",spot:o.spot_data??null,futures:o.futures_data??null,basis:o.jicha??null,basisRate:o.jicha_rate??null}))}));if(t){let r=e.find(o=>o.name===t);if(!r)return{error:`\u672A\u77E5\u677F\u5757: ${t}\u3002\u53EF\u7528: ${e.map(o=>o.name).join("/")}`};e=[r]}return{groups:e,total:e.reduce((r,o)=>r+o.items.length,0)}}async function wi(n,t){let e=await Fn(n);l({data:e,command:`market basis ${n}`,source:"jin10",toJSON:r=>Si(r,t)})}function Do(n){return n.command({command:"market",describe:"\u5E02\u573A\u603B\u89C8",builder:t=>t.strictCommands(!1).command("basis [date]","\u671F\u73B0\u57FA\u5DEE\uFF08jin10 qihuo\uFF0C\u73B0\u8D27 vs \u671F\u8D27\u4EF7\u5DEE\uFF09",e=>e.positional("date",{type:"string"}).option("group",{alias:"g",type:"string",describe:"\u6309\u677F\u5757\u8FC7\u6EE4: \u9ED1\u8272\u7CFB/\u91D1\u5C5E/\u519C\u4EA7\u54C1/\u80FD\u6E90\u5316\u5DE5/\u91D1\u878D"}),async e=>{await wi(e.date||M(),e.g)}).command("emotion","\u5E02\u573A\u60C5\u7EEA\uFF08cls\uFF09",e=>e,async()=>{let e=await an();l({data:e,command:"market emotion",source:"cls",toJSON:si})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",e=>e,async()=>{let e=await lt();l({data:e,command:"market index",source:"glh",toJSON:Oo})}).command("hk [sort]","\u6E2F\u80A1\u6392\u884C\uFF08glh\uFF0C\u9ED8\u8BA4\u964D\u5E8F\uFF09",e=>e.option("order",{alias:"o",type:"string",choices:["asc","desc"],default:"desc",describe:"\u6392\u5E8F\u65B9\u5411\uFF08\u9ED8\u8BA4 desc \u964D\u5E8F\uFF09"}),async e=>{let r=e.sort,o=e.order||"desc",a=Gn(r),s=await Xn({sort:a.id,order:o});l({data:s,command:"market hk",source:"glh",toJSON:ii})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",e=>e,async()=>{let e=await ye();l({data:e,command:"market flow",source:"glh",toJSON:we})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",e=>e,async()=>{let e=await Tn(),r=e?.data?.list||[];l({data:e,command:"market rates",source:"jin10",toJSON:()=>({items:r.map(o=>({bank:o.bankName,rate:o.interestRate,date:o.publishTime}))})})}).command("longhu [date]","\u9F99\u864E\u699C\uFF08\u6276\u6447\u5B98\u65B9\uFF1A\u673A\u6784/\u6E38\u8D44\u62C6\u5206+\u4E70\u5356\u989D\uFF0C\u4E00\u5E74\u5185\u5386\u53F2\uFF1B\u65E0 key \u65F6\u8D70\u96EA\u7403\u5F53\u65E5\u699C\uFF09",e=>e.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF1B\u6276\u6447\u6E90\u9ED8\u8BA4\u6700\u8FD1\u4EA4\u6613\u65E5\uFF0C\u96EA\u7403\u6E90\u9ED8\u8BA4\u4ECA\u5929"}).option("board",{type:"string",default:"all",choices:["all","org","hot_money"],describe:"\u6276\u6447\u6E90\u699C\u5355\uFF1Aall \u5168\u90E8 / org \u673A\u6784\u699C / hot_money \u6E38\u8D44\u699C"}),async e=>{let r=e.date||void 0,o=e.board||"all";if(he()){let u=await ro({boardType:o,date:r});l({data:u,command:`market longhu${r?` ${r}`:""}`,source:"fuyao",toJSON:hi});return}let a=r||M(),s=a.split("-").map(Number),i=Date.UTC(s[0],(s[1]||1)-1,s[2]||1)-480*60*1e3;if(!Number.isFinite(i))throw new Error(`\u65E0\u6548\u65E5\u671F: ${a}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let c=await Er(i);if(c?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${c.error_description||c.error_code}`);l({data:c,command:`market longhu ${a}`,source:"xq",toJSON:ci})}).command("limitup [date]","\u6DA8\u505C\u6C60\uFF08\u8FDE\u677F\u6570/\u5C01\u5355\u989D/\u5B98\u65B9\u6DA8\u505C\u539F\u56E0\uFF0C\u9ED8\u8BA4\u6309\u8FDE\u677F\u6570\u964D\u5E8F\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF1Btotal \u5B57\u6BB5\u4E3A\u6C60\u5B50\u603B\u6570\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF1Alast_price/continue_day_cnt/seal_money/limit_up_time"}).option("dir",{type:"string",default:"desc",describe:"asc / desc"}),async e=>{let r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await Gr({dateMs:o?Jt(o):void 0,size:r,sortField:e.sort||"continue_day_cnt",sortDir:e.dir||"desc"});l({data:a,command:`market limitup${o?` ${o}`:""}`,source:"fuyao",toJSON:ui})}).command("limitdown [date]","\u8DCC\u505C\u6C60",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\uFF1Alast_limit_time/first_limit_time/last_price/price_change_ratio_pct/turnover_ratio_pct"}).option("dir",{type:"string",default:"desc"}),async e=>{let r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await Kr({dateMs:o?Jt(o):void 0,size:r,sortField:e.sort||void 0,sortDir:e.dir||void 0});l({data:a,command:`market limitdown${o?` ${o}`:""}`,source:"fuyao",toJSON:li})}).command("limitbreak [date]","\u70B8\u677F\u6C60\uFF08\u6DA8\u505C\u5F00\u677F\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\uFF1Aprice_change_ratio_pct/open_times/last_price/turnover_ratio_pct/turnover"}).option("dir",{type:"string",default:"desc"}),async e=>{let r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await zr({dateMs:o?Jt(o):void 0,size:r,sortField:e.sort||void 0,sortDir:e.dir||void 0});l({data:a,command:`market limitbreak${o?` ${o}`:""}`,source:"fuyao",toJSON:mi})}).command("ladder","\u8FDE\u677F\u5929\u68AF\uFF08\u8FD1 30 \u4E2A\u4EA4\u6613\u65E5\u8FDE\u677F\u68AF\u961F\u77E9\u9635\uFF0C\u6276\u6447\uFF09",e=>e,async()=>{let e=await Wr();l({data:e,command:"market ladder",source:"fuyao",toJSON:pi})}).command("hot [date]","\u70ED\u80A1\u699C Top30\uFF08date \u4E3A\u5386\u53F2\u81EA\u7136\u65E5\uFF1B--hour \u5C0F\u65F6\u7EA7\uFF0C\u6276\u6447\uFF09",e=>e.positional("date",{type:"string",describe:"\u5386\u53F2\u81EA\u7136\u65E5 YYYY-MM-DD\uFF08\u4E00\u5E74\u5185\uFF09\uFF1B\u7701\u7565=\u5F53\u524D\u699C\u5355"}).option("hour",{type:"boolean",default:!1,describe:"\u5C0F\u65F6\u7EA7\u699C\u5355"}),async e=>{let r=e.date,o=r?await Zr(r):await Vr(e.hour?"hour":"day");l({data:o,command:`market hot${r?` ${r}`:""}`,source:"fuyao",toJSON:r?fi:Ao})}).command("skyrocket","\u4EBA\u6C14\u98D9\u5347\u699C Top30\uFF08--hour \u5C0F\u65F6\u7EA7\uFF0C\u6276\u6447\uFF09",e=>e.option("hour",{type:"boolean",default:!1,describe:"\u5C0F\u65F6\u7EA7\u699C\u5355"}),async e=>{let r=await Qr(e.hour?"hour":"day");l({data:r,command:"market skyrocket",source:"fuyao",toJSON:Ao})}).command("hot-trend <code>","\u4E2A\u80A1\u70ED\u699C\u6392\u540D\u8D70\u52BF\uFF08\u9ED8\u8BA4\u8FD1 30 \u5929\uFF0C\u6276\u6447\uFF09",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 600519 / 300034.SZ"}).option("days",{type:"number",default:30,describe:"\u56DE\u770B\u5929\u6570\uFF08\u2264365\uFF09"}),async e=>{let r=e.code,o=Math.min(Math.max(Number(e.days)||30,1),365),a=new Date,s=new Date(a.getTime()-o*864e5),i=u=>u.toISOString().slice(0,10),c=await eo(r,i(s),i(a));l({data:c,command:`market hot-trend ${r}`,source:"fuyao",toJSON:yi})}).command("anomaly [targets...]","\u5F53\u65E5\u4E2A\u80A1\u5F02\u52A8\u539F\u56E0\uFF08\u5B98\u65B9\u89E3\u8BFB\uFF1B\u4F20\u80A1\u7968\u4EE3\u7801=\u6309\u80A1\u67E5\uFF0C\u4F20\u6807\u7B7E=\u6309\u7C7B\u8FC7\u6EE4\uFF0C\u6276\u6447\uFF09",e=>e.positional("targets",{type:"string",array:!0,describe:"\u80A1\u7968\u4EE3\u7801\uFF08\u226450 \u53EA\uFF0C\u5982 600519 000001\uFF09\u6216\u5F02\u52A8\u6807\u7B7E LIMIT_UP/LIMIT_DOWN/SHARP_RISE/SHARP_FALL/RAPID_RALLY/RAPID_DECLINE\uFF08\u591A\u503C OR\uFF09"}),async e=>{let r=(e.targets||[]).filter(Boolean),a=r.length>0&&r.every(s=>/^((sh|sz|bj)?\d{6}|\d{6}\.(sh|sz|bj))$/i.test(s.trim()))?await no(r):await to(r);l({data:a,command:`market anomaly${r.length?` ${r.join(" ")}`:""}`,source:"fuyao",toJSON:gi})}).command("benchmark [date]","\u77ED\u7EBF\u98CE\u5411\u6807\u7ADE\u4EF7\u57FA\u51C6\uFF08\u9AD8\u5F00/\u653E\u91CF\u7B49\u6807\u7B7E\uFF0C\u6276\u6447\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async e=>{let r=e.date||void 0,o=await ao(r);l({data:o,command:`market benchmark${r?` ${r}`:""}`,source:"fuyao",toJSON:bi})}),handler:async()=>{let t=await lt();l({data:t,command:"market",source:"glh",toJSON:Oo})}})}function _i(n){let t=n?.data||[];return{items:t.map(e=>{let r=e.symbol_code||"",o=/^cls/i.test(r)?"plate":"stock";return{time:e.c_time?e.c_time.slice(11,16):"",code:r,name:e.symbol_name||"",kind:o,direction:e.float==="up"?"up":e.float==="down"?"down":"",articleId:e.article_id??null}}),total:t.length}}function To(n,t){return{type:t,items:n.map(e=>({code:e.secu_code||"",name:e.plate_name||e.secu_name||"",changePercent:Math.round((e.change||0)*100*100)/100})),total:n.length}}function Eo(n){return{items:n.map(t=>({code:t.secu_code||"",name:t.secu_name||"",changePercent:Math.round((t.change||0)*100*100)/100,topStocks:(t.up_stock||[]).slice(0,3).map(e=>({name:e.secu_name?.trim()||"",changePercent:Math.round((e.change||0)*100*100)/100}))})),total:n.length}}function Po(n){let t=(n?.data?.stocks||[]).map(e=>({code:e.secu_code||"",name:e.secu_name||"",price:e.last_px??null,changePercent:Math.round((e.change??0)*1e4)/100,marketCap:e.cmc??null,fundflow:e.fundflow??null,isCore:!!e.is_core,reason:e.assoc_desc||""}));return{items:t,total:t.length}}var Co={concept:"cn_concept",industry:"industry",region:"region",tszs:"tszs"},ki={cn_concept:"\u6982\u5FF5",industry:"\u884C\u4E1A",region:"\u533A\u57DF",tszs:"\u7279\u8272"};function xi(n){return{items:n.map(t=>({code:t.code||"",name:t.name||"",type:t.type||""})),total:n.length}}function vo(n){return{items:n.map(t=>({code:t.thscode||"",name:t.name||""})),total:n.length}}function qo(n){return n.command({command:"sector [code]",describe:"\u677F\u5757\u5DE5\u4F5C\u6D41\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u5F02\u52A8 anchor / \u6392\u884C rank / \u4E2A\u80A1\u6240\u5C5E\u677F\u5757 plate / \u6210\u5206\u80A1 stocks",builder:t=>t.positional("code",{type:"string",describe:"\u677F\u5757\u7801(cls*)\u2192\u6210\u5206\u80A1 / \u80A1\u7968\u7801\u2192\u6240\u5C5E\u677F\u5757"}).strictCommands(!1).command("anchor [date]","\u76D8\u4E2D\u5F02\u52A8\u65F6\u95F4\u8F74\uFF1A\u5F53\u65E5\u62C9\u5347/\u8DF3\u6C34\u7684\u677F\u5757(cls*\u7801\u53EF\u4E0B\u94BB)\u4E0E\u4E2A\u80A1",e=>e.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async e=>{let r=e.date||M(),o=await sn({date:r});l({data:o,command:`sector anchor ${r}`,source:"cls",toJSON:_i})}).command("rank","\u677F\u5757\u6DA8\u8DCC\u6392\u884C\uFF08\u4EC5\u5F53\u65E5\u70ED\u95E8\uFF0C\u7EA6 6~10 \u6761\uFF1B\u770B\u5168\u5929\u5F02\u52A8\u8FC7\u7A0B\u7528 sector anchor\uFF09",e=>e.option("type",{alias:"t",type:"string",default:"industry",describe:"industry(\u884C\u4E1A) / concept(\u6982\u5FF5)"}),async e=>{let{t:r="industry"}=e,o=await Ke({type:r}),a=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector rank -t ${r}`,source:"cls",toJSON:()=>To(a,r)})}).command("plate <code>","\u4E2A\u80A1\u6240\u5C5E\u677F\u5757\uFF08\u8FD4\u56DE plate code\uFF0C\u4F9B stocks \u4E0B\u94BB\uFF09",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async e=>{let r=e.code,o=await Ve(r),a=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector plate ${r}`,source:"cls",toJSON:()=>Eo(a)})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08cls \u677F\u5757\u7801\u6216 88xxxx.TI \u6307\u6570\u7801\u5747\u53EF\uFF09",e=>e.positional("plate_code",{type:"string",describe:"\u677F\u5757\u7801\uFF0C\u5982 cls80605 / 885431.TI / 886042"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async e=>{let{way:r="change"}=e,o=e.plate_code;if(/^88\d{4}(\.TI)?$/i.test(o.trim())||/\.TI$/i.test(o.trim())){let s=await St(o),i=s?.item||[];l({data:s,command:`sector stocks ${o}`,source:"fuyao",toJSON:()=>vo(i)});return}let a=await Ze(o,{way:r});l({data:a,command:`sector stocks ${o}`,source:"cls",toJSON:Po})}).command("search [name]","\u6309\u540D\u79F0\u641C\u677F\u5757\uFF08\u540C\u82B1\u987A\u6982\u5FF5/\u884C\u4E1A\u76EE\u5F55\uFF09\u2192 88xxxx.TI \u7801\uFF0C\u4F9B stocks \u4E0B\u94BB\u4E0E quote \u53D6\u6307\u6570\u884C\u60C5",e=>e.positional("name",{type:"string",describe:"\u677F\u5757\u540D\u79F0\u5173\u952E\u8BCD\uFF08\u5B50\u4E32\u5339\u914D\uFF09\uFF0C\u5982 \u4EBA\u5DE5\u667A\u80FD\uFF1B\u7701\u7565\u5219\u5217\u51FA\u76EE\u5F55"}).option("type",{alias:"t",type:"string",choices:["concept","industry","region","tszs"],describe:"\u76EE\u5F55\u7C7B\u578B\uFF1B\u7701\u7565\u65F6\u641C\u7D22\u9ED8\u8BA4\u67E5 \u6982\u5FF5+\u884C\u4E1A"}),async e=>{let{n:r=30}=e,o=String(e.name||"").trim(),a=e.type||e.t,s=a?[a]:o?["concept","industry"]:["concept"],i=await Promise.all(s.map(m=>or(Co[m]))),c=new Set,u=[];i.forEach((m,p)=>{for(let d of m?.item||[]){let g=d.thscode||"";c.has(g)||(c.add(g),(!o||String(d.name||"").includes(o))&&u.push({code:g,name:d.name||"",type:ki[Co[s[p]]]||s[p]}))}}),l({data:{hits:u},command:`sector search${o?` ${o}`:""}`,source:"fuyao",toJSON:()=>xi(u.slice(0,r))})}),handler:async t=>{let{code:e}=t;if(e)if(/^88\d{4}(\.TI)?$/i.test(e.trim())){let r=await St(e),o=r?.item||[];l({data:r,command:`sector ${e}`,source:"fuyao",toJSON:()=>vo(o)})}else if(/^cls/i.test(e)){let r=await Ze(e,{way:"change"});l({data:r,command:`sector ${e}`,source:"cls",toJSON:Po})}else{let r=await Ve(e),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:`sector ${e}`,source:"cls",toJSON:()=>Eo(o)})}else{let r=await Ke({type:"industry"}),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:"sector",source:"cls",toJSON:()=>To(o,"industry")})}}})}import{inflateSync as Ni}from"zlib";var Oi="wss://wss-flash-2.jin10.com/",Je={DATA:0,HOLIDAY:1,EVENT:2,HOLIDAY_PAGE:3,A_SHARE:4,FIVE_STAR:5,QH_DATA:6,QH_HOLIDAY:7,QH_EVENT:8,US_DATA:9,US_HOLIDAY:10,US_EVENT:11,HK_DATA:12,HK_HOLIDAY:13,HK_EVENT:14},Le={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},le=class{buffer;dv;pos;constructor(t){this.buffer=t instanceof ArrayBuffer?t:t instanceof Uint8Array?t.buffer:new ArrayBuffer(2048),this.dv=new DataView(this.buffer),this.pos=0}w16L(t){this.dv.setInt16(this.pos,t,!0),this.pos+=2}wU16L(t){this.dv.setUint16(this.pos,t,!0),this.pos+=2}w32L(t){this.dv.setInt32(this.pos,t,!0),this.pos+=4}wU32L(t){this.dv.setUint32(this.pos,t,!0),this.pos+=4}wStrL(t){let e=Buffer.from(t,"utf-8");this.wU16L(e.length);for(let r=0;r<e.length;r++)this.dv.setUint8(this.pos++,e[r])}r16L(){let t=this.dv.getInt16(this.pos,!0);return this.pos+=2,t}rU16L(){let t=this.dv.getUint16(this.pos,!0);return this.pos+=2,t}rU32L(){let t=this.dv.getUint32(this.pos,!0);return this.pos+=4,t}rStrL(){let t=this.rU16L(),e=Buffer.from(this.buffer,this.pos,t).toString("utf-8");return this.pos+=t,e}toBuffer(){return this.buffer.slice(0,this.pos)}};function $o(n,t){let e;n instanceof Uint8Array?e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):e=new Uint8Array(n);let r=new Uint8Array(e.length),o=t.charCodeAt(0);for(let a=0;a<e.length;a++)r[a]=e[a]^t.charCodeAt((a+o)%t.length);return r.buffer}function Ai(n,t){return $o(n,t)}function Di(n){try{return Ni(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var Lt=class{ws=null;encryptKey="";requestId=Math.floor(Math.random()*1e6);userId;loginType;userLevel;userAgent;timeout;_pending=new Map;constructor(t={}){this.userId=t.userId||"",this.loginType=t.loginType||"calendar",this.userLevel=t.userLevel||1,this.userAgent=t.userAgent||"chrome",this.timeout=t.timeout||5e3}connect(){return new Promise((t,e)=>{let r=setTimeout(()=>{this.ws?.close(),e(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(Oi),this.ws.binaryType="arraybuffer",this.ws.onmessage=o=>{let a=o.data;if(!this.encryptKey){let u=new le(a);u.rU32L();let m=u.rU32L(),p=u.rU32L();this.encryptKey=`${p}.${m}`,this._sendLogin();return}let s=$o(a,this.encryptKey),i=new le(s),c=i.r16L();if(c===Le.LOGIN){clearTimeout(r),t();return}if(c===Le.CACHE_DATA){i.rU32L(),i.rStrL();let u=i.rU32L(),m=i.rStrL(),p=this._pending.get(u);if(p){this._pending.delete(u),clearTimeout(p.timer);try{let d=JSON.parse(m);if(d.data){let g=Di(d.data);p.resolve(g?JSON.parse(g):null)}else p.resolve(null)}catch(d){p.reject(d)}}}},this.ws.onerror=()=>{clearTimeout(r),e(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let t=new le;t.w16L(Le.LOGIN),t.w32L(parseInt(this.userId)||0),t.wStrL(""),t.wStrL(this.userAgent),t.w32L(this.userLevel),t.wStrL(this.loginType),this._send(t)}_send(t){let e=t.toBuffer(),r=this.encryptKey?Ai(e,this.encryptKey):e;this.ws.send(r)}_request(t,e){return new Promise((r,o)=>{let a=this.requestId++,s=setTimeout(()=>{this._pending.delete(a),o(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(a,{resolve:r,reject:o,timer:s});let i=new le;i.w16L(Le.CACHE_DATA),i.wU32L(t),i.wStrL(e),i.wU32L(a),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(t){return this._request(Je.QH_DATA,t)}getHKStockData(t){return this._request(Je.HK_DATA,t)}getUSStockData(t){return this._request(Je.US_DATA,t)}getAShareData(t={}){let e=[];return t.page&&e.push(`page=${t.page}`),t.limit!=null&&e.push(`limit=${t.limit}`),t.region&&e.push(`region=${t.region}`),t.star!=null&&e.push(`star=${t.star}`),t.determine!=null&&e.push(`determine=${t.determine}`),this._request(Je.A_SHARE,e.join("&"))}};async function jo(n){let t=new Lt(n);return await t.connect(),t}async function Ut(n,...t){let e=await jo();try{return await e[n](...t)}finally{e.close()}}function Ue(n){return{items:n.map(t=>({time:t.pub_time||"",indicator:t.indicator_name||t.name||"",importance:t.star??0,previous:t.previous??null,consensus:t.consensus??null,actual:t.actual??null,country:t.country||""})),total:n.length}}function Ti(n){let t=n?.data||[];return{items:t.map(e=>({time:e.event_time||"",country:e.country||"",importance:e.star??0,event:e.event_content||"",people:e.people||""})),total:t.length}}function Ei(n){let t=n?.data?.data||n?.data,e=Array.isArray(t)?t:t?Object.values(t):[];return{items:e.map(r=>({date:(r.date||"").slice(5,16),market:r.exchange_name||"",name:r.name||"",note:r.rest_note||""})),total:e.length}}function Pi(n){let t=n?.data||[];return{items:t.map(e=>({date:(e.date||"").slice(5,16),event:e.event||"",importance:e.star??0,stocks:(e.stocks||[]).map(r=>({name:r.name,code:r.code})),regions:(e.region||[]).map(r=>({name:r.name}))})),total:t.length}}function Ci(n){let t=n?.data||[];return{items:t.map(e=>({time:e.public_time||"",country:e.country||"",event:e.eventcontent||""})),total:t.length}}function vi(n){let t=n?.data||[];return{items:t.map(e=>({time:e.holiday_time||"",country:e.country||"",market:e.market||"",name:e.holiday_name||"",description:e.description||""})),total:t.length}}function qi(n){let t=n?.data||[];return{items:t.map(e=>({time:e.time_show||"",country:e.country||"",indicator:e.name||"",importance:e.star??0,previous:e.previous??null,consensus:e.consensus??null,actual:e.actual??null,unit:e.unit||"",impact:e.qh_affect_text||""})),total:t.length}}function Io(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:t=>t.strictCommands(!1).command("trading","A\u80A1\u4EA4\u6613\u65E5\u5386\uFF08\u6276\u6447\u5B98\u65B9\uFF0C\u8FD1\u4E00\u5E74\u4EA4\u6613\u65E5\u5E8F\u5217\uFF09",e=>e,async()=>{let e=await ir(),r=e?.item||[];l({data:e,command:"calendar trading",source:"fuyao",toJSON:()=>({items:r.map(o=>({date:/^\d{8}$/.test(o.date||"")?`${o.date.slice(0,4)}-${o.date.slice(4,6)}-${o.date.slice(6,8)}`:o.date})),total:r.length})})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||M(),o=ee(),a=await it(r,"cj",o?{cookie:o}:void 0);l({data:a,command:`calendar macro ${r}`,source:"jin10",toJSON:s=>Ue(s?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||M(),o=ee(),a=await Cn(r,"cj",o?{cookie:o}:void 0);l({data:a,command:"calendar event",source:"jin10",toJSON:Ti})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||M(),o=ee(),a=await vn(r,"cj",o?{cookie:o}:void 0);l({data:a,command:"calendar holiday",source:"jin10",toJSON:Ei})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async()=>{let e=await Ut("getAShareData",{page:1});l({data:e,command:"calendar ashare",source:"jin10",toJSON:Pi})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||M(),o=await Ut("getHKStockData",r);l({data:o,command:"calendar hk",source:"jin10",toJSON:a=>Ue(Array.isArray(a)?a:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||M(),o=await Ut("getUSStockData",r);l({data:o,command:"calendar us",source:"jin10",toJSON:a=>Ue(Array.isArray(a)?a:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||M(),o=await Ln(r);l({data:o,command:`calendar future-event ${r}`,source:"jin10",toJSON:Ci})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||M(),o=await Un(r);l({data:o,command:`calendar future-holiday ${r}`,source:"jin10",toJSON:vi})}).command("futures [date]","\u671F\u8D27\u4EA7\u4E1A\u6570\u636E\u65E5\u5386\uFF08jin10 qihuo\uFF1A\u9A6C\u68D5\u6CB9\u51FA\u53E3/\u68C0\u9A8C\u91CF\u7B49\uFF09",e=>e,async e=>{let r=e.date||M(),o=await Jn(r);l({data:o,command:`calendar futures ${r}`,source:"jin10",toJSON:qi})}),handler:async()=>{let t=M(),e=ee(),r=await it(t,"cj",e?{cookie:e}:void 0);l({data:r,command:`calendar macro ${t}`,source:"jin10",toJSON:o=>Ue(o?.data||[])})}})}import{writeFileSync as Wi}from"fs";var $i="wss://market-ws.jin10.com/";function ji(n,t){if(t+2>n.length)return null;let e=n.readUInt16LE(t);return t+=2,t+e>n.length?null:{str:n.subarray(t,t+e).toString("utf8"),end:t+e}}function Y(n,t){return Number(n.readBigInt64LE(t))}function Ii(n){if(n.length<2)return null;let t=2,e=ji(n,t);if(!e)return null;let r=e.str;if(t=e.end,t+76>n.length)return null;let o=Y(n,t)/1e6,a=Y(n,t+8)/1e6;Y(n,t+16);let s=Y(n,t+24),i=Y(n,t+32)/1e6,c=Y(n,t+40)/1e6,u=Y(n,t+48)/1e6,m=Y(n,t+56)/1e6,p=Y(n,t+64),d=n.readUInt32LE(t+72),g=r.split(".")[1],y=pe.includes(g),h=null,S=t+76;y&&S<n.length&&n[S]===1&&(h=Y(n,S+1)/1e6);let w=h??m,_=o-w,N=w?_/w*100:0;return{code:r,snap:{code:r,close:o,prevClose:a,high:i,low:u,open:c,preclose:w,base:w,change:_,changePercent:N,openInterest:s,turnover:p,timestamp:d}}}function Mo(n,t={}){let e=t.freq??2e3,r=t.timeout??8e3;return new Promise((o,a)=>{if(!n.length)return o(new Map);let s=new Set(n),i=new Map,c=new WebSocket($i);c.binaryType="arraybuffer";let u=setTimeout(()=>{try{c.close()}catch{}o(i)},r);c.onopen=()=>{let m=[],p=Buffer.alloc(8);p.writeUInt16LE(10003,0),p.writeUInt32LE(e,2),p.writeUInt16LE(Math.min(n.length,40),6),m.push(p);for(let d of n.slice(0,40)){let g=Buffer.from(d,"utf8"),y=Buffer.alloc(2);y.writeUInt16LE(g.length),m.push(y,g)}c.send(Buffer.concat(m))},c.onmessage=m=>{try{let p=Buffer.from(m.data);if(p.length<2)return;let d=p.readUInt16LE(0);if(d===1100)return;if(d===1200){c.send(Buffer.alloc(0));return}if(d!==10005)return;let g=Ii(p);if(!g)return;if(s.has(g.code)&&i.set(g.code,g.snap),i.size>=s.size){clearTimeout(u);try{c.close()}catch{}o(i)}}catch{}},c.onerror=()=>{clearTimeout(u),o(i)}})}import Mi from"https";import{gunzipSync as Ro}from"zlib";var Jo="wss://tm-qtg.jiaoyixia.com",Ri="https://jiaoyixia-market.jin10.com",Ht={"1m":{kind:"oss",code:1,sec:60,intraday:!0},"5m":{kind:"oss",code:2,sec:300,intraday:!0},"30m":{kind:"oss",code:3,sec:1800,intraday:!0},"60m":{kind:"oss",code:4,sec:3600,intraday:!0},d:{kind:"oss",code:5,sec:86400,intraday:!1},w:{kind:"oss",code:6,sec:604800,intraday:!1},m:{kind:"oss",code:7,sec:2592e3,intraday:!1},y:{kind:"oss",code:9,sec:31536e3,intraday:!1},"10m":{kind:"agg",from:"5m",factor:2,sec:600},"15m":{kind:"agg",from:"5m",factor:3,sec:900},"120m":{kind:"agg",from:"60m",factor:2,sec:7200}},fl=Object.fromEntries(Object.entries(Ht).flatMap(([n,t])=>t.kind==="oss"?[[n,t.code]]:[])),Ji=Object.keys(Ht).join("/");function Li(n,t){let e=[];for(let r of n){let o=Math.floor(Date.parse(r.date)/1e3);if(!Number.isFinite(o))continue;let a=Math.floor(o/t)*t,s=new Date(a*1e3).toISOString(),i=e[e.length-1];!i||i.date!==s?e.push({date:s,open:r.open,high:r.high,low:r.low,close:r.close,volume:r.volume}):(i.high=Math.max(i.high,r.high),i.low=Math.min(i.low,r.low),i.close=r.close,i.volume+=r.volume)}return e}function me(n,t){let e=Buffer.alloc(n.length);for(let r=0;r<n.length;r++)e[r]=n[r]^t.charCodeAt(r%t.length);return e}var Oe=class{buf=Buffer.alloc(4096);pos=0;wU16(t){return this.buf.writeUInt16LE(t,this.pos),this.pos+=2,this}wU8(t){return this.buf.writeUInt8(t,this.pos),this.pos+=1,this}wI8(t){return this.buf.writeInt8(t,this.pos),this.pos+=1,this}wU32(t){return this.buf.writeUInt32LE(t,this.pos),this.pos+=4,this}wI64(t){return this.buf.writeBigInt64LE(BigInt(t),this.pos),this.pos+=8,this}wStr(t){let e=Buffer.from(t,"utf8");return this.wU16(e.length),e.copy(this.buf,this.pos),this.pos+=e.length,this}toBuffer(){return this.buf.subarray(0,this.pos)}};function Lo(){return new Oe().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function Ui(n,t,e,r=8e3){return new Promise((o,a)=>{let s=new WebSocket(Jo);s.binaryType="arraybuffer";let i="",c=!1,u=(p,d)=>{if(!c){c=!0,clearTimeout(m);try{s.close()}catch{}p?a(p):o(d)}},m=setTimeout(()=>u(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),r);s.onopen=()=>{let p=Buffer.alloc(6);p.writeInt16LE(912,0),p.writeInt32LE(3063,2),s.send(p)},s.onmessage=p=>{try{let d=Buffer.from(p.data);if(!i){if(d.length<4)return;i=d.readUInt32LE(0).toString(),s.send(me(Lo(),i));return}if(d.length<2)return;let g=me(d,i),y=g.readUInt16LE(0);if(y===21100){setTimeout(()=>{let h=new Oe().wU16(10006).wStr(n).wU8(t).wI64(e).wU16(0).wU8(0);s.send(me(h.toBuffer(),i))},400);return}if(y===10006){let h=g.toString("utf8"),S=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,w=[],_;for(;_=S.exec(h);)w.push({hash:_[1],count:+_[2],start:+_[3],end:+_[4],idx:+_[5]});u(null,w)}}catch{}},s.onerror=()=>u(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function Fe(n,t,e,r={}){let o=r.attempts??1;for(let a=0;a<o;a++)try{return await Ui(n,t,e,r.timeout)}catch{a<o-1&&await new Promise(s=>setTimeout(s,300))}return null}async function Fi(n,t,e,r={}){return await Fe(n,t,e,{attempts:r.attempts??3,timeout:r.timeout})??[]}function Hi(n){let t=Math.floor(n.length/48),e=[];for(let r=0;r<t;r++){let o=r*48;e.push({date:new Date(Number(n.readBigUInt64LE(o))*1e3).toISOString(),high:Number(n.readBigInt64LE(o+8))/1e6,open:Number(n.readBigInt64LE(o+16))/1e6,low:Number(n.readBigInt64LE(o+24))/1e6,close:Number(n.readBigInt64LE(o+32))/1e6,volume:Number(n.readBigInt64LE(o+40))})}return e}function Uo(n,t,e){let r=`${Ri}/${n}/${t}/${e}`;return new Promise(o=>{let a=()=>o([]);Mi.get(r,i=>{if(i.statusCode&&i.statusCode>=300&&i.statusCode<400&&i.headers.location&&i.headers.location!==r)return i.resume(),o(Uo(n,t,e));if(!i.statusCode||i.statusCode>=400)return i.resume(),a();let c=[];i.on("data",u=>c.push(u)),i.on("end",()=>{try{o(Hi(Ro(Buffer.concat(c))))}catch{a()}}),i.on("error",a)}).on("error",a)})}var Yi=86400;async function Yt(n,t,e){let r=Ht[n];if(!r)throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F: ${n}\uFF08\u652F\u6301 ${Ji}\uFF09`);let o=ne(t);if(r.kind==="agg"){let a=await Yt(r.from,o,e*r.factor);return{code:o,candles:Li(a.candles,r.sec).slice(-e),source:a.source}}try{let s=[...r.intraday?await Ki(o,r.code):await zi(o,r.code)].sort((u,m)=>m.start-u.start),i=[],c=new Set;for(let u of s){if(i.length>=e)break;if(c.has(u.hash))continue;c.add(u.hash);let m=await Uo(o,r.code,u.hash);for(let p of m)i.some(d=>d.date===p.date)||i.push(p)}return i.sort((u,m)=>u.date<m.date?-1:1),{code:o,candles:i.slice(-e),source:"jin10 tm-qtg"}}catch{return{code:o,candles:[],source:"jin10 tm-qtg"}}}var Bi=new Set(["SHF","DCE","CZC","CF","INE","GFEX"]);function Fo(n,t){let e=n.readUInt16LE(t);return{str:n.toString("utf8",t+2,t+2+e),next:t+2+e}}function Ho(n,t){let e=t,{str:r,next:o}=Fo(n,e);e=o;let a=n.readInt32LE(e);e+=4;let s=n.readUInt32LE(e);e+=4;let i=n.readUInt8(e);e+=1;let c=[0,1,2,3].map(g=>n.readDoubleLE(e+g*8)/1e6);e+=32;let u=[0,1,2].map(g=>n.readUInt32LE(e+g*4));e+=12;let m=n.readUInt16LE(e);e+=2;let p=[];for(let g=0;g<m;g++)p.push({price:n.readDoubleLE(e)/1e6,vol1:n.readUInt32LE(e+8),vol2:n.readUInt32LE(e+12)}),e+=16;let d=r.includes(".")?r.slice(r.lastIndexOf(".")+1):"";return{record:{code:r,seq:a,timestamp:s,flag:i,prices:c,counts:u,levels:p,volOrder:Bi.has(d.toUpperCase())?"domestic":"international"},next:e}}function Xi(n){let t=n.readUInt32LE(1),e=5,r=[];for(let o=0;o<t;o++){let a=n.readUInt16LE(e);e+=2;let{record:s}=Ho(n.subarray(e,e+a),0);r.push(s),e+=a}return{records:r,hasMore:e<n.length?n.readUInt8(e)>0:!1}}function Yo(n,t){let e=ne(n);return new Promise((r,o)=>{let a=new WebSocket(Jo);a.binaryType="arraybuffer";let s="",i=!1,c=!1,u,m=[],p=0,d=0,g=Date.now(),y=S=>{if(!i){i=!0,clearTimeout(h),clearTimeout(u);try{a.close()}catch{}S?o(S):r({symbol:e,records:m,batches:p,singles:d,durationMs:Date.now()-g})}},h=setTimeout(()=>y(m.length?null:new Error("tm-qtg 10027 \u8BA2\u9605\u8D85\u65F6\uFF08\u65E0\u6570\u636E\u63A8\u9001\uFF09")),t+15e3);a.onopen=()=>{let S=Buffer.alloc(6);S.writeInt16LE(912,0),S.writeInt32LE(3063,2),a.send(S)},a.onmessage=S=>{try{let w=Buffer.from(S.data);if(!s){if(w.length<4)return;s=w.readUInt32LE(0).toString(),a.send(me(Lo(),s));return}if(w.length<2)return;let _=me(w,s),N=_.readUInt16LE(0);if(N===21100){setTimeout(()=>{let k=new Oe().wU16(10027).wU32(0).wStr(e).wStr("").wI8(1);a.send(me(k.toBuffer(),s))},400);return}if(N===10027){if(_.length>=4&&_.readUInt16LE(2)===64e3)return y(new Error("\u8D85\u8FC7\u53EF\u8BA2\u9605\u7684\u6570\u91CF\u4E0A\u9650\uFF0864000\uFF09"));c||(c=!0,u=setTimeout(()=>y(null),t));return}if(N===10025){let{record:k}=Ho(_.subarray(2),0);m.push(k),d++;return}if(N===10026){let k=2,{next:P}=Fo(_,k);k=P;let q=Number(_.readBigUInt64LE(k));k+=8;let Q=Ro(_.subarray(k,k+q)),{records:V}=Xi(Q);m.push(...V),p++;return}}catch{}},a.onerror=()=>{m.length||y(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"))}})}var Gi=[1,2,4,8,16,32,64,128,256,512,1024,2048];async function Ft(n,t,e){let r=0;for(let o of Gi){let a=await Fe(n,t,e-o*Yi,{attempts:1,timeout:3500});if(a&&(r++,a.length))return{files:a,allSilent:!1}}return{files:[],allSilent:r===0}}async function Ki(n,t){let e=Math.floor(Date.now()/1e3),r=await Fe(n,t,e,{attempts:2,timeout:5e3});if(r&&r.length)return r;let o=()=>Fe(n,t,0,{attempts:1,timeout:4500});if(r===null){let i=await o();if(!i||!i.length)return i??[];let c=await Ft(n,t,e);return c.files.length?c.files:i}let a=await Ft(n,t,e);if(a.files.length)return a.files;if(a.allSilent){let i=await Ft(n,t,e);if(i.files.length)return i.files}return await o()??[]}async function zi(n,t,e=12){let r=[],o=new Set,a=0;for(let s=0;s<e;s++){let i=await Fi(n,t,a);if(!i.length)break;let c=0;for(let m of i)o.has(m.hash)||(o.add(m.hash),r.push(m),c++);if(c===0)break;a=Math.max(...i.map(m=>m.end))}return r}var Qi=["i9888.DCE","SA888.CZC","rb888.SHF","cu888.SHF","au888.SHF","XAUUSD.GOODS","USOIL.GOODS","DXY.NYF","EURUSD.FXCM","USDCNH.FXCM","SPX.INDEX","HSI.INDEX"];function Vi(n){return{code:n.code,price:n.close,change:n.change,changePercent:Math.round(n.changePercent*100)/100,open:n.open,high:n.high,low:n.low,preclose:n.preclose,openInterest:n.openInterest||null,turnover:n.turnover||null,timestamp:n.timestamp?new Date(n.timestamp*1e3).toISOString():""}}function Zi(n){let t=n?.data||{},e=t.include_types||[];return{product:{id:t.id??null,name:t.name||"",subcode:t.subcode||"",exchange:t.exchange||"",unit:t.unit||""},tagGroups:e.map(r=>({type:r.type||"",tags:(r.tags||[]).map(o=>({id:o.id,name:o.name||""}))})),totalTags:e.reduce((r,o)=>r+(o.tags?.length||0),0),hint:"\u53D6\u67D0\u6307\u6807\u6570\u636E\u5E8F\u5217: price f10 <code> --tag <tag_id>"}}function ec(n){let t=n?.data||{};return{name:t.name||"",xAxis:t.x_axis||[],series:t.series??null,start:t.start??null,end:t.end??null,splitByYear:!!t.split_by_year,points:(t.x_axis||[]).length}}async function tc(n,t){let e=Rn(n);if(!e.ok)return l({data:{error:e.error},command:`price f10 ${n}`,source:"jin10"});let{code:r,subcode:o,exchange:a}=e;if(t!==void 0){let i=await Mn(t);return i?.status&&i.status!==200?l({data:{error:i.message||`tag ${t} \u67E5\u8BE2\u5931\u8D25`},command:`price f10 ${r} --tag ${t}`,source:"jin10"}):l({data:i,command:`price f10 ${r} --tag ${t}`,source:"jin10 futures-report",toJSON:ec})}let s=await In(o,a);if(s?.status&&s.status!==200)return l({data:{error:`${s.message||"\u67E5\u8BE2\u5931\u8D25"}\uFF08subcode=${o} exchange=${a}\uFF09`},command:`price f10 ${r}`,source:"jin10"});l({data:s,command:`price f10 ${r}`,source:"jin10 futures-report",toJSON:Zi})}function Bo(n){return n.command("price [codes...]","\u5B9E\u65F6\u884C\u60C5\uFF1A\u56FD\u5185\u671F\u8D27\u4E3B\u529B / \u73B0\u8D27\u5546\u54C1 / \u5916\u6C47 / \u6307\u6570\uFF08market-ws\uFF09",t=>t.positional("codes",{type:"string",array:!0,describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u522B\u540D GOLD/SP500/WTI \u4E0E\u88F8\u7801 XAUUSD \u81EA\u52A8\u5F52\u4E00\u5316\uFF09\uFF1B\u7701\u7565\u5219\u663E\u793A\u9ED8\u8BA4\u770B\u76D8\u5217\u8868"}).strictCommands(!1).command("search <keyword>","\u54C1\u79CD\u641C\u7D22\uFF1A\u4E2D\u6587\u540D/\u4EE3\u7801 \u2192 CODE.EXCHANGE\uFF08\u672C\u5730\u54C1\u79CD\u5E93\uFF0C\u9996\u6B21\u81EA\u52A8\u4E0B\u8F7D\u7F13\u5B58\uFF09",e=>e.positional("keyword",{type:"string",describe:"\u5173\u952E\u8BCD\uFF1AXAUUSD / \u9EC4\u91D1 / \u94C1\u77FF\u77F3\u4E3B\u529B / KS11"}).option("number",{alias:"n",type:"number",default:20,describe:"\u8FD4\u56DE\u6761\u6570"}).option("type",{alias:"t",type:"string",describe:"\u6309\u5206\u7C7B\u8FC7\u6EE4\uFF1A\u8BA2\u5355\u6D41/\u6CAA\u6DF1\u80A1\u5E02/\u56FD\u5185\u671F\u8D27/\u56FD\u5185\u671F\u6743/\u5546\u54C1\u5916\u6C47/\u5168\u7403\u80A1\u6307/\u56FD\u9645\u671F\u8D27/\u4E0A\u6D77\u9EC4\u91D1/\u5176\u5B83"}),async e=>{let r=e.keyword,o=e.n??20,a=e.t;try{let s=await bn(),i=Sn(s,r,{limit:o,typeFilter:a});l({data:i,command:`price search ${r}${a?" -t "+a:""}`,source:"jin10 symbolist",toJSON:c=>({items:c,total:c.length})})}catch(s){l({data:{error:s.message},command:`price search ${r}`,source:"jin10 symbolist"})}}).command("orderflow <code>","\u8BA2\u5355\u6D41\uFF1A\u9010\u7B14\u4E70\u5356\u76D8\u4EF7\u91CF\u91C7\u96C6\uFF08tm-qtg VolTick\uFF0C\u5168\u6570\u636E\u5199\u6587\u4EF6\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08\u5982 XAUUSD.BANK / GC.FFE / au888.SHF\uFF0C\u8303\u56F4\u89C1 volTick2.csv \u4E0E\u300C\u8BA2\u5355\u6D41\u300D\u5206\u7C7B\uFF09"}).option("seconds",{alias:"s",type:"number",default:10,describe:"\u91C7\u96C6\u79D2\u6570"}).option("out",{type:"string",describe:"\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4 ./finflow-orderflow-<code>-<\u65F6\u95F4\u6233>.json\uFF09"}),async e=>{let r=e.code,o=Math.max(1,Math.min(120,e.s??10)),a=e.out,s=await Yo(r,o*1e3),i=a??`finflow-orderflow-${code.replace(/[^A-Za-z0-9.()-]/g,"_")}-${new Date().toISOString().replace(/[-:]/g,"").slice(0,14)}.json`;Wi(i,JSON.stringify({code:s.symbol,durationMs:s.durationMs,batches:s.batches,singles:s.singles,records:s.records},null,2)),l({data:{code:s.symbol,file:i,records:s.records.length,batches:s.batches,singles:s.singles,durationMs:s.durationMs,hint:"\u5B8C\u6574\u9010\u7B14\u8BB0\u5F55\u5DF2\u5199\u5165 file\uFF08JSON\uFF0Crecords[].levels \u4E3A\u591A\u6863\u4EF7\u91CF\uFF0CvolOrder \u6807\u8BB0\u56FD\u5185/\u56FD\u9645\u5B57\u6BB5\u5E8F\uFF09"},command:`price orderflow ${r} -s ${o}`,source:"jin10 tm-qtg VolTick"})}).command("f10 <code>","\u671F\u8D27\u54C1\u79CD\u57FA\u672C\u9762\u6863\u6848\uFF08\u4F9B\u7ED9/\u9700\u6C42/\u5E93\u5B58\u7B49\u6307\u6807\uFF1B--tag \u53D6\u6570\u636E\u5E8F\u5217\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08\u5982 i9888.DCE / rb888.SHF / \u88F8\u7801 rb888\uFF1B\u4E3B\u529B\u540E\u7F00\u81EA\u52A8\u5265\u79BB\uFF0C\u4EC5\u56FD\u5185\u671F\u8D27\uFF09"}).option("tag",{type:"number",describe:"tag id\uFF08\u6765\u81EA\u4E0D\u5E26 --tag \u7684\u8F93\u51FA\uFF09\uFF0C\u8F93\u51FA\u8BE5\u6307\u6807\u7684\u5386\u53F2\u6570\u636E\u5E8F\u5217"}),async e=>{await tc(e.code,e.tag)}).command("kline [code]","K\u7EBF\u5386\u53F2\uFF08\u671F\u8D27/\u5546\u54C1/\u5916\u6C47/\u6307\u6570\uFF0Ctm-qtg + OSS\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u522B\u540D/\u88F8\u7801\u81EA\u52A8\u5F52\u4E00\u5316\uFF09"}).option("period",{alias:"p",type:"string",default:"d",describe:"\u5468\u671F: d/w/m/y \u6216 1m/5m/10m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly \u7B49\u5168\u8BCD\uFF09"}).option("number",{alias:"n",type:"number",default:120,describe:"K\u7EBF\u6839\u6570"}),async e=>{let r=e.code;if(!r)return l({data:{error:"\u8BF7\u63D0\u4F9B\u54C1\u79CD\u4EE3\u7801\uFF0C\u4F8B\u5982: price kline XAUUSD.GOODS"},command:"price kline",source:"jin10 tm-qtg"});let{p:o="d",n:a=120}=e,s;try{s=Me(o)}catch(m){return l({data:{error:m.message},command:`price kline ${r} -p ${o}`,source:"finflow"})}let{code:i,candles:c,source:u}=await Yt(s,r,a);l({data:{code:i,period:s,items:c,total:c.length},command:`price kline ${i} -p ${s}`,source:u})}),async t=>{let e=t.codes||[],r=e.length?wn(e.map(i=>i.trim()).filter(Boolean)):Qi,o=await Mo(r),a=r.map(i=>o.get(i)).filter(i=>!!i).map(Vi),s=r.filter(i=>!o.has(i));l({data:a,command:`price ${e.length?e.join(" "):"(\u9ED8\u8BA4\u770B\u76D8\u5217\u8868)"}`,source:"jin10 market-ws",toJSON:i=>({items:i,total:i.length,...s.length?{missing:s,hint:"\u4EE3\u7801\u672A\u8FD4\u56DE\u5FEB\u7167\uFF1A\u53EF\u7528 `price search <\u5173\u952E\u8BCD>` \u67E5\u6B63\u786E\u4EE3\u7801\uFF08\u5927\u5C0F\u5199\u654F\u611F\u5DF2\u7531\u5F52\u4E00\u5316\u5904\u7406\uFF0C\u672A\u547D\u4E2D\u591A\u4E3A\u65E0\u5B9E\u65F6\u63A8\u9001\u7684\u54C1\u79CD\uFF09"}:{}})})})}var Xo={fuyao:async()=>{let t=(await be(["600519.SH"]))?.item?.[0];return t?{ok:!0,sample:{thscode:t.thscode,lastPrice:t.last_price,changePercent:Math.round((t.price_change_ratio_pct??0)*100)/100}}:{ok:!0,sample:null}}};function Go(n){let t=ge(n.id);return{source:n.id,name:n.name,describe:n.describe,envVar:n.env,configured:!!t,origin:t?.origin??null,key:t?bt(t.key):null,path:ue(n.id)}}function He(n){let t=String(n.source||"").trim().toLowerCase(),e=ht(t);if(!e)throw new Error(`\u672A\u77E5\u6570\u636E\u6E90 "${t}"\u3002\u5F53\u524D\u652F\u6301:${F.map(r=>r.id).join(", ")}`);return e.id}function Ko(n){return n.command({command:"key",describe:"API key \u7BA1\u7406\uFF08\u591A\u6570\u636E\u6E90\u901A\u7528\uFF09\uFF1Aset / show / clear / test",builder:t=>t.strictCommands(!1).command("set <source> <key>","\u4FDD\u5B58\u6570\u636E\u6E90 API key \u5230 ~/.finflow/keys/<source>\uFF08chmod 600\uFF0C\u4E00\u6B21\u914D\u7F6E\u957F\u671F\u6709\u6548\uFF09",e=>e.positional("source",{type:"string",describe:`\u6570\u636E\u6E90\uFF1A${F.map(r=>r.id).join(" / ")}`}).positional("key",{type:"string",describe:"API key"}),async e=>{let r=He(e),o=String(e.key||"").trim();if(!o)throw new Error("\u7F3A\u5C11 key \u53C2\u6570\uFF1Afinflow key set <source> <key>");let a=Vn(r,o);l({data:{saved:!0,source:r,path:a,key:bt(o)},command:`key set ${r}`,source:"finflow"})}).command("show [source]","\u67E5\u770B key\uFF08\u8131\u654F\uFF09\u53CA\u6765\u6E90\uFF1B\u7701\u7565 source \u67E5\u770B\u5168\u90E8",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90\uFF1B\u7701\u7565=\u5168\u90E8"}),async e=>{let r=e.source?He(e):null,o=r?F.filter(a=>a.id===r):F;l({data:{items:o.map(Go),total:o.length},command:`key show${r?` ${r}`:""}`,source:"finflow"})}).command("clear <source>","\u5220\u9664\u672C\u5730\u4FDD\u5B58\u7684 key\uFF08\u73AF\u5883\u53D8\u91CF\u4E0D\u53D7\u5F71\u54CD\uFF09",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90"}),async e=>{let r=He(e),o=Zn(r);l({data:{cleared:o,source:r,path:ue(r)},command:`key clear ${r}`,source:"finflow"})}).command("test [source]","\u8FDE\u901A\u6027\u81EA\u68C0\uFF1A\u7528\u5F53\u524D key \u5B9E\u8C03\u5404\u6E90\u8F7B\u91CF\u7AEF\u70B9\uFF1B\u7701\u7565 source \u68C0\u6D4B\u5168\u90E8\u5DF2\u914D\u7F6E\u6E90",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90\uFF1B\u7701\u7565=\u5168\u90E8\u5DF2\u914D\u7F6E"}),async e=>{let r=e.source?He(e):null,o=(r?F.filter(s=>s.id===r):F).filter(s=>Xo[s.id]),a=await Promise.all(o.map(async s=>{let i=ge(s.id);if(!i)return{source:s.id,ok:!1,configured:!1,error:`\u672A\u914D\u7F6E key\uFF1A\u8FD0\u884C finflow key set ${s.id} <key> \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ${s.env}`};try{let c=await Xo[s.id]();return{source:s.id,ok:!0,configured:!0,origin:i.origin,...c}}catch(c){return{source:s.id,ok:!1,configured:!0,origin:i.origin,error:c.message}}}));l({data:{items:a,total:a.length,allOk:a.every(s=>s.ok)},command:`key test${r?` ${r}`:""}`,source:"finflow"})}),handler:async()=>{l({data:{items:F.map(Go),total:F.length},command:"key",source:"finflow"})}})}function nc(n){return/\.OF$/i.test(n.trim())?"otc":"exchange"}function I(n,t){return{fund_type:n||nc(t),thscode:A(t)}}function Bt(n,t){return b("/api/fund/profile/detail",I(t,n))}function zo(n,t={}){return b("/api/fund/performance/nav",{...I(t.fundType,n),range:t.range,nav_type:t.navType})}function Wo(n,t){return b("/api/fund/performance/returns",I(t,n))}function Qo(n,t){return b("/api/fund/performance/drawdowns",I(t,n))}function Vo(n,t){return b("/api/fund/portfolio/holdings",I(t,n))}function Zo(n,t,e,r){return b("/api/fund/portfolio/stock-history",{...I(r,n),report_type:t,end_date:e})}function ea(n,t,e,r){return b("/api/fund/portfolio/bond-history",{...I(r,n),report_type:t,end_date:e})}function ta(n,t,e){return b("/api/fund/portfolio/stock-report-dates",{...I(e,n),report_type:t})}function na(n,t){return b("/api/fund/portfolio/asset-allocation",I(t,n))}function ra(n,t){return b("/api/fund/portfolio/industry-allocation",I(t,n))}function oa(n,t,e){return b("/api/fund/holders/detail",{...I(e,n),merge_scope:t})}function aa(n,t,e){return b("/api/fund/holders/top",{...I(e,n),limit:t})}function sa(n){return b("/api/fund/managers/detail",{manager_id:n})}function ia(n){return b("/api/fund/managers/investment-style",{manager_id:n})}function ca(n,t){return b("/api/fund/managers/performance",{manager_id:n,range:t})}function ua(n){return b("/api/fund/managers/experience",{manager_id:n})}function la(n){return b("/api/fund/companies/detail",{company_id:n})}function ma(n,t){return b("/api/fund/financials/indicators",I(t,n))}function da(n,t){return b("/api/fund/financials/income-statements",I(t,n))}function pa(n,t){return b("/api/fund/financials/balance-sheets",I(t,n))}function fa(n,t){return b("/api/fund/corporate-actions/dividends",I(t,n))}function ya(n,t){return b("/api/fund/diagnostics/detail",I(t,n))}function ga(n){return b("/api/fund/offerings/list",{subscribe:n})}function ha(n,t={}){return b("/api/fund/news/article-list",{...I(t.fundType,n),limit:t.limit,offset:t.offset})}function ba(n){return b("/api/fund/market/snapshot",{thscode:A(n)})}function Sa(n,t,e){return b("/api/fund/market/historical",{thscode:A(n),interval:"1d",start:t,end:e})}function T(n){return typeof n=="number"?new Date(n).toISOString():null}var x=n=>n==null?null:Math.round(n*100)/100;function R(n){return t=>n(t.option("type",{type:"string",choices:["otc","exchange","reits"],describe:"\u57FA\u91D1\u7C7B\u578B\uFF08\u9ED8\u8BA4\u6309\u4EE3\u7801\u63A8\u65AD\uFF1A.OF\u2192otc\uFF0C\u5176\u4F59\u2192exchange\uFF1BREITs \u9700\u663E\u5F0F\u6307\u5B9A\uFF09"}))}function v(n){return n.type||void 0}function oc(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",name:t.fund_name||"",established:T(t.estab_date),manager:t.manager_name||null,managerInfo:(t.manager_info||[]).map(e=>({id:e.manager_id??e.id??null,name:e.manager_name??e.name??null,returnPct:x(e.return_pct??e.profit??null),start:T(e.start_date_ms??e.start_ms)??e.start_date??null,end:T(e.end_date_ms??e.end_ms)??e.end_date??null})),company:t.mgmt_name||null,companyId:t.company_id||null,scale:t.fund_scale??null,unitNav:t.unit_nav??null,tradeRule:t.trade_rule||[],rateInfo:t.rate_info||[]}}function ac(n){let t=n?.item||[];return{items:t.map(e=>({date:T(e.nav_date)?.slice(0,10)??null,unitNav:e.unit_nav??null,adjNav:e.adj_nav??null})),total:t.length}}var wa=["week","month","tmonth","hyear","year","twoyear","tyear","fyear","nowyear","now"],_a={week:"\u8FD11\u5468",month:"\u8FD11\u6708",tmonth:"\u8FD13\u6708",hyear:"\u8FD1\u534A\u5E74",year:"\u8FD11\u5E74",twoyear:"\u8FD12\u5E74",tyear:"\u8FD13\u5E74",fyear:"\u8FD15\u5E74",nowyear:"\u4ECA\u5E74\u6765",now:"\u6210\u7ACB\u6765"};function sc(n){let t=n?.item?.[0]||{},e={};for(let r of wa){let o=t[`return_${r}`],a=t[`peer_average_${r}`],s=t[`rank_${r}`],i=t[`rank_total_${r}`];o===void 0&&a===void 0&&s===void 0||(e[_a[r]]={returnPct:x(o??null),peerAveragePct:x(a??null),rank:s??null,rankTotal:i??null})}return{periods:e}}function ic(n){let t=n?.item?.[0]||{},e={};for(let r of wa)t[r]!==void 0&&(e[_a[r]]=x(t[r]));return{code:t.thscode||"",maxDrawdownPct:e}}function cc(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||e.name||"",assetType:e.asset_type||"",holdRatio:x(e.hold_ratio??e.security_market_value_rate_pct)??null,marketValue:e.position_capital??e.market_value??null,rank:e.investment_rank??e.rank??null,reportDate:T(e.end_date_ms)?.slice(0,10)??null})),summary:{stockRatio:x(n?.total_stock_ratio_pct??n?.stock_ratio_pct)??null,bondRatio:x(n?.total_bond_ratio_pct)??null,fundRatio:x(n?.total_fund_ratio_pct)??null,turnoverRate:x(n?.turnover_rate_pct)??null,concentration:x(n?.concentration_ratio)??null,mainIndustry:n?.main_industry||null},total:t.length}}function uc(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",assetType:e.asset_type||"",holdRatio:x(e.hold_ratio)??null,marketValue:e.market_value??null,periodChangePct:x(e.period_increase_pct)??null,rank:e.rank??null,reportDate:T(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function lc(n){let t=n?.item||[];return{items:t.map(e=>({reportType:e.report_type||"",name:e.report_type_name||"",start:T(e.start_date_ms)?.slice(0,10)??null,end:T(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function mc(n){let t=n?.item||[];return{items:t.map(e=>({reportDate:T(e.report_date_ms)?.slice(0,10)??e.report_period??null,stock:x(e.stock_ratio_pct)??null,bond:x(e.bond_ratio_pct)??null,deposit:x(e.deposit_ratio_pct)??null,other:x(e.other_ratio_pct)??null})),total:t.length}}function dc(n){let t=n?.item||[];return{items:t.map(e=>({reportPeriod:e.report_period||"",industry:e.industry_name||"",ratio:x(e.ratio_pct)??null})),total:t.length}}function pc(n){let t=n?.item||[];return{items:t.map(e=>({scope:e.merge_scope||"",reportDate:T(e.report_date_ms)?.slice(0,10)??null,institutionPct:x(e.ins_position)??null,personalPct:x(e.psnl_rate)??null,holderCount:e.holder_amount??null,avgHolderShare:x(e.avg_holder_share)??null,staffHoldPct:x(e.mgmt_staff_hold_rate)??null})),total:t.length}}function fc(n){let t=n?.item||[];return{items:t.map(e=>({rank:e.rank??null,name:e.holder_name||"",type:e.holder_type||"",holdShare:e.hold_share??null,holdPct:x(e.hold_rate_pct)??null,reportDate:T(e.report_date_ms)?.slice(0,10)??null})),total:t.length}}function yc(n,t,e,r){let o=n?.item?.[0]||{},a=t?.item?.[0]||{};return{id:o.manager_id||"",name:o.manager_name||"",sex:o.sex??null,degree:o.degree??null,company:o.company_name??null,companyId:o.company_id??null,resume:o.resume??null,annualReturnPct:x(o.annual_return_pct)??null,maxReturnPct:x(o.maximum_return_pct)??null,radar:o.radar_comparison||[],style:{representativeFund:a.representative_fund_name??null,representativeFundCode:a.representative_fund_thscode??null,idea:a.investment_idea??null,totalScale:a.total_fund_scale??null,industryPreferences:a.industry_preferences??null},experience:e?.item?.[0]??null,performance:r?(r.item||[]).map(s=>({date:T(s.date_ms)?.slice(0,10)??null,managerPct:x(s.manager_return_pct)??null,peerPct:x(s.peer_return_pct)??null,benchmarkPct:x(s.benchmark_return_pct)??null})):null}}function gc(n){let t=n?.item?.[0]||{};return{id:t.company_id||"",name:t.company_name||"",type:t.company_type||"",established:T(t.established_date_ms),fundCount:t.fund_count??null,scale:t.scale??null}}function hc(n){let t=n?.item||[];return{items:t.map(e=>({period:`${T(e.start_date_ms)?.slice(0,10)??""}~${T(e.end_date_ms)?.slice(0,10)??""}`,published:T(e.publish_date_ms),...Object.fromEntries(Object.entries(e).filter(([r])=>!r.endsWith("_ms")&&r!=="thscode"&&r!=="ticker"))})),total:t.length}}function bc(n){let t=n?.item||[];return{count:n?.dividend_count??t.length,total:n?.dividend_total??null,items:t.map(e=>({perTenCashBeforeTax:e.per_ten_cash_before_tax??null,perTenCashAfterTax:e.per_ten_cash_after_tax??null,progress:e.progress||"",publishDate:T(e.publish_date_ms)?.slice(0,10)??null,exDividendDate:T(e.ex_dividend_date_ms)?.slice(0,10)??null,paymentDate:T(e.payment_date_ms)?.slice(0,10)??null}))}}function Sc(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",price:t.last_price??null,change:t.price_change??null,changePercent:x(t.price_change_ratio_pct)??null,open:t.open_price??null,high:t.high_price??null,low:t.low_price??null,prevClose:t.prev_price??null,amplitude:x(t.price_amplitude_ratio_pct)??null,volume:t.volume??null,amount:t.turnover??null,turnoverRate:x(t.turnover_ratio_pct)??null}}function wc(n){let t=n?.item||[];return{code:n?.thscode||"",items:t.map(e=>({date:T(e.date_ms)?.slice(0,10)??null,open:e.open_price??null,high:e.high_price??null,low:e.low_price??null,close:e.close_price??null,volume:e.volume??null,amount:e.turnover??null})),total:t.length}}function _c(n){let t=n?.item||[];return{items:t.map(e=>({title:e.title||"",summary:e.summary||"",source:e.source||"",url:e.url??null,time:T(e.publish_time_ms)})),total:t.length,hasMore:!!n?.has_more,nextOffset:n?.offset??null}}function kc(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",ticker:e.ticker||"",subscriptionStart:T(e.subscription_start_ms)?.slice(0,10)??null,subscriptionEnd:T(e.subscription_end_ms)?.slice(0,10)??null})),total:t.length}}function ka(n){return n.command({command:"fund",describe:"\u57FA\u91D1\u6570\u636E\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1A\u6863\u6848/\u51C0\u503C/\u4E1A\u7EE9/\u56DE\u64A4/\u6301\u4ED3/\u6301\u6709\u4EBA/\u7ECF\u7406/\u516C\u53F8/\u5206\u7EA2/ETF\u884C\u60C5",builder:t=>t.strictCommands(!1).command("profile <code>","\u57FA\u91D1\u6863\u6848\uFF08\u540D\u79F0/\u7ECF\u7406/\u89C4\u6A21/\u8D39\u7387\uFF0C\u542B manager_id \u4E0E company_id \u4E0B\u94BB\u5165\u53E3\uFF09",R(e=>e.positional("code",{type:"string",describe:"\u57FA\u91D1\u4EE3\u7801\uFF0C\u573A\u5916\u5982 025480.OF\uFF0CETF \u5982 510300 / 510300.SH"})),async e=>{let r=await Bt(e.code,v(e));l({data:r,command:`fund profile ${e.code}`,source:"fuyao",toJSON:oc})}).command("nav <code>","\u51C0\u503C\u5E8F\u5217\uFF08\u9ED8\u8BA4\u6700\u65B0\u4E00\u6761\uFF1B--range week..fyear \u53D6\u533A\u95F4\uFF09",R(e=>e.positional("code",{type:"string"}).option("range",{type:"string",choices:["week","month","tmonth","hyear","year","twoyear","tyear","fyear"],describe:"\u51C0\u503C\u533A\u95F4"}).option("nav-type",{type:"string",default:"unit,adj",choices:["unit","adj","unit,adj"],describe:"\u5355\u4F4D/\u590D\u6743\u51C0\u503C"})),async e=>{let r=await zo(e.code,{range:e.range,navType:e["nav-type"],fundType:v(e)});l({data:r,command:`fund nav ${e.code}${e.range?` --range ${e.range}`:""}`,source:"fuyao",toJSON:ac})}).command("perf <code>","\u533A\u95F4\u6536\u76CA\uFF08\u8FD11\u5468..\u6210\u7ACB\u6765 + \u540C\u7C7B\u5E73\u5747 + \u540C\u7C7B\u6392\u540D\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await Wo(e.code,v(e));l({data:r,command:`fund perf ${e.code}`,source:"fuyao",toJSON:sc})}).command("drawdown <code>","\u6700\u5927\u56DE\u64A4\uFF08\u5404\u5468\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await Qo(e.code,v(e));l({data:r,command:`fund drawdown ${e.code}`,source:"fuyao",toJSON:ic})}).command("holdings <code>","\u6700\u65B0\u91CD\u4ED3\u6301\u4ED3\uFF08\u80A1\u7968/\u503A\u5238/\u57FA\u91D1 + \u6C47\u603B\u5360\u6BD4\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await Vo(e.code,v(e));l({data:r,command:`fund holdings ${e.code}`,source:"fuyao",toJSON:cc})}).command("holdings-history <code>","\u5386\u53F2\u6301\u4ED3\u660E\u7EC6\uFF08\u9700\u62A5\u544A\u671F\uFF1A\u5148 fund report-dates \u67E5 end \u65E5\u671F\uFF09",R(e=>e.positional("code",{type:"string"}).option("report",{type:"string",default:"quarter",describe:"\u62A5\u544A\u7C7B\u578B\uFF0C\u5982 quarter"}).option("end",{type:"string",required:!0,describe:"\u62A5\u544A\u622A\u6B62\u65E5 YYYY-MM-DD"}).option("bond",{type:"boolean",default:!1,describe:"\u503A\u5238\u6301\u4ED3\uFF08\u9ED8\u8BA4\u80A1\u7968\uFF09"})),async e=>{let r=e.code,{report:o="quarter",end:a,bond:s}=e,i=s?await ea(r,o,a,v(e)):await Zo(r,o,a,v(e));l({data:i,command:`fund holdings-history ${r} --end ${a}`,source:"fuyao",toJSON:uc})}).command("report-dates <code>","\u6301\u4ED3\u53EF\u7528\u62A5\u544A\u671F\uFF08holdings-history \u9700\u8981\u7684 end \u65E5\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await ta(e.code,void 0,v(e));l({data:r,command:`fund report-dates ${e.code}`,source:"fuyao",toJSON:lc})}).command("allocation <code>","\u8D44\u4EA7\u914D\u7F6E\uFF08\u80A1\u7968/\u503A\u5238/\u5B58\u6B3E/\u5176\u4ED6\u5360\u6BD4\uFF0C\u591A\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await na(e.code,v(e));l({data:r,command:`fund allocation ${e.code}`,source:"fuyao",toJSON:mc})}).command("industry <code>","\u884C\u4E1A\u914D\u7F6E\uFF08\u591A\u671F\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await ra(e.code,v(e));l({data:r,command:`fund industry ${e.code}`,source:"fuyao",toJSON:dc})}).command("holders <code>","\u6301\u6709\u4EBA\u7ED3\u6784\uFF08\u673A\u6784/\u4E2A\u4EBA\u5360\u6BD4\u3001\u6237\u6570\uFF09",R(e=>e.positional("code",{type:"string"}).option("top",{type:"boolean",default:!1,describe:"\u524D\u5341\u5927\u6301\u6709\u4EBA"})),async e=>{let r=e.code,o=e.top?await aa(r,void 0,v(e)):await oa(r,void 0,v(e));l({data:o,command:`fund holders ${r}${e.top?" --top":""}`,source:"fuyao",toJSON:e.top?fc:pc})}).command("manager <code>","\u57FA\u91D1\u7ECF\u7406\uFF08\u7ECF\u57FA\u91D1\u4EE3\u7801\u89E3\u6790 manager_id\uFF1A\u8BE6\u60C5+\u98CE\u683C+\u7ECF\u5386\uFF09",R(e=>e.positional("code",{type:"string",describe:"\u57FA\u91D1\u4EE3\u7801\uFF08\u81EA\u52A8\u53D6\u5176\u73B0\u4EFB\u7ECF\u7406\uFF09"}).option("range",{type:"string",choices:["month","tmonth","year","nowyear","now"],describe:"\u9644\u52A0\u4E1A\u7EE9\u66F2\u7EBF\u533A\u95F4"})),async e=>{let r=e.code,a=(await Bt(r,v(e)))?.item?.[0]?.manager_info?.[0],s=a?.manager_id??a?.id;if(!s)throw new Error(`\u57FA\u91D1 ${r} \u672A\u62AB\u9732\u57FA\u91D1\u7ECF\u7406 ID\uFF0C\u8BF7\u5728 profile \u8F93\u51FA\u7684 managerInfo \u4E2D\u786E\u8BA4`);let[i,c,u]=await Promise.all([sa(s),ia(s),ua(s)]),m=e.range?await ca(s,e.range):null,p=yc(i,c,u,m);l({data:p,command:`fund manager ${r}`,source:"fuyao",toJSON:d=>d})}).command("company <company_id>","\u57FA\u91D1\u516C\u53F8\u8BE6\u60C5\uFF08company_id \u6765\u81EA fund profile \u8F93\u51FA\uFF09",e=>e.positional("company_id",{type:"string",describe:"\u57FA\u91D1\u516C\u53F8 ID\uFF0C\u5982 80000222"}),async e=>{let r=await la(e.company_id);l({data:r,command:`fund company ${e.company_id}`,source:"fuyao",toJSON:gc})}).command("financial <code>","\u57FA\u91D1\u8D22\u52A1\u6570\u636E\uFF08--t indicators(\u9ED8\u8BA4)/income/balance\uFF09",R(e=>e.positional("code",{type:"string"}).option("t",{type:"string",default:"indicators",choices:["indicators","income","balance"]})),async e=>{let r=e.code,o=e.t||"indicators",a=o==="income"?await da(r,v(e)):o==="balance"?await pa(r,v(e)):await ma(r,v(e));l({data:a,command:`fund financial ${r} -t ${o}`,source:"fuyao",toJSON:hc})}).command("dividend <code>","\u57FA\u91D1\u5206\u7EA2\u8BB0\u5F55",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await fa(e.code,v(e));l({data:r,command:`fund dividend ${e.code}`,source:"fuyao",toJSON:bc})}).command("diagnose <code>","\u57FA\u91D1\u8BCA\u65AD\uFF08\u7EF4\u5EA6/\u540C\u7C7B\u5BF9\u6BD4/\u97E7\u6027\u6307\u6807\uFF09",R(e=>e.positional("code",{type:"string"})),async e=>{let r=await ya(e.code,v(e));l({data:r,command:`fund diagnose ${e.code}`,source:"fuyao",toJSON:o=>({items:o?.item||[],total:o?.item?.length??0})})}).command("issue [subscribe]","\u65B0\u53D1\u57FA\u91D1\u52DF\u96C6\u5217\u8868\uFF08active \u5F53\u524D\u52DF\u96C6 / upcoming \u5373\u5C06\u52DF\u96C6\uFF09",e=>e.positional("subscribe",{type:"string",default:"active",choices:["active","upcoming"]}),async e=>{let r=e.subscribe||"active",o=await ga(r);l({data:o,command:`fund issue ${r}`,source:"fuyao",toJSON:kc})}).command("news <code>","\u57FA\u91D1\u8D44\u8BAF",R(e=>e.positional("code",{type:"string"})),async e=>{let{n:r}=e,o=await ha(e.code,{limit:r,fundType:v(e)});l({data:o,command:`fund news ${e.code}`,source:"fuyao",toJSON:_c})}).command("etf <code>","ETF \u884C\u60C5\u5FEB\u7167\uFF08\u4EC5 ETF\uFF1BLOF/\u573A\u5916/REITs \u4E0D\u652F\u6301\uFF09",e=>e.positional("code",{type:"string",describe:"ETF \u4EE3\u7801\uFF0C\u5982 510300 / 510300.SH"}),async e=>{let r=await ba(e.code);l({data:r,command:`fund etf ${e.code}`,source:"fuyao",toJSON:Sc})}).command("etf-kline <code>","ETF \u5386\u53F2\u65E5\u7EBF\uFF08\u7A97\u53E3 \u22645 \u5E74\uFF09",e=>e.positional("code",{type:"string"}).option("days",{type:"number",default:120,describe:"\u56DE\u770B\u5929\u6570\uFF08\u22641825\uFF09"}),async e=>{let r=e.code,o=Math.min(Math.max(Number(e.days)||120,1),1825),a=Date.now(),s=await Sa(r,a-o*864e5,a);l({data:s,command:`fund etf-kline ${r}`,source:"fuyao",toJSON:wc})}),handler:async()=>{throw new Error("\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4\uFF1Afinflow fund --help \u67E5\u770B profile/nav/perf/holdings/etf \u7B49 17 \u4E2A\u5B50\u547D\u4EE4")}})}var W=xc(Nc(process.argv)).scriptName("finflow").version("1.10.1").demandCommand(1,"\u8BF7\u6307\u5B9A\u547D\u4EE4\uFF0C\u8FD0\u884C finflow --help \u67E5\u770B\u5E2E\u52A9").option("n",{type:"number",default:10,describe:"\u6761\u6570"}).strict().help().alias("h","help");Sr(W);No(W);Do(W);qo(W);Io(W);Bo(W);Ko(W);ka(W);W.parse();
|
|
10
|
+
${u}`),process.exit(1)}let i=await Ke(s.id),c=$(i?.data?.depth_list||[]);if(c.length<o){let u=c[c.length-1]?.ctime;if(u){let m=await en(s.id,{lastTime:u,rn:o-c.length}),d=$(m?.data?.depth_list||m?.data||[]);c=[...c,...d]}}l({data:i,command:"info news depth",source:"cls",toJSON:gr})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",r=>r,async()=>{let r=await tn();l({data:r,command:"info news hot",source:"cls",toJSON:xs})}).command("futures","\u671F\u8D27\u5934\u6761\uFF08jin10 qihuo\uFF09",r=>r,async()=>{let r=await jn();l({data:r,command:"info news futures",source:"jin10",toJSON:bs})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF0Ccode \u6216\u540D\u79F0\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.code.trim(),s=a;if(!/^(s[hz]\d+|\d{6})$/i.test(a)){let u=(await De(a,{type:"stock",rn:1}))?.data?.stock?.data?.[0];s=u?.stock_id||u?.descr||a}let i=await sn(s,{rn:o});l({data:i,command:"info news stock",source:"cls",toJSON:Ns})}),async()=>{let e=await Ke(1e3);l({data:e,command:"info news",source:"cls",toJSON:gr})}).command("topic","\u4E13\u9898",e=>e.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",r=>r,async r=>{let{n:o=10}=r,a=r.keyword,s=await ve(),i=Array.isArray(s)?s:s?.data||[],c=a.toLowerCase(),u=i.filter(d=>(d.title||"").toLowerCase().includes(c)||(d.short_name||"").toLowerCase().includes(c)||(d.introduction||"").toLowerCase().includes(c));if(!u.length)return l({data:{items:[],total:0,message:`\u672A\u627E\u5230\u5339\u914D "${a}" \u7684\u4E13\u9898`},command:"info topic search",source:"jin10"});let m=$(u.slice(0,o));l({data:m,command:"info topic search",source:"jin10",toJSON:hr})}).command("groups","\u8BDD\u9898\u5206\u7EC4",r=>r,async()=>{let r=await ve();l({data:r,command:"info topic groups",source:"jin10",toJSON:As})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",r=>r,async()=>{let r=await nn();l({data:r,command:"info topic hot",source:"cls",toJSON:o=>Os($(o))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",r=>r,async r=>{let{n:o=10}=r,a=r.id,s=ee(),i=s?{cookie:s}:void 0,c=new Set,u=[],m=1,d=50;for(;u.length<o&&m<=d;){let y=(await Yn(a,{page:m},i))?.data?.list||[];if(!y.length)break;let h=0;for(let b of y)c.has(b.id)||(c.add(b.id),u.push(b),h++);if(h===0)break;m++,u.length<o&&await new Promise(b=>setTimeout(b,200))}let p=$(u);l({data:p,command:"info topic show",source:"jin10",toJSON:g=>({items:g.map(y=>({time:y.display_datetime,title:y.title,author:y.author?.nick,vip:y.vip})),total:g.length})})}),async e=>{let{n:r=10}=e,o=await ve(),a=$(Array.isArray(o)?o:o?.data||[]);if(a=a.slice(0,r),!a.length)return l({data:{items:[],total:0},command:"info topic",source:"jin10"});l({data:a,command:"info topic",source:"jin10",toJSON:hr})}).command("search","\u5168\u7AD9\u641C\u7D22\uFF08cls \u591A\u7C7B\u76EE / jin10 \u5FEB\u8BAF+\u65B0\u95FB\uFF09",e=>e.command("$0 <keyword>","\u641C\u7D22\u8D44\u8BAF",r=>r.option("src",{alias:"s",type:"string",choices:["cls","jin10"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("type",{alias:"t",type:"string",describe:"cls \u7C7B\u76EE\uFF08\u9ED8\u8BA4 all\uFF09"}).positional("keyword",{type:"string",describe:"\u5173\u952E\u8BCD"}),async r=>{let{n:o=20,src:a="cls",type:s}=r,i=r.keyword;if(a==="jin10"){let u=await at({keyword:i,type:s&&s!=="all"?s:"all",offset:0});l({data:u,command:"info search",source:"jin10",toJSON:Sr})}else{let u=await De(i,{type:s||"all",rn:Math.max(o,20)});l({data:u,command:"info search",source:"cls",toJSON:br})}}).command("detail <id>","\u641C\u7D22\u7ED3\u679C\u8BE6\u60C5\uFF08cls \u7535\u62A5\u5168\u6587\uFF09",r=>r.positional("id",{type:"string",describe:"\u641C\u7D22\u7ED3\u679C item.id\uFF08cls \u7535\u62A5\uFF09"}),async r=>{let o=r.id,a=await Zt(o);l({data:a,command:"info search detail",source:"cls",toJSON:Es})}),async e=>{let{n:r=20,src:o="cls",type:a}=e,s=e.keyword||e._?.[2];if(!s)return l({data:{error:"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD"},command:"info search",source:"cls"});if(o==="jin10"){let c=await at({keyword:s,type:a&&a!=="all"?a:"all",offset:0});l({data:c,command:"info search",source:"jin10",toJSON:Sr})}else{let c=await De(s,{type:a||"all",rn:Math.max(r,20)});l({data:c,command:"info search",source:"cls",toJSON:br})}}),handler:async()=>{l({data:{error:"\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4: flash / news / topic / search\u3002\u8FD0\u884C finflow info --help \u67E5\u770B\u5168\u90E8"},command:"info",source:"cls"})}})}import kr from"fs";import Ps from"path";import vs from"os";var xr=Ps.join(vs.homedir(),".xueqiu-anon-cookie"),Nr="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",T="stock.xueqiu.com",Cs="xueqiu.com";function E(n){let t=n.trim().toUpperCase();return t?/^\d{6}$/.test(t)?t.startsWith("6")||t.startsWith("9")?`SH${t}`:t.startsWith("4")||t.startsWith("8")||t.startsWith("920")?`BJ${t}`:`SZ${t}`:/^(SH|SZ|BJ)\d{6}$/i.test(t)?t.toUpperCase():/^\d{4}$/.test(t)?`0${t}`:t:""}var qs="https://xueqiu.com/hq";function $s(){try{let n=kr.readFileSync(xr,"utf-8").trim();return n&&/acw_tc=/.test(n)?n:null}catch{return null}}function js(n){let t=n.headers;return typeof t.getSetCookie=="function"?t.getSetCookie():(t.get("set-cookie")||"").split(/,(?=\s*[A-Za-z_-]+=)/)}function Is(n){let t=n.map(e=>{let r=e.indexOf("=");if(r<0)return"";let o=e.slice(0,r).trim();if(!o)return"";let a=e.slice(r+1).split(";")[0];return`${o}=${a}`}).filter(Boolean);return t.length?t.join("; "):null}async function _r(){let n=await fetch(qs,{headers:{"User-Agent":Nr,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});if(!n.ok)throw new Error(`\u83B7\u53D6\u96EA\u7403\u533F\u540D\u4EE4\u724C\u5931\u8D25\uFF1A/hq \u8FD4\u56DE HTTP ${n.status}\uFF08\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u662F\u5426\u88AB WAF \u62E6\u622A\uFF09`);let t=Is(js(n));if(!t||!/xq_a_token=/.test(t))throw new Error("\u65E0\u6CD5\u4ECE\u96EA\u7403\u83B7\u53D6\u533F\u540D\u4EE4\u724C (xq_a_token)\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5");try{kr.writeFileSync(xr,t,"utf-8")}catch{}return t}function Rs(n){return String(n?.error_code??n?.code)==="400016"}async function Ms(n,t,e,r,{token:o=!0,ua:a}={}){let s=o?$s()??await _r():null,i=0,c=async m=>{let d={Accept:"application/json","Accept-Language":"zh-Hans-CN;q=1, ja-JP;q=0.9","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive","User-Agent":a||Nr,Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};m&&(d.Cookie=m);let p={method:n,headers:d,redirect:"follow"};r&&(p.body=new URLSearchParams(r).toString(),d["Content-Type"]="application/x-www-form-urlencoded");let g=await fetch(`https://${t}${e}`,p);i=g.status;try{return await g.json()}catch{return null}},u=await c(s);if(o&&(Rs(u)||u===null||i===401)&&(u=await c(await _r())),u===null)throw new Error(`\u96EA\u7403\u63A5\u53E3\u8FD4\u56DE\u975E JSON \u54CD\u5E94\uFF08HTTP ${i}\uFF09\uFF0C\u53EF\u80FD\u88AB WAF \u62E6\u622A\u6216\u533F\u540D\u4EE4\u724C\u5931\u6548`);return u}function A(n,t,e={}){return Ms("GET",n,t,null,e)}function Ot(n){return A(T,`/v5/stock/realtime/quotec.json?symbol=${n.map(E).join(",")}`,{token:!1})}function At(n){return A(T,`/v5/stock/realtime/pankou.json?symbol=${E(n)}`)}var Js={d:"day",w:"week",m:"month",y:"year",q:"quarter"};function Or(n,{period:t="day",count:e=284}={}){let r=Js[t]||t,o=Date.now();return A(T,`/v5/stock/chart/kline.json?symbol=${E(n)}&begin=${o}&period=${r}&type=before&count=-${e}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function Dt(n,{period:t="1d"}={}){return A(T,`/v5/stock/chart/minute.json?symbol=${E(n)}&period=${t}`)}function Tt(n,{count:t=50}={}){return A(T,`/v5/stock/history/trade.json?symbol=${E(n)}&count=${t}`)}function Ar(n){return A(T,`/v5/stock/quote/relevant.json?symbol=${E(n)}`)}function Dr(n){return A(Cs,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function Tr({category:n="cn"}={}){return A(T,`/v5/stock/screener/industries.json?category=${n}`)}function Er(n={}){let{page:t=1,size:e=30,order:r="desc",order_by:o="percent",market:a="CN"}=n,s=new URLSearchParams({page:String(t),size:String(e),order:r,order_by:o,market:a});return n.ind_code&&s.set("ind_code",n.ind_code),n.type&&s.set("type",n.type),A(T,`/v5/stock/screener/quote/list.json?${s.toString()}`)}function Pr(n){return A(T,`/v5/stock/hq/longhu.json?date=${n}`)}function vr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return A(T,`/v5/stock/finance/${a}/indicator.json?symbol=${E(n)}&type=${r}&is_detail=${o}&count=${e}`)}function Cr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return A(T,`/v5/stock/finance/${a}/cash_flow.json?symbol=${E(n)}&type=${r}&is_detail=${o}&count=${e}`)}function qr(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return A(T,`/v5/stock/finance/${a}/income.json?symbol=${E(n)}&type=${r}&is_detail=${o}&count=${e}`)}function $r(n,t={}){let{count:e=10,type:r="Q4",is_detail:o=!0,region:a="cn"}=t;return A(T,`/v5/stock/finance/${a}/balance.json?symbol=${E(n)}&type=${r}&is_detail=${o}&count=${e}`)}function Et(n,{circula:t=1}={}){return A(T,`/v5/stock/f10/cn/top_holders.json?symbol=${E(n)}&circula=${t}`)}function Se(n){return A(T,`/v5/stock/f10/cn/indicator.json?symbol=${E(n)}`)}function jr(n){return A(T,`/v5/stock/f10/cn/industry.json?symbol=${E(n)}`)}function Pt(n,{page:t=1,size:e=10}={}){return A(T,`/v5/stock/f10/cn/bonus.json?symbol=${E(n)}&page=${t}&size=${e}`)}function vt(n){return A(T,`/v5/stock/capital/flow.json?symbol=${E(n)}`)}function Ir(n,{count:t=20}={}){return A(T,`/v5/stock/capital/history.json?symbol=${E(n)}&count=${t}`)}function Rr(n,{page:t=1,size:e=180}={}){return A(T,`/v5/stock/capital/margin.json?symbol=${E(n)}&page=${t}&size=${e}`)}function Mr(n){return A(T,`/v5/stock/batch/quote.json?symbol=${n.map(E).join(",")}&extend=detail&is_delay_hk=true`)}function Ie(n,t){let e=n.filter(d=>typeof d=="number"&&Number.isFinite(d)&&d>0).sort((d,p)=>d-p);if(!e.length)return null;let r=t!=null&&Number.isFinite(t)&&t>0?t:e[e.length-1],o=e.filter(d=>d<r).length,a=Math.round(o/e.length*1e4)/100,s=e[0],i=e[e.length-1],c=Math.round(e.reduce((d,p)=>d+p,0)/e.length*100)/100,u=d=>{let p=Math.min(e.length-1,Math.max(0,Math.floor(d/100*(e.length-1))));return Math.round(e[p]*100)/100},m="fair";return a<20?m="deep_value":a<40?m="undervalued":a<60?m="fair":a<80?m="overvalued":m="high_risk",{current:Math.round(r*100)/100,percentile:a,status:m,min:Math.round(s*100)/100,max:Math.round(i*100)/100,mean:c,median:u(50),opportunity:u(20),danger:u(80)}}async function Jr(n,t=5){let e=E(n);if(!e)return null;let r=Math.min(2500,Math.max(30,Math.round(t*250))),o=await A(T,`/v5/stock/chart/kline.json?symbol=${e}&begin=${Date.now()}&period=day&type=before&count=-${r}&indicator=kline,pe,pb,ps,pcf`),a=o?.data?.item||[];if(!a.length)return null;let s=a[0],i=a[a.length-1],c=new Date(s[0]).toISOString().slice(0,10),u=new Date(i[0]).toISOString().slice(0,10),m=a.map(_=>_[12]),d=a.map(_=>_[13]),p=a.map(_=>_[14]),g=a.map(_=>_[15]),y=Ie(m,m[m.length-1]),h=Ie(d,d[d.length-1]),b=Ie(p,p[p.length-1]),w=Ie(g,g[g.length-1]);return{code:e,name:o?.data?.symbol?e:void 0,years:t,tradeDays:a.length,startDate:c,endDate:u,pe:y,pb:h,ps:b,pcf:w}}function we(n){let t=n.result||{},e=(r,o)=>({label:r,netBuy:o?.netBuyTurnover??null,netBuyText:o?.netBuyTurnoverText||null,turnover:o?.tradValSum??null,status:o?.tradeStatus||null});return{northbound:{shanghai:e("\u5317\u5411\u8D44\u91D1(\u6CAA)",t.shMarketFlowDetail),shenzhen:e("\u5317\u5411\u8D44\u91D1(\u6DF1)",t.szMarketFlowDetail),total:e("\u5317\u5411\u5408\u8BA1",t.shSZTotalMarketFlowDetail)},southbound:{shanghai:e("\u5357\u5411\u8D44\u91D1(\u6CAA)",t.hkSHMarketFlowDetail),shenzhen:e("\u5357\u5411\u8D44\u91D1(\u6DF1)",t.hkSZMarketFlowDetail),total:e("\u5357\u5411\u5408\u8BA1",t.hkSHSZTotalMarketFlowDetail)},source:"glh"}}var Fr="https://query1.finance.yahoo.com/v8/finance/chart",Ls="https://query1.finance.yahoo.com/v1/finance/search",Us="https://finance.yahoo.com/quote",Fs={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9"},qt={"User-Agent":"Mozilla/5.0"},Ct={"KS11.INDEX":"^KS11","KQ11.INDEX":"^KQ11"};function Ur(n){let t=n;for(;t.length>4&&t.startsWith("0");)t=t.slice(1);return`${t}.HK`}function oe(n){let t=n.trim().toUpperCase();return t?Ct[t]?Ct[t]:/^(SH|SZ)\d{6}$/.test(t)?t.startsWith("SH")?`${t.slice(2)}.SS`:`${t.slice(2)}.SZ`:/^\d{6}\.(SS|SH)$/.test(t)?`${t.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(t)?t:/^\d{6}$/.test(t)?t.startsWith("6")?`${t}.SS`:`${t}.SZ`:/^\d{4,5}\.HK$/.test(t)?Ur(t.slice(0,-3)):/^\d{1,5}$/.test(t)?Ur(t.padStart(4,"0")):(/^\d{4}\.T$/.test(t)||/^\d{6}\.(KS|KQ)$/.test(t),t):""}function $t(n){let t=n.trim().toUpperCase();return Ct[t]||t.startsWith("^")?!0:/^\d{6}\.(KS|KQ)$/.test(t)||/^\d{4}\.T$/.test(t)}function f(n){return n==null?null:typeof n=="object"?"raw"in n?n.raw??null:null:n}function Hs(n){return n==null?null:typeof n=="object"?"fmt"in n?n.fmt??null:null:String(n)}function Re(n){let t=f(n);if(!t||typeof t!="number")return Hs(n)||null;let e=t>1e11?t:t*1e3;try{return new Date(e).toISOString().slice(0,10)}catch{return null}}async function Hr(n){let t=oe(n),e=`${Us}/${encodeURIComponent(t)}/`;try{let r=await fetch(e,{headers:Fs});if(r.status!==200)return null;let a=[...(await r.text()).matchAll(/<script[^>]*>(.*?)<\/script>/gs)],s=null,i=null;for(let c of a){let u=c[1].trim();if(u.startsWith('{"status":200'))try{let m=JSON.parse(u);if(m.body){let d=JSON.parse(m.body);if(d.quoteSummary?.result?.[0]&&(s=d.quoteSummary.result[0]),Array.isArray(d.quoteResponse?.result)){let p=d.quoteResponse.result.find(g=>g.symbol?.toUpperCase()===t.toUpperCase());p&&(i=p)}}}catch{}}return{quoteSummary:s,quoteResponse:i}}catch{return null}}function Yr(n,t){let e=n.quoteSummary?.price||{},r=n.quoteSummary?.summaryDetail||{},o=n.quoteResponse||{},a=f(e.regularMarketPrice)??f(o.regularMarketPrice)??0,s=f(e.regularMarketPreviousClose)??f(r.regularMarketPreviousClose)??f(o.regularMarketPreviousClose)??0,i=f(e.regularMarketChange)??a-s,c=f(e.regularMarketChangePercent)!=null?f(e.regularMarketChangePercent)*100:s===0?0:i/s*100;if(!a&&!s)return null;let u=f(e.preMarketPrice)??f(o.preMarketPrice),m=f(e.preMarketChange)??f(o.preMarketChange),d=f(e.preMarketChangePercent)??f(o.preMarketChangePercent),p=f(e.preMarketTime)??f(o.preMarketTime),g=f(e.postMarketPrice)??f(o.postMarketPrice),y=f(e.postMarketChange)??f(o.postMarketChange),h=f(e.postMarketChangePercent)??f(o.postMarketChangePercent),b=f(e.postMarketTime)??f(o.postMarketTime),w=u!=null?{price:u,change:m!=null?Math.round(m*100)/100:s?Math.round((u-s)*100)/100:null,changePercent:d!=null?Math.round(d*(Math.abs(d)<1?1e4:100))/100:0,time:p?new Date(p*1e3).toISOString():null}:null,_=g!=null?{price:g,change:y!=null?Math.round(y*100)/100:a?Math.round((g-a)*100)/100:null,changePercent:h!=null?Math.round(h*(Math.abs(h)<1?1e4:100))/100:0,time:b?new Date(b*1e3).toISOString():null}:null;return{symbol:e.symbol||o.symbol||t,name:e.shortName||e.longName||o.shortName||o.longName||"",price:a,prevClose:s,change:i,changePercent:c,open:f(e.regularMarketOpen)??f(r.open),high:f(e.regularMarketDayHigh)??f(r.dayHigh),low:f(e.regularMarketDayLow)??f(r.dayLow),volume:f(e.regularMarketVolume)??f(r.volume),avgVolume:f(r.averageVolume),marketCap:f(e.marketCap)??f(r.marketCap),pe:f(r.trailingPE),forwardPE:f(r.forwardPE),beta:f(r.beta),fiftyTwoWeekHigh:f(r.fiftyTwoWeekHigh),fiftyTwoWeekLow:f(r.fiftyTwoWeekLow),dividendYield:f(r.dividendYield)!=null?f(r.dividendYield)*100:null,preMarket:w,postMarket:_,currency:e.currency||r.currency||o.currency||"",exchange:e.exchangeName||o.fullExchangeName||"",marketState:e.marketState||o.marketState||"",quoteType:e.quoteType||o.quoteType||""}}function Ys(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary.summaryProfile||{},r=n.quoteSummary.price||{},o=Array.isArray(e.companyOfficers)?e.companyOfficers.map(a=>({name:a.name||"",title:a.title||"",age:f(a.age),totalPay:f(a.totalPay)})):[];return{symbol:r.symbol||t,name:r.shortName||r.longName||"",sector:e.sector||e.sectorDisp||null,industry:e.industry||e.industryDisp||null,website:e.website||null,phone:e.phone||null,address:e.address1||null,city:e.city||null,state:e.state||null,country:e.country||null,zip:e.zip||null,employees:f(e.fullTimeEmployees),description:e.longBusinessSummary||null,officers:o}}function Bs(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.defaultKeyStatistics||{},o=e.summaryDetail||{},a=e.financialData||{},s=e.price||{};return{symbol:s.symbol||t,name:s.shortName||s.longName||"",marketCap:f(s.marketCap)??f(o.marketCap),enterpriseValue:f(r.enterpriseValue),trailingPE:f(o.trailingPE),forwardPE:f(r.forwardPE)??f(o.forwardPE),pegRatio:f(r.pegRatio),priceToBook:f(r.priceToBook),priceToSales:f(r.priceToSalesTrailing12Months)??f(o.priceToSalesTrailing12Months),enterpriseToRevenue:f(r.enterpriseToRevenue),enterpriseToEbitda:f(r.enterpriseToEbitda),profitMargins:f(r.profitMargins)!=null?f(r.profitMargins)*100:f(a.profitMargins)!=null?f(a.profitMargins)*100:null,operatingMargins:f(a.operatingMargins)!=null?f(a.operatingMargins)*100:null,grossMargins:f(a.grossMargins)!=null?f(a.grossMargins)*100:null,ebitdaMargins:f(a.ebitdaMargins)!=null?f(a.ebitdaMargins)*100:null,returnOnAssets:f(a.returnOnAssets)!=null?f(a.returnOnAssets)*100:null,returnOnEquity:f(a.returnOnEquity)!=null?f(a.returnOnEquity)*100:null,totalRevenue:f(a.totalRevenue),revenuePerShare:f(a.revenuePerShare),quarterlyRevenueGrowth:f(a.revenueGrowth)!=null?f(a.revenueGrowth)*100:null,grossProfits:f(a.grossProfits),ebitda:f(a.ebitda),netIncome:f(r.netIncomeToCommon),dilutedEps:f(r.trailingEps),quarterlyEarningsGrowth:f(a.earningsGrowth)!=null?f(a.earningsGrowth)*100:null,totalCash:f(a.totalCash),totalCashPerShare:f(a.totalCashPerShare),totalDebt:f(a.totalDebt),debtToEquity:f(a.debtToEquity),currentRatio:f(a.currentRatio),quickRatio:f(a.quickRatio),bookValuePerShare:f(r.bookValue),operatingCashflow:f(a.operatingCashflow),freeCashflow:f(a.freeCashflow),sharesOutstanding:f(r.sharesOutstanding),floatShares:f(r.floatShares),sharesShort:f(r.sharesShort),shortRatio:f(r.shortRatio),shortPercentOfFloat:f(r.shortPercentOfFloat)!=null?f(r.shortPercentOfFloat)*100:null,heldPercentInsiders:f(r.heldPercentInsiders)!=null?f(r.heldPercentInsiders)*100:null,heldPercentInstitutions:f(r.heldPercentInstitutions)!=null?f(r.heldPercentInstitutions)*100:null,beta:f(r.beta)??f(o.beta),dividendRate:f(o.dividendRate),dividendYield:f(o.dividendYield)!=null?f(o.dividendYield)*100:null,exDividendDate:Re(o.exDividendDate),payoutRatio:f(o.payoutRatio)!=null?f(o.payoutRatio)*100:null,fiveYearAvgDividendYield:f(o.fiveYearAvgDividendYield),currency:a.financialCurrency||s.currency||"USD"}}function Xs(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.financialData||{},o=e.recommendationTrend||{},a=e.upgradeDowngradeHistory||{},s=e.price||{},i=(Array.isArray(o.trend)?o.trend:[]).map(m=>({period:m.period||"",strongBuy:Number(m.strongBuy??0),buy:Number(m.buy??0),hold:Number(m.hold??0),sell:Number(m.sell??0),strongSell:Number(m.strongSell??0)})),u=(Array.isArray(a.history)?a.history:[]).slice(0,30).map(m=>({date:Re(m.epochGradeDate)||"",firm:m.firm||"",action:m.action||"",toGrade:m.toGrade||"",fromGrade:m.fromGrade||"",priceTargetAction:m.priceTargetAction||null,currentPriceTarget:f(m.currentPriceTarget),priorPriceTarget:f(m.priorPriceTarget)}));return{symbol:s.symbol||t,name:s.shortName||s.longName||"",targetPrice:{current:f(r.currentPrice)??f(s.regularMarketPrice),high:f(r.targetHighPrice),low:f(r.targetLowPrice),mean:f(r.targetMeanPrice),median:f(r.targetMedianPrice),analystsCount:f(r.numberOfAnalystOpinions)},recommendation:{key:r.recommendationKey||null,mean:f(r.recommendationMean)},trend:i,upgradesDowngrades:u}}function Gs(n,t){if(!n.quoteSummary)return null;let e=n.quoteSummary,r=e.calendarEvents||{},o=e.earnings||{},a=e.price||{},s=[],i=r.earnings?.earningsDate||o.earningsChart?.earningsDate||[];Array.isArray(i)&&(s=i.map(y=>Re(y)).filter(Boolean));let c=o.earningsChart?.quarterly||[],u=(Array.isArray(c)?c:[]).map(y=>({quarter:y.date||"",calendarQuarter:y.calendarQuarter||void 0,reportedDate:Re(y.reportedDate)||void 0,actual:f(y.actual),estimate:f(y.estimate),difference:typeof y.difference=="string"?Number(y.difference):f(y.difference),surprisePct:typeof y.surprisePct=="string"?Number(y.surprisePct):f(y.surprisePct)})),m=o.financialsChart?.yearly||[],d=(Array.isArray(m)?m:[]).map(y=>({year:Number(y.date||0),revenue:f(y.revenue),earnings:f(y.earnings),profitMargin:f(y.profitMargin)!=null?f(y.profitMargin)*100:null})),p=o.financialsChart?.quarterly||[],g=(Array.isArray(p)?p:[]).map(y=>({quarter:y.date||"",revenue:f(y.revenue),earnings:f(y.earnings),profitMargin:f(y.profitMargin)!=null?f(y.profitMargin)*100:null}));return{symbol:a.symbol||t,name:a.shortName||a.longName||"",currency:o.financialCurrency||a.currency||"USD",earningsDates:s,isEarningsDateEstimate:r.earnings?.isEarningsDateEstimate??o.earningsChart?.isEarningsDateEstimate,quarterlyHistory:u,financialsYearly:d,financialsQuarterly:g}}async function _e(n){let t=oe(n);if(!t)return null;try{let r=await Hr(t);if(r?.quoteSummary||r?.quoteResponse){let o=Yr(r,t);if(o)return o}}catch{}let e=`${Fr}/${encodeURIComponent(t)}?interval=1d&range=1d&includePrePost=true`;try{let r=await fetch(e,{headers:qt});if(r.ok||r.status===200||!r.status){let s=(await r.json())?.chart?.result?.[0]?.meta;if(s?.symbol){let i=Number(s.regularMarketPrice??0),c=Number(s.chartPreviousClose??0),u=i-c,m=c===0?0:u/c*100,d={symbol:s.symbol,name:s.shortName||s.longName||"",price:i,prevClose:c,change:u,changePercent:m,currency:s.currency||"",exchange:s.exchangeName||"",marketState:s.marketState||""};if(s.regularMarketOpen!=null&&(d.open=Number(s.regularMarketOpen)),s.regularMarketDayHigh!=null&&(d.high=Number(s.regularMarketDayHigh)),s.regularMarketDayLow!=null&&(d.low=Number(s.regularMarketDayLow)),s.regularMarketVolume!=null&&(d.volume=Number(s.regularMarketVolume)),s.fiftyTwoWeekHigh!=null&&(d.fiftyTwoWeekHigh=Number(s.fiftyTwoWeekHigh)),s.fiftyTwoWeekLow!=null&&(d.fiftyTwoWeekLow=Number(s.fiftyTwoWeekLow)),s.instrumentType&&(d.quoteType=s.instrumentType),s.preMarketPrice!=null){let p=Number(s.preMarketPrice);d.preMarket={price:p,change:c?p-c:null,changePercent:c?(p-c)/c*100:0,time:s.preMarketTime?new Date(Number(s.preMarketTime)*1e3).toISOString():null}}if(s.postMarketPrice!=null){let p=Number(s.postMarketPrice);d.postMarket={price:p,change:i?p-i:null,changePercent:i?(p-i)/i*100:0,time:s.postMarketTime?new Date(Number(s.postMarketTime)*1e3).toISOString():null}}return d}}}catch{return null}return null}async function ae(n){let t=oe(n);if(!t)return null;let e=await Hr(t),r=e?Yr(e,t):null;if(r||(r=await _e(t)),!r)return null;let o=e?Ys(e,t):null,a=e?Bs(e,t):null,s=e?Xs(e,t):null,i=e?Gs(e,t):null;return{symbol:r.symbol,name:r.name,quote:r,profile:o,stats:a,analysis:s,earnings:i}}async function ke(n,t="1d",e=120){let r=oe(n);if(!r)return null;let o="1d",a="1y";switch(t.toLowerCase()){case"1m":o="1m",a="5d";break;case"5m":o="5m",a="1mo";break;case"15m":o="15m",a="1mo";break;case"30m":o="30m",a="1mo";break;case"60m":case"1h":o="60m",a="3mo";break;case"d":case"1d":o="1d",a=e>250?"5y":e>60?"1y":"6mo";break;case"w":case"1w":o="1wk",a="5y";break;case"m":case"1m_month":case"1mo":o="1mo",a="10y";break;default:o="1d",a="1y"}let s=`${Fr}/${encodeURIComponent(r)}?interval=${o}&range=${a}&includePrePost=false`;try{let i=await fetch(s,{headers:qt});if(i.status!==200)return null;let u=(await i.json())?.chart?.result?.[0];if(!u?.timestamp||!u?.indicators?.quote?.[0])return null;let m=u.timestamp,d=u.indicators.quote[0],p=d.open||[],g=d.high||[],y=d.low||[],h=d.close||[],b=d.volume||[],w=[],_=["1m","5m","15m","30m","60m"].includes(o);for(let k=0;k<m.length;k++){let v=h[k];if(v==null||!Number.isFinite(v))continue;let C=m[k]*1e3,Q=new Date(C),V=_?Q.toISOString():Q.toISOString().slice(0,10);w.push({date:V,open:p[k]??v,high:g[k]??v,low:y[k]??v,close:v,volume:b[k]??0,change:k>0&&h[k-1]!=null?v-h[k-1]:0})}let I=w.slice(-e);return{symbol:u.meta?.symbol||r,period:t,items:I,total:I.length}}catch{return null}}async function jt(n,t=10){let e=`${Ls}?q=${encodeURIComponent(n)}"esCount=${t}&newsCount=5&enableFuzzyQuery=true`;try{let r=await fetch(e,{headers:qt});if(r.status!==200)return null;let o=await r.json(),a=(o.quotes||[]).map(i=>({symbol:i.symbol||"",name:i.shortname||i.longname||"",exchange:i.exchange||i.exchDisp||"",quoteType:i.quoteType||"",industry:i.industry||null,sector:i.sector||null,score:i.score??null})).filter(i=>i.symbol),s=(o.news||[]).map(i=>({uuid:i.uuid||"",title:i.title||"",publisher:i.publisher||"",link:i.link||"",publishTime:i.providerPublishTime?new Date(i.providerPublishTime*1e3).toISOString():"",thumbnail:i.thumbnail?.resolutions?.[0]?.url||null}));return{quotes:a,news:s,total:a.length}}catch{return null}}var Br={d:"d",day:"d",daily:"d",w:"w",week:"w",weekly:"w",m:"m",month:"m",monthly:"m",y:"y",year:"y",yearly:"y",annual:"y",annually:"y"},Xr=new Set(["d","w","m","y","5d","1m","5m","10m","15m","30m","60m","120m"]);function Me(n){let t=String(n??"").trim().toLowerCase();if(Br[t])return Br[t];if(Xr.has(t))return t;let e=t.match(/^(\d+)\s*(?:min|minute|minutes)$/);if(e){let r=`${e[1]}m`;if(Xr.has(r))return r}throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F "${n}"\uFF1B\u652F\u6301 d/w/m/y \u6216 1m/5m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly/monthly/yearly \u7B49\u5168\u8BCD\uFF0C\u6216 5min \u8FD9\u79CD\u5199\u6CD5\uFF09`)}var Gr="Asia/Shanghai";function G(n){return new Date(n).toLocaleDateString("en-CA",{timeZone:Gr})}function xe(n){return new Date(n).toLocaleString("sv-SE",{timeZone:Gr,hour12:!1}).replace(" ","T")+"+08:00"}function Kr(n={}){return S("/api/a-share/special-data/limit-up-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function zr(n={}){return S("/api/a-share/special-data/limit-down-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function Wr(n={}){return S("/api/a-share/special-data/limit-break-pool",{date_ms:n.dateMs,page:n.page,size:n.size,sort_field:n.sortField,sort_dir:n.sortDir})}function Qr(){return S("/api/a-share/special-data/limit-up-ladder")}function Vr(n="day"){return S("/api/a-share/special-data/skyrocket-list",{period:n})}function Zr(n="day"){return S("/api/a-share/special-data/hot-stock-list",{period:n})}function eo(n){return S("/api/a-share/special-data/hot-stock-list-history",{date:n})}function to(n,t,e){return S("/api/a-share/special-data/hot-stock-rank-trend",{thscode:O(n),start_date:t,end_date:e})}function no(n){return S("/api/a-share/special-data/anomaly-analysis-list",{tag_codes:n?.join(",")})}function ro(n){return S("/api/a-share/special-data/anomaly-analysis-stock",{thscodes:n.map(O).join(",")})}function oo(n={}){return S("/api/a-share/special-data/dragon-tiger-list",{board_type:n.boardType,date:n.date})}function ao(n,t="final"){return S("/api/a-share/auction/snapshot",{thscodes:n.map(O).join(","),stage:t})}function so(n){return S("/api/a-share/auction/short-term-benchmark",{date:n})}function zs(n){let t=n?.data||{};return{code:t.secu_code||"",name:t.secu_name||"",price:Number(t.last_px||0),change:Number(t.change_px||0),changePercent:Math.round(Number(t.change||0)*1e4)/100,open:Number(t.open_px||0),high:Number(t.high_px||0),low:Number(t.low_px||0),preclose:Number(t.preclose_px||0),volume:Number(t.business_amount||0),amount:Number(t.business_balance||0),turnoverRate:Number(t.tr||0),amplitude:Number(t.amp||0),avgPrice:Number(t.av_px||0),volumeRatio:Number(t.qrr||0),pe:t.pe!=null?Number(t.pe):null,pb:t.pb!=null?Number(t.pb):null,marketCap:Number(t.mc||0),change3d:t.change_3!=null?Number(t.change_3):null,change5d:t.change_5!=null?Number(t.change_5):null,status:t.trade_status==="TRADE"?"trading":"closed",source:"cls"}}function Ws(n){return{items:n.map(t=>{let e=t.quote||t;return{code:e.symbol||"",name:e.name||"",price:e.current??0,change:e.chg??0,changePercent:Math.round((e.percent??0)*100)/100,volume:e.volume??0,amount:e.amount??0,turnoverRate:e.turnover_rate??0,marketCap:e.market_capital??0,high:e.high??0,low:e.low??0,open:e.open??0}}),total:n.length}}function Qs(n){let t=n?.data||{},e=Number(t.last_px??0);return!!(t.secu_name||t.secu_code)&&Number.isFinite(e)&&e!==0}function Vs(n){if(!n)return!1;let t=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(t)&&t!==0}function ko(n){let t=n.toUpperCase();return t.startsWith("SH")||t.startsWith("SZ")?t:/^\d{6}$/.test(n)?n.startsWith("6")?"SH"+n:"SZ"+n:t}async function xo(n){let t=n.map(ko),e,r;try{e=await Mr(t),r=e?.data?.items||[],r.length&&r[0]?.quote&&(r=r.map(o=>({...o.quote,market:o.market})))}catch{e=await Ot(t),r=e?.data||e?.items||[]}return r}async function Zs(n){let t=await xo([n]);return t[0]?.quote||t[0]||null}function Mt(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent!=null?Math.round(n.changePercent*100)/100:0,open:n.open??null,high:n.high??null,low:n.low??null,preclose:n.prevClose,volume:n.volume??null,avgVolume:n.avgVolume??null,marketCap:n.marketCap??null,pe:n.pe??null,forwardPE:n.forwardPE??null,eps:n.eps??null,beta:n.beta??null,fiftyTwoWeekHigh:n.fiftyTwoWeekHigh??null,fiftyTwoWeekLow:n.fiftyTwoWeekLow??null,dividendYield:n.dividendYield??null,preMarket:n.preMarket?{price:n.preMarket.price,change:n.preMarket.change??null,changePercent:n.preMarket.changePercent!=null?Math.round(n.preMarket.changePercent*100)/100:0,time:n.preMarket.time??null,volume:n.preMarket.volume??null}:null,postMarket:n.postMarket?{price:n.postMarket.price,change:n.postMarket.change??null,changePercent:n.postMarket.changePercent!=null?Math.round(n.postMarket.changePercent*100)/100:0,time:n.postMarket.time??null,volume:n.postMarket.volume??null}:null,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}function ei(n){return{code:n.symbol,name:n.name,quote:Mt(n.quote),profile:n.profile?{sector:n.profile.sector,industry:n.profile.industry,website:n.profile.website,phone:n.profile.phone,address:[n.profile.address,n.profile.city,n.profile.state,n.profile.country].filter(Boolean).join(", "),employees:n.profile.employees,description:n.profile.description,officers:n.profile.officers}:null,stats:n.stats,analysis:n.analysis,earnings:n.earnings,source:"yahoo"}}function K(){return!!he()}function Jt(n){return tr(n)||/^88\d{4}$/.test(n.trim())}function It(n){return/^((sh|sz|bj)\d{6}|\d{6}(\.(sh|sz|bj|ti))?)$/i.test(n.trim())}var H=n=>n==null?null:Math.round(n*100)/100;function Rt(n,t="fuyao fallback"){return{code:n.thscode||"",name:"",price:n.last_price??0,change:n.price_change??0,changePercent:H(n.price_change_ratio_pct)??0,open:n.open_price??0,high:n.high_price??0,low:n.low_price??0,preclose:n.prev_price??0,volume:n.volume??0,amount:n.turnover??0,change3d:null,change5d:null,status:"trading",source:t}}function io(n,t,e){return{code:O(n),period:"d",adjust:e||"none",items:t.map(r=>({date:G(r.date_ms),open:r.open_price??null,high:r.high_price??null,low:r.low_price??null,close:r.close_price??null,volume:r.volume??0,amount:r.turnover??0})),total:t.length}}async function co(n,t,e){let r=Date.now(),o=r-t*1.6*864e5;return((Jt(n)?await or(n,{start:o,end:r}):await nr(n,{start:o,end:r,adjust:e}))?.item||[]).slice(-t)}var No=new Set(["1m","5m","15m","30m","60m","120m"]);function ti(n){if(n==null||n==="")return null;let t=String(n);return/^\d{8}$/.test(t)?`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}`:t}function ni(n,t,e){return{code:n,period:t,items:e.map(r=>({date:ti(r.trade_date),open:Number(r.open_px),high:Number(r.high_px),low:Number(r.low_px),close:Number(r.close_px),volume:Number(r.business_amount||0),change:Number(r.change||0)})),total:e.length}}function ri(n,t,e){let r=No.has(t);return{code:n,period:t,items:e.map(o=>({date:r?xe(o[0]):G(o[0]),open:Number(o[2]),high:Number(o[3]),low:Number(o[4]),close:Number(o[5]),volume:Number(o[1]),amount:Number(o[9]||0),turnoverRate:Number(o[8]||0)})),total:e.length}}function uo(n,t){return{code:n,preclose:Number(t.preclose_px||0),asks:[5,4,3,2,1].map(e=>({price:Number(t[`s_px_${e}`]||0),volume:Number(t[`s_amount_${e}`]||0)})),bids:[1,2,3,4,5].map(e=>({price:Number(t[`b_px_${e}`]||0),volume:Number(t[`b_amount_${e}`]||0)})),source:"cls"}}function lo(n,t){let e=t.current??0,r=t.percent??0,o=r!==0?e/(1+r/100):0;return{code:n,current:e,preclose:o,asks:[1,2,3,4,5].map(a=>({price:Number(t[`sp${a}`]||0),volume:Number(t[`sc${a}`]||0)})),bids:[5,4,3,2,1].map(a=>({price:Number(t[`bp${a}`]||0),volume:Number(t[`bc${a}`]||0)})),buyPercent:t.buypct??null,sellPercent:t.sellpct??null,buySellRatio:t.ratio??null,source:"xq"}}function mo(n,t){let e=t?.data?.volume||[],r=t?.data?.end||e.length;return{code:n,items:e.map(o=>{let a=String(o.minute),s=a.length<=3?"0"+a[0]:a.slice(0,2),i=a.length<=3?a.slice(1):a.slice(2),c=a.slice(-2);return{time:`${s}:${i}:${c}`,price:Number(o.last_px||0),volume:Number(o.change_vol||0),side:o.change_vol_color===1?"buy":"sell"}}),total:r}}function po(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,50).map(r=>({time:xe(r.timestamp),price:Number(r.current||r.price||0),volume:Number(r.trade_volume||r.volume||0),side:r.side==="buy"||r.side===1?"buy":"sell"})),total:e.length}}function fo(n,t){let e=t?.data||{},r=e.line||[],o=Number(e.preclose_px||0);return{code:n,preclose:o,items:r.map(a=>{let s=String(a.minute),i=s.length<=3?"0"+s[0]:s.slice(0,2),c=s.length<=3?s.slice(1):s.slice(2),u=Number(a.last_px||0);return{time:`${i}:${c}`,price:u,avgPrice:Number(a.av_px||0),changePercent:o>0?(u-o)/o*100:0,amount:Number(a.business_balance||0)}}),total:r.length}}function yo(n,t){let e=t?.data?.items||[];return{code:n,items:e.slice(0,240).map(r=>({time:xe(r.timestamp),price:Number(r.current||0),volume:Number(r.volume||0),avgPrice:Number(r.avg_price||0)})),total:e.length}}function oi(n){let t=n?.data||{},e=t.company||{};return{name:e.org_name_cn||"",industry:(t.industry||[]).map(r=>r.ind_name),concept:(t.concept||[]).map(r=>r.ind_name),companyType:e.classi_name||"",region:e.provincial_name||"",listedDate:e.listed_date||"",controller:e.actual_controller||"",mainBusiness:e.main_operation_business||""}}function ai(n){let t=n?.data||{};return{mainInflow:Number(t.main_fund_in||0),mainOutflow:Number(t.main_fund_out||0),mainNet:Number(t.main_fund_diff||0),superNet:Number(t.super_fund_diff||0),largeNet:Number(t.large_fund_diff||0),mediumNet:Number(t.medium_fund_diff||0),smallNet:Number(t.little_fund_diff||0),mainNet3d:t.main_fund_3!=null?Number(t.main_fund_3):null,mainNet5d:t.main_fund_5!=null?Number(t.main_fund_5):null,mainNet10d:t.main_fund_10!=null?Number(t.main_fund_10):null,mainNet20d:t.main_fund_20!=null?Number(t.main_fund_20):null,source:"cls"}}function go(n){let t=n?.data||{},e=t.items||[];return{items:e.map(r=>({time:r.timestamp?G(r.timestamp):"",amount:Number(r.amount||0)})),total:e.length,summary:t.sum3!=null?{sum3:Number(t.sum3),sum5:Number(t.sum5),sum10:Number(t.sum10),sum20:Number(t.sum20)}:null}}function si(n){let t=n?.data?.items||[];return{items:t.map(e=>({date:e.td_date?G(e.td_date):"",marginBalance:Number(e.margin_trading_amt_balance||0),shortBalance:Number(e.short_selling_amt_balance||0),marginNetBuy:Number(e.margin_trading_net_buy_amt||0),marginBuy:Number(e.margin_trading_buy_amt||0)})),total:t.length}}function ii(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.title||"",date:e.time||(e.timestamp?G(e.timestamp):""),url:e.url||"",source:"cls"})),total:t.length}}function ci(n){let t=Array.isArray(n?.data)?n.data:[];return{items:t.map(e=>({title:e.anncTitle||"",question:e.words||"",answer:e.anncContent||"",date:e.anncDate1?G(e.anncDate1):e.anncDate2||"",source:e.source||"\u6295\u8D44\u8005\u4E92\u52A8"})),total:n?.total??t.length}}function ho(n){let t=n?.data?.items||n?.data||[];return{items:t.map((e,r)=>({rank:r+1,holderName:e.holder_name||"",shares:Number(e.held_num||0),ratio:Number(e.held_ratio||0),change:e.chg_amount??e.change??null})),total:t.length}}function bo(n){let t=n?.data?.items||n?.data||[];return Array.isArray(t)?{items:t.map(e=>({period:e.dividend_year||"",exDividendDate:e.ashare_ex_dividend_date?G(e.ashare_ex_dividend_date):"",equityDate:e.equity_date?G(e.equity_date):"",plan:e.plan_explain||""})),total:t.length}:{items:[],total:0}}function Ne(n){return Array.isArray(n)?n[0]:n}function ui(n){let t=n?.data||{},e=t.list||[];return{name:t.quote_name||"",items:e.map(r=>({report:r.report_name||"",roe:Ne(r.avg_roe),eps:Ne(r.basic_eps),grossMargin:Ne(r.gross_selling_rate),revenueYoy:Ne(r.operating_income_yoy)})),total:e.length}}function Je(n){let t=n?.data?.items?.[0];if(!t)return{items:[],total:0};let e=r=>r==null||r===""?null:Number(r);return{items:[{report:t.report_date||"",peTtm:e(t.pe_ttm),pb:e(t.pb),roe:e(t.avg_roe),eps:e(t.basic_eps),netProfitPerShare:e(t.np_per_share),grossMargin:e(t.gross_selling_rate),netMargin:e(t.net_selling_rate),dividendYield:e(t.dividend_yield),revenue:e(t.total_revenue),netProfit:e(t.net_profit_atsopc),revenueYoy:e(t.operating_income_yoy),netProfitYoy:e(t.net_profit_atsopc_yoy),assetLiabRatio:e(t.asset_liab_ratio),pledgeRatio:e(t.pledge_ratio),marketCap:e(t.market_capital),currency:t.currency||"CNY"}],total:1}}function li(n,t){let e=n?.data||{},r=e.list||[],o={cashflow:["report_name","ncf_from_oa","ncf_from_ia","ncf_from_fa","net_increase_in_cce"],income:["report_name","total_revenue","net_profit","net_profit_atsopc","net_profit_after_nrgal_atsolc"],balance:["report_name","total_assets","total_liab","asset_liab_ratio","total_quity_atsopc"]},a={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},s=o[t]||o.cashflow,i=a[t]||a.cashflow;return{name:e.quote_name||"",type:t,items:r.map(c=>{let u={report:c.report_name||""};for(let m=1;m<s.length;m++)u[i[m]]=Ne(c[s[m]]);return u}),total:r.length}}function So(n){let t=n?.data||n?.list||[],e={1:"stock",2:"fund",3:"index"};return{items:t.map(r=>({code:r.code||r.symbol||"",name:r.query||r.name||r.cn_name||"",type:r.type?e[r.type]||String(r.type):""})),total:t.length}}function mi(n){let e=(n?.data||{}).items||[];return{items:e.map(r=>({time:r.timestamp?xe(r.timestamp):"",amount:Number(r.amount||0)})),total:e.length}}function di(n){let t=(n?.data?.industries||[]).map(e=>({code:e.encode||"",name:e.name||"",pinyin:e.pinyin||""}));return{items:t,total:t.length}}function wo(n,t){return{items:n.map(e=>({code:e.symbol||"",name:e.name||"",price:e.current??null,changePercent:Math.round((e.percent??0)*100)/100,amount:e.amount??null,volume:e.volume??null,marketCap:e.market_capital??null,pe:e.pe_ttm??null,pb:e.pb??null,turnoverRate:e.turnover_rate??null})),total:t??n.length}}async function _o(n){let t=[],e,r=1,o=12;for(;t.length<n.n&&r<=o;){let a=await Er({page:r,size:Math.min(90,n.n-t.length),order:n.order,order_by:n.order_by,market:n.market,ind_code:n.ind_code,type:n.type});if(a?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);let s=a?.data?.list||[];if(e=a?.data?.count??e,!s.length)break;t.push(...s),r++}return{list:t,count:e}}function Oo(n){return n.command({command:"quote [codes...]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF1B\u591A\u53EA\u4E00\u8D77\u4F20\uFF0C\u81EA\u52A8\u6279\u91CF\uFF09",builder:t=>t.positional("codes",{type:"string",array:!0,describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09\uFF1B\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\u67E5\u8BE2"}).strictCommands(!1).command("detail <code>","\u6DF1\u5EA6\u7EFC\u5408\u8BE6\u60C5\uFF08\u516C\u53F8\u6982\u51B5/\u6838\u5FC3\u4F30\u503C/\u5206\u6790\u5E08\u8BC4\u7EA7/\u4E1A\u7EE9\u5386\u53F2\uFF0CYahoo\uFF09",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 AAPL / NVDA / TSLA / 0700.HK"}),async e=>{let r=e.code,o=await ae(r);if(!o)throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${r} \u7684\u6DF1\u5EA6\u8BE6\u60C5`);l({data:o,command:`quote detail ${r}`,source:"yahoo",toJSON:()=>ei(o)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",e=>e,async e=>{let r=e.code,a=await Ar(r),s=a?.data?.items||a?.data||[];l({data:a,command:`quote related ${r}`,source:"xq",toJSON:()=>({items:s.map(i=>({code:i.symbol||"",name:i.name||"",price:i.current??0,changePercent:Math.round((i.percent??0)*100)/100,relation:i.relation||""}))})})}).command("search <keyword>","\u641C\u7D22\u80A1\u7968\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1/\u5168\u7403\u8BC1\u5238\uFF1Bxq / fuyao / yahoo \u591A\u6E90\u515C\u5E95\uFF09",e=>e,async e=>{let r=e.keyword,o;try{o=await Dr(r)}catch(i){if(!K())throw i;o=null}if((o?.data?.stocks||o?.data||[]).length){l({data:o,command:`quote search ${r}`,source:"xq",toJSON:So});return}if(K())try{let i=await sr(r,{limit:20});if(i?.item?.length){l({data:i,command:`quote search ${r}`,source:"fuyao fallback",toJSON:c=>({items:(c?.item||[]).map(u=>({code:u.thscode||"",name:u.name||"",type:u.asset_type||"",exchange:u.exchange??null})),total:c?.item?.length??0})});return}}catch{}let s=await jt(r,20);if(s&&s.quotes.length){l({data:s,command:`quote search ${r}`,source:"yahoo fallback",toJSON:i=>({items:i.quotes.map(c=>({code:c.symbol,name:c.name,type:c.quoteType,exchange:c.exchange})),total:i.quotes.length})});return}l({data:o,command:`quote search ${r}`,source:"xq",toJSON:So})}).command("industry [ind_code]","\u884C\u4E1A\uFF08\u96EA\u7403\uFF09\uFF1A\u5217\u51FA\u884C\u4E1A\u6216\u67D0\u884C\u4E1A\u6210\u5206\u80A1\uFF08A\u80A1\u7533\u4E07/\u7F8E\u80A1GICS/\u6E2F\u80A1\u6052\u751F\uFF09",e=>e.positional("ind_code",{type:"string",describe:"\u884C\u4E1A\u4EE3\u7801\uFF08\u677F\u5757ID\uFF09\uFF1B\u6CE8\u610F\u4E0D\u662F\u80A1\u7968\u4EE3\u7801\u3002\u7701\u7565\u5219\u5217\u51FA\u5168\u90E8\u884C\u4E1A\u3002\u5404\u5E02\u573A\u4EE3\u7801\u4F53\u7CFB\u4E0D\u540C\uFF1Acn=\u7533\u4E07(S2701=\u534A\u5BFC\u4F53) / us=GICS(453010=\u534A\u5BFC\u4F53) / hk=\u6052\u751F(7030=\u5DE5\u4E1A\u5DE5\u7A0B)"}).option("market",{type:"string",default:"cn",choices:["cn","us","hk"],describe:"\u5E02\u573A\uFF1Acn(A\u80A1\u7533\u4E07) / us(\u7F8E\u80A1GICS) / hk(\u6E2F\u80A1\u6052\u751F)"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async e=>{let{n:r=30}=e,o=e.ind_code,a=String(e.market??"cn").toLowerCase(),s=e["order-by"]??"percent",i=e.order??"desc";if(!o){let m=await Tr({category:a});if(m?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${m.error_description||m.error_code}`);return l({data:m,command:`quote industry --market ${a}`,source:"xq",toJSON:di})}let{list:c,count:u}=await _o({n:r,order:i,order_by:s,market:a.toUpperCase(),ind_code:o});l({data:{list:c},command:`quote industry ${o} --market ${a}`,source:"xq",toJSON:()=>wo(c,u)})}).command("industry-profile <code>","\u4E2A\u80A1\u884C\u4E1A\u753B\u50CF\uFF08\u96EA\u7403 F10\uFF09\uFF1A\u6240\u5C5E\u884C\u4E1A/\u6982\u5FF5/\u4E3B\u8425/\u5B9E\u63A7\u4EBA",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async e=>{let r=e.code,o=r.length<=6?r.toUpperCase().startsWith("SH")||r.toUpperCase().startsWith("SZ")?r:r.toUpperCase():r,a=await jr(o);l({data:a,command:`quote industry-profile ${r}`,source:"xq",toJSON:oi})}).command("board <type>","\u677F\u5757/\u5E02\u573A\u4E00\u89C8\u6210\u5206\u80A1\uFF08\u96EA\u7403\uFF09",e=>e.positional("type",{type:"string",describe:"\u677F\u5757/\u5E02\u573A\uFF1AA\u80A1 sh_sz/sha/sza/cyb/kcb/shb/szb/zxb/xsbno/xsbin\uFF1B\u7F8E\u80A1 us\uFF1B\u6E2F\u80A1 hk\uFF1B\u4E2D\u6982\u80A1 us_china"}).option("order-by",{type:"string",default:"percent",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF08\u96EA\u7403\u9875\u9762\u53EF\u6392\u5E8F\u7684\u5217\uFF09\uFF1Acurrent/chg/percent/current_year_percent/volume/amount/turnover_rate/pe_ttm/dividend_yield/market_capital"}).option("order",{type:"string",choices:["asc","desc"],default:"desc"}),async e=>{let{n:r=30}=e,o=e.type,a=e["order-by"]??"percent",s=e.order??"desc",i=o==="hk"?"HK":o==="us"||o==="us_china"?"US":"CN",{list:c,count:u}=await _o({n:r,order:s,order_by:a,market:i,type:o});l({data:{list:c},command:`quote board ${o}`,source:"xq",toJSON:()=>wo(c,u)})}).command("kline [code]","K\u7EBF",e=>e.positional("code",{type:"string"}).option("period",{alias:"p",type:"string",default:"d"}).option("number",{alias:"n",type:"number",default:120}).option("src",{type:"string",choices:["cls","xq","fuyao","yahoo"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u53EF\u7528 xq \u6216 yahoo\uFF1B\u590D\u6743\u65E5\u7EBF/\u540C\u82B1\u987A\u6307\u6570\u7528 fuyao\uFF09"}).option("adjust",{alias:"a",type:"string",default:"none",choices:["none","forward","backward"],describe:"\u590D\u6743\uFF08\u4EC5 fuyao \u65E5\u7EBF\uFF1Aforward \u524D\u590D\u6743 / backward \u540E\u590D\u6743\uFF09"}),async e=>{let{p:r="d",n:o=120,src:a}=e,s=e.adjust||e.a||"none",i=e.code,c;try{c=Me(r)}catch(y){return l({data:{error:y.message},command:`quote kline ${i} -p ${r}`,source:"finflow"})}let u=No.has(c);if(a==="yahoo"){let y=await ke(i,c,o);if(y&&y.items.length)return l({data:y.items,command:`quote kline ${i} -p ${c} --src yahoo`,source:"yahoo",toJSON:()=>({code:y.symbol,period:c,items:y.items,total:y.total})});throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${i} \u7684 K \u7EBF\u6570\u636E`)}if(a==="fuyao"||s!=="none"||Jt(i)){if(!K())throw new Error("\u6276\u6447\u5B98\u65B9\u6E90\u672A\u914D\u7F6E\uFF1A\u590D\u6743\u65E5K/\u540C\u82B1\u987A\u6307\u6570K\u7EBF\u9700\u8981\u5148\u8FD0\u884C finflow key set fuyao <sk-fuyao-\u2026>");if(u)throw new Error("\u6276\u6447 K \u7EBF\u4EC5\u652F\u6301\u65E5\u7EBF\uFF08interval=1d\uFF09\uFF1B\u5206\u949F\u7EBF\u8BF7\u7528\u9ED8\u8BA4\u6E90\uFF08xq\uFF09");let y=await co(i,o,s!=="none"?s:void 0);l({data:y,command:`quote kline ${i} -p d${s!=="none"?` --adjust ${s}`:""}`,source:"fuyao",toJSON:()=>io(i,y,s)});return}if(!a&&$t(i)){let y=await ke(i,c,o);if(y&&y.items.length)return l({data:y.items,command:`quote kline ${i} -p ${c}`,source:"yahoo",toJSON:()=>({code:y.symbol,period:c,items:y.items,total:y.total})});throw new Error(`Yahoo \u65E0\u6CD5\u83B7\u53D6 ${i} \u7684 K \u7EBF\u6570\u636E`)}let d=a==="xq"||!a&&u,p=async y=>{if(y){let v=await Or(ko(i),{period:c,count:o}),C=v?.data?.item||v?.data||[];return{items:C,toJSON:()=>ri(i,c,C),source:"xq"}}let h=c==="w"?"w":c==="m"?"m":c==="y"?"y":"d",b=[],w,_=0,I=50;for(;b.length<o&&_++<I;){let C=(await on(i,{period:h,limit:Math.min(o-b.length,200),start_date:w}))?.data||[];if(!C.length)break;b=[...C,...b],w=String(C[0].trade_date)}let k=b.slice(-o);return{items:k,toJSON:()=>ni(i,h,k),source:"cls"}},g=(y,h)=>!Array.isArray(y.items)||!y.items.length?!1:(l({data:y.items,command:`quote kline ${i} -p ${c}`,source:h,toJSON:y.toJSON}),!0);try{let y=await p(d);if(g(y,y.source))return;throw new Error("empty kline")}catch(y){if(!u){try{let h=await p(!d);if(g(h,`${h.source} fallback`))return}catch{}if(K()&&It(i))try{let h=await co(i,o);if(h?.length){l({data:h,command:`quote kline ${i} -p d`,source:"fuyao fallback",toJSON:()=>io(i,h)});return}}catch{}}try{let h=await ke(i,c,o);if(h&&h.items.length){l({data:h.items,command:`quote kline ${i} -p ${c}`,source:"yahoo fallback",toJSON:()=>({code:h.symbol,period:c,items:h.items,total:h.total})});return}}catch{}throw y}}).command("depth [code]","\u4E94\u6863\u76D8\u53E3",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await At(o);return l({data:s,command:`quote depth ${o} --src xq`,source:"xq",toJSON:i=>lo(o,i?.data||{})})}else{let s=await We(o);return l({data:s,command:`quote depth ${o}`,source:"cls",toJSON:i=>uo(o,i?.data||{})})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await At(o);l({data:i,command:`quote depth ${o} --src xq`,source:"xq fallback",toJSON:c=>lo(o,c?.data||{})})}else{let i=await We(o);l({data:i,command:`quote depth ${o}`,source:"cls fallback",toJSON:c=>uo(o,c?.data||{})})}}}).command("ticks [code]","\u9010\u7B14\u6210\u4EA4",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await Tt(o);return l({data:s,command:`quote ticks ${o} --src xq`,source:"xq",toJSON:i=>po(o,i)})}else{let s=await Qe(o);return l({data:s,command:`quote ticks ${o}`,source:"cls",toJSON:i=>mo(o,i)})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await Tt(o);l({data:i,command:`quote ticks ${o} --src xq`,source:"xq fallback",toJSON:c=>po(o,c)})}else{let i=await Qe(o);l({data:i,command:`quote ticks ${o}`,source:"cls fallback",toJSON:c=>mo(o,c)})}}}).command("timeline [code]","\u5206\u65F6\u7EBF",e=>e.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls",describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async e=>{let{src:r="cls"}=e,o=e.code,a=r;try{if(a==="xq"){let s=await Dt(o,{period:"1d"});return l({data:s,command:`quote timeline ${o} --src xq`,source:"xq",toJSON:i=>yo(o,i)})}else{let s=await Ve(o);return l({data:s,command:`quote timeline ${o}`,source:"cls",toJSON:i=>fo(o,i)})}}catch{if((a==="xq"?"cls":"xq")==="xq"){let i=await Dt(o,{period:"1d"});l({data:i,command:`quote timeline ${o} --src xq`,source:"xq fallback",toJSON:c=>yo(o,c)})}else{let i=await Ve(o);l({data:i,command:`quote timeline ${o}`,source:"cls fallback",toJSON:c=>fo(o,c)})}}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",r=>r,async()=>{let r=await ye();l({data:r,command:"quote flow market",source:"glh",toJSON:we})}).command("history <code>","\u5386\u53F2\u8D44\u91D1\u6D41",r=>r.option("count",{alias:"c",type:"number",default:20}),async r=>{let{c:o=20}=r,a=r.code,s=await Ir(a,{count:o});l({data:s,command:`quote flow history ${a}`,source:"xq",toJSON:go})}).command("margin <code>","\u878D\u8D44\u878D\u5238",r=>r,async r=>{let o=r.code,a=await Rr(o);l({data:a,command:`quote flow margin ${o}`,source:"xq",toJSON:si})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",r=>r,async r=>{let o=r.code,s=await vt(o);l({data:s,command:`quote flow intraday ${o}`,source:"xq",toJSON:go})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",r=>r,async r=>{let o=r.code,s=await vt(o);l({data:s,command:`quote flow xq ${o}`,source:"xq",toJSON:mi})}),async e=>{let{code:r}=e;if(r){let o=await an(r);l({data:o,command:`quote flow ${r}`,source:"cls",toJSON:ai})}else{let o=await ye();l({data:o,command:"quote flow market",source:"glh",toJSON:we})}}).command("f10 [code]","\u57FA\u672C\u9762\uFF08\u9ED8\u8BA4\u4E3B\u8981\u6307\u6807\uFF0C\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",e=>e.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",r=>r,async r=>{let o=r.code;try{let s=await Et(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 holders ${o}`,source:"xq",toJSON:ho})}catch{}let a=await Et(o);l({data:a,command:`quote f10 holders ${o}`,source:"xq",toJSON:ho})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",r=>r,async r=>{let o=r.code;try{let s=await Pt(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 bonus ${o}`,source:"xq",toJSON:bo})}catch{}try{let s=await ae(o);if(s?.stats)return l({data:s.stats,command:`quote f10 bonus ${o}`,source:"yahoo fallback",toJSON:()=>({items:[{dividendRate:s.stats?.dividendRate,dividendYield:s.stats?.dividendYield,exDividendDate:s.stats?.exDividendDate,payoutRatio:s.stats?.payoutRatio}],total:1})})}catch{}let a=await Pt(o);l({data:a,command:`quote f10 bonus ${o}`,source:"xq",toJSON:bo})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",r=>r,async r=>{let o=r.code;try{let s=await Se(o);if(s?.data?.items?.length)return l({data:s,command:`quote f10 indicator ${o}`,source:"xq",toJSON:Je})}catch{}try{let s=await ae(o);if(s?.stats)return l({data:s.stats,command:`quote f10 indicator ${o}`,source:"yahoo fallback",toJSON:()=>({items:[{report:"latest",peTtm:s.stats?.trailingPE,pb:s.stats?.priceToBook,roe:s.stats?.returnOnEquity,eps:s.stats?.dilutedEps,grossMargin:s.stats?.grossMargins,netMargin:s.stats?.profitMargins,dividendYield:s.stats?.dividendYield,revenue:s.stats?.totalRevenue,netProfit:s.stats?.netIncome,revenueYoy:s.stats?.quarterlyRevenueGrowth,netProfitYoy:s.stats?.quarterlyEarningsGrowth,marketCap:s.stats?.marketCap,currency:s.stats?.currency}],total:1})})}catch{}let a=await Se(o);l({data:a,command:`quote f10 indicator ${o}`,source:"xq",toJSON:Je})}).command("profile <code>","\u516C\u53F8\u8D44\u6599\u4E0E\u9AD8\u7BA1",r=>r,async r=>{let o=r.code,a=await ae(o);if(!a?.profile)throw new Error(`\u65E0\u6CD5\u83B7\u53D6 ${o} \u7684\u516C\u53F8\u8D44\u6599`);l({data:a.profile,command:`quote f10 profile ${o}`,source:"yahoo",toJSON:s=>({code:s.symbol,name:s.name,sector:s.sector,industry:s.industry,website:s.website,phone:s.phone,address:[s.address,s.city,s.state,s.country].filter(Boolean).join(", "),employees:s.employees,description:s.description,officers:s.officers,source:"yahoo"})})}),async e=>{let r=e.code;if(!r)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote f10 sh600519"},command:"quote f10",source:"xq"});try{let a=await Se(r);if(a?.data?.items?.length)return l({data:a,command:`quote f10 indicator ${r}`,source:"xq",toJSON:Je})}catch{}try{let a=await ae(r);if(a?.stats)return l({data:a.stats,command:`quote f10 indicator ${r}`,source:"yahoo fallback",toJSON:()=>({items:[{report:"latest",peTtm:a.stats?.trailingPE,pb:a.stats?.priceToBook,roe:a.stats?.returnOnEquity,eps:a.stats?.dilutedEps,grossMargin:a.stats?.grossMargins,netMargin:a.stats?.profitMargins,dividendYield:a.stats?.dividendYield,revenue:a.stats?.totalRevenue,netProfit:a.stats?.netIncome,revenueYoy:a.stats?.quarterlyRevenueGrowth,netProfitYoy:a.stats?.quarterlyEarningsGrowth,marketCap:a.stats?.marketCap,currency:a.stats?.currency}],total:1})})}catch{}let o=await Se(r);l({data:o,command:`quote f10 indicator ${r}`,source:"xq",toJSON:Je})}).command("auction <codes...>","\u96C6\u5408\u7ADE\u4EF7\u5FEB\u7167\uFF08\u7ADE\u4EF7\u4EF7\u683C/\u91CF\u6BD4/\u672A\u5339\u914D\u91CF\uFF0C\u6276\u6447\u5B98\u65B9\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 600519 000001"}).option("live",{type:"boolean",default:!1,describe:"\u5B9E\u65F6\u9636\u6BB5\uFF08\u9ED8\u8BA4\u7EC8\u6001 final\uFF09"}),async e=>{let r=e.codes,o=e.live?"live":"final",a=await ao(r,o),s=a?.item||[];l({data:a,command:`quote auction ${r.join(" ")}`,source:"fuyao",toJSON:()=>({phase:a?.auction_phase||"",dataStatus:a?.data_status||"",items:s.map(i=>({code:i.thscode||"",name:i.name||"",price:i.auction_price??null,changePercent:H(i.auction_pct),volume:i.auction_volume??null,amount:i.auction_amount??null,unmatched:i.auction_unmatched??null,turnoverRate:H(i.auction_turnover_pct),volumeRatio:i.auction_volume_ratio??null,preClose:i.pre_close_price??null,floatMarketCap:i.float_market_cap??null})),total:a?.total??s.length})})}).command("announcement <code>","\u4E2A\u80A1\u516C\u544A\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6700\u65B0\u516C\u544A\u5217\u8868",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}),async e=>{let r=e.code,o=e.p??1,a=await ln(r,{page:o});l({data:a,command:`quote announcement ${r}`,source:"cls",toJSON:ii})}).command("interaction <code>","\u4E92\u52A8\u6613\u95EE\u7B54\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u6295\u8D44\u8005\u63D0\u95EE\u4E0E\u516C\u53F8\u56DE\u590D",e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF0C\u5982 sh600176"}).option("page",{alias:"p",type:"number",default:1,describe:"\u9875\u7801"}).option("size",{alias:"s",type:"number",default:15,describe:"\u6BCF\u9875\u6761\u6570"}).option("keyword",{alias:"k",type:"string",default:"",describe:"\u5173\u952E\u8BCD\u7B5B\u9009"}),async e=>{let r=e.code,o=e.p??1,a=e.s??15,s=e.k??"",i=await mn(r,{page:o,pageSize:a,keyWord:s});l({data:i,command:`quote interaction ${r}`,source:"cls",toJSON:ci})}).command("finance [code]","\u8D22\u52A1\u62A5\u8868",e=>e.positional("code",{type:"string"}).option("type",{alias:"t",type:"string",choices:["indicator","cashflow","income","balance"],default:"indicator"}).option("src",{type:"string",choices:["xq","fuyao"],default:"xq",describe:"\u6570\u636E\u6E90\uFF1Bfuyao \u4E3A\u5B98\u65B9\u591A\u671F\u5E8F\u5217\uFF08--period annual|quarterly\uFF0C\u652F\u6301 --limit/--start/--end \u65E5\u671F YYYY-MM-DD\uFF09"}).option("period",{type:"string",choices:["annual","quarterly"],default:"annual",describe:"fuyao \u62A5\u544A\u671F\u7C7B\u578B"}).option("limit",{type:"number",default:4,describe:"fuyao \u6700\u8FD1 N \u671F\uFF081..20\uFF09"}).option("start",{type:"string",describe:"fuyao \u533A\u95F4\u8D77\u59CB\u65E5 YYYY-MM-DD\uFF08\u4E0E --end \u540C\u4F20\uFF09"}).option("end",{type:"string",describe:"fuyao \u533A\u95F4\u622A\u6B62\u65E5 YYYY-MM-DD"}),async e=>{let{t:r="indicator",src:o="xq"}=e,a=e.code;if(o==="fuyao"){let{period:s="annual",limit:i=4}=e,{start:c,end:u}=e,m=c&&u?{period:s,start:Date.parse(`${c}T00:00:00+08:00`),end:Date.parse(`${u}T00:00:00+08:00`)}:{period:s,limit:i},d=r==="income"?lr:r==="balance"?mr:r==="cashflow"?dr:null;if(!d)return l({data:{error:"\u6276\u6447\u6E90\u7684\u8D22\u52A1\u6307\u6807\u8BF7\u7528: finflow quote indicators <code> <report>\uFF08report \u5982 2025-4\uFF09"},command:`quote finance ${r} ${a} --src fuyao`,source:"fuyao"});let p=await d(a,m);l({data:p,command:`quote finance ${r} ${a} --src fuyao --period ${s}`,source:"fuyao",toJSON:g=>({code:O(a),type:r,period:s,items:(g?.item||[]).map(y=>({fiscalYear:y.fiscal_year??null,fiscalPeriod:y.fiscal_period||"",reportDate:y.report_date_ms?new Date(y.report_date_ms).toISOString():null,periodEnd:y.period_end_ms?new Date(y.period_end_ms).toISOString():null,...Object.fromEntries(Object.entries(y).filter(([h])=>!h.endsWith("_ms")&&!["thscode","ticker","period","fiscal_year","fiscal_period","currency"].includes(h)))})),total:g?.item?.length??0})});return}if(r==="indicator"){let s=await vr(a);l({data:s,command:`quote finance indicator ${a}`,source:"xq",toJSON:ui})}else{let i={cashflow:Cr,income:qr,balance:$r}[r];if(!i)return l({data:{error:`\u672A\u77E5\u7C7B\u578B: ${r}\uFF0C\u53EF\u9009 indicator/cashflow/income/balance`},command:`quote finance ${r}`,source:"xq"});let c=await i(a);l({data:c,command:`quote finance ${r} ${a}`,source:"xq",toJSON:u=>li(u,r)})}}).command("valuation <codes...>","\u5386\u53F2\u4F30\u503C\u5206\u4F4D\u6570\u5206\u6790\uFF08PE/PB/PS/PCF \u5206\u4F4D\u3001\u9AD8\u4F4E\u503C\u3001\u4E2D\u4F4D\u6570\u4E0E\u4F30\u503C\u72B6\u6001\uFF1B\u591A\u53EA\u4E3A\u6279\u91CF\u5FEB\u7167\u5BF9\u6BD4\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519 \u6216 600519 000651"}).option("years",{alias:"y",type:"number",default:5,describe:"\u5386\u53F2\u5206\u4F4D\u6570\u8BA1\u7B97\u5E74\u9650\uFF081/3/5/10\uFF0C\u9ED8\u8BA4 5 \u5E74\uFF09"}).option("batch",{type:"boolean",default:!1,describe:"\u5F3A\u5236\u4F7F\u7528\u6A2A\u5411\u6279\u91CF\u5FEB\u7167\u6A21\u5F0F"}),async e=>{let r=e.codes,o=Number(e.years||e.y||5),a=!!e.batch;if(r.length===1&&!a){let c=r[0],u=await Jr(c,o);if(u)return l({data:u,command:`quote valuation ${c}${o!==5?` -y ${o}`:""}`,source:"xq",toJSON:m=>m})}if(r.length>100)throw new Error("\u4F30\u503C\u5FEB\u7167\u5355\u6B21\u6700\u591A 100 \u53EA");if(K()){let c=await fr(r);return l({data:c,command:`quote valuation ${r.join(" ")}`,source:"fuyao",toJSON:u=>({items:(u?.item||[]).map(m=>({code:m.thscode||"",name:m.name??null,peTtm:H(m.pe_ttm),peMrq:H(m.pe_mrq),pb:H(m.pb_mrq),ps:H(m.ps_ttm),pcf:H(m.pcf_ttm)})),total:u?.total??u?.item?.length??0})})}let s=await Ot(r),i=Array.isArray(s?.data?.items)?s.data.items:[];l({data:s,command:`quote valuation ${r.join(" ")}`,source:"xq fallback",toJSON:()=>({items:i.map(c=>({code:c.symbol||c.code,name:c.name||"",price:c.current??c.price,peTtm:H(c.pe_ttm),pb:H(c.pb),marketCap:c.market_capital})),total:i.length})})}).command("indicators <code> [report]","\u8D22\u52A1\u6307\u6807\uFF08\u6276\u6447\u5B98\u65B9\uFF0C\u4E94\u7EF4\uFF09\uFF1A\u6210\u957F/\u76C8\u5229/\u507F\u503A/\u8425\u8FD0/\u73B0\u91D1\u6D41\uFF1Breport \u5982 2025-4\uFF08\u9ED8\u8BA4\u6700\u8FD1\u5E74\u62A5\uFF09",e=>e.positional("code",{type:"string",describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519"}).positional("report",{type:"string",describe:"\u62A5\u544A\u671F yyyy-1|2|3|4\uFF081 \u4E00\u5B63\u62A5 / 4 \u5E74\u62A5\uFF09\uFF0C\u9ED8\u8BA4 <\u4ECA\u5E74>-4"}),async e=>{let r=e.code,o=`${new Date().getFullYear()-1}-4`,a=e.report||o,s=await pr(r,a),i={growth:"\u6210\u957F",profitability:"\u76C8\u5229",solvency:"\u507F\u503A",operation:"\u8425\u8FD0","cash-flow":"\u73B0\u91D1\u6D41"};l({data:s,command:`quote indicators ${r} ${a}`,source:"fuyao",toJSON:c=>({code:c?.thscode||O(r),report:a,abilities:(c?.abilities||[]).map(u=>({ability:i[u.ability]||u.ability,indicators:(u.indicators||[]).map(m=>({id:m.index_id,value:m.value}))}))})})}).command("adjust <code>","\u590D\u6743\u56E0\u5B50\u4E8B\u4EF6\u6D41\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1A\u6BCF\u80A1\u5206\u7EA2/\u9001\u8F6C\uFF0C\u6309\u9664\u6743\u65E5\u964D\u5E8F",e=>e.positional("code",{type:"string",describe:"A\u80A1\u4EE3\u7801\uFF0C\u5982 600519"}).option("from",{type:"string",describe:"\u8D77\u59CB\u65E5 YYYY-MM-DD"}).option("to",{type:"string",describe:"\u622A\u6B62\u65E5 YYYY-MM-DD"}),async e=>{let r=e.code,{from:o,to:a}=e,s=await ur(r,{from:o,to:a});l({data:s,command:`quote adjust ${r}`,source:"fuyao",toJSON:i=>({code:i?.thscode||O(r),items:(i?.item||[]).map(c=>({exDate:c.ex_date_ms?new Date(c.ex_date_ms).toISOString().slice(0,10):null,dividendPerShare:c.dividend_per_share??null,perShareBonus:c.per_share_bonus??null})),total:i?.item?.length??0})})}),handler:async t=>{let e=t.codes||[];if(!e.length)return l({data:{error:"\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL\uFF08\u591A\u53EA\u7528\u7A7A\u683C\u5206\u9694\u5373\u6279\u91CF\uFF09"},command:"quote",source:"cls"});let r=["search","related","industry","industry-profile","board","kline","depth","ticks","timeline","sector","flow","f10","finance","valuation","indicators","adjust","detail"];if(e.length===1&&r.includes(e[0]))return l({data:{error:`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${e[0]} <code>`},command:`quote ${e[0]}`,source:"cls"});if(e.every(u=>Jt(u))){if(!K())throw new Error("\u540C\u82B1\u987A\u6307\u6570(88xxxx.TI)\u884C\u60C5\u6765\u81EA\u6276\u6447\u5B98\u65B9\u6E90\uFF0C\u8BF7\u5148\u8FD0\u884C finflow key set fuyao <sk-fuyao-\u2026>");let u=await rr(e),m=u?.item||[];l({data:u,command:`quote ${e.join(" ")}`,source:"fuyao",toJSON:()=>({items:m.map(d=>Rt(d,"fuyao")),total:m.length})});return}if(e.length>1){let u=[];try{u=await xo(e)}catch{u=[]}if(u.length){l({data:u,command:`quote ${e.join(" ")}`,source:"xq",toJSON:()=>Ws(u)});return}if(K()&&e.every(It)){let m=await be(e),d=m?.item||[];l({data:m,command:`quote ${e.join(" ")}`,source:"fuyao fallback",toJSON:()=>({items:d.map(p=>Rt(p)),total:d.length})});return}throw new Error(`\u96EA\u7403\u65E0\u6CD5\u83B7\u53D6 ${e.join(" ")} \u7684\u6279\u91CF\u884C\u60C5${K()?"":"\uFF08\u914D\u7F6E\u6276\u6447 key \u53EF\u542F\u7528 A \u80A1\u515C\u5E95\uFF1Afinflow key set fuyao\uFF09"}`)}let o=e[0],a=o.trim().toUpperCase();if(/^[A-Z]{1,5}$/.test(a)&&!a.startsWith("SH")&&!a.startsWith("SZ"))try{let u=await _e(a);if(u){l({data:u,command:`quote ${o}`,source:"yahoo",toJSON:()=>Mt(u)});return}}catch{}try{let u=await rn(o);if(Qs(u)){l({data:u,command:`quote ${o}`,source:"cls",toJSON:zs});return}}catch{}let i=null;try{i=await Zs(o)}catch{}if(Vs(i)){l({data:i,command:`quote ${o}`,source:"xq fallback",toJSON:u=>({code:u.symbol||"",name:u.name||"",price:u.current??0,change:u.chg??0,changePercent:Math.round((u.percent??0)*100)/100,open:u.open??0,high:u.high??0,low:u.low??0,preclose:u.last_close??0,volume:u.volume??0,amount:u.amount??0,turnoverRate:u.turnover_rate??0,amplitude:u.amplitude??0,avgPrice:u.avg_price??0,volumeRatio:u.volume_ratio??0,pe:u.pe_ttm??null,pb:u.pb??null,marketCap:u.market_capital??0,change3d:null,change5d:null,status:u.status===1?"trading":"closed",source:"xq fallback"})});return}if(K()&&It(o))try{let m=(await be([o]))?.item?.[0];if(m&&m.last_price!=null){l({data:m,command:`quote ${o}`,source:"fuyao fallback",toJSON:Rt});return}}catch{}let c=oe(o);if(c){let u=await _e(c);if(u){l({data:u,command:`quote ${o}`,source:"yahoo fallback",toJSON:()=>Mt(u)});return}}if(i){l({data:i,command:`quote ${o}`,source:"xq fallback",toJSON:u=>({code:u.symbol||"",name:u.name||"",price:u.current??0,change:u.chg??0,changePercent:Math.round((u.percent??0)*100)/100,open:u.open??0,high:u.high??0,low:u.low??0,preclose:u.last_close??0,volume:u.volume??0,amount:u.amount??0,turnoverRate:u.turnover_rate??0,amplitude:u.amplitude??0,avgPrice:u.avg_price??0,volumeRatio:u.volume_ratio??0,pe:u.pe_ttm??null,pb:u.pb??null,marketCap:u.market_capital??0,change3d:null,change5d:null,status:u.status===1?"trading":"closed",source:"xq fallback"})});return}throw new Error(`cls\u3001xq \u548C Yahoo \u5747\u65E0\u6CD5\u83B7\u53D6 ${o} \u7684\u884C\u60C5\u6570\u636E`)}})}function pi(n){let t=n?.data||{},e=t.limit_up_board||{},r=t.up_down_dis||{};return{marketDegree:Number(t.market_degree)||0,limitUp:Number(t.up_ratio_num||0),limitOpen:Number(t.up_open_num||0),sealRate:parseFloat(t.up_ratio)||0,turnover:t.shsz_balance||"",turnoverChange:t.shsz_balance_change_px||"",limitUpBoard:e.row2?{total:e.row2[0]||0,first:e.row2[1]||0,second:e.row2[2]||0,third:e.row2[3]||0,promoteRate:e.row3?{first:e.row3[1]||"",second:e.row3[2]||"",third:e.row3[3]||""}:{}}:null,prevPerformance:t.performance||"",gapUpRate:t.up_open_ratio||"",profitRate:t.profit_ratio||"",distribution:r.status?{limitUp:Number(r.up_num||0),limitDown:Number(r.down_num||0),rise:Number(r.rise_num||0),fall:Number(r.fall_num||0),flat:Number(r.flat_num||0),suspend:Number(r.suspend_num||0)}:null,source:"cls"}}function Ao(n){let t=n.result||[],e=t.filter(o=>o.category==="\u6307\u6570"),r=t.filter(o=>o.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:e.map(o=>({name:o.name,value:Number(o.value||0),change:Number(o.change||0),changePercent:Math.round(Number(o.netChange||0)*1e4)/100})),capitalFlow:r.map(o=>({name:o.name,shanghai:o.sh??null,shenzhen:o.sz??null})),source:"glh"}}function fi(n){let t=n.result||[];return{items:t.map(e=>({name:e.stockName||"",code:(e.stockType||"")+(e.stockCode||""),price:e.currentPrice??null,changePercent:e.netChange!=null?Math.round(Number(e.netChange)*1e4)/100:null})),total:t.length}}function yi(n){let t=(n?.data?.items||[]).map(e=>({code:e.symbol||"",name:e.name||"",close:e.close??null,changePercent:Math.round((e.percent??0)*100)/100,volume:e.volume??null,amount:e.amount??null,reasons:e.type_name||[]}));return{items:t,total:n?.data?.items_size??t.length}}function Lt(n){return Date.parse(`${n}T00:00:00+08:00`)}var z=n=>n==null?null:Math.round(n*100)/100;function gi(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:z(e.price_change_ratio_pct),limitUpTime:e.limit_up_time||"",reason:e.limit_up_reason??null,continueDays:e.continue_day_cnt??null,continueText:e.continue_day_text||"",sealMoney:e.seal_money??null,maxSealMoney:e.max_seal_money??null,isSt:!!e.is_st,isNew:!!e.is_new})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function hi(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:z(e.price_change_ratio_pct),firstLimitTime:e.first_limit_time||"",lastLimitTime:e.last_limit_time||"",turnoverRate:z(e.turnover_ratio_pct)})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}function bi(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",price:e.last_price??null,changePercent:z(e.price_change_ratio_pct),openTimes:e.open_times??null,turnoverRate:z(e.turnover_ratio_pct),amount:e.turnover??null})),total:n?.pagination?.total??t.length,page:n?.pagination?.page??1}}var Si=[["two_board","2\u677F"],["three_board","3\u677F"],["four_board","4\u677F"],["five_board","5\u677F"],["six_board","6\u677F"],["seven_over","7\u677F+"]];function wi(n){let t=n?.item||[];return{windowDays:n?.window?.length??null,items:t.map(e=>({date:(e.date||"").replace(/^(\d{4})(\d{2})(\d{2})$/,"$1-$2-$3"),boards:Object.fromEntries(Si.map(([r,o])=>[o,(e.boards?.[r]||[]).map(a=>({code:a.thscode||"",name:a.name||"",boardNum:a.board_num??null,sealNextday:a.seal_nextday??null}))]))})),total:t.length}}function Do(n){let t=n?.item||[];return{items:t.map(e=>({rank:e.rank??null,code:e.thscode||"",name:e.name||"",heat:e.heat??null,rankChange:e.rank_change??null,rankTrend:e.rank_trend||""})),total:t.length}}function _i(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({rank:e.rank??null,code:e.thscode||"",name:e.name||""})),total:t.length}}function ki(n){let t=n?.item||[];return{items:t.map(e=>({date:e.date||"",rank:e.rank??null})),total:t.length}}function xi(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||"",tag:e.tag_name||"",analysis:e.analysis_content||"",keywords:e.keyword_list||[]})),total:t.length}}function Ni(n){let t=n?.stock_items||[],e=n?.hot_money_items||[];return{tradeDate:n?.trade_date||"",boardType:n?.board_type||"all",items:t.map(r=>({code:r.thscode||"",name:r.name||"",changePercent:z((r.change??0)*100),netBuy:r.net_value??null,netRate:z((r.net_rate??0)*100),buy:r.buy_value??null,sell:r.sell_value??null,orgNetBuy:r.org_net_value??null,orgBuyNum:r.org_buy_num??null,orgSellNum:r.org_sell_num??null,hotRank:r.hot_rank??null,reason:r.limit_reason??null,rangeDays:r.range_days??null,concepts:(r.concept_list||[]).map(o=>o.name||"")})),hotMoneyItems:e.map(r=>({name:r.name||"",netBuy:r.buying??null,stocks:(r.rows||[]).map(o=>({code:o.thscode||"",name:o.name||"",changePercent:z((o.change??0)*100)}))})),total:n?.stock_count??t.length}}function Oi(n){let t=n?.item||[];return{date:n?.date||"",items:t.map(e=>({code:e.thscode||"",name:e.name||"",changePercent:z(e.auction_pct),tags:e.tags||[]})),total:t.length}}function Ai(n,t){let e=(n?.data?.list||[]).map(r=>({name:r.name||"",items:(r.data||[]).filter(o=>o.published===1).map(o=>({category:o.category||"",city:o.city||"",spot:o.spot_data??null,futures:o.futures_data??null,basis:o.jicha??null,basisRate:o.jicha_rate??null}))}));if(t){let r=e.find(o=>o.name===t);if(!r)return{error:`\u672A\u77E5\u677F\u5757: ${t}\u3002\u53EF\u7528: ${e.map(o=>o.name).join("/")}`};e=[r]}return{groups:e,total:e.reduce((r,o)=>r+o.items.length,0)}}async function Di(n,t){let e=await Hn(n);l({data:e,command:`market basis ${n}`,source:"jin10",toJSON:r=>Ai(r,t)})}function To(n){return n.command({command:"market",describe:"\u5E02\u573A\u603B\u89C8",builder:t=>t.strictCommands(!1).command("basis [date]","\u671F\u73B0\u57FA\u5DEE\uFF08jin10 qihuo\uFF0C\u73B0\u8D27 vs \u671F\u8D27\u4EF7\u5DEE\uFF09",e=>e.positional("date",{type:"string"}).option("group",{alias:"g",type:"string",describe:"\u6309\u677F\u5757\u8FC7\u6EE4: \u9ED1\u8272\u7CFB/\u91D1\u5C5E/\u519C\u4EA7\u54C1/\u80FD\u6E90\u5316\u5DE5/\u91D1\u878D"}),async e=>{await Di(e.date||R(),e.g)}).command("emotion","\u5E02\u573A\u60C5\u7EEA\uFF08cls\uFF09",e=>e,async()=>{let e=await cn();l({data:e,command:"market emotion",source:"cls",toJSON:pi})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",e=>e,async()=>{let e=await mt();l({data:e,command:"market index",source:"glh",toJSON:Ao})}).command("hk [sort]","\u6E2F\u80A1\u6392\u884C\uFF08glh\uFF0C\u9ED8\u8BA4\u964D\u5E8F\uFF09",e=>e.option("order",{alias:"o",type:"string",choices:["asc","desc"],default:"desc",describe:"\u6392\u5E8F\u65B9\u5411\uFF08\u9ED8\u8BA4 desc \u964D\u5E8F\uFF09"}),async e=>{let r=e.sort,o=e.order||"desc",a=Kn(r),s=await Gn({sort:a.id,order:o});l({data:s,command:"market hk",source:"glh",toJSON:fi})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",e=>e,async()=>{let e=await ye();l({data:e,command:"market flow",source:"glh",toJSON:we})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",e=>e,async()=>{let e=await En(),r=e?.data?.list||[];l({data:e,command:"market rates",source:"jin10",toJSON:()=>({items:r.map(o=>({bank:o.bankName,rate:o.interestRate,date:o.publishTime}))})})}).command("longhu [date]","\u9F99\u864E\u699C\uFF08\u6276\u6447\u5B98\u65B9\uFF1A\u673A\u6784/\u6E38\u8D44\u62C6\u5206+\u4E70\u5356\u989D\uFF0C\u4E00\u5E74\u5185\u5386\u53F2\uFF1B\u65E0 key \u65F6\u8D70\u96EA\u7403\u5F53\u65E5\u699C\uFF09",e=>e.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF1B\u6276\u6447\u6E90\u9ED8\u8BA4\u6700\u8FD1\u4EA4\u6613\u65E5\uFF0C\u96EA\u7403\u6E90\u9ED8\u8BA4\u4ECA\u5929"}).option("board",{type:"string",default:"all",choices:["all","org","hot_money"],describe:"\u6276\u6447\u6E90\u699C\u5355\uFF1Aall \u5168\u90E8 / org \u673A\u6784\u699C / hot_money \u6E38\u8D44\u699C"}),async e=>{let r=e.date||void 0,o=e.board||"all";if(he()){let u=await oo({boardType:o,date:r});l({data:u,command:`market longhu${r?` ${r}`:""}`,source:"fuyao",toJSON:Ni});return}let a=r||R(),s=a.split("-").map(Number),i=Date.UTC(s[0],(s[1]||1)-1,s[2]||1)-480*60*1e3;if(!Number.isFinite(i))throw new Error(`\u65E0\u6548\u65E5\u671F: ${a}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let c=await Pr(i);if(c?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${c.error_description||c.error_code}`);l({data:c,command:`market longhu ${a}`,source:"xq",toJSON:yi})}).command("limitup [date]","\u6DA8\u505C\u6C60\uFF08\u8FDE\u677F\u6570/\u5C01\u5355\u989D/\u5B98\u65B9\u6DA8\u505C\u539F\u56E0\uFF0C\u9ED8\u8BA4\u6309\u8FDE\u677F\u6570\u964D\u5E8F\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF1Btotal \u5B57\u6BB5\u4E3A\u6C60\u5B50\u603B\u6570\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\u5B57\u6BB5\uFF1Alast_price/continue_day_cnt/seal_money/limit_up_time"}).option("dir",{type:"string",default:"desc",describe:"asc / desc"}),async e=>{let r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await Kr({dateMs:o?Lt(o):void 0,size:r,sortField:e.sort||"continue_day_cnt",sortDir:e.dir||"desc"});l({data:a,command:`market limitup${o?` ${o}`:""}`,source:"fuyao",toJSON:gi})}).command("limitdown [date]","\u8DCC\u505C\u6C60",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\uFF1Alast_limit_time/first_limit_time/last_price/price_change_ratio_pct/turnover_ratio_pct"}).option("dir",{type:"string",default:"desc"}),async e=>{let r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await zr({dateMs:o?Lt(o):void 0,size:r,sortField:e.sort||void 0,sortDir:e.dir||void 0});l({data:a,command:`market limitdown${o?` ${o}`:""}`,source:"fuyao",toJSON:hi})}).command("limitbreak [date]","\u70B8\u677F\u6C60\uFF08\u6DA8\u505C\u5F00\u677F\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}).option("n",{type:"number",default:50,describe:"\u6761\u6570\uFF08\u2264200\uFF09"}).option("sort",{type:"string",describe:"\u6392\u5E8F\uFF1Aprice_change_ratio_pct/open_times/last_price/turnover_ratio_pct/turnover"}).option("dir",{type:"string",default:"desc"}),async e=>{let r=Math.min(Number(e.n)||50,200),o=e.date||void 0,a=await Wr({dateMs:o?Lt(o):void 0,size:r,sortField:e.sort||void 0,sortDir:e.dir||void 0});l({data:a,command:`market limitbreak${o?` ${o}`:""}`,source:"fuyao",toJSON:bi})}).command("ladder","\u8FDE\u677F\u5929\u68AF\uFF08\u8FD1 30 \u4E2A\u4EA4\u6613\u65E5\u8FDE\u677F\u68AF\u961F\u77E9\u9635\uFF0C\u6276\u6447\uFF09",e=>e,async()=>{let e=await Qr();l({data:e,command:"market ladder",source:"fuyao",toJSON:wi})}).command("hot [date]","\u70ED\u80A1\u699C Top30\uFF08date \u4E3A\u5386\u53F2\u81EA\u7136\u65E5\uFF1B--hour \u5C0F\u65F6\u7EA7\uFF0C\u6276\u6447\uFF09",e=>e.positional("date",{type:"string",describe:"\u5386\u53F2\u81EA\u7136\u65E5 YYYY-MM-DD\uFF08\u4E00\u5E74\u5185\uFF09\uFF1B\u7701\u7565=\u5F53\u524D\u699C\u5355"}).option("hour",{type:"boolean",default:!1,describe:"\u5C0F\u65F6\u7EA7\u699C\u5355"}),async e=>{let r=e.date,o=r?await eo(r):await Zr(e.hour?"hour":"day");l({data:o,command:`market hot${r?` ${r}`:""}`,source:"fuyao",toJSON:r?_i:Do})}).command("skyrocket","\u4EBA\u6C14\u98D9\u5347\u699C Top30\uFF08--hour \u5C0F\u65F6\u7EA7\uFF0C\u6276\u6447\uFF09",e=>e.option("hour",{type:"boolean",default:!1,describe:"\u5C0F\u65F6\u7EA7\u699C\u5355"}),async e=>{let r=await Vr(e.hour?"hour":"day");l({data:r,command:"market skyrocket",source:"fuyao",toJSON:Do})}).command("hot-trend <code>","\u4E2A\u80A1\u70ED\u699C\u6392\u540D\u8D70\u52BF\uFF08\u9ED8\u8BA4\u8FD1 30 \u5929\uFF0C\u6276\u6447\uFF09",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 600519 / 300034.SZ"}).option("days",{type:"number",default:30,describe:"\u56DE\u770B\u5929\u6570\uFF08\u2264365\uFF09"}),async e=>{let r=e.code,o=Math.min(Math.max(Number(e.days)||30,1),365),a=new Date,s=new Date(a.getTime()-o*864e5),i=u=>u.toISOString().slice(0,10),c=await to(r,i(s),i(a));l({data:c,command:`market hot-trend ${r}`,source:"fuyao",toJSON:ki})}).command("anomaly [targets...]","\u5F53\u65E5\u4E2A\u80A1\u5F02\u52A8\u539F\u56E0\uFF08\u5B98\u65B9\u89E3\u8BFB\uFF1B\u4F20\u80A1\u7968\u4EE3\u7801=\u6309\u80A1\u67E5\uFF0C\u4F20\u6807\u7B7E=\u6309\u7C7B\u8FC7\u6EE4\uFF0C\u6276\u6447\uFF09",e=>e.positional("targets",{type:"string",array:!0,describe:"\u80A1\u7968\u4EE3\u7801\uFF08\u226450 \u53EA\uFF0C\u5982 600519 000001\uFF09\u6216\u5F02\u52A8\u6807\u7B7E LIMIT_UP/LIMIT_DOWN/SHARP_RISE/SHARP_FALL/RAPID_RALLY/RAPID_DECLINE\uFF08\u591A\u503C OR\uFF09"}),async e=>{let r=(e.targets||[]).filter(Boolean),a=r.length>0&&r.every(s=>/^((sh|sz|bj)?\d{6}|\d{6}\.(sh|sz|bj))$/i.test(s.trim()))?await ro(r):await no(r);l({data:a,command:`market anomaly${r.length?` ${r.join(" ")}`:""}`,source:"fuyao",toJSON:xi})}).command("benchmark [date]","\u77ED\u7EBF\u98CE\u5411\u6807\u7ADE\u4EF7\u57FA\u51C6\uFF08\u9AD8\u5F00/\u653E\u91CF\u7B49\u6807\u7B7E\uFF0C\u6276\u6447\uFF09",e=>e.positional("date",{type:"string",describe:"\u4EA4\u6613\u65E5 YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async e=>{let r=e.date||void 0,o=await so(r);l({data:o,command:`market benchmark${r?` ${r}`:""}`,source:"fuyao",toJSON:Oi})}),handler:async()=>{let t=await mt();l({data:t,command:"market",source:"glh",toJSON:Ao})}})}function Ti(n){let t=n?.data||[];return{items:t.map(e=>{let r=e.symbol_code||"",o=/^cls/i.test(r)?"plate":"stock";return{time:e.c_time?e.c_time.slice(11,16):"",code:r,name:e.symbol_name||"",kind:o,direction:e.float==="up"?"up":e.float==="down"?"down":"",articleId:e.article_id??null}}),total:t.length}}function Eo(n,t){return{type:t,items:n.map(e=>({code:e.secu_code||"",name:e.plate_name||e.secu_name||"",changePercent:Math.round((e.change||0)*100*100)/100})),total:n.length}}function Po(n){return{items:n.map(t=>({code:t.secu_code||"",name:t.secu_name||"",changePercent:Math.round((t.change||0)*100*100)/100,topStocks:(t.up_stock||[]).slice(0,3).map(e=>({name:e.secu_name?.trim()||"",changePercent:Math.round((e.change||0)*100*100)/100}))})),total:n.length}}function vo(n){let t=(n?.data?.stocks||[]).map(e=>({code:e.secu_code||"",name:e.secu_name||"",price:e.last_px??null,changePercent:Math.round((e.change??0)*1e4)/100,marketCap:e.cmc??null,fundflow:e.fundflow??null,isCore:!!e.is_core,reason:e.assoc_desc||""}));return{items:t,total:t.length}}var Co={concept:"cn_concept",industry:"industry",region:"region",tszs:"tszs"},Ei={cn_concept:"\u6982\u5FF5",industry:"\u884C\u4E1A",region:"\u533A\u57DF",tszs:"\u7279\u8272"};function Pi(n){return{items:n.map(t=>({code:t.code||"",name:t.name||"",type:t.type||""})),total:n.length}}function qo(n){return{items:n.map(t=>({code:t.thscode||"",name:t.name||""})),total:n.length}}function $o(n){return n.command({command:"sector [code]",describe:"\u677F\u5757\u5DE5\u4F5C\u6D41\uFF08\u8D22\u8054\u793E\uFF09\uFF1A\u5F02\u52A8 anchor / \u6392\u884C rank / \u4E2A\u80A1\u6240\u5C5E\u677F\u5757 plate / \u6210\u5206\u80A1 stocks",builder:t=>t.positional("code",{type:"string",describe:"\u677F\u5757\u7801(cls*)\u2192\u6210\u5206\u80A1 / \u80A1\u7968\u7801\u2192\u6240\u5C5E\u677F\u5757"}).strictCommands(!1).command("anchor [date]","\u76D8\u4E2D\u5F02\u52A8\u65F6\u95F4\u8F74\uFF1A\u5F53\u65E5\u62C9\u5347/\u8DF3\u6C34\u7684\u677F\u5757(cls*\u7801\u53EF\u4E0B\u94BB)\u4E0E\u4E2A\u80A1",e=>e.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async e=>{let r=e.date||R(),o=await un({date:r});l({data:o,command:`sector anchor ${r}`,source:"cls",toJSON:Ti})}).command("rank","\u677F\u5757\u6DA8\u8DCC\u6392\u884C\uFF08\u4EC5\u5F53\u65E5\u70ED\u95E8\uFF0C\u7EA6 6~10 \u6761\uFF1B\u770B\u5168\u5929\u5F02\u52A8\u8FC7\u7A0B\u7528 sector anchor\uFF09",e=>e.option("type",{alias:"t",type:"string",default:"industry",describe:"industry(\u884C\u4E1A) / concept(\u6982\u5FF5)"}),async e=>{let{t:r="industry"}=e,o=await ze({type:r}),a=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector rank -t ${r}`,source:"cls",toJSON:()=>Eo(a,r)})}).command("plate <code>","\u4E2A\u80A1\u6240\u5C5E\u677F\u5757\uFF08\u8FD4\u56DE plate code\uFF0C\u4F9B stocks \u4E0B\u94BB\uFF09",e=>e.positional("code",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 sh600519"}),async e=>{let r=e.code,o=await Ze(r),a=Array.isArray(o?.data)?o.data:[];l({data:o,command:`sector plate ${r}`,source:"cls",toJSON:()=>Po(a)})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08cls \u677F\u5757\u7801\u6216 88xxxx.TI \u6307\u6570\u7801\u5747\u53EF\uFF09",e=>e.positional("plate_code",{type:"string",describe:"\u677F\u5757\u7801\uFF0C\u5982 cls80605 / 885431.TI / 886042"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async e=>{let{way:r="change"}=e,o=e.plate_code;if(/^88\d{4}(\.TI)?$/i.test(o.trim())||/\.TI$/i.test(o.trim())){let s=await wt(o),i=s?.item||[];l({data:s,command:`sector stocks ${o}`,source:"fuyao",toJSON:()=>qo(i)});return}let a=await et(o,{way:r});l({data:a,command:`sector stocks ${o}`,source:"cls",toJSON:vo})}).command("search [name]","\u6309\u540D\u79F0\u641C\u677F\u5757\uFF08\u540C\u82B1\u987A\u6982\u5FF5/\u884C\u4E1A\u76EE\u5F55\uFF09\u2192 88xxxx.TI \u7801\uFF0C\u4F9B stocks \u4E0B\u94BB\u4E0E quote \u53D6\u6307\u6570\u884C\u60C5",e=>e.positional("name",{type:"string",describe:"\u677F\u5757\u540D\u79F0\u5173\u952E\u8BCD\uFF08\u5B50\u4E32\u5339\u914D\uFF09\uFF0C\u5982 \u4EBA\u5DE5\u667A\u80FD\uFF1B\u7701\u7565\u5219\u5217\u51FA\u76EE\u5F55"}).option("type",{alias:"t",type:"string",choices:["concept","industry","region","tszs"],describe:"\u76EE\u5F55\u7C7B\u578B\uFF1B\u7701\u7565\u65F6\u641C\u7D22\u9ED8\u8BA4\u67E5 \u6982\u5FF5+\u884C\u4E1A"}),async e=>{let{n:r=30}=e,o=String(e.name||"").trim(),a=e.type||e.t,s=a?[a]:o?["concept","industry"]:["concept"],i=await Promise.all(s.map(m=>ar(Co[m]))),c=new Set,u=[];i.forEach((m,d)=>{for(let p of m?.item||[]){let g=p.thscode||"";c.has(g)||(c.add(g),(!o||String(p.name||"").includes(o))&&u.push({code:g,name:p.name||"",type:Ei[Co[s[d]]]||s[d]}))}}),l({data:{hits:u},command:`sector search${o?` ${o}`:""}`,source:"fuyao",toJSON:()=>Pi(u.slice(0,r))})}),handler:async t=>{let{code:e}=t;if(e)if(/^88\d{4}(\.TI)?$/i.test(e.trim())){let r=await wt(e),o=r?.item||[];l({data:r,command:`sector ${e}`,source:"fuyao",toJSON:()=>qo(o)})}else if(/^cls/i.test(e)){let r=await et(e,{way:"change"});l({data:r,command:`sector ${e}`,source:"cls",toJSON:vo})}else{let r=await Ze(e),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:`sector ${e}`,source:"cls",toJSON:()=>Po(o)})}else{let r=await ze({type:"industry"}),o=Array.isArray(r?.data)?r.data:[];l({data:r,command:"sector",source:"cls",toJSON:()=>Eo(o,"industry")})}}})}import{inflateSync as vi}from"zlib";var Ci="wss://wss-flash-2.jin10.com/",Le={DATA:0,HOLIDAY:1,EVENT:2,HOLIDAY_PAGE:3,A_SHARE:4,FIVE_STAR:5,QH_DATA:6,QH_HOLIDAY:7,QH_EVENT:8,US_DATA:9,US_HOLIDAY:10,US_EVENT:11,HK_DATA:12,HK_HOLIDAY:13,HK_EVENT:14},Ue={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},le=class{buffer;dv;pos;constructor(t){this.buffer=t instanceof ArrayBuffer?t:t instanceof Uint8Array?t.buffer:new ArrayBuffer(2048),this.dv=new DataView(this.buffer),this.pos=0}w16L(t){this.dv.setInt16(this.pos,t,!0),this.pos+=2}wU16L(t){this.dv.setUint16(this.pos,t,!0),this.pos+=2}w32L(t){this.dv.setInt32(this.pos,t,!0),this.pos+=4}wU32L(t){this.dv.setUint32(this.pos,t,!0),this.pos+=4}wStrL(t){let e=Buffer.from(t,"utf-8");this.wU16L(e.length);for(let r=0;r<e.length;r++)this.dv.setUint8(this.pos++,e[r])}r16L(){let t=this.dv.getInt16(this.pos,!0);return this.pos+=2,t}rU16L(){let t=this.dv.getUint16(this.pos,!0);return this.pos+=2,t}rU32L(){let t=this.dv.getUint32(this.pos,!0);return this.pos+=4,t}rStrL(){let t=this.rU16L(),e=Buffer.from(this.buffer,this.pos,t).toString("utf-8");return this.pos+=t,e}toBuffer(){return this.buffer.slice(0,this.pos)}};function jo(n,t){let e;n instanceof Uint8Array?e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):e=new Uint8Array(n);let r=new Uint8Array(e.length),o=t.charCodeAt(0);for(let a=0;a<e.length;a++)r[a]=e[a]^t.charCodeAt((a+o)%t.length);return r.buffer}function qi(n,t){return jo(n,t)}function $i(n){try{return vi(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var Ut=class{ws=null;encryptKey="";requestId=Math.floor(Math.random()*1e6);userId;loginType;userLevel;userAgent;timeout;_pending=new Map;constructor(t={}){this.userId=t.userId||"",this.loginType=t.loginType||"calendar",this.userLevel=t.userLevel||1,this.userAgent=t.userAgent||"chrome",this.timeout=t.timeout||5e3}connect(){return new Promise((t,e)=>{let r=setTimeout(()=>{this.ws?.close(),e(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(Ci),this.ws.binaryType="arraybuffer",this.ws.onmessage=o=>{let a=o.data;if(!this.encryptKey){let u=new le(a);u.rU32L();let m=u.rU32L(),d=u.rU32L();this.encryptKey=`${d}.${m}`,this._sendLogin();return}let s=jo(a,this.encryptKey),i=new le(s),c=i.r16L();if(c===Ue.LOGIN){clearTimeout(r),t();return}if(c===Ue.CACHE_DATA){i.rU32L(),i.rStrL();let u=i.rU32L(),m=i.rStrL(),d=this._pending.get(u);if(d){this._pending.delete(u),clearTimeout(d.timer);try{let p=JSON.parse(m);if(p.data){let g=$i(p.data);d.resolve(g?JSON.parse(g):null)}else d.resolve(null)}catch(p){d.reject(p)}}}},this.ws.onerror=()=>{clearTimeout(r),e(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let t=new le;t.w16L(Ue.LOGIN),t.w32L(parseInt(this.userId)||0),t.wStrL(""),t.wStrL(this.userAgent),t.w32L(this.userLevel),t.wStrL(this.loginType),this._send(t)}_send(t){let e=t.toBuffer(),r=this.encryptKey?qi(e,this.encryptKey):e;this.ws.send(r)}_request(t,e){return new Promise((r,o)=>{let a=this.requestId++,s=setTimeout(()=>{this._pending.delete(a),o(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(a,{resolve:r,reject:o,timer:s});let i=new le;i.w16L(Ue.CACHE_DATA),i.wU32L(t),i.wStrL(e),i.wU32L(a),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(t){return this._request(Le.QH_DATA,t)}getHKStockData(t){return this._request(Le.HK_DATA,t)}getUSStockData(t){return this._request(Le.US_DATA,t)}getAShareData(t={}){let e=[];return t.page&&e.push(`page=${t.page}`),t.limit!=null&&e.push(`limit=${t.limit}`),t.region&&e.push(`region=${t.region}`),t.star!=null&&e.push(`star=${t.star}`),t.determine!=null&&e.push(`determine=${t.determine}`),this._request(Le.A_SHARE,e.join("&"))}};async function Io(n){let t=new Ut(n);return await t.connect(),t}async function Ft(n,...t){let e=await Io();try{return await e[n](...t)}finally{e.close()}}function Fe(n){return{items:n.map(t=>({time:t.pub_time||"",indicator:t.indicator_name||t.name||"",importance:t.star??0,previous:t.previous??null,consensus:t.consensus??null,actual:t.actual??null,country:t.country||""})),total:n.length}}function ji(n){let t=n?.data||[];return{items:t.map(e=>({time:e.event_time||"",country:e.country||"",importance:e.star??0,event:e.event_content||"",people:e.people||""})),total:t.length}}function Ii(n){let t=n?.data?.data||n?.data,e=Array.isArray(t)?t:t?Object.values(t):[];return{items:e.map(r=>({date:(r.date||"").slice(5,16),market:r.exchange_name||"",name:r.name||"",note:r.rest_note||""})),total:e.length}}function Ri(n){let t=n?.data||[];return{items:t.map(e=>({date:(e.date||"").slice(5,16),event:e.event||"",importance:e.star??0,stocks:(e.stocks||[]).map(r=>({name:r.name,code:r.code})),regions:(e.region||[]).map(r=>({name:r.name}))})),total:t.length}}function Mi(n){let t=n?.data||[];return{items:t.map(e=>({time:e.public_time||"",country:e.country||"",event:e.eventcontent||""})),total:t.length}}function Ji(n){let t=n?.data||[];return{items:t.map(e=>({time:e.holiday_time||"",country:e.country||"",market:e.market||"",name:e.holiday_name||"",description:e.description||""})),total:t.length}}function Li(n){let t=n?.data||[];return{items:t.map(e=>({time:e.time_show||"",country:e.country||"",indicator:e.name||"",importance:e.star??0,previous:e.previous??null,consensus:e.consensus??null,actual:e.actual??null,unit:e.unit||"",impact:e.qh_affect_text||""})),total:t.length}}function Ro(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:t=>t.strictCommands(!1).command("trading","A\u80A1\u4EA4\u6613\u65E5\u5386\uFF08\u6276\u6447\u5B98\u65B9\uFF0C\u8FD1\u4E00\u5E74\u4EA4\u6613\u65E5\u5E8F\u5217\uFF09",e=>e,async()=>{let e=await cr(),r=e?.item||[];l({data:e,command:"calendar trading",source:"fuyao",toJSON:()=>({items:r.map(o=>({date:/^\d{8}$/.test(o.date||"")?`${o.date.slice(0,4)}-${o.date.slice(4,6)}-${o.date.slice(6,8)}`:o.date})),total:r.length})})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||R(),o=ee(),a=await ct(r,"cj",o?{cookie:o}:void 0);l({data:a,command:`calendar macro ${r}`,source:"jin10",toJSON:s=>Fe(s?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||R(),o=ee(),a=await Cn(r,"cj",o?{cookie:o}:void 0);l({data:a,command:"calendar event",source:"jin10",toJSON:ji})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||R(),o=ee(),a=await qn(r,"cj",o?{cookie:o}:void 0);l({data:a,command:"calendar holiday",source:"jin10",toJSON:Ii})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",e=>e,async()=>{let e=await Ft("getAShareData",{page:1});l({data:e,command:"calendar ashare",source:"jin10",toJSON:Ri})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||R(),o=await Ft("getHKStockData",r);l({data:o,command:"calendar hk",source:"jin10",toJSON:a=>Fe(Array.isArray(a)?a:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",e=>e,async e=>{let r=e.date||R(),o=await Ft("getUSStockData",r);l({data:o,command:"calendar us",source:"jin10",toJSON:a=>Fe(Array.isArray(a)?a:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||R(),o=await Un(r);l({data:o,command:`calendar future-event ${r}`,source:"jin10",toJSON:Mi})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",e=>e.positional("date",{type:"string"}),async e=>{let r=e.date||R(),o=await Fn(r);l({data:o,command:`calendar future-holiday ${r}`,source:"jin10",toJSON:Ji})}).command("futures [date]","\u671F\u8D27\u4EA7\u4E1A\u6570\u636E\u65E5\u5386\uFF08jin10 qihuo\uFF1A\u9A6C\u68D5\u6CB9\u51FA\u53E3/\u68C0\u9A8C\u91CF\u7B49\uFF09",e=>e,async e=>{let r=e.date||R(),o=await Ln(r);l({data:o,command:`calendar futures ${r}`,source:"jin10",toJSON:Li})}),handler:async()=>{let t=R(),e=ee(),r=await ct(t,"cj",e?{cookie:e}:void 0);l({data:r,command:`calendar macro ${t}`,source:"jin10",toJSON:o=>Fe(o?.data||[])})}})}import{writeFileSync as ac}from"fs";function Mo(n){if(n==null||typeof n!="object")return null;let t=n,e=t.data!==void 0?t.data:n;if(e==null||typeof e!="object")return null;let r=e;if(Array.isArray(r.items)){let o=[];for(let a of r.items){if(!a||typeof a!="object")continue;let s=a.code;typeof s=="string"&&s.trim()&&o.push(s.trim())}return o}if(typeof r.code=="string"){let o=r.code.trim();return o?[o]:[]}return null}function Ui(n){return n.split(/[\s,]+/).filter(Boolean)}function Jo(n){let t=n.replace(/^\uFEFF/,"").trim();if(!t)return[];try{let r=Mo(JSON.parse(t));if(r)return r}catch{}let e=[];for(let r of t.split(/\r?\n/)){let o=r.trim();if(!(!o||o.startsWith("#"))){try{let a=Mo(JSON.parse(o));if(a){e.push(...a);continue}}catch{}e.push(...Ui(o))}}return e}var Fi="wss://market-ws.jin10.com/";function Hi(n,t){if(t+2>n.length)return null;let e=n.readUInt16LE(t);return t+=2,t+e>n.length?null:{str:n.subarray(t,t+e).toString("utf8"),end:t+e}}function Y(n,t){return Number(n.readBigInt64LE(t))}function Yi(n){if(n.length<2)return null;let t=2,e=Hi(n,t);if(!e)return null;let r=e.str;if(t=e.end,t+76>n.length)return null;let o=Y(n,t)/1e6,a=Y(n,t+8)/1e6;Y(n,t+16);let s=Y(n,t+24),i=Y(n,t+32)/1e6,c=Y(n,t+40)/1e6,u=Y(n,t+48)/1e6,m=Y(n,t+56)/1e6,d=Y(n,t+64),p=n.readUInt32LE(t+72),g=r.split(".")[1],y=pe.includes(g),h=null,b=t+76;y&&b<n.length&&n[b]===1&&(h=Y(n,b+1)/1e6);let w=h??m,_=o-w,I=w?_/w*100:0;return{code:r,snap:{code:r,close:o,prevClose:a,high:i,low:u,open:c,preclose:w,base:w,change:_,changePercent:I,openInterest:s,turnover:d,timestamp:p}}}var Lo=40;function Bi(n,t){let e=[],r=Buffer.alloc(8);r.writeUInt16LE(10003,0),r.writeUInt32LE(t,2),r.writeUInt16LE(n.length,6),e.push(r);for(let o of n){let a=Buffer.from(o,"utf8"),s=Buffer.alloc(2);s.writeUInt16LE(a.length),e.push(s,a)}return Buffer.concat(e)}async function*Ht(n,t={}){let e=n.slice(0,Lo);if(!e.length)return;let{signal:r}=t;if(r?.aborted)return;let o=t.freq??1e3,a=new Set(e),s=[],i,c=!1,u,m=!1,d=()=>{i?.(),i=void 0},p=new WebSocket(Fi);p.binaryType="arraybuffer";let g=()=>{if(!c){c=!0;try{p.close()}catch{}d()}},y=()=>g();r?.addEventListener("abort",y),p.onopen=()=>{m=!0;try{p.send(Bi(e,o))}catch(h){u=h,g()}},p.onmessage=h=>{if(!c)try{let b=Buffer.from(h.data);if(b.length<2)return;let w=b.readUInt16LE(0);if(w===1100)return;if(w===1200){try{p.send(Buffer.alloc(0))}catch{}return}if(w!==10005)return;let _=Yi(b);if(!_||!a.has(_.code))return;s.push(_.snap),d()}catch{}},p.onerror=()=>{m||(u=new Error("market-ws \u8FDE\u63A5\u5931\u8D25")),g()},p.onclose=()=>g();try{for(;;){if(r?.aborted)return;for(;s.length;)yield s.shift();if(c){if(u&&!m)throw u;return}await new Promise(h=>{i=h})}}finally{r?.removeEventListener("abort",y),g()}}async function Uo(n,t={}){let e=n.slice(0,Lo);if(!e.length)return new Map;let r=new Map,o=new AbortController,a=setTimeout(()=>o.abort(),t.timeout??8e3);try{for await(let s of Ht(e,{freq:t.freq??2e3,signal:o.signal}))if(r.set(s.code,s),r.size>=e.length)break}catch{}finally{clearTimeout(a),o.abort()}return r}import Xi from"https";import{gunzipSync as Fo}from"zlib";var Ho="wss://tm-qtg.jiaoyixia.com",Gi="https://jiaoyixia-market.jin10.com",Bt={"1m":{kind:"oss",code:1,sec:60,intraday:!0},"5m":{kind:"oss",code:2,sec:300,intraday:!0},"30m":{kind:"oss",code:3,sec:1800,intraday:!0},"60m":{kind:"oss",code:4,sec:3600,intraday:!0},d:{kind:"oss",code:5,sec:86400,intraday:!1},w:{kind:"oss",code:6,sec:604800,intraday:!1},m:{kind:"oss",code:7,sec:2592e3,intraday:!1},y:{kind:"oss",code:9,sec:31536e3,intraday:!1},"10m":{kind:"agg",from:"5m",factor:2,sec:600},"15m":{kind:"agg",from:"5m",factor:3,sec:900},"120m":{kind:"agg",from:"60m",factor:2,sec:7200}},Al=Object.fromEntries(Object.entries(Bt).flatMap(([n,t])=>t.kind==="oss"?[[n,t.code]]:[])),Ki=Object.keys(Bt).join("/");function zi(n,t){let e=[];for(let r of n){let o=Math.floor(Date.parse(r.date)/1e3);if(!Number.isFinite(o))continue;let a=Math.floor(o/t)*t,s=new Date(a*1e3).toISOString(),i=e[e.length-1];!i||i.date!==s?e.push({date:s,open:r.open,high:r.high,low:r.low,close:r.close,volume:r.volume}):(i.high=Math.max(i.high,r.high),i.low=Math.min(i.low,r.low),i.close=r.close,i.volume+=r.volume)}return e}function me(n,t){let e=Buffer.alloc(n.length);for(let r=0;r<n.length;r++)e[r]=n[r]^t.charCodeAt(r%t.length);return e}var Oe=class{buf=Buffer.alloc(4096);pos=0;wU16(t){return this.buf.writeUInt16LE(t,this.pos),this.pos+=2,this}wU8(t){return this.buf.writeUInt8(t,this.pos),this.pos+=1,this}wI8(t){return this.buf.writeInt8(t,this.pos),this.pos+=1,this}wU32(t){return this.buf.writeUInt32LE(t,this.pos),this.pos+=4,this}wI64(t){return this.buf.writeBigInt64LE(BigInt(t),this.pos),this.pos+=8,this}wStr(t){let e=Buffer.from(t,"utf8");return this.wU16(e.length),e.copy(this.buf,this.pos),this.pos+=e.length,this}toBuffer(){return this.buf.subarray(0,this.pos)}};function Yo(){return new Oe().wU16(21100).wStr("").wI8(7).wU16(0).wU16(0).wU16(0).wU16(46860).wU32(0).wI8(122).wU32(0).wU32(0).toBuffer()}function Wi(n,t,e,r=8e3){return new Promise((o,a)=>{let s=new WebSocket(Ho);s.binaryType="arraybuffer";let i="",c=!1,u=(d,p)=>{if(!c){c=!0,clearTimeout(m);try{s.close()}catch{}d?a(d):o(p)}},m=setTimeout(()=>u(new Error("tm-qtg 10006 \u8D85\u65F6"),[]),r);s.onopen=()=>{let d=Buffer.alloc(6);d.writeInt16LE(912,0),d.writeInt32LE(3063,2),s.send(d)},s.onmessage=d=>{try{let p=Buffer.from(d.data);if(!i){if(p.length<4)return;i=p.readUInt32LE(0).toString(),s.send(me(Yo(),i));return}if(p.length<2)return;let g=me(p,i),y=g.readUInt16LE(0);if(y===21100){setTimeout(()=>{let h=new Oe().wU16(10006).wStr(n).wU8(t).wI64(e).wU16(0).wU8(0);s.send(me(h.toBuffer(),i))},400);return}if(y===10006){let h=g.toString("utf8"),b=/([0-9a-f]{32})\.(\d+)\.(\d+)\.(\d+)\.(\d+)/g,w=[],_;for(;_=b.exec(h);)w.push({hash:_[1],count:+_[2],start:+_[3],end:+_[4],idx:+_[5]});u(null,w)}}catch{}},s.onerror=()=>u(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"),[])})}async function He(n,t,e,r={}){let o=r.attempts??1;for(let a=0;a<o;a++)try{return await Wi(n,t,e,r.timeout)}catch{a<o-1&&await new Promise(s=>setTimeout(s,300))}return null}async function Qi(n,t,e,r={}){return await He(n,t,e,{attempts:r.attempts??3,timeout:r.timeout})??[]}function Vi(n){let t=Math.floor(n.length/48),e=[];for(let r=0;r<t;r++){let o=r*48;e.push({date:new Date(Number(n.readBigUInt64LE(o))*1e3).toISOString(),high:Number(n.readBigInt64LE(o+8))/1e6,open:Number(n.readBigInt64LE(o+16))/1e6,low:Number(n.readBigInt64LE(o+24))/1e6,close:Number(n.readBigInt64LE(o+32))/1e6,volume:Number(n.readBigInt64LE(o+40))})}return e}function Bo(n,t,e){let r=`${Gi}/${n}/${t}/${e}`;return new Promise(o=>{let a=()=>o([]);Xi.get(r,i=>{if(i.statusCode&&i.statusCode>=300&&i.statusCode<400&&i.headers.location&&i.headers.location!==r)return i.resume(),o(Bo(n,t,e));if(!i.statusCode||i.statusCode>=400)return i.resume(),a();let c=[];i.on("data",u=>c.push(u)),i.on("end",()=>{try{o(Vi(Fo(Buffer.concat(c))))}catch{a()}}),i.on("error",a)}).on("error",a)})}var Zi=86400;async function Xt(n,t,e){let r=Bt[n];if(!r)throw new Error(`\u4E0D\u652F\u6301\u7684\u5468\u671F: ${n}\uFF08\u652F\u6301 ${Ki}\uFF09`);let o=ne(t);if(r.kind==="agg"){let a=await Xt(r.from,o,e*r.factor);return{code:o,candles:zi(a.candles,r.sec).slice(-e),source:a.source}}try{let s=[...r.intraday?await rc(o,r.code):await oc(o,r.code)].sort((u,m)=>m.start-u.start),i=[],c=new Set;for(let u of s){if(i.length>=e)break;if(c.has(u.hash))continue;c.add(u.hash);let m=await Bo(o,r.code,u.hash);for(let d of m)i.some(p=>p.date===d.date)||i.push(d)}return i.sort((u,m)=>u.date<m.date?-1:1),{code:o,candles:i.slice(-e),source:"jin10 tm-qtg"}}catch{return{code:o,candles:[],source:"jin10 tm-qtg"}}}var ec=new Set(["SHF","DCE","CZC","CF","INE","GFEX"]);function Xo(n,t){let e=n.readUInt16LE(t);return{str:n.toString("utf8",t+2,t+2+e),next:t+2+e}}function Go(n,t){let e=t,{str:r,next:o}=Xo(n,e);e=o;let a=n.readInt32LE(e);e+=4;let s=n.readUInt32LE(e);e+=4;let i=n.readUInt8(e);e+=1;let c=[0,1,2,3].map(g=>n.readDoubleLE(e+g*8)/1e6);e+=32;let u=[0,1,2].map(g=>n.readUInt32LE(e+g*4));e+=12;let m=n.readUInt16LE(e);e+=2;let d=[];for(let g=0;g<m;g++)d.push({price:n.readDoubleLE(e)/1e6,vol1:n.readUInt32LE(e+8),vol2:n.readUInt32LE(e+12)}),e+=16;let p=r.includes(".")?r.slice(r.lastIndexOf(".")+1):"";return{record:{code:r,seq:a,timestamp:s,flag:i,prices:c,counts:u,levels:d,volOrder:ec.has(p.toUpperCase())?"domestic":"international"},next:e}}function tc(n){let t=n.readUInt32LE(1),e=5,r=[];for(let o=0;o<t;o++){let a=n.readUInt16LE(e);e+=2;let{record:s}=Go(n.subarray(e,e+a),0);r.push(s),e+=a}return{records:r,hasMore:e<n.length?n.readUInt8(e)>0:!1}}function Ko(n,t){let e=ne(n);return new Promise((r,o)=>{let a=new WebSocket(Ho);a.binaryType="arraybuffer";let s="",i=!1,c=!1,u,m=[],d=0,p=0,g=Date.now(),y=b=>{if(!i){i=!0,clearTimeout(h),clearTimeout(u);try{a.close()}catch{}b?o(b):r({symbol:e,records:m,batches:d,singles:p,durationMs:Date.now()-g})}},h=setTimeout(()=>y(m.length?null:new Error("tm-qtg 10027 \u8BA2\u9605\u8D85\u65F6\uFF08\u65E0\u6570\u636E\u63A8\u9001\uFF09")),t+15e3);a.onopen=()=>{let b=Buffer.alloc(6);b.writeInt16LE(912,0),b.writeInt32LE(3063,2),a.send(b)},a.onmessage=b=>{try{let w=Buffer.from(b.data);if(!s){if(w.length<4)return;s=w.readUInt32LE(0).toString(),a.send(me(Yo(),s));return}if(w.length<2)return;let _=me(w,s),I=_.readUInt16LE(0);if(I===21100){setTimeout(()=>{let k=new Oe().wU16(10027).wU32(0).wStr(e).wStr("").wI8(1);a.send(me(k.toBuffer(),s))},400);return}if(I===10027){if(_.length>=4&&_.readUInt16LE(2)===64e3)return y(new Error("\u8D85\u8FC7\u53EF\u8BA2\u9605\u7684\u6570\u91CF\u4E0A\u9650\uFF0864000\uFF09"));c||(c=!0,u=setTimeout(()=>y(null),t));return}if(I===10025){let{record:k}=Go(_.subarray(2),0);m.push(k),p++;return}if(I===10026){let k=2,{next:v}=Xo(_,k);k=v;let C=Number(_.readBigUInt64LE(k));k+=8;let Q=Fo(_.subarray(k,k+C)),{records:V}=tc(Q);m.push(...V),d++;return}}catch{}},a.onerror=()=>{m.length||y(new Error("tm-qtg \u8FDE\u63A5\u5931\u8D25"))}})}var nc=[1,2,4,8,16,32,64,128,256,512,1024,2048];async function Yt(n,t,e){let r=0;for(let o of nc){let a=await He(n,t,e-o*Zi,{attempts:1,timeout:3500});if(a&&(r++,a.length))return{files:a,allSilent:!1}}return{files:[],allSilent:r===0}}async function rc(n,t){let e=Math.floor(Date.now()/1e3),r=await He(n,t,e,{attempts:2,timeout:5e3});if(r&&r.length)return r;let o=()=>He(n,t,0,{attempts:1,timeout:4500});if(r===null){let i=await o();if(!i||!i.length)return i??[];let c=await Yt(n,t,e);return c.files.length?c.files:i}let a=await Yt(n,t,e);if(a.files.length)return a.files;if(a.allSilent){let i=await Yt(n,t,e);if(i.files.length)return i.files}return await o()??[]}async function oc(n,t,e=12){let r=[],o=new Set,a=0;for(let s=0;s<e;s++){let i=await Qi(n,t,a);if(!i.length)break;let c=0;for(let m of i)o.has(m.hash)||(o.add(m.hash),r.push(m),c++);if(c===0)break;a=Math.max(...i.map(m=>m.end))}return r}var sc=["i9888.DCE","SA888.CZC","rb888.SHF","cu888.SHF","au888.SHF","XAUUSD.GOODS","USOIL.GOODS","DXY.NYF","EURUSD.FXCM","USDCNH.FXCM","SPX.INDEX","HSI.INDEX"];function zo(n){return{code:n.code,price:n.close,change:n.change,changePercent:Math.round(n.changePercent*100)/100,open:n.open,high:n.high,low:n.low,preclose:n.preclose,openInterest:n.openInterest||null,turnover:n.turnover||null,timestamp:n.timestamp?new Date(n.timestamp*1e3).toISOString():""}}function ic(n){let t=n?.data||{},e=t.include_types||[];return{product:{id:t.id??null,name:t.name||"",subcode:t.subcode||"",exchange:t.exchange||"",unit:t.unit||""},tagGroups:e.map(r=>({type:r.type||"",tags:(r.tags||[]).map(o=>({id:o.id,name:o.name||""}))})),totalTags:e.reduce((r,o)=>r+(o.tags?.length||0),0),hint:"\u53D6\u67D0\u6307\u6807\u6570\u636E\u5E8F\u5217: price f10 <code> --tag <tag_id>"}}function cc(n){let t=n?.data||{};return{name:t.name||"",xAxis:t.x_axis||[],series:t.series??null,start:t.start??null,end:t.end??null,splitByYear:!!t.split_by_year,points:(t.x_axis||[]).length}}async function uc(n,t){let e=Jn(n);if(!e.ok)return l({data:{error:e.error},command:`price f10 ${n}`,source:"jin10"});let{code:r,subcode:o,exchange:a}=e;if(t!==void 0){let i=await Mn(t);return i?.status&&i.status!==200?l({data:{error:i.message||`tag ${t} \u67E5\u8BE2\u5931\u8D25`},command:`price f10 ${r} --tag ${t}`,source:"jin10"}):l({data:i,command:`price f10 ${r} --tag ${t}`,source:"jin10 futures-report",toJSON:cc})}let s=await Rn(o,a);if(s?.status&&s.status!==200)return l({data:{error:`${s.message||"\u67E5\u8BE2\u5931\u8D25"}\uFF08subcode=${o} exchange=${a}\uFF09`},command:`price f10 ${r}`,source:"jin10"});l({data:s,command:`price f10 ${r}`,source:"jin10 futures-report",toJSON:ic})}async function lc(){let n=[];for await(let t of process.stdin)n.push(Buffer.isBuffer(t)?t:Buffer.from(t));return Buffer.concat(n).toString("utf8")}async function mc(n,t){let e=new AbortController,r=()=>e.abort(),o=s=>{s.code==="EPIPE"&&e.abort()};process.on("SIGINT",r),process.on("SIGTERM",r),process.stdout.on("error",o);let a=n&&n>0?setTimeout(()=>e.abort(),n*1e3):void 0;try{await t(e.signal)}finally{a&&clearTimeout(a),process.off("SIGINT",r),process.off("SIGTERM",r),process.stdout.off("error",o)}}async function dc(n){let t=(n||[]).map(o=>o.trim()).filter(Boolean),e;if(t.length)e=t;else if(!process.stdin.isTTY)e=Jo(await lc());else return{error:"\u8BF7\u63D0\u4F9B\u54C1\u79CD\u4EE3\u7801\uFF0C\u6216\u901A\u8FC7\u7BA1\u9053\u4F20\u5165\uFF08price search \u9EC4\u91D1 -n 5 | price sub\uFF09"};let r=[...new Set(rt(e))];return r.length?r:{error:"\u672A\u89E3\u6790\u5230\u54C1\u79CD\u4EE3\u7801"}}function Wo(n){return n.command("price [codes...]","\u5B9E\u65F6\u884C\u60C5\uFF1A\u56FD\u5185\u671F\u8D27\u4E3B\u529B / \u73B0\u8D27\u5546\u54C1 / \u5916\u6C47 / \u6307\u6570\uFF08market-ws\uFF09",t=>t.positional("codes",{type:"string",array:!0,describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u522B\u540D GOLD/SP500/WTI \u4E0E\u88F8\u7801 XAUUSD \u81EA\u52A8\u5F52\u4E00\u5316\uFF09\uFF1B\u7701\u7565\u5219\u663E\u793A\u9ED8\u8BA4\u770B\u76D8\u5217\u8868"}).strictCommands(!1).command("sub [codes...]","\u8BA2\u9605\u5B9E\u65F6\u884C\u60C5\uFF1A\u6BCF\u7B14\u63A8\u9001\u4E00\u884C JSON\uFF0C\u76F4\u5230 SIGINT \u6216 -s \u79D2\u6570\uFF1B\u65E0\u53C2\u6570\u65F6\u4ECE stdin \u8BFB\u4EE3\u7801\uFF08\u7EAF\u6587\u672C\u6216 finflow JSON\uFF09",e=>e.positional("codes",{type:"string",array:!0,describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF1B\u522B\u540D/\u88F8\u7801\u81EA\u52A8\u5F52\u4E00\u5316\uFF09\uFF1B\u7701\u7565\u5219\u4ECE stdin \u8BFB\u53D6"}).option("seconds",{alias:"s",type:"number",describe:"\u8BA2\u9605\u79D2\u6570\uFF08\u7701\u7565=\u6301\u7EED\u5230 SIGINT / \u7BA1\u9053\u5173\u95ED\uFF09"}).option("freq",{type:"number",default:1e3,describe:"\u63A8\u9001\u8282\u6D41\u4E0B\u9650 ms"}),async e=>{let r=await dc(e.codes);if(!Array.isArray(r))return l({data:{error:r.error},command:"price sub",source:"jin10 market-ws"});let o=Number(e.s??e.seconds),a=Number(e.freq),s=Number.isFinite(a)&&a>0?a:1e3;try{await mc(Number.isFinite(o)&&o>0?o:void 0,async i=>{for await(let c of Ht(r,{freq:s,signal:i}))l({data:c,command:`price sub ${r.join(" ")}`,source:"jin10 market-ws",toJSON:zo})})}catch(i){l({data:{error:i.message||"market-ws \u8FDE\u63A5\u5931\u8D25"},command:"price sub",source:"jin10 market-ws"})}}).command("search <keyword>","\u54C1\u79CD\u641C\u7D22\uFF1A\u4E2D\u6587\u540D/\u4EE3\u7801 \u2192 CODE.EXCHANGE\uFF08\u672C\u5730\u54C1\u79CD\u5E93\uFF0C\u9996\u6B21\u81EA\u52A8\u4E0B\u8F7D\u7F13\u5B58\uFF09",e=>e.positional("keyword",{type:"string",describe:"\u5173\u952E\u8BCD\uFF1AXAUUSD / \u9EC4\u91D1 / \u94C1\u77FF\u77F3\u4E3B\u529B / KS11"}).option("number",{alias:"n",type:"number",default:20,describe:"\u8FD4\u56DE\u6761\u6570\uFF08total \u4E3A\u5168\u5E93\u547D\u4E2D\u6570\uFF09"}),async e=>{let r=e.keyword,o=Number(e.n),a=Number.isFinite(o)&&o>0?o:20;try{let s=await wn(),i=_n(s,r),c=i.slice(0,a);l({data:c,command:`price search ${r}`,source:"jin10 symbolist",toJSON:u=>({items:u,total:i.length})})}catch(s){l({data:{error:s.message},command:`price search ${r}`,source:"jin10 symbolist"})}}).command("orderflow <code>","\u8BA2\u5355\u6D41\uFF1A\u9010\u7B14\u4E70\u5356\u76D8\u4EF7\u91CF\u91C7\u96C6\uFF08tm-qtg VolTick\uFF0C\u5168\u6570\u636E\u5199\u6587\u4EF6\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08\u5982 XAUUSD.BANK / GC.FFE / au888.SHF\uFF0C\u8303\u56F4\u89C1 volTick2.csv \u4E0E\u300C\u8BA2\u5355\u6D41\u300D\u5206\u7C7B\uFF09"}).option("seconds",{alias:"s",type:"number",default:10,describe:"\u91C7\u96C6\u79D2\u6570"}).option("out",{type:"string",describe:"\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4 ./finflow-orderflow-<code>-<\u65F6\u95F4\u6233>.json\uFF09"}),async e=>{let r=e.code,o=Math.max(1,Math.min(120,e.s??10)),a=e.out,s=await Ko(r,o*1e3),i=a??`finflow-orderflow-${code.replace(/[^A-Za-z0-9.()-]/g,"_")}-${new Date().toISOString().replace(/[-:]/g,"").slice(0,14)}.json`;ac(i,JSON.stringify({code:s.symbol,durationMs:s.durationMs,batches:s.batches,singles:s.singles,records:s.records},null,2)),l({data:{code:s.symbol,file:i,records:s.records.length,batches:s.batches,singles:s.singles,durationMs:s.durationMs,hint:"\u5B8C\u6574\u9010\u7B14\u8BB0\u5F55\u5DF2\u5199\u5165 file\uFF08JSON\uFF0Crecords[].levels \u4E3A\u591A\u6863\u4EF7\u91CF\uFF0CvolOrder \u6807\u8BB0\u56FD\u5185/\u56FD\u9645\u5B57\u6BB5\u5E8F\uFF09"},command:`price orderflow ${r} -s ${o}`,source:"jin10 tm-qtg VolTick"})}).command("f10 <code>","\u671F\u8D27\u54C1\u79CD\u57FA\u672C\u9762\u6863\u6848\uFF08\u4F9B\u7ED9/\u9700\u6C42/\u5E93\u5B58\u7B49\u6307\u6807\uFF1B--tag \u53D6\u6570\u636E\u5E8F\u5217\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08\u5982 i9888.DCE / rb888.SHF / \u88F8\u7801 rb888\uFF1B\u4E3B\u529B\u540E\u7F00\u81EA\u52A8\u5265\u79BB\uFF0C\u4EC5\u56FD\u5185\u671F\u8D27\uFF09"}).option("tag",{type:"number",describe:"tag id\uFF08\u6765\u81EA\u4E0D\u5E26 --tag \u7684\u8F93\u51FA\uFF09\uFF0C\u8F93\u51FA\u8BE5\u6307\u6807\u7684\u5386\u53F2\u6570\u636E\u5E8F\u5217"}),async e=>{await uc(e.code,e.tag)}).command("kline [code]","K\u7EBF\u5386\u53F2\uFF08\u671F\u8D27/\u5546\u54C1/\u5916\u6C47/\u6307\u6570\uFF0Ctm-qtg + OSS\uFF09",e=>e.positional("code",{type:"string",describe:"\u54C1\u79CD\u4EE3\u7801\uFF08CODE.EXCHANGE\uFF0C\u5982 XAUUSD.GOODS / i9888.DCE\uFF1B\u522B\u540D/\u88F8\u7801\u81EA\u52A8\u5F52\u4E00\u5316\uFF09"}).option("period",{alias:"p",type:"string",default:"d",describe:"\u5468\u671F: d/w/m/y \u6216 1m/5m/10m/15m/30m/60m/120m\uFF08\u4E5F\u63A5\u53D7 daily/weekly \u7B49\u5168\u8BCD\uFF09"}).option("number",{alias:"n",type:"number",default:120,describe:"K\u7EBF\u6839\u6570"}),async e=>{let r=e.code;if(!r)return l({data:{error:"\u8BF7\u63D0\u4F9B\u54C1\u79CD\u4EE3\u7801\uFF0C\u4F8B\u5982: price kline XAUUSD.GOODS"},command:"price kline",source:"jin10 tm-qtg"});let{p:o="d",n:a=120}=e,s;try{s=Me(o)}catch(m){return l({data:{error:m.message},command:`price kline ${r} -p ${o}`,source:"finflow"})}let{code:i,candles:c,source:u}=await Xt(s,r,a);l({data:{code:i,period:s,items:c,total:c.length},command:`price kline ${i} -p ${s}`,source:u})}),async t=>{let e=t.codes||[],r=e.length?rt(e.map(i=>i.trim()).filter(Boolean)):sc,o=await Uo(r),a=r.map(i=>o.get(i)).filter(i=>!!i).map(zo),s=r.filter(i=>!o.has(i));l({data:a,command:`price ${e.length?e.join(" "):"(\u9ED8\u8BA4\u770B\u76D8\u5217\u8868)"}`,source:"jin10 market-ws",toJSON:i=>({items:i,total:i.length,...s.length?{missing:s,hint:"\u4EE3\u7801\u672A\u8FD4\u56DE\u5FEB\u7167\uFF1A\u53EF\u7528 `price search <\u5173\u952E\u8BCD>` \u67E5\u6B63\u786E\u4EE3\u7801\uFF08\u5927\u5C0F\u5199\u654F\u611F\u5DF2\u7531\u5F52\u4E00\u5316\u5904\u7406\uFF0C\u672A\u547D\u4E2D\u591A\u4E3A\u65E0\u5B9E\u65F6\u63A8\u9001\u7684\u54C1\u79CD\uFF09"}:{}})})})}var Qo={fuyao:async()=>{let t=(await be(["600519.SH"]))?.item?.[0];return t?{ok:!0,sample:{thscode:t.thscode,lastPrice:t.last_price,changePercent:Math.round((t.price_change_ratio_pct??0)*100)/100}}:{ok:!0,sample:null}}};function Vo(n){let t=ge(n.id);return{source:n.id,name:n.name,describe:n.describe,envVar:n.env,configured:!!t,origin:t?.origin??null,key:t?St(t.key):null,path:ue(n.id)}}function Ye(n){let t=String(n.source||"").trim().toLowerCase(),e=bt(t);if(!e)throw new Error(`\u672A\u77E5\u6570\u636E\u6E90 "${t}"\u3002\u5F53\u524D\u652F\u6301:${F.map(r=>r.id).join(", ")}`);return e.id}function Zo(n){return n.command({command:"key",describe:"API key \u7BA1\u7406\uFF08\u591A\u6570\u636E\u6E90\u901A\u7528\uFF09\uFF1Aset / show / clear / test",builder:t=>t.strictCommands(!1).command("set <source> <key>","\u4FDD\u5B58\u6570\u636E\u6E90 API key \u5230 ~/.finflow/keys/<source>\uFF08chmod 600\uFF0C\u4E00\u6B21\u914D\u7F6E\u957F\u671F\u6709\u6548\uFF09",e=>e.positional("source",{type:"string",describe:`\u6570\u636E\u6E90\uFF1A${F.map(r=>r.id).join(" / ")}`}).positional("key",{type:"string",describe:"API key"}),async e=>{let r=Ye(e),o=String(e.key||"").trim();if(!o)throw new Error("\u7F3A\u5C11 key \u53C2\u6570\uFF1Afinflow key set <source> <key>");let a=Zn(r,o);l({data:{saved:!0,source:r,path:a,key:St(o)},command:`key set ${r}`,source:"finflow"})}).command("show [source]","\u67E5\u770B key\uFF08\u8131\u654F\uFF09\u53CA\u6765\u6E90\uFF1B\u7701\u7565 source \u67E5\u770B\u5168\u90E8",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90\uFF1B\u7701\u7565=\u5168\u90E8"}),async e=>{let r=e.source?Ye(e):null,o=r?F.filter(a=>a.id===r):F;l({data:{items:o.map(Vo),total:o.length},command:`key show${r?` ${r}`:""}`,source:"finflow"})}).command("clear <source>","\u5220\u9664\u672C\u5730\u4FDD\u5B58\u7684 key\uFF08\u73AF\u5883\u53D8\u91CF\u4E0D\u53D7\u5F71\u54CD\uFF09",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90"}),async e=>{let r=Ye(e),o=er(r);l({data:{cleared:o,source:r,path:ue(r)},command:`key clear ${r}`,source:"finflow"})}).command("test [source]","\u8FDE\u901A\u6027\u81EA\u68C0\uFF1A\u7528\u5F53\u524D key \u5B9E\u8C03\u5404\u6E90\u8F7B\u91CF\u7AEF\u70B9\uFF1B\u7701\u7565 source \u68C0\u6D4B\u5168\u90E8\u5DF2\u914D\u7F6E\u6E90",e=>e.positional("source",{type:"string",describe:"\u6570\u636E\u6E90\uFF1B\u7701\u7565=\u5168\u90E8\u5DF2\u914D\u7F6E"}),async e=>{let r=e.source?Ye(e):null,o=(r?F.filter(s=>s.id===r):F).filter(s=>Qo[s.id]),a=await Promise.all(o.map(async s=>{let i=ge(s.id);if(!i)return{source:s.id,ok:!1,configured:!1,error:`\u672A\u914D\u7F6E key\uFF1A\u8FD0\u884C finflow key set ${s.id} <key> \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ${s.env}`};try{let c=await Qo[s.id]();return{source:s.id,ok:!0,configured:!0,origin:i.origin,...c}}catch(c){return{source:s.id,ok:!1,configured:!0,origin:i.origin,error:c.message}}}));l({data:{items:a,total:a.length,allOk:a.every(s=>s.ok)},command:`key test${r?` ${r}`:""}`,source:"finflow"})}),handler:async()=>{l({data:{items:F.map(Vo),total:F.length},command:"key",source:"finflow"})}})}function pc(n){return/\.OF$/i.test(n.trim())?"otc":"exchange"}function j(n,t){return{fund_type:n||pc(t),thscode:O(t)}}function Gt(n,t){return S("/api/fund/profile/detail",j(t,n))}function ea(n,t={}){return S("/api/fund/performance/nav",{...j(t.fundType,n),range:t.range,nav_type:t.navType})}function ta(n,t){return S("/api/fund/performance/returns",j(t,n))}function na(n,t){return S("/api/fund/performance/drawdowns",j(t,n))}function ra(n,t){return S("/api/fund/portfolio/holdings",j(t,n))}function oa(n,t,e,r){return S("/api/fund/portfolio/stock-history",{...j(r,n),report_type:t,end_date:e})}function aa(n,t,e,r){return S("/api/fund/portfolio/bond-history",{...j(r,n),report_type:t,end_date:e})}function sa(n,t,e){return S("/api/fund/portfolio/stock-report-dates",{...j(e,n),report_type:t})}function ia(n,t){return S("/api/fund/portfolio/asset-allocation",j(t,n))}function ca(n,t){return S("/api/fund/portfolio/industry-allocation",j(t,n))}function ua(n,t,e){return S("/api/fund/holders/detail",{...j(e,n),merge_scope:t})}function la(n,t,e){return S("/api/fund/holders/top",{...j(e,n),limit:t})}function ma(n){return S("/api/fund/managers/detail",{manager_id:n})}function da(n){return S("/api/fund/managers/investment-style",{manager_id:n})}function pa(n,t){return S("/api/fund/managers/performance",{manager_id:n,range:t})}function fa(n){return S("/api/fund/managers/experience",{manager_id:n})}function ya(n){return S("/api/fund/companies/detail",{company_id:n})}function ga(n,t){return S("/api/fund/financials/indicators",j(t,n))}function ha(n,t){return S("/api/fund/financials/income-statements",j(t,n))}function ba(n,t){return S("/api/fund/financials/balance-sheets",j(t,n))}function Sa(n,t){return S("/api/fund/corporate-actions/dividends",j(t,n))}function wa(n,t){return S("/api/fund/diagnostics/detail",j(t,n))}function _a(n){return S("/api/fund/offerings/list",{subscribe:n})}function ka(n,t={}){return S("/api/fund/news/article-list",{...j(t.fundType,n),limit:t.limit,offset:t.offset})}function xa(n){return S("/api/fund/market/snapshot",{thscode:O(n)})}function Na(n,t,e){return S("/api/fund/market/historical",{thscode:O(n),interval:"1d",start:t,end:e})}function D(n){return typeof n=="number"?new Date(n).toISOString():null}var x=n=>n==null?null:Math.round(n*100)/100;function M(n){return t=>n(t.option("type",{type:"string",choices:["otc","exchange","reits"],describe:"\u57FA\u91D1\u7C7B\u578B\uFF08\u9ED8\u8BA4\u6309\u4EE3\u7801\u63A8\u65AD\uFF1A.OF\u2192otc\uFF0C\u5176\u4F59\u2192exchange\uFF1BREITs \u9700\u663E\u5F0F\u6307\u5B9A\uFF09"}))}function P(n){return n.type||void 0}function yc(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",name:t.fund_name||"",established:D(t.estab_date),manager:t.manager_name||null,managerInfo:(t.manager_info||[]).map(e=>({id:e.manager_id??e.id??null,name:e.manager_name??e.name??null,returnPct:x(e.return_pct??e.profit??null),start:D(e.start_date_ms??e.start_ms)??e.start_date??null,end:D(e.end_date_ms??e.end_ms)??e.end_date??null})),company:t.mgmt_name||null,companyId:t.company_id||null,scale:t.fund_scale??null,unitNav:t.unit_nav??null,tradeRule:t.trade_rule||[],rateInfo:t.rate_info||[]}}function gc(n){let t=n?.item||[];return{items:t.map(e=>({date:D(e.nav_date)?.slice(0,10)??null,unitNav:e.unit_nav??null,adjNav:e.adj_nav??null})),total:t.length}}var Oa=["week","month","tmonth","hyear","year","twoyear","tyear","fyear","nowyear","now"],Aa={week:"\u8FD11\u5468",month:"\u8FD11\u6708",tmonth:"\u8FD13\u6708",hyear:"\u8FD1\u534A\u5E74",year:"\u8FD11\u5E74",twoyear:"\u8FD12\u5E74",tyear:"\u8FD13\u5E74",fyear:"\u8FD15\u5E74",nowyear:"\u4ECA\u5E74\u6765",now:"\u6210\u7ACB\u6765"};function hc(n){let t=n?.item?.[0]||{},e={};for(let r of Oa){let o=t[`return_${r}`],a=t[`peer_average_${r}`],s=t[`rank_${r}`],i=t[`rank_total_${r}`];o===void 0&&a===void 0&&s===void 0||(e[Aa[r]]={returnPct:x(o??null),peerAveragePct:x(a??null),rank:s??null,rankTotal:i??null})}return{periods:e}}function bc(n){let t=n?.item?.[0]||{},e={};for(let r of Oa)t[r]!==void 0&&(e[Aa[r]]=x(t[r]));return{code:t.thscode||"",maxDrawdownPct:e}}function Sc(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.stock_name||e.name||"",assetType:e.asset_type||"",holdRatio:x(e.hold_ratio??e.security_market_value_rate_pct)??null,marketValue:e.position_capital??e.market_value??null,rank:e.investment_rank??e.rank??null,reportDate:D(e.end_date_ms)?.slice(0,10)??null})),summary:{stockRatio:x(n?.total_stock_ratio_pct??n?.stock_ratio_pct)??null,bondRatio:x(n?.total_bond_ratio_pct)??null,fundRatio:x(n?.total_fund_ratio_pct)??null,turnoverRate:x(n?.turnover_rate_pct)??null,concentration:x(n?.concentration_ratio)??null,mainIndustry:n?.main_industry||null},total:t.length}}function wc(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",name:e.name||"",assetType:e.asset_type||"",holdRatio:x(e.hold_ratio)??null,marketValue:e.market_value??null,periodChangePct:x(e.period_increase_pct)??null,rank:e.rank??null,reportDate:D(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function _c(n){let t=n?.item||[];return{items:t.map(e=>({reportType:e.report_type||"",name:e.report_type_name||"",start:D(e.start_date_ms)?.slice(0,10)??null,end:D(e.end_date_ms)?.slice(0,10)??null})),total:t.length}}function kc(n){let t=n?.item||[];return{items:t.map(e=>({reportDate:D(e.report_date_ms)?.slice(0,10)??e.report_period??null,stock:x(e.stock_ratio_pct)??null,bond:x(e.bond_ratio_pct)??null,deposit:x(e.deposit_ratio_pct)??null,other:x(e.other_ratio_pct)??null})),total:t.length}}function xc(n){let t=n?.item||[];return{items:t.map(e=>({reportPeriod:e.report_period||"",industry:e.industry_name||"",ratio:x(e.ratio_pct)??null})),total:t.length}}function Nc(n){let t=n?.item||[];return{items:t.map(e=>({scope:e.merge_scope||"",reportDate:D(e.report_date_ms)?.slice(0,10)??null,institutionPct:x(e.ins_position)??null,personalPct:x(e.psnl_rate)??null,holderCount:e.holder_amount??null,avgHolderShare:x(e.avg_holder_share)??null,staffHoldPct:x(e.mgmt_staff_hold_rate)??null})),total:t.length}}function Oc(n){let t=n?.item||[];return{items:t.map(e=>({rank:e.rank??null,name:e.holder_name||"",type:e.holder_type||"",holdShare:e.hold_share??null,holdPct:x(e.hold_rate_pct)??null,reportDate:D(e.report_date_ms)?.slice(0,10)??null})),total:t.length}}function Ac(n,t,e,r){let o=n?.item?.[0]||{},a=t?.item?.[0]||{};return{id:o.manager_id||"",name:o.manager_name||"",sex:o.sex??null,degree:o.degree??null,company:o.company_name??null,companyId:o.company_id??null,resume:o.resume??null,annualReturnPct:x(o.annual_return_pct)??null,maxReturnPct:x(o.maximum_return_pct)??null,radar:o.radar_comparison||[],style:{representativeFund:a.representative_fund_name??null,representativeFundCode:a.representative_fund_thscode??null,idea:a.investment_idea??null,totalScale:a.total_fund_scale??null,industryPreferences:a.industry_preferences??null},experience:e?.item?.[0]??null,performance:r?(r.item||[]).map(s=>({date:D(s.date_ms)?.slice(0,10)??null,managerPct:x(s.manager_return_pct)??null,peerPct:x(s.peer_return_pct)??null,benchmarkPct:x(s.benchmark_return_pct)??null})):null}}function Dc(n){let t=n?.item?.[0]||{};return{id:t.company_id||"",name:t.company_name||"",type:t.company_type||"",established:D(t.established_date_ms),fundCount:t.fund_count??null,scale:t.scale??null}}function Tc(n){let t=n?.item||[];return{items:t.map(e=>({period:`${D(e.start_date_ms)?.slice(0,10)??""}~${D(e.end_date_ms)?.slice(0,10)??""}`,published:D(e.publish_date_ms),...Object.fromEntries(Object.entries(e).filter(([r])=>!r.endsWith("_ms")&&r!=="thscode"&&r!=="ticker"))})),total:t.length}}function Ec(n){let t=n?.item||[];return{count:n?.dividend_count??t.length,total:n?.dividend_total??null,items:t.map(e=>({perTenCashBeforeTax:e.per_ten_cash_before_tax??null,perTenCashAfterTax:e.per_ten_cash_after_tax??null,progress:e.progress||"",publishDate:D(e.publish_date_ms)?.slice(0,10)??null,exDividendDate:D(e.ex_dividend_date_ms)?.slice(0,10)??null,paymentDate:D(e.payment_date_ms)?.slice(0,10)??null}))}}function Pc(n){let t=n?.item?.[0]||{};return{code:t.thscode||"",price:t.last_price??null,change:t.price_change??null,changePercent:x(t.price_change_ratio_pct)??null,open:t.open_price??null,high:t.high_price??null,low:t.low_price??null,prevClose:t.prev_price??null,amplitude:x(t.price_amplitude_ratio_pct)??null,volume:t.volume??null,amount:t.turnover??null,turnoverRate:x(t.turnover_ratio_pct)??null}}function vc(n){let t=n?.item||[];return{code:n?.thscode||"",items:t.map(e=>({date:D(e.date_ms)?.slice(0,10)??null,open:e.open_price??null,high:e.high_price??null,low:e.low_price??null,close:e.close_price??null,volume:e.volume??null,amount:e.turnover??null})),total:t.length}}function Cc(n){let t=n?.item||[];return{items:t.map(e=>({title:e.title||"",summary:e.summary||"",source:e.source||"",url:e.url??null,time:D(e.publish_time_ms)})),total:t.length,hasMore:!!n?.has_more,nextOffset:n?.offset??null}}function qc(n){let t=n?.item||[];return{items:t.map(e=>({code:e.thscode||"",ticker:e.ticker||"",subscriptionStart:D(e.subscription_start_ms)?.slice(0,10)??null,subscriptionEnd:D(e.subscription_end_ms)?.slice(0,10)??null})),total:t.length}}function Da(n){return n.command({command:"fund",describe:"\u57FA\u91D1\u6570\u636E\uFF08\u6276\u6447\u5B98\u65B9\uFF09\uFF1A\u6863\u6848/\u51C0\u503C/\u4E1A\u7EE9/\u56DE\u64A4/\u6301\u4ED3/\u6301\u6709\u4EBA/\u7ECF\u7406/\u516C\u53F8/\u5206\u7EA2/ETF\u884C\u60C5",builder:t=>t.strictCommands(!1).command("profile <code>","\u57FA\u91D1\u6863\u6848\uFF08\u540D\u79F0/\u7ECF\u7406/\u89C4\u6A21/\u8D39\u7387\uFF0C\u542B manager_id \u4E0E company_id \u4E0B\u94BB\u5165\u53E3\uFF09",M(e=>e.positional("code",{type:"string",describe:"\u57FA\u91D1\u4EE3\u7801\uFF0C\u573A\u5916\u5982 025480.OF\uFF0CETF \u5982 510300 / 510300.SH"})),async e=>{let r=await Gt(e.code,P(e));l({data:r,command:`fund profile ${e.code}`,source:"fuyao",toJSON:yc})}).command("nav <code>","\u51C0\u503C\u5E8F\u5217\uFF08\u9ED8\u8BA4\u6700\u65B0\u4E00\u6761\uFF1B--range week..fyear \u53D6\u533A\u95F4\uFF09",M(e=>e.positional("code",{type:"string"}).option("range",{type:"string",choices:["week","month","tmonth","hyear","year","twoyear","tyear","fyear"],describe:"\u51C0\u503C\u533A\u95F4"}).option("nav-type",{type:"string",default:"unit,adj",choices:["unit","adj","unit,adj"],describe:"\u5355\u4F4D/\u590D\u6743\u51C0\u503C"})),async e=>{let r=await ea(e.code,{range:e.range,navType:e["nav-type"],fundType:P(e)});l({data:r,command:`fund nav ${e.code}${e.range?` --range ${e.range}`:""}`,source:"fuyao",toJSON:gc})}).command("perf <code>","\u533A\u95F4\u6536\u76CA\uFF08\u8FD11\u5468..\u6210\u7ACB\u6765 + \u540C\u7C7B\u5E73\u5747 + \u540C\u7C7B\u6392\u540D\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await ta(e.code,P(e));l({data:r,command:`fund perf ${e.code}`,source:"fuyao",toJSON:hc})}).command("drawdown <code>","\u6700\u5927\u56DE\u64A4\uFF08\u5404\u5468\u671F\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await na(e.code,P(e));l({data:r,command:`fund drawdown ${e.code}`,source:"fuyao",toJSON:bc})}).command("holdings <code>","\u6700\u65B0\u91CD\u4ED3\u6301\u4ED3\uFF08\u80A1\u7968/\u503A\u5238/\u57FA\u91D1 + \u6C47\u603B\u5360\u6BD4\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await ra(e.code,P(e));l({data:r,command:`fund holdings ${e.code}`,source:"fuyao",toJSON:Sc})}).command("holdings-history <code>","\u5386\u53F2\u6301\u4ED3\u660E\u7EC6\uFF08\u9700\u62A5\u544A\u671F\uFF1A\u5148 fund report-dates \u67E5 end \u65E5\u671F\uFF09",M(e=>e.positional("code",{type:"string"}).option("report",{type:"string",default:"quarter",describe:"\u62A5\u544A\u7C7B\u578B\uFF0C\u5982 quarter"}).option("end",{type:"string",required:!0,describe:"\u62A5\u544A\u622A\u6B62\u65E5 YYYY-MM-DD"}).option("bond",{type:"boolean",default:!1,describe:"\u503A\u5238\u6301\u4ED3\uFF08\u9ED8\u8BA4\u80A1\u7968\uFF09"})),async e=>{let r=e.code,{report:o="quarter",end:a,bond:s}=e,i=s?await aa(r,o,a,P(e)):await oa(r,o,a,P(e));l({data:i,command:`fund holdings-history ${r} --end ${a}`,source:"fuyao",toJSON:wc})}).command("report-dates <code>","\u6301\u4ED3\u53EF\u7528\u62A5\u544A\u671F\uFF08holdings-history \u9700\u8981\u7684 end \u65E5\u671F\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await sa(e.code,void 0,P(e));l({data:r,command:`fund report-dates ${e.code}`,source:"fuyao",toJSON:_c})}).command("allocation <code>","\u8D44\u4EA7\u914D\u7F6E\uFF08\u80A1\u7968/\u503A\u5238/\u5B58\u6B3E/\u5176\u4ED6\u5360\u6BD4\uFF0C\u591A\u671F\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await ia(e.code,P(e));l({data:r,command:`fund allocation ${e.code}`,source:"fuyao",toJSON:kc})}).command("industry <code>","\u884C\u4E1A\u914D\u7F6E\uFF08\u591A\u671F\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await ca(e.code,P(e));l({data:r,command:`fund industry ${e.code}`,source:"fuyao",toJSON:xc})}).command("holders <code>","\u6301\u6709\u4EBA\u7ED3\u6784\uFF08\u673A\u6784/\u4E2A\u4EBA\u5360\u6BD4\u3001\u6237\u6570\uFF09",M(e=>e.positional("code",{type:"string"}).option("top",{type:"boolean",default:!1,describe:"\u524D\u5341\u5927\u6301\u6709\u4EBA"})),async e=>{let r=e.code,o=e.top?await la(r,void 0,P(e)):await ua(r,void 0,P(e));l({data:o,command:`fund holders ${r}${e.top?" --top":""}`,source:"fuyao",toJSON:e.top?Oc:Nc})}).command("manager <code>","\u57FA\u91D1\u7ECF\u7406\uFF08\u7ECF\u57FA\u91D1\u4EE3\u7801\u89E3\u6790 manager_id\uFF1A\u8BE6\u60C5+\u98CE\u683C+\u7ECF\u5386\uFF09",M(e=>e.positional("code",{type:"string",describe:"\u57FA\u91D1\u4EE3\u7801\uFF08\u81EA\u52A8\u53D6\u5176\u73B0\u4EFB\u7ECF\u7406\uFF09"}).option("range",{type:"string",choices:["month","tmonth","year","nowyear","now"],describe:"\u9644\u52A0\u4E1A\u7EE9\u66F2\u7EBF\u533A\u95F4"})),async e=>{let r=e.code,a=(await Gt(r,P(e)))?.item?.[0]?.manager_info?.[0],s=a?.manager_id??a?.id;if(!s)throw new Error(`\u57FA\u91D1 ${r} \u672A\u62AB\u9732\u57FA\u91D1\u7ECF\u7406 ID\uFF0C\u8BF7\u5728 profile \u8F93\u51FA\u7684 managerInfo \u4E2D\u786E\u8BA4`);let[i,c,u]=await Promise.all([ma(s),da(s),fa(s)]),m=e.range?await pa(s,e.range):null,d=Ac(i,c,u,m);l({data:d,command:`fund manager ${r}`,source:"fuyao",toJSON:p=>p})}).command("company <company_id>","\u57FA\u91D1\u516C\u53F8\u8BE6\u60C5\uFF08company_id \u6765\u81EA fund profile \u8F93\u51FA\uFF09",e=>e.positional("company_id",{type:"string",describe:"\u57FA\u91D1\u516C\u53F8 ID\uFF0C\u5982 80000222"}),async e=>{let r=await ya(e.company_id);l({data:r,command:`fund company ${e.company_id}`,source:"fuyao",toJSON:Dc})}).command("financial <code>","\u57FA\u91D1\u8D22\u52A1\u6570\u636E\uFF08--t indicators(\u9ED8\u8BA4)/income/balance\uFF09",M(e=>e.positional("code",{type:"string"}).option("t",{type:"string",default:"indicators",choices:["indicators","income","balance"]})),async e=>{let r=e.code,o=e.t||"indicators",a=o==="income"?await ha(r,P(e)):o==="balance"?await ba(r,P(e)):await ga(r,P(e));l({data:a,command:`fund financial ${r} -t ${o}`,source:"fuyao",toJSON:Tc})}).command("dividend <code>","\u57FA\u91D1\u5206\u7EA2\u8BB0\u5F55",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await Sa(e.code,P(e));l({data:r,command:`fund dividend ${e.code}`,source:"fuyao",toJSON:Ec})}).command("diagnose <code>","\u57FA\u91D1\u8BCA\u65AD\uFF08\u7EF4\u5EA6/\u540C\u7C7B\u5BF9\u6BD4/\u97E7\u6027\u6307\u6807\uFF09",M(e=>e.positional("code",{type:"string"})),async e=>{let r=await wa(e.code,P(e));l({data:r,command:`fund diagnose ${e.code}`,source:"fuyao",toJSON:o=>({items:o?.item||[],total:o?.item?.length??0})})}).command("issue [subscribe]","\u65B0\u53D1\u57FA\u91D1\u52DF\u96C6\u5217\u8868\uFF08active \u5F53\u524D\u52DF\u96C6 / upcoming \u5373\u5C06\u52DF\u96C6\uFF09",e=>e.positional("subscribe",{type:"string",default:"active",choices:["active","upcoming"]}),async e=>{let r=e.subscribe||"active",o=await _a(r);l({data:o,command:`fund issue ${r}`,source:"fuyao",toJSON:qc})}).command("news <code>","\u57FA\u91D1\u8D44\u8BAF",M(e=>e.positional("code",{type:"string"})),async e=>{let{n:r}=e,o=await ka(e.code,{limit:r,fundType:P(e)});l({data:o,command:`fund news ${e.code}`,source:"fuyao",toJSON:Cc})}).command("etf <code>","ETF \u884C\u60C5\u5FEB\u7167\uFF08\u4EC5 ETF\uFF1BLOF/\u573A\u5916/REITs \u4E0D\u652F\u6301\uFF09",e=>e.positional("code",{type:"string",describe:"ETF \u4EE3\u7801\uFF0C\u5982 510300 / 510300.SH"}),async e=>{let r=await xa(e.code);l({data:r,command:`fund etf ${e.code}`,source:"fuyao",toJSON:Pc})}).command("etf-kline <code>","ETF \u5386\u53F2\u65E5\u7EBF\uFF08\u7A97\u53E3 \u22645 \u5E74\uFF09",e=>e.positional("code",{type:"string"}).option("days",{type:"number",default:120,describe:"\u56DE\u770B\u5929\u6570\uFF08\u22641825\uFF09"}),async e=>{let r=e.code,o=Math.min(Math.max(Number(e.days)||120,1),1825),a=Date.now(),s=await Na(r,a-o*864e5,a);l({data:s,command:`fund etf-kline ${r}`,source:"fuyao",toJSON:vc})}),handler:async()=>{throw new Error("\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4\uFF1Afinflow fund --help \u67E5\u770B profile/nav/perf/holdings/etf \u7B49 17 \u4E2A\u5B50\u547D\u4EE4")}})}var W=$c(jc(process.argv)).scriptName("finflow").version("1.10.3").demandCommand(1,"\u8BF7\u6307\u5B9A\u547D\u4EE4\uFF0C\u8FD0\u884C finflow --help \u67E5\u770B\u5E2E\u52A9").option("n",{type:"number",default:10,describe:"\u6761\u6570"}).strict().help().alias("h","help");wr(W);Oo(W);To(W);$o(W);Ro(W);Wo(W);Zo(W);Da(W);W.parse();
|