@openduo/finflow 1.5.1 → 1.6.0

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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import Ar from"yargs";import{hideBin as qr}from"yargs/helpers";function U(n){return(n||"").replace(/<[^>]+>/g,"")}function O(){let n=new Date;return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function Qn(n,e=!1){console.log(e?JSON.stringify(n,null,2):JSON.stringify(n))}function Yn(n,e,t){return{data:n,meta:{source:t,timestamp:new Date().toISOString(),command:e}}}function u(n){let{data:e,command:t,source:o,toJSON:r}=n;Qn(Yn(r?r(e):e,t,o))}import Xn from"https";import ot from"crypto";var se=Object.freeze({os:"web",sv:"8.4.6",app:"CailianpressWeb"});function Vn(n){return Object.keys(n).sort().map(e=>`${e}=${n[e]}`).join("&")}function Wn(n){let e={...se,...n},t=Vn(e);return t?ot.createHash("md5").update(ot.createHash("sha1").update(t).digest("hex")).digest("hex"):ot.createHash("md5").update(ot.createHash("sha1").update("").digest("hex")).digest("hex")}function ie(n){return{...se,...n,sign:Wn(n)}}var H=n=>n.trim().toLowerCase(),Zn="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",to={"User-Agent":Zn,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"};function A(n,e,t={},o={}){let r=o.timeout??1e4,s=new URLSearchParams(ie(t)).toString(),a=`${e}?${s}`;return new Promise((i,c)=>{let m=Xn.request({hostname:n,path:a,method:"GET",timeout:r,headers:{...to,host:n,Referer:`https://${n}/`}},d=>{let l="";d.on("data",p=>l+=p),d.on("end",()=>{try{i(JSON.parse(l))}catch{i(l)}})});m.on("error",c),m.on("timeout",()=>{m.destroy(),c(new Error("timeout"))}),m.end()})}function wt(n={}){let e=n.lastTime??Math.floor(Date.now()/1e3);return A("www.cls.cn","/v1/roll/get_roll_list",{lastTime:e,last_time:e,refresh_type:1,rn:n.rn??20})}function St(n){return A("www.cls.cn",`/v3/depth/home/assembled/${n}`)}function ce(n,e={}){return A("www.cls.cn",`/v3/depth/list/${n}`,{id:n,last_time:e.lastTime,rn:e.rn??20})}function le(){return A("www.cls.cn","/v2/article/hot/list")}function ue(){return A("www.cls.cn","/api/subject/hotAndNewestSubject")}function xt(n={}){return A("x-quote.cls.cn","/web_quote/plate/hot_plate",{type:n.type??"industry",way:n.way??"change",rever:1})}function me(n={}){return A("x-quote.cls.cn","/web_quote/web_stock/stock_list",{way:n.way??"change",rever:1,types:n.types??"change_px,change"})}function de(n){return A("x-quote.cls.cn","/quote/stock/basic",{secu_code:H(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 Nt(n){return A("x-quote.cls.cn","/quote/stock/volume",{secu_code:H(n),field:"five"})}function kt(n){return A("x-quote.cls.cn","/quote/stock/volume",{secu_code:H(n),field:"vol"})}function vt(n){return A("x-quote.cls.cn","/v2/quote/a/tline",{secu_code:H(n)})}function rt(n,e={}){let t={code:H(n),period:e.period??"d",fq_type:e.fq_type??1,limit:e.limit??200};return e.start_date&&(t.start_date=e.start_date),A("x-quote.cls.cn","/v2/quote/a/kline",t)}function At(n){return A("x-quote.cls.cn","/web_quote/stock/assoc_plate",{secu_code:H(n)})}function pe(n,e={}){return A("x-quote.cls.cn","/web_quote/plate/stocks",{secu_code:H(n),way:e.way??"change",rever:e.rever??1})}function ge(n){return A("x-quote.cls.cn","/quote/stock/fundflow",{secu_code:H(n)})}function fe(n,e={}){let t=Math.floor(Date.now()/1e3);return A("www.cls.cn","/es/quotes/articles",{keyword:n,lastTime:t,rn:e.rn??10})}function he(){return A("x-quote.cls.cn","/v2/quote/a/stock/emotion")}function qt(n){return A("www.cls.cn","/v3/transaction/anchor",{cdate:n.date})}var K=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"}}),jt=Object.freeze({change:{way:"change",name:"\u6DA8\u8DCC\u5E45"},volume:{way:"volume",name:"\u6210\u4EA4\u91CF"},amount:{way:"amount",name:"\u6210\u4EA4\u989D"},turnover:{way:"turnover",name:"\u6362\u624B\u7387"},amplitude:{way:"amplitude",name:"\u632F\u5E45"}}),Ot=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 ye(n){return Ot[n]?Ot[n]:Object.values(Ot).find(e=>e.name===n||e.category===n)||null}function be(n){if(K[n])return K[n];let e=parseInt(n,10);return isNaN(e)?Object.values(K).find(t=>t.name===n||t.name.includes(n))||null:Object.values(K).find(t=>t.id===e)||null}import eo from"https";import no from"http";var oo="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",ro={"User-Agent":oo,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},ao={"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 k(n,e,t={},o={}){let r=o.timeout??1e4,s=Object.keys(t).length?"?"+new URLSearchParams(t).toString():"",a=`${e}${s}`,i={...ro,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},c=ao[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)),o.cookie&&(i.Cookie=o.cookie),o.extraHeaders&&Object.assign(i,o.extraHeaders),new Promise((m,d)=>{let p=(n.startsWith("localhost")?no:eo).request({hostname:n,path:a,method:"GET",timeout:r,headers:i},g=>{if(g.statusCode>=300&&g.statusCode<400&&g.headers.location){let y=new URL(g.headers.location,`https://${n}`);return m(k(y.hostname,y.pathname+y.search,t,o))}let f=[];g.on("data",y=>f.push(y)),g.on("end",()=>{let y=Buffer.concat(f).toString("utf-8");try{let h=JSON.parse(y);g.statusCode>=400&&(h._statusCode=g.statusCode),m(h)}catch{m(y)}})});p.on("error",d),p.on("timeout",()=>{p.destroy(),d(new Error("timeout"))}),p.end()})}function _e(n={},e){let t={};return n.max_read_id&&(t.max_read_id=n.max_read_id),n.channel&&(t.channel=n.channel),k("flash-api.jin10.com","/get_flash_list",t,e)}function we(n,e){return k("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},e)}function Se(n,e){return k("flash-api.jin10.com","/get_flash_detail",{id:n},e)}function xe(n,e){return k("flash-api.jin10.com","/get_flash_list_by_date",{date:n},e)}function Ne(){return k("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function ke(){return k("cdn.jin10.com","/json/index/slide_204.json")}function ve(){return k("cdn.jin10.com","/json/index/flir.json")}var Ct="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",so={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function $t(n){return{extraHeaders:so,...n}}function Ae(n,e="cj",t){return k(Ct,"/get/data",{date:n,category:e},$t(t))}function qe(n,e="cj",t){return k(Ct,"/get/event",{date:n,category:e},$t(t))}function Oe(n,e="cj",t){return k(Ct,"/page/holiday",{date:n,category:e,page:1,pagesize:50},$t(t))}function Tt(n=-1,e={},t){let o={channel:n};return e.max_time&&(o.max_time=e.max_time),k("qh-flash-api.jin10.com","/get_flash_list",o,t)}function je(n){return k("futures-report-api.jin10.com","/api/headline",{},n)}function Jt(n){return n.replace(/-/g,"")}function Ce(n,e){return k("qhcal-api.jin10.com","/data",{date:Jt(n)},e)}function st(n,e){return k("qhcal-api.jin10.com","/event",{date:Jt(n)},e)}function it(n,e){return k("qhcal-api.jin10.com","/holiday",{date:Jt(n)},e)}function $e(n,e){return k("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...e,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function ct(){return k("cdn.jin10.com","/json/index/all_topics.json")}function Te(n,e={},t){let o={id:n};return e.page&&(o.page=e.page),e.page_size&&(o.page_size=e.page_size),k("reference-api.jin10.com","/topic/getById",o,{...t,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import Je from"fs";import io from"path";import co from"os";var Re=io.join(co.homedir(),".xueqiu-cookie");function Rt(){try{return Je.readFileSync(Re,"utf-8").trim()||null}catch{return null}}function Lt(n){Je.writeFileSync(Re,n.trim(),"utf-8")}var _="stock.xueqiu.com",Dt="xueqiu.com";function N(n){return n.trim().toUpperCase()}function Le(n,e,t,o,{token:r=!0,ua:s}={}){let a=r?Rt():null;if(r&&!a)throw new Error("\u672A\u8BBE\u7F6E\u96EA\u7403 Cookie\uFF0C\u8BF7\u5148\u8FD0\u884C: finflow config login \u6216 finflow config cookie <cookie>");let i={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":s||"Xueqiu iPhone 14.15.1",Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};a&&(i.Cookie=a);let c={method:n,headers:i,redirect:"follow"};return o&&(c.body=new URLSearchParams(o).toString(),i["Content-Type"]="application/x-www-form-urlencoded"),fetch(`https://${e}${t}`,c).then(m=>m.json())}function b(n,e,t={}){return Le("GET",n,e,null,t)}function De(n,e,t,o={}){return Le("POST",n,e,t,o)}function Et(n){return b(_,`/v5/stock/realtime/quotec.json?symbol=${n.map(N).join(",")}`,{token:!1})}function Mt(n){return b(_,`/v5/stock/realtime/pankou.json?symbol=${N(n)}`)}function lt(n,{period:e="day",count:t=284}={}){let o=Date.now();return b(_,`/v5/stock/chart/kline.json?symbol=${N(n)}&begin=${o}&period=${e}&type=before&count=-${t}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function Pt(n,{period:e="1d"}={}){return b(_,`/v5/stock/chart/minute.json?symbol=${N(n)}&period=${e}`)}function Ht(n,{count:e=50}={}){return b(_,`/v5/stock/history/trade.json?symbol=${N(n)}&count=${e}`)}function Ee(n){return b(_,`/v5/stock/quote/relevant.json?symbol=${N(n)}`)}function Me(n){return b(_,`/v5/stock/event/entry.json?symbol=${N(n)}`)}function Pe(n){return b(Dt,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function He({category:n="cn"}={}){return b(_,`/v5/stock/screener/industries.json?category=${n}`)}function Ie(n={}){let{page:e=1,size:t=30,order:o="desc",order_by:r="percent",market:s="CN"}=n,a=new URLSearchParams({page:String(e),size:String(t),order:o,order_by:r,market:s});return n.ind_code&&a.set("ind_code",n.ind_code),n.type&&a.set("type",n.type),b(_,`/v5/stock/screener/quote/list.json?${a.toString()}`)}function Be(n){return b(_,`/v5/stock/hq/longhu.json?date=${n}`)}function Ue(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/indicator.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function Fe(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/cash_flow.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function Ge(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/income.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function Ke(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/balance.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function ze(n,{circula:e=1}={}){return b(_,`/v5/stock/f10/cn/top_holders.json?symbol=${N(n)}&circula=${e}`)}function Qe(n){return b(_,`/v5/stock/f10/cn/indicator.json?symbol=${N(n)}`)}function Ye(n){return b(_,`/v5/stock/f10/cn/industry.json?symbol=${N(n)}`)}function Ve(n,{page:e=1,size:t=10}={}){return b(_,`/v5/stock/f10/cn/bonus.json?symbol=${N(n)}&page=${e}&size=${t}`)}function It(n){return b(_,`/v5/stock/capital/flow.json?symbol=${N(n)}`)}function We(n,{count:e=20}={}){return b(_,`/v5/stock/capital/history.json?symbol=${N(n)}&count=${e}`)}function Xe(n,{page:e=1,size:t=180}={}){return b(_,`/v5/stock/capital/margin.json?symbol=${N(n)}&page=${e}&size=${t}`)}function Ze(){return b(_,"/v5/stock/portfolio/list.json?system=true")}function Bt(n,{size:e=1e3}={}){return b(_,`/v5/stock/portfolio/stock/list.json?size=${e}&category=1&pid=${n}`)}function tn(n,{category:e=1}={}){return De(_,"/v5/stock/portfolio/stock/add.json",{symbols:n,category:e})}function en(n,{category:e=1}={}){return De(_,"/v5/stock/portfolio/stock/cancel.json",{symbols:n,category:e})}function V(n){return b(_,`/v5/stock/batch/quote.json?symbol=${n.map(N).join(",")}&extend=detail&is_delay_hk=true`)}function nn(n){return b(Dt,`/cubes/nav_daily/all.json?cube_symbol=${n}`)}function on(n){return b(Dt,`/cubes/rebalancing/current.json?cube_symbol=${n}`)}function rn(n){return b(_,`/stock/report/latest.json?symbol=${N(n)}`)}import lo from"https";var Ut="www.gelonghui.com",uo="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 mt(n,e=1e4){return new Promise((t,o)=>{let r=new URL(n,`https://${Ut}`),s=lo.get({hostname:Ut,path:r.pathname+r.search,headers:{"User-Agent":uo,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"}},a=>{let i=[];a.on("data",c=>i.push(c)),a.on("end",()=>{let c=Buffer.concat(i).toString();try{t(JSON.parse(c))}catch{t(c)}})});s.setTimeout(e,()=>{s.destroy(),o(new Error("timeout"))}),s.on("error",o)})}function W(n={}){let e=new URLSearchParams({category:n.category??"all",limit:String(n.limit??15),timestamp:String(Date.now())});return n.liveId&&e.set("liveId",String(n.liveId)),mt(`/api/live-channels/${n.channel??"all"}/lives/v4?${e}`)}function an(n={}){return W({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function sn(n={}){return W({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function cn(n={}){return mt(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function Ft(){return mt("/hq/home-page-data")}function X(){return mt("/hq/quote/api/market/flow/entrance/data/v2")}var Gt=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"}]),Kt=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function dt(n){return n?Gt.find(e=>e.id.toLowerCase()===n.toLowerCase()||e.name===n)??Gt[0]:Gt[0]}function ln(n){return n?Kt.find(e=>e.id.toLowerCase()===n.toLowerCase()||e.name===n)??Kt[0]:Kt[0]}import zt from"fs";import M from"path";import P from"os";import{execSync as Qt}from"child_process";import un from"crypto";function po(){return Qt('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function go(n){let e=n.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e?.[1])return e[1];let t=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let o of t){let r=n.match(o);if(r?.[1]?.length>0)return r[1]}return n}function fo(n,e,t=0){let o=n.slice(0,3).toString("ascii");if(!/^v\d\d$/.test(o))return n.toString("utf-8");let r=n.slice(3);if(r.length===0||r.length%16!==0)return n.toString("utf-8");let s=un.pbkdf2Sync(e,"saltysalt",1003,16,"sha1"),a=Buffer.alloc(16,32),i=un.createDecipheriv("aes-128-cbc",s,a);i.setAutoPadding(!1);let c=Buffer.concat([i.update(r),i.final()]),m=c[c.length-1];return m&&m<=16&&(c=c.slice(0,-m)),t>=24&&c.length>32&&(c=c.slice(32)),go(c.toString("utf-8"))}var ho=[M.join(P.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),M.join(P.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),M.join(P.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),M.join(P.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),M.join(P.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),M.join(P.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),M.join(P.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),M.join(P.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function yo(n){for(let e of ho){if(!zt.existsSync(e))continue;let t=M.join(P.tmpdir(),`finflow_cookies_${Date.now()}.db`);zt.copyFileSync(e,t);try{let o=0;try{let a=Qt(`sqlite3 "${t}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();o=parseInt(a,10)||0}catch{}let r=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(Qt(`sqlite3 -json "${t}" "${r}"`,{encoding:"utf-8"})).map(a=>({name:a.name,value:Buffer.from(a["hex(encrypted_value)"],"hex"),domain:a.host_key,_metaVersion:o}))}finally{try{zt.unlinkSync(t)}catch{}}}return[]}function z(n,e){if(process.platform!=="darwin")throw new Error("\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie \u4EC5\u652F\u6301 macOS");let t;try{t=po()}catch{throw new Error(`\u65E0\u6CD5\u4ECE Keychain \u83B7\u53D6 Chrome \u5BC6\u7801\u3002
2
+ import Ar from"yargs";import{hideBin as qr}from"yargs/helpers";function U(n){return(n||"").replace(/<[^>]+>/g,"")}function O(){let n=new Date;return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function Qn(n,e=!1){console.log(e?JSON.stringify(n,null,2):JSON.stringify(n))}function Yn(n,e,t){return{data:n,meta:{source:t,timestamp:new Date().toISOString(),command:e}}}function u(n){let{data:e,command:t,source:o,toJSON:r}=n;Qn(Yn(r?r(e):e,t,o))}import Xn from"https";import ot from"crypto";var se=Object.freeze({os:"web",sv:"8.4.6",app:"CailianpressWeb"});function Vn(n){return Object.keys(n).sort().map(e=>`${e}=${n[e]}`).join("&")}function Wn(n){let e={...se,...n},t=Vn(e);return t?ot.createHash("md5").update(ot.createHash("sha1").update(t).digest("hex")).digest("hex"):ot.createHash("md5").update(ot.createHash("sha1").update("").digest("hex")).digest("hex")}function ie(n){return{...se,...n,sign:Wn(n)}}var H=n=>n.trim().toLowerCase(),Zn="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",to={"User-Agent":Zn,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"};function A(n,e,t={},o={}){let r=o.timeout??1e4,s=new URLSearchParams(ie(t)).toString(),a=`${e}?${s}`;return new Promise((i,c)=>{let m=Xn.request({hostname:n,path:a,method:"GET",timeout:r,headers:{...to,host:n,Referer:`https://${n}/`}},d=>{let l="";d.on("data",p=>l+=p),d.on("end",()=>{try{i(JSON.parse(l))}catch{i(l)}})});m.on("error",c),m.on("timeout",()=>{m.destroy(),c(new Error("timeout"))}),m.end()})}function wt(n={}){let e=n.lastTime??Math.floor(Date.now()/1e3);return A("www.cls.cn","/v1/roll/get_roll_list",{lastTime:e,last_time:e,refresh_type:1,rn:n.rn??20})}function St(n){return A("www.cls.cn",`/v3/depth/home/assembled/${n}`)}function ce(n,e={}){return A("www.cls.cn",`/v3/depth/list/${n}`,{id:n,last_time:e.lastTime,rn:e.rn??20})}function le(){return A("www.cls.cn","/v2/article/hot/list")}function ue(){return A("www.cls.cn","/api/subject/hotAndNewestSubject")}function xt(n={}){return A("x-quote.cls.cn","/web_quote/plate/hot_plate",{type:n.type??"industry",way:n.way??"change",rever:1})}function me(n={}){return A("x-quote.cls.cn","/web_quote/web_stock/stock_list",{way:n.way??"change",rever:1,types:n.types??"change_px,change"})}function de(n){return A("x-quote.cls.cn","/quote/stock/basic",{secu_code:H(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 Nt(n){return A("x-quote.cls.cn","/quote/stock/volume",{secu_code:H(n),field:"five"})}function kt(n){return A("x-quote.cls.cn","/quote/stock/volume",{secu_code:H(n),field:"vol"})}function vt(n){return A("x-quote.cls.cn","/v2/quote/a/tline",{secu_code:H(n)})}function rt(n,e={}){let t={code:H(n),period:e.period??"d",fq_type:e.fq_type??1,limit:e.limit??200};return e.start_date&&(t.start_date=e.start_date),A("x-quote.cls.cn","/v2/quote/a/kline",t)}function At(n){return A("x-quote.cls.cn","/web_quote/stock/assoc_plate",{secu_code:H(n)})}function pe(n,e={}){return A("x-quote.cls.cn","/web_quote/plate/stocks",{secu_code:H(n),way:e.way??"change",rever:e.rever??1})}function ge(n){return A("x-quote.cls.cn","/quote/stock/fundflow",{secu_code:H(n)})}function fe(n,e={}){let t=Math.floor(Date.now()/1e3);return A("www.cls.cn","/es/quotes/articles",{keyword:n,lastTime:t,rn:e.rn??10})}function he(){return A("x-quote.cls.cn","/v2/quote/a/stock/emotion")}function qt(n){return A("www.cls.cn","/v3/transaction/anchor",{cdate:n.date})}var K=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"}}),jt=Object.freeze({change:{way:"change",name:"\u6DA8\u8DCC\u5E45"},volume:{way:"volume",name:"\u6210\u4EA4\u91CF"},amount:{way:"amount",name:"\u6210\u4EA4\u989D"},turnover:{way:"turnover",name:"\u6362\u624B\u7387"},amplitude:{way:"amplitude",name:"\u632F\u5E45"}}),Ot=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 ye(n){return Ot[n]?Ot[n]:Object.values(Ot).find(e=>e.name===n||e.category===n)||null}function be(n){if(K[n])return K[n];let e=parseInt(n,10);return isNaN(e)?Object.values(K).find(t=>t.name===n||t.name.includes(n))||null:Object.values(K).find(t=>t.id===e)||null}import eo from"https";import no from"http";var oo="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",ro={"User-Agent":oo,Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9"},ao={"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 k(n,e,t={},o={}){let r=o.timeout??1e4,s=Object.keys(t).length?"?"+new URLSearchParams(t).toString():"",a=`${e}${s}`,i={...ro,Referer:"https://www.jin10.com/",Origin:"https://www.jin10.com"},c=ao[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)),o.cookie&&(i.Cookie=o.cookie),o.extraHeaders&&Object.assign(i,o.extraHeaders),new Promise((m,d)=>{let p=(n.startsWith("localhost")?no:eo).request({hostname:n,path:a,method:"GET",timeout:r,headers:i},g=>{if(g.statusCode>=300&&g.statusCode<400&&g.headers.location){let y=new URL(g.headers.location,`https://${n}`);return m(k(y.hostname,y.pathname+y.search,t,o))}let f=[];g.on("data",y=>f.push(y)),g.on("end",()=>{let y=Buffer.concat(f).toString("utf-8");try{let h=JSON.parse(y);g.statusCode>=400&&(h._statusCode=g.statusCode),m(h)}catch{m(y)}})});p.on("error",d),p.on("timeout",()=>{p.destroy(),d(new Error("timeout"))}),p.end()})}function _e(n={},e){let t={};return n.max_read_id&&(t.max_read_id=n.max_read_id),n.channel&&(t.channel=n.channel),k("flash-api.jin10.com","/get_flash_list",t,e)}function we(n,e){return k("flash-api.jin10.com","/get_flash_list",{channel:"-8200",vip:"1",max_time:n},e)}function Se(n,e){return k("flash-api.jin10.com","/get_flash_detail",{id:n},e)}function xe(n,e){return k("flash-api.jin10.com","/get_flash_list_by_date",{date:n},e)}function Ne(){return k("e0430d16720e4211b5e072c26205c890.z3c.jin10.com","/web/interest_rates",{},{extraHeaders:{"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0"}})}function ke(){return k("cdn.jin10.com","/json/index/slide_204.json")}function ve(){return k("cdn.jin10.com","/json/index/flir.json")}var Ct="e0430d16720e4211b5e072c26205c890.z3c.jin10.com",so={"x-app-id":"sKKYe29sFuJaeOCJ","x-version":"2.0",handleerror:"true"};function $t(n){return{extraHeaders:so,...n}}function Ae(n,e="cj",t){return k(Ct,"/get/data",{date:n,category:e},$t(t))}function qe(n,e="cj",t){return k(Ct,"/get/event",{date:n,category:e},$t(t))}function Oe(n,e="cj",t){return k(Ct,"/page/holiday",{date:n,category:e,page:1,pagesize:50},$t(t))}function Tt(n=-1,e={},t){let o={channel:n};return e.max_time&&(o.max_time=e.max_time),k("qh-flash-api.jin10.com","/get_flash_list",o,t)}function je(n){return k("futures-report-api.jin10.com","/api/headline",{},n)}function Jt(n){return n.replace(/-/g,"")}function Ce(n,e){return k("qhcal-api.jin10.com","/data",{date:Jt(n)},e)}function st(n,e){return k("qhcal-api.jin10.com","/event",{date:Jt(n)},e)}function it(n,e){return k("qhcal-api.jin10.com","/holiday",{date:Jt(n)},e)}function $e(n,e){return k("28e2bd69d5104a428d25ff1df132b716.z3c.jin10.com","/basic_data",{date:n},{...e,extraHeaders:{"x-app-id":"KxBcVoDHStE6CUkQ","x-version":"1.0"}})}function ct(){return k("cdn.jin10.com","/json/index/all_topics.json")}function Te(n,e={},t){let o={id:n};return e.page&&(o.page=e.page),e.page_size&&(o.page_size=e.page_size),k("reference-api.jin10.com","/topic/getById",o,{...t,extraHeaders:{"x-app-id":"arU9WZF7TC9m7nWn","x-version":"1.0.1",Referer:"https://xnews.jin10.com/"}})}import Je from"fs";import io from"path";import co from"os";var Re=io.join(co.homedir(),".xueqiu-cookie");function Rt(){try{return Je.readFileSync(Re,"utf-8").trim()||null}catch{return null}}function Lt(n){Je.writeFileSync(Re,n.trim(),"utf-8")}var _="stock.xueqiu.com",Dt="xueqiu.com";function N(n){return n.trim().toUpperCase()}function Le(n,e,t,o,{token:r=!0,ua:s}={}){let a=r?Rt():null;if(r&&!a)throw new Error("\u672A\u8BBE\u7F6E\u96EA\u7403 Cookie\uFF0C\u8BF7\u5148\u8FD0\u884C: finflow config login \u6216 finflow config cookie <cookie>");let i={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":s||"Xueqiu iPhone 14.15.1",Origin:"https://xueqiu.com",Referer:"https://xueqiu.com/"};a&&(i.Cookie=a);let c={method:n,headers:i,redirect:"follow"};return o&&(c.body=new URLSearchParams(o).toString(),i["Content-Type"]="application/x-www-form-urlencoded"),fetch(`https://${e}${t}`,c).then(m=>m.json())}function b(n,e,t={}){return Le("GET",n,e,null,t)}function De(n,e,t,o={}){return Le("POST",n,e,t,o)}function Et(n){return b(_,`/v5/stock/realtime/quotec.json?symbol=${n.map(N).join(",")}`,{token:!1})}function Pt(n){return b(_,`/v5/stock/realtime/pankou.json?symbol=${N(n)}`)}function lt(n,{period:e="day",count:t=284}={}){let o=Date.now();return b(_,`/v5/stock/chart/kline.json?symbol=${N(n)}&begin=${o}&period=${e}&type=before&count=-${t}&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance`)}function Mt(n,{period:e="1d"}={}){return b(_,`/v5/stock/chart/minute.json?symbol=${N(n)}&period=${e}`)}function Ht(n,{count:e=50}={}){return b(_,`/v5/stock/history/trade.json?symbol=${N(n)}&count=${e}`)}function Ee(n){return b(_,`/v5/stock/quote/relevant.json?symbol=${N(n)}`)}function Pe(n){return b(_,`/v5/stock/event/entry.json?symbol=${N(n)}`)}function Me(n){return b(Dt,`/query/v1/suggest_stock.json?q=${encodeURIComponent(n)}`)}function He({category:n="cn"}={}){return b(_,`/v5/stock/screener/industries.json?category=${n}`)}function Ie(n={}){let{page:e=1,size:t=30,order:o="desc",order_by:r="percent",market:s="CN"}=n,a=new URLSearchParams({page:String(e),size:String(t),order:o,order_by:r,market:s});return n.ind_code&&a.set("ind_code",n.ind_code),n.type&&a.set("type",n.type),b(_,`/v5/stock/screener/quote/list.json?${a.toString()}`)}function Be(n){return b(_,`/v5/stock/hq/longhu.json?date=${n}`)}function Ue(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/indicator.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function Fe(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/cash_flow.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function Ge(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/income.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function Ke(n,e={}){let{count:t=10,type:o="Q4",is_detail:r=!0,region:s="cn"}=e;return b(_,`/v5/stock/finance/${s}/balance.json?symbol=${N(n)}&type=${o}&is_detail=${r}&count=${t}`)}function ze(n,{circula:e=1}={}){return b(_,`/v5/stock/f10/cn/top_holders.json?symbol=${N(n)}&circula=${e}`)}function Qe(n){return b(_,`/v5/stock/f10/cn/indicator.json?symbol=${N(n)}`)}function Ye(n){return b(_,`/v5/stock/f10/cn/industry.json?symbol=${N(n)}`)}function Ve(n,{page:e=1,size:t=10}={}){return b(_,`/v5/stock/f10/cn/bonus.json?symbol=${N(n)}&page=${e}&size=${t}`)}function It(n){return b(_,`/v5/stock/capital/flow.json?symbol=${N(n)}`)}function We(n,{count:e=20}={}){return b(_,`/v5/stock/capital/history.json?symbol=${N(n)}&count=${e}`)}function Xe(n,{page:e=1,size:t=180}={}){return b(_,`/v5/stock/capital/margin.json?symbol=${N(n)}&page=${e}&size=${t}`)}function Ze(){return b(_,"/v5/stock/portfolio/list.json?system=true")}function Bt(n,{size:e=1e3}={}){return b(_,`/v5/stock/portfolio/stock/list.json?size=${e}&category=1&pid=${n}`)}function tn(n,{category:e=1}={}){return De(_,"/v5/stock/portfolio/stock/add.json",{symbols:n,category:e})}function en(n,{category:e=1}={}){return De(_,"/v5/stock/portfolio/stock/cancel.json",{symbols:n,category:e})}function V(n){return b(_,`/v5/stock/batch/quote.json?symbol=${n.map(N).join(",")}&extend=detail&is_delay_hk=true`)}function nn(n){return b(Dt,`/cubes/nav_daily/all.json?cube_symbol=${n}`)}function on(n){return b(Dt,`/cubes/rebalancing/current.json?cube_symbol=${n}`)}function rn(n){return b(_,`/stock/report/latest.json?symbol=${N(n)}`)}import lo from"https";var Ut="www.gelonghui.com",uo="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 mt(n,e=1e4){return new Promise((t,o)=>{let r=new URL(n,`https://${Ut}`),s=lo.get({hostname:Ut,path:r.pathname+r.search,headers:{"User-Agent":uo,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"}},a=>{let i=[];a.on("data",c=>i.push(c)),a.on("end",()=>{let c=Buffer.concat(i).toString();try{t(JSON.parse(c))}catch{t(c)}})});s.setTimeout(e,()=>{s.destroy(),o(new Error("timeout"))}),s.on("error",o)})}function W(n={}){let e=new URLSearchParams({category:n.category??"all",limit:String(n.limit??15),timestamp:String(Date.now())});return n.liveId&&e.set("liveId",String(n.liveId)),mt(`/api/live-channels/${n.channel??"all"}/lives/v4?${e}`)}function an(n={}){return W({channel:n.channel,category:"important",limit:n.limit,liveId:n.liveId})}function sn(n={}){return W({channel:n.channel,category:"popular",limit:n.limit,liveId:n.liveId})}function cn(n={}){return mt(`/hq/hk/boards/v1?sort=${n.sort??"netChange"}&order=${n.order??"desc"}`)}function Ft(){return mt("/hq/home-page-data")}function X(){return mt("/hq/quote/api/market/flow/entrance/data/v2")}var Gt=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"}]),Kt=Object.freeze([{id:"netChange",name:"\u6DA8\u8DCC\u5E45"},{id:"turnoverValue",name:"\u6210\u4EA4\u989D"},{id:"turnVolume",name:"\u6210\u4EA4\u91CF"}]);function dt(n){return n?Gt.find(e=>e.id.toLowerCase()===n.toLowerCase()||e.name===n)??Gt[0]:Gt[0]}function ln(n){return n?Kt.find(e=>e.id.toLowerCase()===n.toLowerCase()||e.name===n)??Kt[0]:Kt[0]}import zt from"fs";import P from"path";import M from"os";import{execSync as Qt}from"child_process";import un from"crypto";function po(){return Qt('security find-generic-password -w -s "Chrome Safe Storage"',{encoding:"utf-8"}).trim()}function go(n){let e=n.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e?.[1])return e[1];let t=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let o of t){let r=n.match(o);if(r?.[1]?.length>0)return r[1]}return n}function fo(n,e,t=0){let o=n.slice(0,3).toString("ascii");if(!/^v\d\d$/.test(o))return n.toString("utf-8");let r=n.slice(3);if(r.length===0||r.length%16!==0)return n.toString("utf-8");let s=un.pbkdf2Sync(e,"saltysalt",1003,16,"sha1"),a=Buffer.alloc(16,32),i=un.createDecipheriv("aes-128-cbc",s,a);i.setAutoPadding(!1);let c=Buffer.concat([i.update(r),i.final()]),m=c[c.length-1];return m&&m<=16&&(c=c.slice(0,-m)),t>=24&&c.length>32&&(c=c.slice(32)),go(c.toString("utf-8"))}var ho=[P.join(M.homedir(),"Library/Application Support/Google/Chrome/Default/Cookies"),P.join(M.homedir(),"Library/Application Support/Google/Chrome/Profile 1/Cookies"),P.join(M.homedir(),"Library/Application Support/Google/Chrome Beta/Default/Cookies"),P.join(M.homedir(),"Library/Application Support/Google/Chrome Beta/Profile 1/Cookies"),P.join(M.homedir(),"Library/Application Support/Google/Chrome Dev/Default/Cookies"),P.join(M.homedir(),"Library/Application Support/Google/Chrome Canary/Default/Cookies"),P.join(M.homedir(),"Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies"),P.join(M.homedir(),"Library/Application Support/Microsoft Edge/Default/Cookies")];function yo(n){for(let e of ho){if(!zt.existsSync(e))continue;let t=P.join(M.tmpdir(),`finflow_cookies_${Date.now()}.db`);zt.copyFileSync(e,t);try{let o=0;try{let a=Qt(`sqlite3 "${t}" "SELECT value FROM meta WHERE key='version';"`,{encoding:"utf-8"}).trim();o=parseInt(a,10)||0}catch{}let r=`SELECT name, hex(encrypted_value), host_key FROM cookies WHERE host_key LIKE '%${n}%'`;return JSON.parse(Qt(`sqlite3 -json "${t}" "${r}"`,{encoding:"utf-8"})).map(a=>({name:a.name,value:Buffer.from(a["hex(encrypted_value)"],"hex"),domain:a.host_key,_metaVersion:o}))}finally{try{zt.unlinkSync(t)}catch{}}}return[]}function z(n,e){if(process.platform!=="darwin")throw new Error("\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie \u4EC5\u652F\u6301 macOS");let t;try{t=po()}catch{throw new Error(`\u65E0\u6CD5\u4ECE Keychain \u83B7\u53D6 Chrome \u5BC6\u7801\u3002
3
3
  \u8BF7\u786E\u4FDD\u5DF2\u5B89\u88C5 Google Chrome\u3002`)}let o=yo(n);if(!o.length)throw new Error(`\u672A\u627E\u5230 ${n} Cookie\uFF0C\u8BF7\u786E\u4FDD\u5DF2\u5728 Chrome \u4E2D\u767B\u5F55 ${n}`);let r=e?[e,`.${e}`]:[`.${n}`,n],s=[];for(let a of o)if(r.includes(a.domain))try{let i=fo(a.value,t,a._metaVersion);if(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(i))continue;s.push(`${a.name}=${i}`)}catch{}if(!s.length)throw new Error("Cookie \u89E3\u5BC6\u5168\u90E8\u5931\u8D25");return s.join("; ")}function F(){try{return z("jin10.com")}catch{return null}}function mn(n){return n?.slice(5,16)||""}function Z(n){return n?.length?n.filter(e=>e.type==="quotes").map(e=>e.title).join(" "):""}function pt(n,e){return!n&&e?.data?.vip_title?`[VIP] ${e.data.vip_title}`:n?U(n).replace(/^金十数据\d{4}年\d{1,2}月\d{1,2}日讯[,,]?\s*/,""):""}var dn=[],bo=["content","title","brief","data.content","data.title","indicator_name","name","subject_name"];function _o(n){return bo.map(e=>e.split(".").reduce((o,r)=>o?.[r],n)||"").filter(Boolean).join(" ").toLowerCase()}function v(n){if(!dn.length||!Array.isArray(n))return n;let e=dn.map(t=>t.toLowerCase());return n.filter(t=>{let o=_o(t);return!e.some(r=>o.includes(r))})}function tt(n){return n=v(n),{items:n.map(e=>({time:e.time,content:pt(e.data?.content||e.data?.title||"",e),title:e.data?.title||"",importance:e.important??0,source:e.data?.source||"",tags:Z(e.remark)?Z(e.remark).split(" "):[]})),total:n.length}}function wo(n){return n=v(n),{items:n.map(e=>({time:new Date(e.ctime*1e3).toISOString(),content:U(e.content||e.brief||""),title:e.title||"",importance:0,source:"cls",tags:(e.subjects||[]).map(t=>`#${t.subject_name}`)})),total:n.length}}function Yt(n){return n=v(n),{items:n.map(e=>({time:new Date(e.createTimestamp*1e3).toISOString(),content:U(e.content||""),title:e.title||"",importance:e.level===1?1:0,source:"glh",tags:[...(e.relatedStocks||[]).map(t=>t.name),...(e.relatedInfos||[]).map(t=>`#${t.name}`)],readCount:e.count?.read||0})),total:n.length}}function So(n){let e=n?.list||(Array.isArray(n)?n:[]),t=[];if(Array.isArray(e)&&Array.isArray(e[0]))for(let o of e)for(let r of o)t.push(r);else Array.isArray(e)&&(t=e);return t=v(t),{items:t.map(o=>({title:o.title||"",badge:o.ndata?.badge||"",redirectUrl:o.web_redirect_url||""})),total:t.length}}function xo(n){let e=[],t=n?.list||(Array.isArray(n)?n:[]);if(Array.isArray(t)&&t.length&&Array.isArray(t[0]))for(let o of t)e.push(...o);else Array.isArray(t)&&(e=t);return e=v(e),{items:e.map(o=>({title:o.title||"",introduction:o.introduction||"",displayDatetime:o.display_datetime||"",tags:(o.reveal_tags||[]).map(r=>r.name||r),vip:!!o.vip,source:o.source||""})),total:e.length}}function pn(n){let e=n?.data?.top_article||[],t=n?.data?.depth_list||[],o=v([...e,...t]);return{items:o.map(r=>({time:r.ctime?new Date(r.ctime*1e3).toISOString():"",title:r.title||"",brief:U(r.brief||""),source:r.source||"",subjects:(r.subjects||[]).map(s=>s.subject_name||s.name||""),readingNum:r.reading_num||0})),total:o.length}}function No(n){let e=v(n?.data||[]);return{items:e.map(t=>({title:t.title||"",readingNum:t.readNum||0})),total:e.length}}function ko(n){let e=v(n?.data||[]);return{items:e.map(t=>({time:t.ctime?new Date(t.ctime*1e3).toISOString():"",title:t.title||"",source:t.source||""})),total:e.length}}function vo(n){let e=v(n?.list||n?.data||[]);return Array.isArray(e)?{items:e.map(t=>({date:t.created_at?String(t.created_at).slice(0,10):"",title:t.title||"",institution:t.institution||"",rating:t.rating||""})),total:e.length}:{items:[],total:0}}function gn(n){return{items:n.map(e=>({id:e.id,title:e.title||"",shortName:e.short_name||"",introduction:(e.introduction||"").trim().slice(0,200),categoryName:e.category_name||"",subscribeNum:e.subscribe_num||0})),total:n.length}}function Ao(n){let e=n?.data?.hot_subjects||[],t=n?.data?.newest_subjects||[];return{hotSubjects:e.map(o=>({name:o.name||"",attentionNum:o.attention_num||0,newestArticleTitle:U(o.newest_article_title||"")})),newestSubjects:t.map(o=>({name:o.name||""}))}}function qo(n){let e=Array.isArray(n)?n:n?.data||[],t=new Map;for(let r of e){let s=r.category_name||"\u672A\u5206\u7C7B";t.set(s,(t.get(s)||0)+1)}let o=Array.from(t,([r,s])=>({name:r,count:s}));return{items:o,total:o.length}}async function Vt(n){let e=F(),t=e?{cookie:e}:void 0,o=new Set,r=[],s=await _e({},t);for(let c of s?.data||[])o.has(c.id)||(o.add(c.id),r.push(c));let a=0,i=50;for(;r.length<n&&a++<i;){let c=r[r.length-1];if(!c)break;let d=(await we(c.time,t))?.data||[];if(!d.length)break;let l=0;for(let p of d)o.has(p.id)||(o.add(p.id),r.push(p),l++);if(l===0)break;r.length<n&&await new Promise(p=>setTimeout(p,200))}return r}function fn(n){return n.command({command:"info",describe:"\u4FE1\u606F\u6D41",builder:e=>e.strictCommands(!1).command("flash","\u5FEB\u8BAF",t=>t.option("src",{alias:"s",type:"string",choices:["cls","jin10","glh"],default:"cls",describe:"\u6570\u636E\u6E90"}).option("category",{alias:"c",type:"string",describe:"cls \u680F\u76EE / glh \u9891\u9053"}).strictCommands(!1).command("important","\u91CD\u8981\u5FEB\u8BAF\uFF08glh \u6570\u636E\u6E90\uFF09",o=>o.option("channel",{alias:"c",type:"string",describe:"\u9891\u9053"}),async o=>{let{n:r=10,channel:s}=o,a=s?dt(s):dt("popular"),i=await an({channel:a.id,limit:r}),c=v(i.result||[]);u({data:c,command:"info flash important",source:"glh",toJSON:()=>Yt(c)})}).command("popular","\u70ED\u95E8\u5FEB\u8BAF\uFF08glh\uFF09",o=>o,async o=>{let{n:r=10}=o,s=await sn({limit:r}),a=v(s.result||[]);u({data:a,command:"info flash popular",source:"glh",toJSON:()=>Yt(a)})}).command("detail <id>","\u5FEB\u8BAF\u8BE6\u60C5\uFF08jin10\uFF09",o=>o,async o=>{let r=o.id,s=await Se(r);u({data:s,command:"info flash detail",source:"jin10",toJSON:a=>tt(a?.data?[a]:[])})}).command("date <date>","\u5386\u53F2\u5FEB\u8BAF\uFF08jin10\uFF0C\u9700\u767B\u5F55\uFF09",o=>o,async o=>{let r=o.date,s;try{s=z("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 a=await xe(r,{cookie:s});a?._statusCode===403&&(console.error("\u6B64\u529F\u80FD\u9700\u8981\u5F00\u901A\u4F1A\u5458\uFF0C\u8BF7\u5728 jin10.com \u5347\u7EA7"),process.exit(1)),u({data:a,command:"info flash date",source:"jin10",toJSON:i=>tt(i?.data||[])})}),async t=>{let{n:o=10,src:r="cls",category:s}=t,a=s||"all",i=[];r==="jin10"?i.push({name:"jin10",fn:l=>Vt(o).then(p=>u({data:p,command:"info flash",source:l,toJSON:tt}))},{name:"cls",fn:l=>m(l,a,o)},{name:"glh",fn:l=>d(l,a,o)}):r==="glh"?i.push({name:"glh",fn:l=>d(l,a,o)},{name:"cls",fn:l=>m(l,a,o)},{name:"jin10",fn:l=>Vt(o).then(p=>u({data:p,command:"info flash",source:l,toJSON:tt}))}):a==="all"?i.push({name:"cls",fn:l=>m(l,a,o)},{name:"jin10",fn:l=>Vt(o).then(p=>u({data:v(p),command:"info flash",source:l,toJSON:tt}))},{name:"glh",fn:l=>d(l,a,o)}):i.push({name:"cls",fn:l=>m(l,a,o)});let c;for(let l=0;l<i.length;l++){let{name:p,fn:g}=i[l],f=l===0?p:`${p} (fallback)`;try{await g(f);return}catch(y){c=y,l<i.length-1&&console.error(`Source ${p} failed: ${y?.message||y}, trying next...`)}}throw c;async function m(l,p,g){let f=ye(p);f||(console.error(`\u672A\u77E5\u680F\u76EE: ${p}
4
4
  \u4F7F\u7528 --category \u6307\u5B9A\u680F\u76EE\u6216\u4F7F\u7528 --src jin10|glh`),process.exit(1));let y=new Set,h=[],J=20,G=50,B=0,q=(await wt({rn:J}))?.data?.roll_data||[];for(let S of q)y.has(S.id)||(y.add(S.id),h.push(S));for(;h.length<g&&B++<G;){let S=h.reduce((T,Y)=>(Y.ctime||0)<(T.ctime||0)?Y:T,h[0]);if(!S?.ctime)break;let _t=(await wt({lastTime:S.ctime,rn:J}))?.data?.roll_data||[],C=0;for(let T of _t)y.has(T.id)||(y.add(T.id),h.push(T),C++);if(!C)break;h.length<g&&await new Promise(T=>setTimeout(T,200))}h.sort((S,j)=>(j.ctime||0)-(S.ctime||0));let $=h.slice(0,g);f.category!=="all"&&($=$.filter(S=>(S.subjects||[]).some(j=>j.subject_id===f.category))),u({data:$,command:"info flash",source:l,toJSON:wo})}async function d(l,p,g){let f=p&&p!=="all"?dt(p):{id:"all"},y=new Set,h=[],J=15,G=50,B=0,bt=await W({channel:f.id,limit:J});for(let q of bt?.result||[])y.has(q.id)||(y.add(q.id),h.push(q));for(;h.length<g&&B++<G;){let q=h[h.length-1];if(!q?.id)break;let $=await W({channel:f.id,limit:J,liveId:q.id}),S=0;for(let j of $?.result||[])y.has(j.id)||(y.add(j.id),h.push(j),S++);if(!S)break;h.length<g&&await new Promise(j=>setTimeout(j,200))}u({data:h,command:"info flash",source:l,toJSON:Yt})}}).command("news","\u6DF1\u5EA6\u6587\u7AE0",t=>t.strictCommands(!1).command("slide","\u5E7B\u706F\u7247/\u91CD\u8981\u4E8B\u4EF6\uFF08jin10\uFF09",o=>o,async()=>{let o=await ke();u({data:o,command:"info news slide",source:"jin10",toJSON:So})}).command("feature","\u7CBE\u9009\u6587\u7AE0\uFF08jin10\uFF09",o=>o,async()=>{let o=await ve();u({data:o,command:"info news feature",source:"jin10",toJSON:xo})}).command("depth [channel]","\u6DF1\u5EA6\u680F\u76EE\uFF08cls\uFF09",o=>o,async o=>{let{n:r=10}=o,s=o.channel||"headline",a=be(s);if(!a){let m=Object.entries(K).map(([d,l])=>` ${d.padEnd(12)} ${l.name} (${l.id})`).join(`
5
5
  `);console.error(`\u672A\u77E5\u680F\u76EE: ${s}
6
6
  \u53EF\u7528\u680F\u76EE:
7
- ${m}`),process.exit(1)}let i=await St(a.id),c=v(i?.data?.depth_list||[]);if(c.length<r){let m=c[c.length-1]?.ctime;if(m){let d=await ce(a.id,{lastTime:m,rn:r-c.length}),l=v(d?.data?.depth_list||d?.data||[]);c=[...c,...l]}}u({data:i,command:"info news depth",source:"cls",toJSON:pn})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",o=>o,async()=>{let o=await le();u({data:o,command:"info news hot",source:"cls",toJSON:No})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF09",o=>o,async o=>{let{n:r=10}=o,s=o.code,a=await fe(s,{rn:r});u({data:a,command:"info news stock",source:"cls",toJSON:ko})}),async()=>{let t=await St(1e3);u({data:t,command:"info news",source:"cls",toJSON:pn})}).command("report <code>","\u673A\u6784\u7814\u62A5\uFF08xq\uFF09",t=>t,async t=>{let r=t.code,s=await rn(r);u({data:s,command:"info report",source:"xq",toJSON:vo})}).command("topic","\u4E13\u9898",t=>t.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",o=>o,async o=>{let{n:r=10}=o,s=o.keyword,a=await ct(),i=Array.isArray(a)?a:a?.data||[],c=s.toLowerCase(),m=i.filter(l=>(l.title||"").toLowerCase().includes(c)||(l.short_name||"").toLowerCase().includes(c)||(l.introduction||"").toLowerCase().includes(c));if(!m.length)return console.log(`\u672A\u627E\u5230\u5339\u914D "${s}" \u7684\u4E13\u9898`);let d=v(m.slice(0,r));u({data:d,command:"info topic search",source:"jin10",toJSON:gn})}).command("groups","\u8BDD\u9898\u5206\u7EC4",o=>o,async()=>{let o=await ct();u({data:o,command:"info topic groups",source:"jin10",toJSON:qo})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",o=>o,async()=>{let o=await ue();u({data:o,command:"info topic hot",source:"cls",toJSON:r=>Ao(v(r))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",o=>o,async o=>{let{n:r=10}=o,s=o.id,a=F(),i=a?{cookie:a}:void 0,c=new Set,m=[],d=1,l=50;for(;m.length<r&&d<=l;){let f=(await Te(s,{page:d},i))?.data?.list||[];if(!f.length)break;let y=0;for(let h of f)c.has(h.id)||(c.add(h.id),m.push(h),y++);if(y===0)break;d++,m.length<r&&await new Promise(h=>setTimeout(h,200))}let p=v(m);u({data:p,command:"info topic show",source:"jin10",toJSON:g=>({items:g.map(f=>({time:f.display_datetime,title:f.title,author:f.author?.nick,vip:f.vip})),total:g.length})})}),async t=>{let{n:o=10}=t,r=await ct(),s=v(Array.isArray(r)?r:r?.data||[]);if(s=s.slice(0,o),!s.length)return console.log("\u6682\u65E0\u6570\u636E");u({data:s,command:"info topic",source:"jin10",toJSON:gn})}),handler:async()=>{console.log("\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4\uFF0C\u4F8B\u5982: finflow info flash, finflow info news, finflow info topic")}})}function x(n){return n[n.length-1]}function L(n,e,t){return Math.max(e,Math.min(t,n))}function Oo(n){if(n.length<2)return 0;let e=n.reduce((o,r)=>o+r,0)/n.length,t=n.reduce((o,r)=>o+(r-e)**2,0)/(n.length-1);return Math.sqrt(t)}function gt(n){return n.map(e=>e.close)}function D(n,e){let t=[];for(let o=0;o<n.length;o++){if(o<e-1){t.push(NaN);continue}let r=n.slice(o-e+1,o+1);t.push(r.reduce((s,a)=>s+a,0)/e)}return t}function Wt(n,e){let t=[],o=2/(e+1),r=NaN;for(let s=0;s<n.length;s++){if(s<e-1){t.push(NaN);continue}if(s===e-1){r=n.slice(0,e).reduce((a,i)=>a+i,0)/e,t.push(r);continue}r=n[s]*o+r*(1-o),t.push(r)}return t}function jo(n,e=12,t=26,o=9){let r=Wt(n,e),s=Wt(n,t),a=r.map((l,p)=>isNaN(l)||isNaN(s[p])?NaN:l-s[p]),i=a.filter(l=>!isNaN(l)),c=Wt(i,o),m=a.slice(a.length-i.length),d=m.map((l,p)=>isNaN(l)||isNaN(c[p])?NaN:l-c[p]);return{macd:m,signal:c,histogram:d}}function Co(n,e=14){let t=[];if(n.length<e+1){for(let o=0;o<n.length;o++)t.push(NaN);return t}for(let o=0;o<n.length;o++){if(o<e){t.push(NaN);continue}if(o===e){let i=0,c=0;for(let l=1;l<=e;l++){let p=n[l]-n[l-1];p>0?i+=p:c-=p}let m=i/e,d=c/e;t.push(d===0?100:100-100/(1+m/d));continue}let r=t[o-1];if(isNaN(r)){t.push(NaN);continue}let s=0,a=0;for(let i=o-e+1;i<=o;i++){let c=n[i]-n[i-1];c>0?s+=c:a-=c}s/=e,a/=e,t.push(a===0?100:100-100/(1+s/a))}return t}function $o(n,e=20,t=2){let o=D(n,e),r=[],s=[],a=[],i=[];for(let c=0;c<n.length;c++){if(isNaN(o[c])){r.push(NaN),s.push(NaN),a.push(NaN),i.push(NaN);continue}let m=n.slice(c-e+1,c+1),d=Oo(m),l=o[c]+t*d,p=o[c]-t*d;r.push(l),s.push(p),a.push(o[c]===0?0:(l-p)/o[c]*100),i.push(l===p?.5:(n[c]-p)/(l-p))}return{upper:r,middle:o,lower:s,bandwidth:a,percentB:i}}function To(n,e=14){let t=[];for(let o=0;o<n.length;o++){if(o===0){t.push(n[o].high-n[o].low);continue}t.push(Math.max(n[o].high-n[o].low,Math.abs(n[o].high-n[o-1].close),Math.abs(n[o].low-n[o-1].close)))}return D(t,e)}function Xt(n,e=20){if(n.length<2)return{ratio:1,trend:"flat",avgVolume:n[0]?.volume??0};let t=n.slice(-e),o=t.reduce((i,c)=>i+c.volume,0)/t.length,r=x(n).volume,s=o===0?1:r/o,a="flat";if(t.length>=10){let i=t.slice(-5),c=t.slice(-10,-5),m=i.reduce((l,p)=>l+p.volume,0)/i.length,d=c.reduce((l,p)=>l+p.volume,0)/c.length;if(d>0){let l=(m-d)/d;l>.15?a="rising":l<-.15&&(a="falling")}}return{ratio:Math.round(s*100)/100,trend:a,avgVolume:Math.round(o)}}function Jo(n,e=9){let t=[],o=[],r=[];for(let s=0;s<n.length;s++){if(s<e-1){t.push(50),o.push(50),r.push(50);continue}let a=n.slice(s-e+1,s+1),i=Math.max(...a.map(d=>d.high)),c=Math.min(...a.map(d=>d.low)),m=i===c?50:(n[s].close-c)/(i-c)*100;if(s===e-1)t.push(m),o.push(m),r.push(3*m-2*m);else{let d=t[s-1],l=o[s-1],p=2/3*d+1/3*m,g=2/3*l+1/3*p,f=3*p-2*g;t.push(p),o.push(g),r.push(f)}}return{k:t,d:o,j:r}}function Ro(n,e=20){if(n.length<e)return{direction:"sideways",strength:0,description:"\u6570\u636E\u4E0D\u8DB3"};let t=gt(n),o=x(D(t,5)),r=x(D(t,10)),s=x(D(t,e)),a=t.length>=60?x(D(t,60)):NaN,i=x(t),c=0,m=0;i>o?c++:m++,o>r?c++:m++,r>s?c++:m++,isNaN(a)||(s>a?c++:m++);let d=isNaN(a)?3:4,l=Math.abs(c-m)/d,p=s===0?0:(i-s)/s,g=L(Math.round(l*60+Math.min(Math.abs(p)*500,40)),0,100),f,y,h=c/d;return h>.75?(f="up",y=`\u591A\u5934\u6392\u5217${isNaN(a)?"":"\uFF0C\u5747\u7EBF\u53D1\u6563"}\uFF0C\u4EF7\u683C${p>0?"\u9AD8\u4E8E":"\u8D34\u8FD1"}MA${e}`):h<.25?(f="down",y=`\u7A7A\u5934\u6392\u5217${isNaN(a)?"":"\uFF0C\u5747\u7EBF\u53D1\u6563"}\uFF0C\u4EF7\u683C${p<0?"\u4F4E\u4E8E":"\u8D34\u8FD1"}MA${e}`):(f="sideways",g=Math.round(g*.6),y="\u5747\u7EBF\u7EA0\u7F20\uFF0C\u65B9\u5411\u4E0D\u660E"),{direction:f,strength:g,description:y}}function Lo(n,e=20){if(n.length<e){let a=gt(n);return{supports:[Math.min(...a)],resistances:[Math.max(...a)]}}let t=[],o=[],r=gt(n);for(let a=e;a<n.length-1;a++){let i=Math.min(...n.slice(a-e,a).map(g=>g.low)),c=Math.min(...n.slice(a+1,a+1+e).map(g=>g.low)),m=n[a].low;m<=i&&m<=c&&(t.find(f=>Math.abs(f-m)/m<.01)||t.push(m));let d=Math.max(...n.slice(a-e,a).map(g=>g.high)),l=Math.max(...n.slice(a+1,a+1+e).map(g=>g.high)),p=n[a].high;p>=d&&p>=l&&(o.find(f=>Math.abs(f-p)/p<.01)||o.push(p))}let s=x(r);return t.sort((a,i)=>i-a),o.sort((a,i)=>a-i),{supports:t.filter(a=>a<s).slice(0,3),resistances:o.filter(a=>a>s).slice(0,3)}}function Do(n,e=20,t=2){let o=Xt(n,e),r=o.ratio>=t,s=r?`\u6210\u4EA4\u91CF\u5F02\u5E38\u653E\u5927\uFF0C\u4E3A${e}\u65E5\u5747\u91CF${o.ratio.toFixed(1)}\u500D`:`\u6210\u4EA4\u91CF\u6B63\u5E38\uFF0C\u4E3A${e}\u65E5\u5747\u91CF${o.ratio.toFixed(1)}\u500D`;return{isAnomalous:r,ratio:o.ratio,description:s}}function Eo(n,e=20){if(n.length<e+1)return{type:null,strength:0,description:"\u6570\u636E\u4E0D\u8DB3"};let t=n.slice(-e-1,-1),o=x(n),r=Math.max(...t.map(c=>c.high)),s=Math.min(...t.map(c=>c.low)),a=r-s,i=Xt(n,e);return o.close>r&&a>0?{type:"up",strength:L(Math.round((o.close-r)/a*50+(i.ratio>1.5?25:0)),0,100),description:`\u5411\u4E0A\u7A81\u7834${e}\u65E5\u9AD8\u70B9${r.toFixed(2)}\uFF0C\u653E\u91CF${i.ratio>1.5?"\u786E\u8BA4":"\u4E0D\u8DB3"}`}:o.close<s&&a>0?{type:"down",strength:L(Math.round((s-o.close)/a*50+(i.ratio>1.5?25:0)),0,100),description:`\u5411\u4E0B\u8DCC\u7834${e}\u65E5\u4F4E\u70B9${s.toFixed(2)}\uFF0C\u653E\u91CF${i.ratio>1.5?"\u786E\u8BA4":"\u4E0D\u8DB3"}`}:{type:null,strength:0,description:"\u65E0\u7A81\u7834\u4FE1\u53F7"}}function Zt(n){let e=gt(n);if(n.length<30)return{trend:{direction:"sideways",strength:0,score:1,maAlign:"\u6570\u636E\u4E0D\u8DB3"},momentum:{rsi:NaN,macdHistogram:NaN,score:1},volatility:{atr:0,bollingerBandwidth:0,score:3},volume:{volumeRatio:1,trend:"flat",score:3},pattern:{description:"\u6570\u636E\u4E0D\u8DB3",score:1},keyLevels:{support:[],resistance:[]},compositeScore:1,summary:"\u6570\u636E\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u8BC4\u5206"};let t=Ro(n,20),o=t.direction==="up"?L(Math.round(2.5+t.strength/100*2.5),1,5):t.direction==="down"?L(Math.round(2.5-t.strength/100*1.5),1,5):L(Math.round(2.5),1,3),r=x(D(e,5)),s=x(D(e,10)),a=x(D(e,20)),i=e.length>=60?x(D(e,60)):NaN,c=e.length>=60?`${r>s?"\u2191":"\u2193"}5 ${s>a?"\u2191":"\u2193"}10 ${a>i?"\u2191":"\u2193"}20 \u219160`:`${r>s?"\u2191":"\u2193"}5 ${s>a?"\u2191":"\u2193"}10`,m=Co(e,14),d=x(m),l=jo(e),p=x(l.histogram),g=isNaN(p)?0:p,f=3;if(isNaN(d)||(d>=50&&d<=70&&(f+=.5),d>=30&&d<50&&(f-=.5),d>80&&(f-=.5),d<20&&(f+=.5)),!isNaN(g)){if(g>0&&l.histogram.length>=3){let w=l.histogram;w[w.length-1]>w[w.length-2]&&w[w.length-2]>w[w.length-3]&&(f+=.5)}else if(g<0&&l.histogram.length>=3){let w=l.histogram;w[w.length-1]<w[w.length-2]&&w[w.length-2]<w[w.length-3]&&(f-=.5)}}f=L(Math.round(f),1,5);let y=To(n,14),h=x(y)||0,J=x(e)===0?0:h/x(e)*100,G=$o(e,20),B=x(G.bandwidth)||0,bt=x(G.percentB)||.5,q=3;J<1?q+=1:J>3&&(q-=1),B<5?q+=.5:B>20&&(q-=.5),q=L(Math.round(q),1,5);let $=Xt(n,20),S=3;t.direction==="up"&&$.trend==="rising"?S+=1.5:t.direction==="down"&&$.trend==="falling"?S+=.5:t.direction==="up"&&$.trend==="falling"?S-=1:t.direction==="down"&&$.trend==="rising"&&(S-=1.5),$.ratio>2?S+=.5:$.ratio<.5&&(S-=.5),S=L(Math.round(S),1,5);let j=Eo(n),_t=Do(n),C=Jo(n),T=x(C.k),Y=x(C.d),Or=x(C.j),E=[],R=3;if(j.type==="up"&&j.strength>30?(E.push("\u5411\u4E0A\u7A81\u7834"),R+=1):j.type==="down"&&j.strength>30&&(E.push("\u5411\u4E0B\u8DCC\u7834"),R-=1),_t.isAnomalous&&(E.push("\u653E\u91CF\u5F02\u52A8"),R+=j.type==="up"?.5:-.5),C.k.length>=2&&C.d.length>=2&&(C.k[C.k.length-2]<C.d[C.d.length-2]&&T>Y&&T<30&&(E.push("KDJ\u4F4E\u4F4D\u91D1\u53C9"),R+=.5),C.k[C.k.length-2]>C.d[C.d.length-2]&&T<Y&&T>70&&(E.push("KDJ\u9AD8\u4F4D\u6B7B\u53C9"),R-=.5)),l.macd.length>=2&&l.signal.length>=2){let w=l.macd.length;l.macd[w-2]<l.signal[w-2]&&l.macd[w-1]>l.signal[w-1]&&(E.push("MACD\u91D1\u53C9"),R+=.5),l.macd[w-2]>l.signal[w-2]&&l.macd[w-1]<l.signal[w-1]&&(E.push("MACD\u6B7B\u53C9"),R-=.5)}R=L(Math.round(R),1,5);let ae=E.length>0?E.join("\u3001"):"\u65E0\u660E\u663E\u5F62\u6001\u4FE1\u53F7",Bn=Lo(n),Un=o*.25+f*.25+q*.15+S*.2+R*.15,Fn=L(Math.round(Un*10)/10,1,5),Gn=t.direction==="up"?"\u504F\u591A":t.direction==="down"?"\u504F\u7A7A":"\u9707\u8361",Kn=isNaN(d)?"":d>70?"\uFF0CRSI\u8D85\u4E70":d<30?"\uFF0CRSI\u8D85\u5356":"",zn=`${Gn}${Kn}\uFF0C${ae}`;return{trend:{direction:t.direction,strength:t.strength,score:o,maAlign:c},momentum:{rsi:Math.round(d*100)/100,macdHistogram:isNaN(g)?0:Math.round(g*1e4)/1e4,score:f},volatility:{atr:Math.round(h*100)/100,bollingerBandwidth:Math.round(B*100)/100,score:q},volume:{volumeRatio:$.ratio,trend:$.trend,score:S},pattern:{description:ae,score:R},keyLevels:Bn,compositeScore:Fn,summary:zn}}function et(n){let e=n.result||{},t=(o,r)=>({label:o,netBuy:r?.netBuyTurnover??null,netBuyText:r?.netBuyTurnoverText||null,turnover:r?.tradValSum??null,status:r?.tradeStatus||null});return{northbound:{shanghai:t("\u5317\u5411\u8D44\u91D1(\u6CAA)",e.shMarketFlowDetail),shenzhen:t("\u5317\u5411\u8D44\u91D1(\u6DF1)",e.szMarketFlowDetail),total:t("\u5317\u5411\u5408\u8BA1",e.shSZTotalMarketFlowDetail)},southbound:{shanghai:t("\u5357\u5411\u8D44\u91D1(\u6CAA)",e.hkSHMarketFlowDetail),shenzhen:t("\u5357\u5411\u8D44\u91D1(\u6DF1)",e.hkSZMarketFlowDetail),total:t("\u5357\u5411\u5408\u8BA1",e.hkSHSZTotalMarketFlowDetail)},source:"glh"}}var Mo="https://query1.finance.yahoo.com/v8/finance/chart",Po={"User-Agent":"Mozilla/5.0"};async function te(n){let e=n.trim().toUpperCase(),t=`${Mo}/${encodeURIComponent(e)}?interval=1d&range=1d`;try{let s=(await(await fetch(t,{headers:Po})).json())?.chart?.result;if(!Array.isArray(s)||s.length===0)return null;let a=s[0]?.meta;if(!a?.symbol)return null;let i=Number(a.regularMarketPrice??0),c=Number(a.chartPreviousClose??0),m=i-c,d=c===0?0:m/c*100;return{symbol:a.symbol,name:a.shortName??"",price:i,prevClose:c,change:m,changePercent:d,currency:a.currency??"",exchange:a.exchangeName??"",marketState:a.marketState??""}}catch{return null}}function Ho(n){let e=n?.data||{};return{code:e.secu_code||"",name:e.secu_name||"",price:Number(e.last_px||0),change:Number(e.change_px||0),changePercent:Math.round(Number(e.change||0)*1e4)/100,open:Number(e.open_px||0),high:Number(e.high_px||0),low:Number(e.low_px||0),preclose:Number(e.preclose_px||0),volume:Number(e.business_amount||0),amount:Number(e.business_balance||0),turnoverRate:Number(e.tr||0),amplitude:Number(e.amp||0),avgPrice:Number(e.av_px||0),volumeRatio:Number(e.qrr||0),pe:e.pe!=null?Number(e.pe):null,pb:e.pb!=null?Number(e.pb):null,marketCap:Number(e.mc||0),change3d:e.change_3!=null?Number(e.change_3):null,change5d:e.change_5!=null?Number(e.change_5):null,status:e.trade_status==="TRADE"?"trading":"closed",source:"cls"}}function Io(n){return{items:n.map(e=>{let t=e.quote||e;return{code:t.symbol||"",name:t.name||"",price:t.current??0,change:t.chg??0,changePercent:Math.round((t.percent??0)*1e4)/100,volume:t.volume??0,amount:t.amount??0,turnoverRate:t.turnover_rate??0,marketCap:t.market_capital??0,high:t.high??0,low:t.low??0,open:t.open??0}}),total:n.length}}function Bo(n){let e=n?.data||{},t=Number(e.last_px??0);return!!(e.secu_name||e.secu_code)&&Number.isFinite(t)&&t!==0}function Uo(n){if(!n)return!1;let e=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(e)&&e!==0}function Fo(n){let e=n.trim().toUpperCase();return e?/^[A-Z]+$/.test(e)||/^\d{4}\.T$/.test(e)||/^\d{6}\.(KS|KQ)$/.test(e)||/^\d{4,5}\.HK$/.test(e)?e:/^\d{6}\.(SS|SH)$/.test(e)?`${e.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(e)?e:/^(SH|SZ)\d{6}$/.test(e)?e.startsWith("SH")?`${e.slice(2)}.SS`:`${e.slice(2)}.SZ`:/^\d{6}$/.test(e)?e.startsWith("6")?`${e}.SS`:`${e}.SZ`:null:null}async function Go(n){let e=n.toUpperCase().startsWith("SH")||n.toUpperCase().startsWith("SZ")?[n.toUpperCase()]:/^\d{6}$/.test(n)?[n.startsWith("6")?"SH"+n:"SZ"+n]:[n.toUpperCase()];try{let o=(await V(e))?.data?.items||[];return o[0]?.quote||o[0]||null}catch{let t=await Et(e);return(t?.data||t?.items||[])[0]||null}}function Ko(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent,preclose:n.prevClose,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}async function hn(n,e,t,o){let r=ee.has(e);if(o==="xq"||!o&&r){let g=await lt(n,{period:e,count:t});return{candles:(g?.data?.item||g?.data||[]).map(h=>({date:new Date(h[0]).toISOString().slice(0,10),open:Number(h[2]),high:Number(h[3]),low:Number(h[4]),close:Number(h[5]),volume:Number(h[1]),amount:Number(h[9]||0),turnoverRate:Number(h[8]||0)})),source:"xq"}}let a=e==="w"?"w":e==="m"?"m":e==="y"?"y":e==="5d"?"5d":"d",i=[],c,m=0,d=50;for(;i.length<t&&m++<d;){let f=(await rt(n,{period:a,limit:Math.min(t-i.length,200),start_date:c}))?.data||[];if(!f.length)break;i=[...f,...i],c=String(f[0].trade_date)}return{candles:i.slice(-t).map(g=>({date:String(g.trade_date).replace(/(\d{4})(\d{2})(\d{2})/,"$1-$2-$3"),open:Number(g.open_px),high:Number(g.high_px),low:Number(g.low_px),close:Number(g.close_px),volume:Number(g.business_amount||0)})),source:"cls"}}var ee=new Set(["1m","5m","15m","30m","60m","120m"]);function yn(n,e,t){return{code:n,period:e,items:t.map(o=>({date:String(o.trade_date),open:Number(o.open_px),high:Number(o.high_px),low:Number(o.low_px),close:Number(o.close_px),volume:Number(o.business_amount||0),change:Number(o.change||0)})),total:t.length}}function bn(n,e,t){return{code:n,period:e,items:t.map(o=>({date:new Date(o[0]).toISOString().slice(0,10),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:t.length}}function _n(n,e){return{code:n,preclose:Number(e.preclose_px||0),asks:[5,4,3,2,1].map(t=>({price:Number(e[`s_px_${t}`]||0),volume:Number(e[`s_amount_${t}`]||0)})),bids:[1,2,3,4,5].map(t=>({price:Number(e[`b_px_${t}`]||0),volume:Number(e[`b_amount_${t}`]||0)})),source:"cls"}}function wn(n,e){let t=e.current??0,o=e.percent??0,r=o!==0?t/(1+o/100):0;return{code:n,current:t,preclose:r,asks:[1,2,3,4,5].map(s=>({price:Number(e[`sp${s}`]||0),volume:Number(e[`sc${s}`]||0)})),bids:[5,4,3,2,1].map(s=>({price:Number(e[`bp${s}`]||0),volume:Number(e[`bc${s}`]||0)})),buyPercent:e.buypct??null,sellPercent:e.sellpct??null,buySellRatio:e.ratio??null,source:"xq"}}function Sn(n,e){let t=e?.data?.volume||[],o=e?.data?.end||t.length;return{code:n,items:t.map(r=>{let s=String(r.minute),a=s.length<=3?"0"+s[0]:s.slice(0,2),i=s.length<=3?s.slice(1):s.slice(2),c=s.slice(-2);return{time:`${a}:${i}:${c}`,price:Number(r.last_px||0),volume:Number(r.change_vol||0),side:r.change_vol_color===1?"buy":"sell"}}),total:o}}function xn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,50).map(o=>({time:new Date(o.timestamp).toISOString(),price:Number(o.current||o.price||0),volume:Number(o.trade_volume||o.volume||0),side:o.side==="buy"||o.side===1?"buy":"sell"})),total:t.length}}function Nn(n,e){let t=e?.data||{},o=t.line||[],r=Number(t.preclose_px||0);return{code:n,preclose:r,items:o.map(s=>{let a=String(s.minute),i=a.length<=3?"0"+a[0]:a.slice(0,2),c=a.length<=3?a.slice(1):a.slice(2),m=Number(s.last_px||0);return{time:`${i}:${c}`,price:m,avgPrice:Number(s.av_px||0),changePercent:r>0?(m-r)/r*100:0,amount:Number(s.business_balance||0)}}),total:o.length}}function kn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,240).map(o=>({time:new Date(o.timestamp).toISOString(),price:Number(o.current||0),volume:Number(o.volume||0),avgPrice:Number(o.avg_price||0)})),total:t.length}}function vn(n,e){return{type:e,items:n.map(t=>({code:t.secu_code||"",name:t.plate_name||t.secu_name||"",changePercent:Math.round((t.change||0)*100*100)/100})),total:n.length}}function An(n){return{items:n.map(e=>({code:e.secu_code||"",name:e.secu_name||"",changePercent:Math.round((e.change||0)*100*100)/100,topStocks:(e.up_stock||[]).slice(0,3).map(t=>({name:t.secu_name?.trim()||"",changePercent:Math.round((t.change||0)*100*100)/100}))})),total:n.length}}function zo(n){let e=(n?.data?.stocks||[]).map(t=>({code:t.secu_code||"",name:t.secu_name||"",price:t.last_px??null,changePercent:Math.round((t.change??0)*1e4)/100,marketCap:t.cmc??null,fundflow:t.fundflow??null,isCore:!!t.is_core,reason:t.assoc_desc||""}));return{items:e,total:e.length}}function Qo(n){let e=n?.data||{},t=e.company||{};return{name:t.org_name_cn||"",industry:(e.industry||[]).map(o=>o.ind_name),concept:(e.concept||[]).map(o=>o.ind_name),companyType:t.classi_name||"",region:t.provincial_name||"",listedDate:t.listed_date||"",controller:t.actual_controller||"",mainBusiness:t.main_operation_business||""}}function Yo(n){let e=n?.data||{};return{mainInflow:Number(e.main_fund_in||0),mainOutflow:Number(e.main_fund_out||0),mainNet:Number(e.main_fund_diff||0),superNet:Number(e.super_fund_diff||0),largeNet:Number(e.large_fund_diff||0),mediumNet:Number(e.medium_fund_diff||0),smallNet:Number(e.little_fund_diff||0),mainNet3d:e.main_fund_3!=null?Number(e.main_fund_3):null,mainNet5d:e.main_fund_5!=null?Number(e.main_fund_5):null,mainNet10d:e.main_fund_10!=null?Number(e.main_fund_10):null,mainNet20d:e.main_fund_20!=null?Number(e.main_fund_20):null,source:"cls"}}function qn(n){let e=n?.data||{},t=e.items||[];return{items:t.map(o=>({time:o.timestamp?new Date(o.timestamp).toISOString():"",amount:Number(o.amount||0)})),total:t.length,summary:e.sum3!=null?{sum3:Number(e.sum3),sum5:Number(e.sum5),sum10:Number(e.sum10),sum20:Number(e.sum20)}:null}}function Vo(n){let e=n?.data?.items||[];return{items:e.map(t=>({date:t.td_date?new Date(t.td_date).toISOString().slice(0,10):"",marginBalance:Number(t.margin_trading_amt_balance||0),shortBalance:Number(t.short_selling_amt_balance||0),marginNetBuy:Number(t.margin_trading_net_buy_amt||0),marginBuy:Number(t.margin_trading_buy_amt||0)})),total:e.length}}function Wo(n){let e=n?.data?.items||n?.data||[];return{items:e.map((t,o)=>({rank:o+1,holderName:t.holder_name||"",shares:Number(t.held_num||0),ratio:Number(t.held_ratio||0),change:t.chg_amount??t.change??null})),total:e.length}}function Xo(n){let e=n?.data?.items||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({period:t.dividend_year||"",exDividendDate:t.ashare_ex_dividend_date?new Date(t.ashare_ex_dividend_date).toISOString().slice(0,10):"",equityDate:t.equity_date?new Date(t.equity_date).toISOString().slice(0,10):"",plan:t.plan_explain||""})),total:e.length}:{items:[],total:0}}function Zo(n){let e=n?.data?.items||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({date:t.begin?new Date(t.begin).toISOString().slice(0,10):"",title:t.content||""})),total:e.length}:{items:[],total:0}}function nt(n){return Array.isArray(n)?n[0]:n}function On(n){let e=n?.data||{},t=e.list||[];return{name:e.quote_name||"",items:t.map(o=>({report:o.report_name||"",roe:nt(o.avg_roe),eps:nt(o.basic_eps),grossMargin:nt(o.gross_selling_rate),revenueYoy:nt(o.operating_income_yoy)})),total:t.length}}function tr(n,e){let t=n?.data||{},o=t.list||[],r={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"]},s={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},a=r[e]||r.cashflow,i=s[e]||s.cashflow;return{name:t.quote_name||"",type:e,items:o.map(c=>{let m={report:c.report_name||""};for(let d=1;d<a.length;d++)m[i[d]]=nt(c[a[d]]);return m}),total:o.length}}function er(n){let e=n?.data||n?.list||[],t={1:"stock",2:"fund",3:"index"};return{items:e.map(o=>({code:o.code||o.symbol||"",name:o.query||o.name||o.cn_name||"",type:o.type?t[o.type]||String(o.type):""})),total:e.length}}function nr(n){let t=(n?.data||{}).items||[];return{items:t.map(o=>({time:o.timestamp?new Date(o.timestamp).toISOString():"",amount:Number(o.amount||0)})),total:t.length}}function or(n){let e=(n?.data?.industries||[]).map(t=>({code:t.encode||"",name:t.name||"",pinyin:t.pinyin||""}));return{items:e,total:e.length}}function jn(n,e){return{items:n.map(t=>({code:t.symbol||"",name:t.name||"",price:t.current??null,changePercent:Math.round((t.percent??0)*100)/100,amount:t.amount??null,volume:t.volume??null,marketCap:t.market_capital??null,pe:t.pe_ttm??null,pb:t.pb??null,turnoverRate:t.turnover_rate??null})),total:e??n.length}}async function Cn(n){let e=[],t,o=1,r=12;for(;e.length<n.n&&o<=r;){let s=await Ie({page:o,size:Math.min(90,n.n-e.length),order:n.order,order_by:n.order_by,ind_code:n.ind_code,type:n.type});if(s?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${s.error_description||s.error_code}`);let a=s?.data?.list||[];if(t=s?.data?.count??t,!a.length)break;e.push(...a),o++}return{list:e,count:t}}function $n(n){return n.command({command:"quote [code]",describe:"\u8BC1\u5238\u884C\u60C5",builder:e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801"}).strictCommands(!1).command("batch <codes...>","\u6279\u91CF\u884C\u60C5\uFF08xueqiu\uFF09",t=>t,async t=>{let o=t.codes,r=o.map(i=>{let c=i.toUpperCase();return c.startsWith("SH")||c.startsWith("SZ")?c:/^\d{6}$/.test(i)?i.startsWith("6")?"SH"+i:"SZ"+i:c}),s,a;try{s=await V(r),a=s?.data?.items||[],a.length&&a[0]?.quote&&(a=a.map(i=>({...i.quote,market:i.market})))}catch{s=await Et(r),a=s?.data||s?.items||[]}u({data:a,command:`quote batch ${o.join(" ")}`,source:"xq",toJSON:()=>Io(a)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",t=>t,async t=>{let o=t.code,s=await Ee(o),a=s?.data?.items||s?.data||[];u({data:s,command:`quote related ${o}`,source:"xq",toJSON:()=>({items:a.map(i=>({code:i.symbol||"",name:i.name||"",price:i.current??0,changePercent:Math.round((i.percent??0)*1e4)/100,relation:i.relation||""}))})})}).command("search <keyword>","\u641C\u7D22\u80A1\u7968",t=>t,async t=>{let o=t.keyword,r=await Pe(o);u({data:r,command:`quote search ${o}`,source:"xq",toJSON:er})}).command("industry [ind_code]","\u7533\u4E07\u884C\u4E1A\uFF08\u96EA\u7403\uFF09\uFF1A\u5217\u51FA\u884C\u4E1A\u6216\u67D0\u884C\u4E1A\u6210\u5206\u80A1",t=>t.positional("ind_code",{type:"string",describe:"\u7533\u4E07\u884C\u4E1A\u4EE3\u7801\uFF08\u677F\u5757ID\uFF0C\u5982 S2701=\u534A\u5BFC\u4F53\uFF09\uFF1B\u6CE8\u610F\u4E0D\u662F\u80A1\u7968\u4EE3\u7801\u3002\u7701\u7565\u5219\u5217\u51FA\u5168\u90E8\u884C\u4E1A"}).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 t=>{let{n:o=30}=t,r=t.ind_code,s=t["order-by"]??"percent",a=t.order??"desc";if(!r){let m=await He();if(m?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${m.error_description||m.error_code}`);return u({data:m,command:"quote industry",source:"xq",toJSON:or})}let{list:i,count:c}=await Cn({n:o,order:a,order_by:s,ind_code:r});u({data:{list:i},command:`quote industry ${r}`,source:"xq",toJSON:()=>jn(i,c)})}).command("board <type>","\u677F\u5757\u6210\u5206\u80A1\uFF08\u96EA\u7403\uFF09",t=>t.positional("type",{type:"string",describe:"\u677F\u5757\uFF1Ash_sz/cyb/kcb/sha/sza/zxb/shb/szb/xsbno/xsbin"}).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 t=>{let{n:o=30}=t,r=t.type,s=t["order-by"]??"percent",a=t.order??"desc",{list:i,count:c}=await Cn({n:o,order:a,order_by:s,type:r});u({data:{list:i},command:`quote board ${r}`,source:"xq",toJSON:()=>jn(i,c)})}).command("ta [code]","\u6280\u672F\u9762\u91CF\u5316\u5206\u6790",t=>t.positional("code",{type:"string"}).option("period",{alias:"p",type:"string",default:"d"}).option("count",{alias:"c",type:"number",default:120,describe:"K\u7EBF\u6761\u6570"}).option("src",{type:"string",choices:["cls","xq"]}),async t=>{let{p:o="d",src:r}=t,s=t.count??120,a=t.code;try{let{candles:i,source:c}=await hn(a,o,s,r);if(!i.length)return console.log("\u6682\u65E0\u6570\u636E");let m=Zt(i);u({data:m,command:`quote ta ${a} -p ${o} -c ${s}`,source:c})}catch(i){if(ee.has(o)&&!r){console.error(i.message||i);return}let m=r==="xq"?"cls":"xq";try{let{candles:d,source:l}=await hn(a,o,s,m);if(!d.length)return console.log("\u6682\u65E0\u6570\u636E");let p=Zt(d);u({data:p,command:`quote ta ${a} -p ${o} -c ${s}`,source:`${m} fallback`})}catch(d){console.error(d.message||d)}}}).command("kline [code]","K\u7EBF",t=>t.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"]}),async t=>{let{p:o="d",n:r=120,src:s}=t,a=t.code,i=ee.has(o),c=s==="xq"||!s&&i;try{if(c){let m=await lt(a,{period:o,count:r}),d=m?.data?.item||m?.data||[];return u({data:m,command:`quote kline ${a} -p ${o}`,source:"xq",toJSON:()=>bn(a,o,d)})}else{let m=o==="w"?"w":o==="m"?"m":o==="y"?"y":o==="5d"?"5d":"d",d=[],l,p=0,g=50;for(;d.length<r&&p++<g;){let h=(await rt(a,{period:m,limit:Math.min(r-d.length,200),start_date:l}))?.data||[];if(!h.length)break;d=[...h,...d],l=String(h[0].trade_date)}let f=d.slice(-r);return u({data:f,command:`quote kline ${a} -p ${o}`,source:"cls",toJSON:y=>yn(a,m,y)})}}catch{if(i&&!s)throw new Error("xq K\u7EBF\u8BF7\u6C42\u5931\u8D25\uFF0C\u5206\u949F\u7EBF\u65E0\u5907\u9009\u6570\u636E\u6E90");if((c?"cls":"xq")==="xq"){let d=await lt(a,{period:o,count:r}),l=d?.data?.item||d?.data||[];u({data:d,command:`quote kline ${a} -p ${o}`,source:"xq fallback",toJSON:()=>bn(a,o,l)})}else{let d=o==="w"?"w":o==="m"?"m":o==="y"?"y":o==="5d"?"5d":"d",l=[],p,g=0,f=50;for(;l.length<r&&g++<f;){let J=(await rt(a,{period:d,limit:Math.min(r-l.length,200),start_date:p}))?.data||[];if(!J.length)break;l=[...J,...l],p=String(J[0].trade_date)}let y=l.slice(-r);u({data:y,command:`quote kline ${a} -p ${o}`,source:"cls fallback",toJSON:h=>yn(a,d,h)})}}}).command("depth [code]","\u4E94\u6863\u76D8\u53E3",t=>t.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls"}),async t=>{let{src:o="cls"}=t,r=t.code,s=o;try{if(s==="xq"){let a=await Mt(r);return u({data:a,command:`quote depth ${r} --src xq`,source:"xq",toJSON:i=>wn(r,i?.data||{})})}else{let a=await Nt(r);return u({data:a,command:`quote depth ${r}`,source:"cls",toJSON:i=>_n(r,i?.data||{})})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Mt(r);u({data:i,command:`quote depth ${r} --src xq`,source:"xq fallback",toJSON:c=>wn(r,c?.data||{})})}else{let i=await Nt(r);u({data:i,command:`quote depth ${r}`,source:"cls fallback",toJSON:c=>_n(r,c?.data||{})})}}}).command("ticks [code]","\u9010\u7B14\u6210\u4EA4",t=>t.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls"}),async t=>{let{src:o="cls"}=t,r=t.code,s=o;try{if(s==="xq"){let a=await Ht(r);return u({data:a,command:`quote ticks ${r} --src xq`,source:"xq",toJSON:i=>xn(r,i)})}else{let a=await kt(r);return u({data:a,command:`quote ticks ${r}`,source:"cls",toJSON:i=>Sn(r,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Ht(r);u({data:i,command:`quote ticks ${r} --src xq`,source:"xq fallback",toJSON:c=>xn(r,c)})}else{let i=await kt(r);u({data:i,command:`quote ticks ${r}`,source:"cls fallback",toJSON:c=>Sn(r,c)})}}}).command("timeline [code]","\u5206\u65F6\u7EBF",t=>t.positional("code",{type:"string"}).option("src",{type:"string",choices:["cls","xq"],default:"cls"}),async t=>{let{src:o="cls"}=t,r=t.code,s=o;try{if(s==="xq"){let a=await Pt(r,{period:"1d"});return u({data:a,command:`quote timeline ${r} --src xq`,source:"xq",toJSON:i=>kn(r,i)})}else{let a=await vt(r);return u({data:a,command:`quote timeline ${r}`,source:"cls",toJSON:i=>Nn(r,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Pt(r,{period:"1d"});u({data:i,command:`quote timeline ${r} --src xq`,source:"xq fallback",toJSON:c=>kn(r,c)})}else{let i=await vt(r);u({data:i,command:`quote timeline ${r}`,source:"cls fallback",toJSON:c=>Nn(r,c)})}}}).command("sector [code]","\u677F\u5757",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("rank","\u677F\u5757\u6392\u884C",o=>o.option("type",{alias:"t",type:"string",default:"industry"}),async o=>{let{t:r="industry"}=o,s=await xt({type:r}),a=Array.isArray(s?.data)?s.data:[];u({data:s,command:`quote sector rank -t ${r}`,source:"cls",toJSON:()=>vn(a,r)})}).command("plate <code>","\u4E2A\u80A1\u677F\u5757",o=>o,async o=>{let r=o.code,s=await At(r),a=Array.isArray(s?.data)?s.data:[];u({data:s,command:`quote sector plate ${r}`,source:"cls",toJSON:()=>An(a)})}).command("industry <code>","\u884C\u4E1A\u4FE1\u606F",o=>o,async o=>{let r=o.code,s=r.length<=6?r.toUpperCase().startsWith("SH")||r.toUpperCase().startsWith("SZ")?r:r.toUpperCase():r,a=await Ye(s);u({data:a,command:`quote sector industry ${r}`,source:"xq",toJSON:Qo})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08plate_code \u6765\u81EA sector rank / sector plate\uFF09",o=>o.positional("plate_code",{type:"string"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async o=>{let{way:r="change"}=o,s=o.plate_code,a=await pe(s,{way:r});u({data:a,command:`quote sector stocks ${s}`,source:"cls",toJSON:zo})}),async t=>{let{code:o}=t;if(o){let r=await At(o),s=Array.isArray(r?.data)?r.data:[];u({data:r,command:`quote sector ${o}`,source:"cls",toJSON:()=>An(s)})}else{let r=await xt({type:"industry"}),s=Array.isArray(r?.data)?r.data:[];u({data:r,command:"quote sector",source:"cls",toJSON:()=>vn(s,"industry")})}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",o=>o,async()=>{let o=await X();u({data:o,command:"quote flow market",source:"glh",toJSON:et})}).command("history <code>","\u5386\u53F2\u8D44\u91D1\u6D41",o=>o.option("count",{alias:"c",type:"number",default:20}),async o=>{let{c:r=20}=o,s=o.code,a=await We(s,{count:r});u({data:a,command:`quote flow history ${s}`,source:"xq",toJSON:qn})}).command("margin <code>","\u878D\u8D44\u878D\u5238",o=>o,async o=>{let r=o.code,s=await Xe(r);u({data:s,command:`quote flow margin ${r}`,source:"xq",toJSON:Vo})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",o=>o,async o=>{let r=o.code,a=await It(r);u({data:a,command:`quote flow intraday ${r}`,source:"xq",toJSON:qn})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",o=>o,async o=>{let r=o.code,a=await It(r);u({data:a,command:`quote flow xq ${r}`,source:"xq",toJSON:nr})}),async t=>{let{code:o}=t;if(o){let r=await ge(o);u({data:r,command:`quote flow ${o}`,source:"cls",toJSON:Yo})}else{let r=await X();u({data:r,command:"quote flow market",source:"glh",toJSON:et})}}).command("f10 [code]","\u57FA\u672C\u9762",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",o=>o,async o=>{let r=o.code,s=await ze(r);u({data:s,command:`quote f10 holders ${r}`,source:"xq",toJSON:Wo})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",o=>o,async o=>{let r=o.code,s=await Ve(r);u({data:s,command:`quote f10 bonus ${r}`,source:"xq",toJSON:Xo})}).command("event <code>","\u516C\u53F8\u5927\u4E8B",o=>o,async o=>{let r=o.code,s=await Me(r);u({data:s,command:`quote f10 event ${r}`,source:"xq",toJSON:Zo})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",o=>o,async o=>{let r=o.code,s=await Qe(r);u({data:s,command:`quote f10 indicator ${r}`,source:"xq",toJSON:On})})).command("finance [code]","\u8D22\u52A1\u62A5\u8868",t=>t.positional("code",{type:"string"}).option("type",{alias:"t",type:"string",choices:["indicator","cashflow","income","balance"],default:"indicator"}),async t=>{let{t:o="indicator"}=t,r=t.code;if(o==="indicator"){let s=await Ue(r);u({data:s,command:`quote finance indicator ${r}`,source:"xq",toJSON:On})}else{let a={cashflow:Fe,income:Ge,balance:Ke}[o];if(!a)return console.log(`\u672A\u77E5\u7C7B\u578B: ${o}`);let i=await a(r);u({data:i,command:`quote finance ${o} ${r}`,source:"xq",toJSON:c=>tr(c,o)})}}),handler:async e=>{let t=e.code;if(!t){console.log("\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519"),console.log("\u8FD0\u884C finflow quote --help \u67E5\u770B\u6240\u6709\u5B50\u547D\u4EE4");return}if(["search","batch","related","industry","board","kline","ta","depth","ticks","timeline","sector","flow","f10","finance"].includes(t)){console.log(`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${t} <code>`);return}try{let a=await de(t);if(Bo(a)){u({data:a,command:`quote ${t}`,source:"cls",toJSON:Ho});return}}catch{}let r=null;try{r=await Go(t)}catch{}if(Uo(r)){u({data:r,command:`quote ${t}`,source:"xq fallback",toJSON:a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,change:a.chg??0,changePercent:Math.round((a.percent??0)*1e4)/100,open:a.open??0,high:a.high??0,low:a.low??0,preclose:a.last_close??0,volume:a.volume??0,amount:a.amount??0,turnoverRate:a.turnover_rate??0,amplitude:a.amplitude??0,avgPrice:a.avg_price??0,volumeRatio:a.volume_ratio??0,pe:a.pe_ttm??null,pb:a.pb??null,marketCap:a.market_capital??0,change3d:null,change5d:null,status:a.status===1?"trading":"closed",source:"xq fallback"})});return}let s=Fo(t);if(s){let a=await te(s);if(a){u({data:a,command:`quote ${t}`,source:"yahoo fallback",toJSON:Ko});return}}if(r){u({data:r,command:`quote ${t}`,source:"xq fallback",toJSON:a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,change:a.chg??0,changePercent:Math.round((a.percent??0)*1e4)/100,open:a.open??0,high:a.high??0,low:a.low??0,preclose:a.last_close??0,volume:a.volume??0,amount:a.amount??0,turnoverRate:a.turnover_rate??0,amplitude:a.amplitude??0,avgPrice:a.avg_price??0,volumeRatio:a.volume_ratio??0,pe:a.pe_ttm??null,pb:a.pb??null,marketCap:a.market_capital??0,change3d:null,change5d:null,status:a.status===1?"trading":"closed",source:"xq fallback"})});return}throw new Error(`cls\u3001xq \u548C Yahoo \u5747\u65E0\u6CD5\u83B7\u53D6 ${t} \u7684\u884C\u60C5\u6570\u636E`)}})}function rr(n){let e=n?.data||{},t=e.limit_up_board||{},o=e.up_down_dis||{};return{marketDegree:e.market_degree||0,limitUp:Number(e.up_ratio_num||0),limitOpen:Number(e.up_open_num||0),sealRate:parseFloat(e.up_ratio)||0,turnover:e.shsz_balance||"",turnoverChange:e.shsz_balance_change_px||"",limitUpBoard:t.row2?{total:t.row2[0]||0,first:t.row2[1]||0,second:t.row2[2]||0,third:t.row2[3]||0,promoteRate:t.row3?{first:t.row3[1]||"",second:t.row3[2]||"",third:t.row3[3]||""}:{}}:null,prevPerformance:e.performance||"",gapUpRate:e.up_open_ratio||"",profitRate:e.profit_ratio||"",distribution:o.status?{limitUp:Number(o.up_num||0),limitDown:Number(o.down_num||0),rise:Number(o.rise_num||0),fall:Number(o.fall_num||0),flat:Number(o.flat_num||0),suspend:Number(o.suspend_num||0)}:null,source:"cls"}}function Tn(n){let e=n.result||[],t=e.filter(r=>r.category==="\u6307\u6570"),o=e.filter(r=>r.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:t.map(r=>({name:r.name,value:Number(r.value||0),change:Number(r.change||0),changePercent:Number(r.netChange||0)})),capitalFlow:o.map(r=>({name:r.name,shanghai:r.sh??null,shenzhen:r.sz??null})),source:"glh"}}function ar(n){let e=n?.data,t=Array.isArray(e)?e:e?.data||[];return{items:t.map(o=>({code:o.secu_code||"",name:o.secu_name||"",change:o.change_px??null,changePercent:o.change??null})),total:t.length}}function sr(n){let e=n.result||[];return{items:e.map(t=>({name:t.stockName||"",code:(t.stockType||"")+(t.stockCode||""),price:t.currentPrice??null,changePercent:t.netChange??null})),total:e.length}}function ir(n){let e=(n?.data?.items||[]).map(t=>({code:t.symbol||"",name:t.name||"",close:t.close??null,changePercent:Math.round((t.percent??0)*100)/100,volume:t.volume??null,amount:t.amount??null,reasons:t.type_name||[]}));return{items:e,total:n?.data?.items_size??e.length}}function Jn(n){return n.command({command:"market",describe:"\u5E02\u573A\u603B\u89C8",builder:e=>e.strictCommands(!1).command("emotion","\u5E02\u573A\u60C5\u7EEA\uFF08cls\uFF09",t=>t,async()=>{let t=await he();u({data:t,command:"market emotion",source:"cls",toJSON:rr})}).command("rank [type]","\u6DA8\u8DCC\u6392\u884C\uFF08cls\uFF09",t=>t,async t=>{let o=t.type||"change",r=jt[o]||jt.change,s=await me({way:r.way});u({data:s,command:"market rank",source:"cls",toJSON:ar})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",t=>t,async()=>{let t=await Ft();u({data:t,command:"market index",source:"glh",toJSON:Tn})}).command("hk [sort]","\u6E2F\u80A1\u6392\u884C\uFF08glh\uFF09",t=>t.option("order",{alias:"o",type:"string",choices:["asc","desc"],default:"desc",describe:"\u6392\u5E8F\u65B9\u5411"}),async t=>{let o=t.sort,r=t.order||"desc",s=ln(o),a=await cn({sort:s.id,order:r});u({data:a,command:"market hk",source:"glh",toJSON:sr})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",t=>t,async()=>{let t=await X();u({data:t,command:"market flow",source:"glh",toJSON:et})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",t=>t,async()=>{let t=await Ne(),o=t?.data?.list||[];u({data:t,command:"market rates",source:"jin10",toJSON:()=>({items:o.map(r=>({bank:r.bankName,rate:r.interestRate,date:r.publishTime}))})})}).command("longhu [date]","\u9F99\u864E\u699C\uFF08\u96EA\u7403\uFF0C\u9700\u767B\u5F55\uFF09",t=>t.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async t=>{let o=t.date||O(),r=o.split("-").map(Number),s=Date.UTC(r[0],(r[1]||1)-1,r[2]||1)-480*60*1e3;if(!Number.isFinite(s))throw new Error(`\u65E0\u6548\u65E5\u671F: ${o}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let a=await Be(s);if(a?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);u({data:a,command:`market longhu ${o}`,source:"xq",toJSON:ir})}),handler:async()=>{let e=await Ft();u({data:e,command:"market",source:"glh",toJSON:Tn})}})}import{inflateSync as cr}from"zlib";var lr="wss://wss-flash-2.jin10.com/",ft={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},ht={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},Q=class{buffer;dv;pos;constructor(e){this.buffer=e instanceof ArrayBuffer?e:e instanceof Uint8Array?e.buffer:new ArrayBuffer(2048),this.dv=new DataView(this.buffer),this.pos=0}w16L(e){this.dv.setInt16(this.pos,e,!0),this.pos+=2}wU16L(e){this.dv.setUint16(this.pos,e,!0),this.pos+=2}w32L(e){this.dv.setInt32(this.pos,e,!0),this.pos+=4}wU32L(e){this.dv.setUint32(this.pos,e,!0),this.pos+=4}wStrL(e){let t=Buffer.from(e,"utf-8");this.wU16L(t.length);for(let o=0;o<t.length;o++)this.dv.setUint8(this.pos++,t[o])}r16L(){let e=this.dv.getInt16(this.pos,!0);return this.pos+=2,e}rU16L(){let e=this.dv.getUint16(this.pos,!0);return this.pos+=2,e}rU32L(){let e=this.dv.getUint32(this.pos,!0);return this.pos+=4,e}rStrL(){let e=this.rU16L(),t=Buffer.from(this.buffer,this.pos,e).toString("utf-8");return this.pos+=e,t}toBuffer(){return this.buffer.slice(0,this.pos)}};function Rn(n,e){let t;n instanceof Uint8Array?t=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):t=new Uint8Array(n);let o=new Uint8Array(t.length),r=e.charCodeAt(0);for(let s=0;s<t.length;s++)o[s]=t[s]^e.charCodeAt((s+r)%e.length);return o.buffer}function ur(n,e){return Rn(n,e)}function mr(n){try{return cr(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var ne=class{ws=null;encryptKey="";requestId=Math.floor(Math.random()*1e6);userId;loginType;userLevel;userAgent;timeout;_pending=new Map;constructor(e={}){this.userId=e.userId||"",this.loginType=e.loginType||"calendar",this.userLevel=e.userLevel||1,this.userAgent=e.userAgent||"chrome",this.timeout=e.timeout||5e3}connect(){return new Promise((e,t)=>{let o=setTimeout(()=>{this.ws?.close(),t(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(lr),this.ws.binaryType="arraybuffer",this.ws.onmessage=r=>{let s=r.data;if(!this.encryptKey){let m=new Q(s);m.rU32L();let d=m.rU32L(),l=m.rU32L();this.encryptKey=`${l}.${d}`,this._sendLogin();return}let a=Rn(s,this.encryptKey),i=new Q(a),c=i.r16L();if(c===ht.LOGIN){clearTimeout(o),e();return}if(c===ht.CACHE_DATA){i.rU32L(),i.rStrL();let m=i.rU32L(),d=i.rStrL(),l=this._pending.get(m);if(l){this._pending.delete(m),clearTimeout(l.timer);try{let p=JSON.parse(d);if(p.data){let g=mr(p.data);l.resolve(g?JSON.parse(g):null)}else l.resolve(null)}catch(p){l.reject(p)}}}},this.ws.onerror=()=>{clearTimeout(o),t(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let e=new Q;e.w16L(ht.LOGIN),e.w32L(parseInt(this.userId)||0),e.wStrL(""),e.wStrL(this.userAgent),e.w32L(this.userLevel),e.wStrL(this.loginType),this._send(e)}_send(e){let t=e.toBuffer(),o=this.encryptKey?ur(t,this.encryptKey):t;this.ws.send(o)}_request(e,t){return new Promise((o,r)=>{let s=this.requestId++,a=setTimeout(()=>{this._pending.delete(s),r(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(s,{resolve:o,reject:r,timer:a});let i=new Q;i.w16L(ht.CACHE_DATA),i.wU32L(e),i.wStrL(t),i.wU32L(s),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(e){return this._request(ft.QH_DATA,e)}getHKStockData(e){return this._request(ft.HK_DATA,e)}getUSStockData(e){return this._request(ft.US_DATA,e)}getAShareData(e={}){let t=[];return e.page&&t.push(`page=${e.page}`),e.limit!=null&&t.push(`limit=${e.limit}`),e.region&&t.push(`region=${e.region}`),e.star!=null&&t.push(`star=${e.star}`),e.determine!=null&&t.push(`determine=${e.determine}`),this._request(ft.A_SHARE,t.join("&"))}};async function Ln(n){let e=new ne(n);return await e.connect(),e}async function oe(n,...e){let t=await Ln();try{return await t[n](...e)}finally{t.close()}}function re(n){return{items:n.map(e=>({time:e.pub_time||"",indicator:e.indicator_name||e.name||"",importance:e.star??0,previous:e.previous??null,consensus:e.consensus??null,actual:e.actual??null,country:e.country||""})),total:n.length}}function Dn(n){let e=n?.data||[];return{items:e.map(t=>({time:t.c_time?t.c_time.slice(5,16):"",name:t.symbol_name||t.event||"",direction:t.float==="up"?"up":t.float==="down"?"down":""})),total:e.length}}function dr(n){let e=n?.data||[];return{items:e.map(t=>({time:t.event_time||"",country:t.country||"",importance:t.star??0,event:t.event_content||"",people:t.people||""})),total:e.length}}function pr(n){let e=n?.data?.data||n?.data,t=Array.isArray(e)?e:e?Object.values(e):[];return{items:t.map(o=>({date:(o.date||"").slice(5,16),market:o.exchange_name||"",name:o.name||"",note:o.rest_note||""})),total:t.length}}function gr(n){let e=n?.data||[];return{items:e.map(t=>({date:(t.date||"").slice(5,16),event:t.event||"",importance:t.star??0,stocks:(t.stocks||[]).map(o=>({name:o.name,code:o.code})),regions:(t.region||[]).map(o=>({name:o.name}))})),total:e.length}}function fr(n){let e=n?.data||[];return{items:e.map(t=>({time:t.public_time||"",country:t.country||"",event:t.eventcontent||""})),total:e.length}}function hr(n){let e=n?.data||[];return{items:e.map(t=>({time:t.holiday_time||"",country:t.country||"",market:t.market||"",name:t.holiday_name||"",description:t.description||""})),total:e.length}}function En(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:e=>e.strictCommands(!1).command("invest [date]","A\u80A1\u6295\u8D44\u65E5\u5386\uFF08cls\uFF0C\u9ED8\u8BA4\u4ECA\u5929\uFF09",t=>t,async t=>{let o=t.date||O(),r=await qt({date:o});u({data:r,command:"calendar invest",source:"cls",toJSON:Dn})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=F(),s=await Ae(o,"cj",r?{cookie:r}:void 0);u({data:s,command:"calendar macro",source:"jin10",toJSON:a=>re(a?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=F(),s=await qe(o,"cj",r?{cookie:r}:void 0);u({data:s,command:"calendar event",source:"jin10",toJSON:dr})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=F(),s=await Oe(o,"cj",r?{cookie:r}:void 0);u({data:s,command:"calendar holiday",source:"jin10",toJSON:pr})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async()=>{let t=await oe("getAShareData",{page:1});u({data:t,command:"calendar ashare",source:"jin10",toJSON:gr})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await oe("getHKStockData",o);u({data:r,command:"calendar hk",source:"jin10",toJSON:s=>re(Array.isArray(s)?s:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await oe("getUSStockData",o);u({data:r,command:"calendar us",source:"jin10",toJSON:s=>re(Array.isArray(s)?s:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await st(o);u({data:r,command:"calendar future-event",source:"jin10",toJSON:fr})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await it(o);u({data:r,command:"calendar future-holiday",source:"jin10",toJSON:hr})}),handler:async()=>{let e=await qt({date:O()});u({data:e,command:"calendar",source:"cls",toJSON:Dn})}})}var yt={all:-1,oil:19,steel:20,coal:21,gas:22,metal:23,nonferrous:24,chemical:25,sugar:27,grain:28,pig:29,macro:30};function yr(n){let e=n?.data?.list||[];return{items:e.map(t=>({title:t.title||"",hot:!!t.hot,updatedAt:t.updated_at||""})),total:e.length}}function br(n){return{groups:(n?.data?.list||[]).map(t=>({name:t.name||"",items:(t.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}))}))}}function _r(n){let e=n?.data||[];return{items:e.map(t=>({time:t.time_show||"",country:t.country||"",indicator:t.name||"",importance:t.star??0,previous:t.previous??null,consensus:t.consensus??null,actual:t.actual??null,unit:t.unit||"",impact:t.qh_affect_text||""})),total:e.length}}function wr(n){let e=n?.data||[];return{items:e.map(t=>({time:mn(t.time),content:pt(t.data?.content||t.data?.title||"",t),importance:t.important??0,source:t.data?.source||"",remark:Z(t.remark)||""})),total:e.length}}function Mn(n){return n.command("future","\u671F\u8D27",e=>e.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(yt).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let t=await je();u({data:t,command:"future headline",source:"jin10",toJSON:yr})}).command("basis [date]","\u671F\u73B0\u57FA\u5DEE",t=>t.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 t=>{let o=t.date||O(),r=await $e(o);u({data:r,command:"future basis",source:"jin10",toJSON:br})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",t=>t.positional("date",{type:"string"}),async t=>{let o=t.date||O(),r=await Ce(o);u({data:r,command:"future calendar",source:"jin10",toJSON:_r})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let o=t.date||O(),r=await st(o);u({data:r,command:`future event ${o}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.public_time,country:i.country,event:i.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let o=t.date||O(),r=await it(o);u({data:r,command:`future holiday ${o}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.holiday_time,country:i.country,market:i.market,name:i.holiday_name,description:i.description}))})})}),async e=>{let{channel:t="all",n:o=10}=e,r=yt[t];r===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${t}"\uFF0C\u53EF\u9009: ${Object.keys(yt).join(", ")}`),process.exit(1));let s=new Set,a=[],i=await Tt(r);for(let l of i?.data||[])s.has(l.id)||(s.add(l.id),a.push(l));let c=0,m=50;for(;a.length<o&&c++<m;){let l=a[a.length-1];if(!l)break;let g=(await Tt(r,{max_time:l.time}))?.data||[];if(!g.length)break;let f=0;for(let y of g)s.has(y.id)||(s.add(y.id),a.push(y),f++);if(f===0)break;a.length<o&&await new Promise(y=>setTimeout(y,200))}let d={...i,data:a};u({data:d,command:"future",source:"jin10",toJSON:wr})})}function Sr(n){let e=n?.data||{};return{stocks:(e.stocks||[]).map(t=>({id:t.id,name:t.name,symbolCount:t.symbol_count||0})),cubes:(e.cubes||[]).map(t=>({id:t.id,name:t.name})),funds:(e.funds||[]).map(t=>({id:t.id,name:t.name}))}}function xr(n){let e=n?.data?.stocks||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({symbol:t.symbol||t.stock_code||"",name:t.name||t.stock_name||"",price:t.current??t.price??null,changePercent:typeof t.percent=="number"?Math.round(t.percent*1e4)/100:t.chg_pct??null,marketCap:t.market_capital??t.mc??null})),total:e.length}:{items:[],total:0}}function Nr(n){let e=n?.data||[];return Array.isArray(e)?{items:e.map(t=>({date:t.time?String(t.time).slice(0,10):"",nav:t.nav??t.unit_nav??null,accumulatedNav:t.accumulated_nav??null,dailyReturn:t.daily_return??t.nav_chg_pct??null})),total:e.length}:{items:[],total:0}}function kr(n){let e=n?.data?.list||n?.data?.holdings||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({symbol:t.stock_symbol||t.symbol||t.code||"",name:t.stock_name||t.name||"",weight:t.weight??t.proportion??null,price:t.price??t.current??null,changePercent:t.chg_pct??t.percent??null,marketCap:t.market_capital??t.mc??null})),total:e.length}:{items:[],total:0}}async function vr(n){if(!n.length)return;let e=n.map(t=>t.symbol).filter(Boolean);try{let t=await V(e),o={};for(let r of t?.data?.items||[]){let s=r.quote;s&&(o[s.symbol]=s)}for(let r of n){let s=o[r.symbol];s&&(r.current=s.current,r.percent=s.percent,r.market_capital=s.market_capital)}}catch{}}function Pn(n,e){let t=n?.data?.stocks||[];vr(t).then(()=>{u({data:n,command:e,source:"xq",toJSON:xr})})}function Hn(n){return n.command({command:"portfolio",describe:"\u81EA\u9009/\u7EC4\u5408\uFF08\u96EA\u7403\uFF0C\u9700 cookie\uFF09",builder:e=>(e.command({command:"stocks",describe:"\u67E5\u770B/\u7BA1\u7406\u81EA\u9009\u80A1",builder:t=>(t.command({command:"list [pid]",describe:"\u67E5\u770B\u5206\u7EC4\u4E0B\u7684\u80A1\u7968\uFF08\u9ED8\u8BA4\u5168\u90E8\uFF09",builder:o=>o.positional("pid",{type:"string",describe:"\u5206\u7EC4 ID\uFF0C\u5982 -1(\u5168\u90E8) -5(\u6CAA\u6DF1)"}),handler:async o=>{let r=o.pid||"-1",s=await Bt(r);Pn(s,"portfolio stocks "+r)}}),t.command({command:"add <symbol>",describe:"\u6DFB\u52A0\u80A1\u7968\u5230\u81EA\u9009",builder:o=>o.positional("symbol",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 SH600519"}).option("category",{alias:"c",type:"number",default:1,describe:"\u5206\u7EC4 ID\uFF0C\u9ED8\u8BA4\u5168\u90E8"}),handler:async o=>{let r=o.symbol,s=o.category,a=await tn(r,{category:s});console.log(a?.data?"\u5DF2\u6DFB\u52A0":"\u6DFB\u52A0\u5931\u8D25")}}),t.command({command:"remove <symbol>",describe:"\u4ECE\u81EA\u9009\u5220\u9664\u80A1\u7968",builder:o=>o.positional("symbol",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 SH600519"}).option("category",{alias:"c",type:"number",default:1,describe:"\u5206\u7EC4 ID\uFF0C\u9ED8\u8BA4\u5168\u90E8"}),handler:async o=>{let r=o.symbol,s=o.category,a=await en(r,{category:s});console.log(a?.data?"\u5DF2\u5220\u9664":"\u5220\u9664\u5931\u8D25")}}),t.strictCommands(!1)),handler:async()=>{let t=await Bt("-1");Pn(t,"portfolio stocks")}}),e.command({command:"cube [code]",describe:"\u7EC4\u5408\u51C0\u503C\u8D70\u52BF",builder:t=>(t.positional("code",{type:"string",describe:"\u7EC4\u5408\u4EE3\u7801"}),t.command({command:"holding <code>",describe:"\u67E5\u770B\u7EC4\u5408\u6301\u4ED3",builder:o=>o.positional("code",{type:"string",describe:"\u7EC4\u5408\u4EE3\u7801"}),handler:async o=>{let r=o.code,s=await on(r);u({data:s,command:"portfolio cube holding "+r,source:"xq",toJSON:kr})}}),t.strictCommands(!1)),handler:async t=>{let o=t.code;if(!o){console.log("\u8BF7\u63D0\u4F9B\u7EC4\u5408\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow portfolio cube <code>");return}let r=await nn(o);u({data:r,command:"portfolio cube "+o,source:"xq",toJSON:Nr})}}),e.strictCommands(!1)),handler:async()=>{let e=await Ze();u({data:e,command:"portfolio",source:"xq",toJSON:Sr})}}),n}function In(n){return n.command("config","\u914D\u7F6E\u7BA1\u7406",e=>e.command("cookie [value]","\u67E5\u770B/\u8BBE\u7F6E\u96EA\u7403 Cookie",t=>t.positional("value",{type:"string"}),t=>{let{value:o}=t;if(o)Lt(o),console.log("Cookie \u5DF2\u4FDD\u5B58");else{let r=Rt();console.log(r?`\u5F53\u524D Cookie: ${r.slice(0,40)}...`:"\u672A\u8BBE\u7F6E Cookie\u3002\u8FD0\u884C finflow config login \u6216 finflow config cookie <value> \u8BBE\u7F6E")}}).command("login","\u4ECE\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie",{},()=>{try{console.log("\u6B63\u5728\u4ECE\u6D4F\u89C8\u5668\u83B7\u53D6 Cookie...");let t=z("xueqiu.com");Lt(t),console.log("Cookie \u5DF2\u4FDD\u5B58")}catch(t){console.error(t.message),process.exit(1)}}))}var I=Ar(qr(process.argv)).scriptName("finflow").version("1.5.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");fn(I);$n(I);Jn(I);En(I);Mn(I);Hn(I);In(I);I.parse();
7
+ ${m}`),process.exit(1)}let i=await St(a.id),c=v(i?.data?.depth_list||[]);if(c.length<r){let m=c[c.length-1]?.ctime;if(m){let d=await ce(a.id,{lastTime:m,rn:r-c.length}),l=v(d?.data?.depth_list||d?.data||[]);c=[...c,...l]}}u({data:i,command:"info news depth",source:"cls",toJSON:pn})}).command("hot","\u70ED\u95E8\u6587\u7AE0\u6392\u884C\uFF08cls\uFF09",o=>o,async()=>{let o=await le();u({data:o,command:"info news hot",source:"cls",toJSON:No})}).command("stock <code>","\u4E2A\u80A1\u65B0\u95FB\uFF08cls\uFF09",o=>o,async o=>{let{n:r=10}=o,s=o.code,a=await fe(s,{rn:r});u({data:a,command:"info news stock",source:"cls",toJSON:ko})}),async()=>{let t=await St(1e3);u({data:t,command:"info news",source:"cls",toJSON:pn})}).command("report <code>","\u673A\u6784\u7814\u62A5\uFF08xq\uFF09",t=>t,async t=>{let r=t.code,s=await rn(r);u({data:s,command:"info report",source:"xq",toJSON:vo})}).command("topic","\u4E13\u9898",t=>t.strictCommands(!1).command("search <keyword>","\u641C\u7D22\u8BDD\u9898",o=>o,async o=>{let{n:r=10}=o,s=o.keyword,a=await ct(),i=Array.isArray(a)?a:a?.data||[],c=s.toLowerCase(),m=i.filter(l=>(l.title||"").toLowerCase().includes(c)||(l.short_name||"").toLowerCase().includes(c)||(l.introduction||"").toLowerCase().includes(c));if(!m.length)return console.log(`\u672A\u627E\u5230\u5339\u914D "${s}" \u7684\u4E13\u9898`);let d=v(m.slice(0,r));u({data:d,command:"info topic search",source:"jin10",toJSON:gn})}).command("groups","\u8BDD\u9898\u5206\u7EC4",o=>o,async()=>{let o=await ct();u({data:o,command:"info topic groups",source:"jin10",toJSON:qo})}).command("hot","\u8D22\u8054\u793E\u9898\u6750",o=>o,async()=>{let o=await ue();u({data:o,command:"info topic hot",source:"cls",toJSON:r=>Ao(v(r))})}).command("show <id>","\u4E13\u9898\u6587\u7AE0\uFF08jin10\uFF09",o=>o,async o=>{let{n:r=10}=o,s=o.id,a=F(),i=a?{cookie:a}:void 0,c=new Set,m=[],d=1,l=50;for(;m.length<r&&d<=l;){let f=(await Te(s,{page:d},i))?.data?.list||[];if(!f.length)break;let y=0;for(let h of f)c.has(h.id)||(c.add(h.id),m.push(h),y++);if(y===0)break;d++,m.length<r&&await new Promise(h=>setTimeout(h,200))}let p=v(m);u({data:p,command:"info topic show",source:"jin10",toJSON:g=>({items:g.map(f=>({time:f.display_datetime,title:f.title,author:f.author?.nick,vip:f.vip})),total:g.length})})}),async t=>{let{n:o=10}=t,r=await ct(),s=v(Array.isArray(r)?r:r?.data||[]);if(s=s.slice(0,o),!s.length)return console.log("\u6682\u65E0\u6570\u636E");u({data:s,command:"info topic",source:"jin10",toJSON:gn})}),handler:async()=>{console.log("\u8BF7\u6307\u5B9A\u5B50\u547D\u4EE4\uFF0C\u4F8B\u5982: finflow info flash, finflow info news, finflow info topic")}})}function x(n){return n[n.length-1]}function L(n,e,t){return Math.max(e,Math.min(t,n))}function Oo(n){if(n.length<2)return 0;let e=n.reduce((o,r)=>o+r,0)/n.length,t=n.reduce((o,r)=>o+(r-e)**2,0)/(n.length-1);return Math.sqrt(t)}function gt(n){return n.map(e=>e.close)}function D(n,e){let t=[];for(let o=0;o<n.length;o++){if(o<e-1){t.push(NaN);continue}let r=n.slice(o-e+1,o+1);t.push(r.reduce((s,a)=>s+a,0)/e)}return t}function Wt(n,e){let t=[],o=2/(e+1),r=NaN;for(let s=0;s<n.length;s++){if(s<e-1){t.push(NaN);continue}if(s===e-1){r=n.slice(0,e).reduce((a,i)=>a+i,0)/e,t.push(r);continue}r=n[s]*o+r*(1-o),t.push(r)}return t}function jo(n,e=12,t=26,o=9){let r=Wt(n,e),s=Wt(n,t),a=r.map((l,p)=>isNaN(l)||isNaN(s[p])?NaN:l-s[p]),i=a.filter(l=>!isNaN(l)),c=Wt(i,o),m=a.slice(a.length-i.length),d=m.map((l,p)=>isNaN(l)||isNaN(c[p])?NaN:l-c[p]);return{macd:m,signal:c,histogram:d}}function Co(n,e=14){let t=[];if(n.length<e+1){for(let o=0;o<n.length;o++)t.push(NaN);return t}for(let o=0;o<n.length;o++){if(o<e){t.push(NaN);continue}if(o===e){let i=0,c=0;for(let l=1;l<=e;l++){let p=n[l]-n[l-1];p>0?i+=p:c-=p}let m=i/e,d=c/e;t.push(d===0?100:100-100/(1+m/d));continue}let r=t[o-1];if(isNaN(r)){t.push(NaN);continue}let s=0,a=0;for(let i=o-e+1;i<=o;i++){let c=n[i]-n[i-1];c>0?s+=c:a-=c}s/=e,a/=e,t.push(a===0?100:100-100/(1+s/a))}return t}function $o(n,e=20,t=2){let o=D(n,e),r=[],s=[],a=[],i=[];for(let c=0;c<n.length;c++){if(isNaN(o[c])){r.push(NaN),s.push(NaN),a.push(NaN),i.push(NaN);continue}let m=n.slice(c-e+1,c+1),d=Oo(m),l=o[c]+t*d,p=o[c]-t*d;r.push(l),s.push(p),a.push(o[c]===0?0:(l-p)/o[c]*100),i.push(l===p?.5:(n[c]-p)/(l-p))}return{upper:r,middle:o,lower:s,bandwidth:a,percentB:i}}function To(n,e=14){let t=[];for(let o=0;o<n.length;o++){if(o===0){t.push(n[o].high-n[o].low);continue}t.push(Math.max(n[o].high-n[o].low,Math.abs(n[o].high-n[o-1].close),Math.abs(n[o].low-n[o-1].close)))}return D(t,e)}function Xt(n,e=20){if(n.length<2)return{ratio:1,trend:"flat",avgVolume:n[0]?.volume??0};let t=n.slice(-e),o=t.reduce((i,c)=>i+c.volume,0)/t.length,r=x(n).volume,s=o===0?1:r/o,a="flat";if(t.length>=10){let i=t.slice(-5),c=t.slice(-10,-5),m=i.reduce((l,p)=>l+p.volume,0)/i.length,d=c.reduce((l,p)=>l+p.volume,0)/c.length;if(d>0){let l=(m-d)/d;l>.15?a="rising":l<-.15&&(a="falling")}}return{ratio:Math.round(s*100)/100,trend:a,avgVolume:Math.round(o)}}function Jo(n,e=9){let t=[],o=[],r=[];for(let s=0;s<n.length;s++){if(s<e-1){t.push(50),o.push(50),r.push(50);continue}let a=n.slice(s-e+1,s+1),i=Math.max(...a.map(d=>d.high)),c=Math.min(...a.map(d=>d.low)),m=i===c?50:(n[s].close-c)/(i-c)*100;if(s===e-1)t.push(m),o.push(m),r.push(3*m-2*m);else{let d=t[s-1],l=o[s-1],p=2/3*d+1/3*m,g=2/3*l+1/3*p,f=3*p-2*g;t.push(p),o.push(g),r.push(f)}}return{k:t,d:o,j:r}}function Ro(n,e=20){if(n.length<e)return{direction:"sideways",strength:0,description:"\u6570\u636E\u4E0D\u8DB3"};let t=gt(n),o=x(D(t,5)),r=x(D(t,10)),s=x(D(t,e)),a=t.length>=60?x(D(t,60)):NaN,i=x(t),c=0,m=0;i>o?c++:m++,o>r?c++:m++,r>s?c++:m++,isNaN(a)||(s>a?c++:m++);let d=isNaN(a)?3:4,l=Math.abs(c-m)/d,p=s===0?0:(i-s)/s,g=L(Math.round(l*60+Math.min(Math.abs(p)*500,40)),0,100),f,y,h=c/d;return h>.75?(f="up",y=`\u591A\u5934\u6392\u5217${isNaN(a)?"":"\uFF0C\u5747\u7EBF\u53D1\u6563"}\uFF0C\u4EF7\u683C${p>0?"\u9AD8\u4E8E":"\u8D34\u8FD1"}MA${e}`):h<.25?(f="down",y=`\u7A7A\u5934\u6392\u5217${isNaN(a)?"":"\uFF0C\u5747\u7EBF\u53D1\u6563"}\uFF0C\u4EF7\u683C${p<0?"\u4F4E\u4E8E":"\u8D34\u8FD1"}MA${e}`):(f="sideways",g=Math.round(g*.6),y="\u5747\u7EBF\u7EA0\u7F20\uFF0C\u65B9\u5411\u4E0D\u660E"),{direction:f,strength:g,description:y}}function Lo(n,e=20){if(n.length<e){let a=gt(n);return{supports:[Math.min(...a)],resistances:[Math.max(...a)]}}let t=[],o=[],r=gt(n);for(let a=e;a<n.length-1;a++){let i=Math.min(...n.slice(a-e,a).map(g=>g.low)),c=Math.min(...n.slice(a+1,a+1+e).map(g=>g.low)),m=n[a].low;m<=i&&m<=c&&(t.find(f=>Math.abs(f-m)/m<.01)||t.push(m));let d=Math.max(...n.slice(a-e,a).map(g=>g.high)),l=Math.max(...n.slice(a+1,a+1+e).map(g=>g.high)),p=n[a].high;p>=d&&p>=l&&(o.find(f=>Math.abs(f-p)/p<.01)||o.push(p))}let s=x(r);return t.sort((a,i)=>i-a),o.sort((a,i)=>a-i),{supports:t.filter(a=>a<s).slice(0,3),resistances:o.filter(a=>a>s).slice(0,3)}}function Do(n,e=20,t=2){let o=Xt(n,e),r=o.ratio>=t,s=r?`\u6210\u4EA4\u91CF\u5F02\u5E38\u653E\u5927\uFF0C\u4E3A${e}\u65E5\u5747\u91CF${o.ratio.toFixed(1)}\u500D`:`\u6210\u4EA4\u91CF\u6B63\u5E38\uFF0C\u4E3A${e}\u65E5\u5747\u91CF${o.ratio.toFixed(1)}\u500D`;return{isAnomalous:r,ratio:o.ratio,description:s}}function Eo(n,e=20){if(n.length<e+1)return{type:null,strength:0,description:"\u6570\u636E\u4E0D\u8DB3"};let t=n.slice(-e-1,-1),o=x(n),r=Math.max(...t.map(c=>c.high)),s=Math.min(...t.map(c=>c.low)),a=r-s,i=Xt(n,e);return o.close>r&&a>0?{type:"up",strength:L(Math.round((o.close-r)/a*50+(i.ratio>1.5?25:0)),0,100),description:`\u5411\u4E0A\u7A81\u7834${e}\u65E5\u9AD8\u70B9${r.toFixed(2)}\uFF0C\u653E\u91CF${i.ratio>1.5?"\u786E\u8BA4":"\u4E0D\u8DB3"}`}:o.close<s&&a>0?{type:"down",strength:L(Math.round((s-o.close)/a*50+(i.ratio>1.5?25:0)),0,100),description:`\u5411\u4E0B\u8DCC\u7834${e}\u65E5\u4F4E\u70B9${s.toFixed(2)}\uFF0C\u653E\u91CF${i.ratio>1.5?"\u786E\u8BA4":"\u4E0D\u8DB3"}`}:{type:null,strength:0,description:"\u65E0\u7A81\u7834\u4FE1\u53F7"}}function Zt(n){let e=gt(n);if(n.length<30)return{trend:{direction:"sideways",strength:0,score:1,maAlign:"\u6570\u636E\u4E0D\u8DB3"},momentum:{rsi:NaN,macdHistogram:NaN,score:1},volatility:{atr:0,bollingerBandwidth:0,score:3},volume:{volumeRatio:1,trend:"flat",score:3},pattern:{description:"\u6570\u636E\u4E0D\u8DB3",score:1},keyLevels:{support:[],resistance:[]},compositeScore:1,summary:"\u6570\u636E\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u8BC4\u5206"};let t=Ro(n,20),o=t.direction==="up"?L(Math.round(2.5+t.strength/100*2.5),1,5):t.direction==="down"?L(Math.round(2.5-t.strength/100*1.5),1,5):L(Math.round(2.5),1,3),r=x(D(e,5)),s=x(D(e,10)),a=x(D(e,20)),i=e.length>=60?x(D(e,60)):NaN,c=e.length>=60?`${r>s?"\u2191":"\u2193"}5 ${s>a?"\u2191":"\u2193"}10 ${a>i?"\u2191":"\u2193"}20 \u219160`:`${r>s?"\u2191":"\u2193"}5 ${s>a?"\u2191":"\u2193"}10`,m=Co(e,14),d=x(m),l=jo(e),p=x(l.histogram),g=isNaN(p)?0:p,f=3;if(isNaN(d)||(d>=50&&d<=70&&(f+=.5),d>=30&&d<50&&(f-=.5),d>80&&(f-=.5),d<20&&(f+=.5)),!isNaN(g)){if(g>0&&l.histogram.length>=3){let w=l.histogram;w[w.length-1]>w[w.length-2]&&w[w.length-2]>w[w.length-3]&&(f+=.5)}else if(g<0&&l.histogram.length>=3){let w=l.histogram;w[w.length-1]<w[w.length-2]&&w[w.length-2]<w[w.length-3]&&(f-=.5)}}f=L(Math.round(f),1,5);let y=To(n,14),h=x(y)||0,J=x(e)===0?0:h/x(e)*100,G=$o(e,20),B=x(G.bandwidth)||0,bt=x(G.percentB)||.5,q=3;J<1?q+=1:J>3&&(q-=1),B<5?q+=.5:B>20&&(q-=.5),q=L(Math.round(q),1,5);let $=Xt(n,20),S=3;t.direction==="up"&&$.trend==="rising"?S+=1.5:t.direction==="down"&&$.trend==="falling"?S+=.5:t.direction==="up"&&$.trend==="falling"?S-=1:t.direction==="down"&&$.trend==="rising"&&(S-=1.5),$.ratio>2?S+=.5:$.ratio<.5&&(S-=.5),S=L(Math.round(S),1,5);let j=Eo(n),_t=Do(n),C=Jo(n),T=x(C.k),Y=x(C.d),Or=x(C.j),E=[],R=3;if(j.type==="up"&&j.strength>30?(E.push("\u5411\u4E0A\u7A81\u7834"),R+=1):j.type==="down"&&j.strength>30&&(E.push("\u5411\u4E0B\u8DCC\u7834"),R-=1),_t.isAnomalous&&(E.push("\u653E\u91CF\u5F02\u52A8"),R+=j.type==="up"?.5:-.5),C.k.length>=2&&C.d.length>=2&&(C.k[C.k.length-2]<C.d[C.d.length-2]&&T>Y&&T<30&&(E.push("KDJ\u4F4E\u4F4D\u91D1\u53C9"),R+=.5),C.k[C.k.length-2]>C.d[C.d.length-2]&&T<Y&&T>70&&(E.push("KDJ\u9AD8\u4F4D\u6B7B\u53C9"),R-=.5)),l.macd.length>=2&&l.signal.length>=2){let w=l.macd.length;l.macd[w-2]<l.signal[w-2]&&l.macd[w-1]>l.signal[w-1]&&(E.push("MACD\u91D1\u53C9"),R+=.5),l.macd[w-2]>l.signal[w-2]&&l.macd[w-1]<l.signal[w-1]&&(E.push("MACD\u6B7B\u53C9"),R-=.5)}R=L(Math.round(R),1,5);let ae=E.length>0?E.join("\u3001"):"\u65E0\u660E\u663E\u5F62\u6001\u4FE1\u53F7",Bn=Lo(n),Un=o*.25+f*.25+q*.15+S*.2+R*.15,Fn=L(Math.round(Un*10)/10,1,5),Gn=t.direction==="up"?"\u504F\u591A":t.direction==="down"?"\u504F\u7A7A":"\u9707\u8361",Kn=isNaN(d)?"":d>70?"\uFF0CRSI\u8D85\u4E70":d<30?"\uFF0CRSI\u8D85\u5356":"",zn=`${Gn}${Kn}\uFF0C${ae}`;return{trend:{direction:t.direction,strength:t.strength,score:o,maAlign:c},momentum:{rsi:Math.round(d*100)/100,macdHistogram:isNaN(g)?0:Math.round(g*1e4)/1e4,score:f},volatility:{atr:Math.round(h*100)/100,bollingerBandwidth:Math.round(B*100)/100,score:q},volume:{volumeRatio:$.ratio,trend:$.trend,score:S},pattern:{description:ae,score:R},keyLevels:Bn,compositeScore:Fn,summary:zn}}function et(n){let e=n.result||{},t=(o,r)=>({label:o,netBuy:r?.netBuyTurnover??null,netBuyText:r?.netBuyTurnoverText||null,turnover:r?.tradValSum??null,status:r?.tradeStatus||null});return{northbound:{shanghai:t("\u5317\u5411\u8D44\u91D1(\u6CAA)",e.shMarketFlowDetail),shenzhen:t("\u5317\u5411\u8D44\u91D1(\u6DF1)",e.szMarketFlowDetail),total:t("\u5317\u5411\u5408\u8BA1",e.shSZTotalMarketFlowDetail)},southbound:{shanghai:t("\u5357\u5411\u8D44\u91D1(\u6CAA)",e.hkSHMarketFlowDetail),shenzhen:t("\u5357\u5411\u8D44\u91D1(\u6DF1)",e.hkSZMarketFlowDetail),total:t("\u5357\u5411\u5408\u8BA1",e.hkSHSZTotalMarketFlowDetail)},source:"glh"}}var Po="https://query1.finance.yahoo.com/v8/finance/chart",Mo={"User-Agent":"Mozilla/5.0"};async function te(n){let e=n.trim().toUpperCase(),t=`${Po}/${encodeURIComponent(e)}?interval=1d&range=1d`;try{let s=(await(await fetch(t,{headers:Mo})).json())?.chart?.result;if(!Array.isArray(s)||s.length===0)return null;let a=s[0]?.meta;if(!a?.symbol)return null;let i=Number(a.regularMarketPrice??0),c=Number(a.chartPreviousClose??0),m=i-c,d=c===0?0:m/c*100;return{symbol:a.symbol,name:a.shortName??"",price:i,prevClose:c,change:m,changePercent:d,currency:a.currency??"",exchange:a.exchangeName??"",marketState:a.marketState??""}}catch{return null}}function Ho(n){let e=n?.data||{};return{code:e.secu_code||"",name:e.secu_name||"",price:Number(e.last_px||0),change:Number(e.change_px||0),changePercent:Math.round(Number(e.change||0)*1e4)/100,open:Number(e.open_px||0),high:Number(e.high_px||0),low:Number(e.low_px||0),preclose:Number(e.preclose_px||0),volume:Number(e.business_amount||0),amount:Number(e.business_balance||0),turnoverRate:Number(e.tr||0),amplitude:Number(e.amp||0),avgPrice:Number(e.av_px||0),volumeRatio:Number(e.qrr||0),pe:e.pe!=null?Number(e.pe):null,pb:e.pb!=null?Number(e.pb):null,marketCap:Number(e.mc||0),change3d:e.change_3!=null?Number(e.change_3):null,change5d:e.change_5!=null?Number(e.change_5):null,status:e.trade_status==="TRADE"?"trading":"closed",source:"cls"}}function Io(n){return{items:n.map(e=>{let t=e.quote||e;return{code:t.symbol||"",name:t.name||"",price:t.current??0,change:t.chg??0,changePercent:Math.round((t.percent??0)*100)/100,volume:t.volume??0,amount:t.amount??0,turnoverRate:t.turnover_rate??0,marketCap:t.market_capital??0,high:t.high??0,low:t.low??0,open:t.open??0}}),total:n.length}}function Bo(n){let e=n?.data||{},t=Number(e.last_px??0);return!!(e.secu_name||e.secu_code)&&Number.isFinite(t)&&t!==0}function Uo(n){if(!n)return!1;let e=Number(n.current??n.price??0);return!!(n.symbol||n.name)&&Number.isFinite(e)&&e!==0}function Fo(n){let e=n.trim().toUpperCase();return e?/^[A-Z]+$/.test(e)||/^\d{4}\.T$/.test(e)||/^\d{6}\.(KS|KQ)$/.test(e)||/^\d{4,5}\.HK$/.test(e)?e:/^\d{6}\.(SS|SH)$/.test(e)?`${e.slice(0,6)}.SS`:/^\d{6}\.SZ$/.test(e)?e:/^(SH|SZ)\d{6}$/.test(e)?e.startsWith("SH")?`${e.slice(2)}.SS`:`${e.slice(2)}.SZ`:/^\d{6}$/.test(e)?e.startsWith("6")?`${e}.SS`:`${e}.SZ`:null:null}async function Go(n){let e=n.toUpperCase().startsWith("SH")||n.toUpperCase().startsWith("SZ")?[n.toUpperCase()]:/^\d{6}$/.test(n)?[n.startsWith("6")?"SH"+n:"SZ"+n]:[n.toUpperCase()];try{let o=(await V(e))?.data?.items||[];return o[0]?.quote||o[0]||null}catch{let t=await Et(e);return(t?.data||t?.items||[])[0]||null}}function Ko(n){return{code:n.symbol,name:n.name,price:n.price,change:n.change,changePercent:n.changePercent,preclose:n.prevClose,currency:n.currency,exchange:n.exchange,marketState:n.marketState,status:n.marketState==="REGULAR"?"trading":"closed",source:"yahoo"}}async function hn(n,e,t,o){let r=ee.has(e);if(o==="xq"||!o&&r){let g=await lt(n,{period:e,count:t});return{candles:(g?.data?.item||g?.data||[]).map(h=>({date:new Date(h[0]).toISOString().slice(0,10),open:Number(h[2]),high:Number(h[3]),low:Number(h[4]),close:Number(h[5]),volume:Number(h[1]),amount:Number(h[9]||0),turnoverRate:Number(h[8]||0)})),source:"xq"}}let a=e==="w"?"w":e==="m"?"m":e==="y"?"y":e==="5d"?"5d":"d",i=[],c,m=0,d=50;for(;i.length<t&&m++<d;){let f=(await rt(n,{period:a,limit:Math.min(t-i.length,200),start_date:c}))?.data||[];if(!f.length)break;i=[...f,...i],c=String(f[0].trade_date)}return{candles:i.slice(-t).map(g=>({date:String(g.trade_date).replace(/(\d{4})(\d{2})(\d{2})/,"$1-$2-$3"),open:Number(g.open_px),high:Number(g.high_px),low:Number(g.low_px),close:Number(g.close_px),volume:Number(g.business_amount||0)})),source:"cls"}}var ee=new Set(["1m","5m","15m","30m","60m","120m"]);function yn(n,e,t){return{code:n,period:e,items:t.map(o=>({date:String(o.trade_date),open:Number(o.open_px),high:Number(o.high_px),low:Number(o.low_px),close:Number(o.close_px),volume:Number(o.business_amount||0),change:Number(o.change||0)})),total:t.length}}function bn(n,e,t){return{code:n,period:e,items:t.map(o=>({date:new Date(o[0]).toISOString().slice(0,10),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:t.length}}function _n(n,e){return{code:n,preclose:Number(e.preclose_px||0),asks:[5,4,3,2,1].map(t=>({price:Number(e[`s_px_${t}`]||0),volume:Number(e[`s_amount_${t}`]||0)})),bids:[1,2,3,4,5].map(t=>({price:Number(e[`b_px_${t}`]||0),volume:Number(e[`b_amount_${t}`]||0)})),source:"cls"}}function wn(n,e){let t=e.current??0,o=e.percent??0,r=o!==0?t/(1+o/100):0;return{code:n,current:t,preclose:r,asks:[1,2,3,4,5].map(s=>({price:Number(e[`sp${s}`]||0),volume:Number(e[`sc${s}`]||0)})),bids:[5,4,3,2,1].map(s=>({price:Number(e[`bp${s}`]||0),volume:Number(e[`bc${s}`]||0)})),buyPercent:e.buypct??null,sellPercent:e.sellpct??null,buySellRatio:e.ratio??null,source:"xq"}}function Sn(n,e){let t=e?.data?.volume||[],o=e?.data?.end||t.length;return{code:n,items:t.map(r=>{let s=String(r.minute),a=s.length<=3?"0"+s[0]:s.slice(0,2),i=s.length<=3?s.slice(1):s.slice(2),c=s.slice(-2);return{time:`${a}:${i}:${c}`,price:Number(r.last_px||0),volume:Number(r.change_vol||0),side:r.change_vol_color===1?"buy":"sell"}}),total:o}}function xn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,50).map(o=>({time:new Date(o.timestamp).toISOString(),price:Number(o.current||o.price||0),volume:Number(o.trade_volume||o.volume||0),side:o.side==="buy"||o.side===1?"buy":"sell"})),total:t.length}}function Nn(n,e){let t=e?.data||{},o=t.line||[],r=Number(t.preclose_px||0);return{code:n,preclose:r,items:o.map(s=>{let a=String(s.minute),i=a.length<=3?"0"+a[0]:a.slice(0,2),c=a.length<=3?a.slice(1):a.slice(2),m=Number(s.last_px||0);return{time:`${i}:${c}`,price:m,avgPrice:Number(s.av_px||0),changePercent:r>0?(m-r)/r*100:0,amount:Number(s.business_balance||0)}}),total:o.length}}function kn(n,e){let t=e?.data?.items||[];return{code:n,items:t.slice(0,240).map(o=>({time:new Date(o.timestamp).toISOString(),price:Number(o.current||0),volume:Number(o.volume||0),avgPrice:Number(o.avg_price||0)})),total:t.length}}function vn(n,e){return{type:e,items:n.map(t=>({code:t.secu_code||"",name:t.plate_name||t.secu_name||"",changePercent:Math.round((t.change||0)*100*100)/100})),total:n.length}}function An(n){return{items:n.map(e=>({code:e.secu_code||"",name:e.secu_name||"",changePercent:Math.round((e.change||0)*100*100)/100,topStocks:(e.up_stock||[]).slice(0,3).map(t=>({name:t.secu_name?.trim()||"",changePercent:Math.round((t.change||0)*100*100)/100}))})),total:n.length}}function zo(n){let e=(n?.data?.stocks||[]).map(t=>({code:t.secu_code||"",name:t.secu_name||"",price:t.last_px??null,changePercent:Math.round((t.change??0)*1e4)/100,marketCap:t.cmc??null,fundflow:t.fundflow??null,isCore:!!t.is_core,reason:t.assoc_desc||""}));return{items:e,total:e.length}}function Qo(n){let e=n?.data||{},t=e.company||{};return{name:t.org_name_cn||"",industry:(e.industry||[]).map(o=>o.ind_name),concept:(e.concept||[]).map(o=>o.ind_name),companyType:t.classi_name||"",region:t.provincial_name||"",listedDate:t.listed_date||"",controller:t.actual_controller||"",mainBusiness:t.main_operation_business||""}}function Yo(n){let e=n?.data||{};return{mainInflow:Number(e.main_fund_in||0),mainOutflow:Number(e.main_fund_out||0),mainNet:Number(e.main_fund_diff||0),superNet:Number(e.super_fund_diff||0),largeNet:Number(e.large_fund_diff||0),mediumNet:Number(e.medium_fund_diff||0),smallNet:Number(e.little_fund_diff||0),mainNet3d:e.main_fund_3!=null?Number(e.main_fund_3):null,mainNet5d:e.main_fund_5!=null?Number(e.main_fund_5):null,mainNet10d:e.main_fund_10!=null?Number(e.main_fund_10):null,mainNet20d:e.main_fund_20!=null?Number(e.main_fund_20):null,source:"cls"}}function qn(n){let e=n?.data||{},t=e.items||[];return{items:t.map(o=>({time:o.timestamp?new Date(o.timestamp).toISOString():"",amount:Number(o.amount||0)})),total:t.length,summary:e.sum3!=null?{sum3:Number(e.sum3),sum5:Number(e.sum5),sum10:Number(e.sum10),sum20:Number(e.sum20)}:null}}function Vo(n){let e=n?.data?.items||[];return{items:e.map(t=>({date:t.td_date?new Date(t.td_date).toISOString().slice(0,10):"",marginBalance:Number(t.margin_trading_amt_balance||0),shortBalance:Number(t.short_selling_amt_balance||0),marginNetBuy:Number(t.margin_trading_net_buy_amt||0),marginBuy:Number(t.margin_trading_buy_amt||0)})),total:e.length}}function Wo(n){let e=n?.data?.items||n?.data||[];return{items:e.map((t,o)=>({rank:o+1,holderName:t.holder_name||"",shares:Number(t.held_num||0),ratio:Number(t.held_ratio||0),change:t.chg_amount??t.change??null})),total:e.length}}function Xo(n){let e=n?.data?.items||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({period:t.dividend_year||"",exDividendDate:t.ashare_ex_dividend_date?new Date(t.ashare_ex_dividend_date).toISOString().slice(0,10):"",equityDate:t.equity_date?new Date(t.equity_date).toISOString().slice(0,10):"",plan:t.plan_explain||""})),total:e.length}:{items:[],total:0}}function Zo(n){let e=n?.data?.items||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({date:t.begin?new Date(t.begin).toISOString().slice(0,10):"",title:t.content||""})),total:e.length}:{items:[],total:0}}function nt(n){return Array.isArray(n)?n[0]:n}function On(n){let e=n?.data||{},t=e.list||[];return{name:e.quote_name||"",items:t.map(o=>({report:o.report_name||"",roe:nt(o.avg_roe),eps:nt(o.basic_eps),grossMargin:nt(o.gross_selling_rate),revenueYoy:nt(o.operating_income_yoy)})),total:t.length}}function tr(n,e){let t=n?.data||{},o=t.list||[],r={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"]},s={cashflow:["report","operating","investing","financing","netIncrease"],income:["report","revenue","netProfit","netProfitAttrib","netProfitDeducted"],balance:["report","totalAssets","totalLiab","debtRatio","equity"]},a=r[e]||r.cashflow,i=s[e]||s.cashflow;return{name:t.quote_name||"",type:e,items:o.map(c=>{let m={report:c.report_name||""};for(let d=1;d<a.length;d++)m[i[d]]=nt(c[a[d]]);return m}),total:o.length}}function er(n){let e=n?.data||n?.list||[],t={1:"stock",2:"fund",3:"index"};return{items:e.map(o=>({code:o.code||o.symbol||"",name:o.query||o.name||o.cn_name||"",type:o.type?t[o.type]||String(o.type):""})),total:e.length}}function nr(n){let t=(n?.data||{}).items||[];return{items:t.map(o=>({time:o.timestamp?new Date(o.timestamp).toISOString():"",amount:Number(o.amount||0)})),total:t.length}}function or(n){let e=(n?.data?.industries||[]).map(t=>({code:t.encode||"",name:t.name||"",pinyin:t.pinyin||""}));return{items:e,total:e.length}}function jn(n,e){return{items:n.map(t=>({code:t.symbol||"",name:t.name||"",price:t.current??null,changePercent:Math.round((t.percent??0)*100)/100,amount:t.amount??null,volume:t.volume??null,marketCap:t.market_capital??null,pe:t.pe_ttm??null,pb:t.pb??null,turnoverRate:t.turnover_rate??null})),total:e??n.length}}async function Cn(n){let e=[],t,o=1,r=12;for(;e.length<n.n&&o<=r;){let s=await Ie({page:o,size:Math.min(90,n.n-e.length),order:n.order,order_by:n.order_by,market:n.market,ind_code:n.ind_code,type:n.type});if(s?.error_code)throw new Error(`\u96EA\u7403\u7B5B\u9009\u63A5\u53E3\u9519\u8BEF: ${s.error_description||s.error_code}`);let a=s?.data?.list||[];if(t=s?.data?.count??t,!a.length)break;e.push(...a),o++}return{list:e,count:t}}function $n(n){return n.command({command:"quote [code]",describe:"\u8BC1\u5238\u884C\u60C5\uFF08\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF0C\u81EA\u52A8\u8BC6\u522B\u6570\u636E\u6E90\uFF09",builder:e=>e.positional("code",{type:"string",describe:"\u8BC1\u5238\u4EE3\u7801\uFF08A\u80A1: sh600519 / 600519\uFF0C\u6E2F\u80A1: 00700\uFF0C\u7F8E\u80A1: AAPL\uFF09"}).strictCommands(!1).command("batch <codes...>","\u6279\u91CF\u884C\u60C5\uFF08\u96EA\u7403\uFF0C\u652F\u6301 A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1\uFF09",t=>t,async t=>{let o=t.codes,r=o.map(i=>{let c=i.toUpperCase();return c.startsWith("SH")||c.startsWith("SZ")?c:/^\d{6}$/.test(i)?i.startsWith("6")?"SH"+i:"SZ"+i:c}),s,a;try{s=await V(r),a=s?.data?.items||[],a.length&&a[0]?.quote&&(a=a.map(i=>({...i.quote,market:i.market})))}catch{s=await Et(r),a=s?.data||s?.items||[]}u({data:a,command:`quote batch ${o.join(" ")}`,source:"xq",toJSON:()=>Io(a)})}).command("related <code>","\u5173\u8054\u80A1\u7968\uFF08xueqiu\uFF09",t=>t,async t=>{let o=t.code,s=await Ee(o),a=s?.data?.items||s?.data||[];u({data:s,command:`quote related ${o}`,source:"xq",toJSON:()=>({items:a.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\uFF09",t=>t,async t=>{let o=t.keyword,r=await Me(o);u({data:r,command:`quote search ${o}`,source:"xq",toJSON:er})}).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",t=>t.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 t=>{let{n:o=30}=t,r=t.ind_code,s=String(t.market??"cn").toLowerCase(),a=t["order-by"]??"percent",i=t.order??"desc";if(!r){let d=await He({category:s});if(d?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${d.error_description||d.error_code}`);return u({data:d,command:`quote industry --market ${s}`,source:"xq",toJSON:or})}let{list:c,count:m}=await Cn({n:o,order:i,order_by:a,market:s.toUpperCase(),ind_code:r});u({data:{list:c},command:`quote industry ${r} --market ${s}`,source:"xq",toJSON:()=>jn(c,m)})}).command("board <type>","\u677F\u5757/\u5E02\u573A\u4E00\u89C8\u6210\u5206\u80A1\uFF08\u96EA\u7403\uFF09",t=>t.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 t=>{let{n:o=30}=t,r=t.type,s=t["order-by"]??"percent",a=t.order??"desc",i=r==="hk"?"HK":r==="us"||r==="us_china"?"US":"CN",{list:c,count:m}=await Cn({n:o,order:a,order_by:s,market:i,type:r});u({data:{list:c},command:`quote board ${r}`,source:"xq",toJSON:()=>jn(c,m)})}).command("ta [code]","\u6280\u672F\u9762\u91CF\u5316\u5206\u6790",t=>t.positional("code",{type:"string"}).option("period",{alias:"p",type:"string",default:"d"}).option("count",{alias:"c",type:"number",default:120,describe:"K\u7EBF\u6761\u6570"}).option("src",{type:"string",choices:["cls","xq"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async t=>{let{p:o="d",src:r}=t,s=t.count??120,a=t.code;try{let{candles:i,source:c}=await hn(a,o,s,r);if(!i.length)return console.log("\u6682\u65E0\u6570\u636E");let m=Zt(i);u({data:m,command:`quote ta ${a} -p ${o} -c ${s}`,source:c})}catch(i){if(ee.has(o)&&!r){console.error(i.message||i);return}let m=r==="xq"?"cls":"xq";try{let{candles:d,source:l}=await hn(a,o,s,m);if(!d.length)return console.log("\u6682\u65E0\u6570\u636E");let p=Zt(d);u({data:p,command:`quote ta ${a} -p ${o} -c ${s}`,source:`${m} fallback`})}catch(d){console.error(d.message||d)}}}).command("kline [code]","K\u7EBF",t=>t.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"],describe:"\u6570\u636E\u6E90\uFF08\u7F8E\u80A1/\u6E2F\u80A1\u8BF7\u7528 xq\uFF09"}),async t=>{let{p:o="d",n:r=120,src:s}=t,a=t.code,i=ee.has(o),c=s==="xq"||!s&&i;try{if(c){let m=await lt(a,{period:o,count:r}),d=m?.data?.item||m?.data||[];return u({data:m,command:`quote kline ${a} -p ${o}`,source:"xq",toJSON:()=>bn(a,o,d)})}else{let m=o==="w"?"w":o==="m"?"m":o==="y"?"y":o==="5d"?"5d":"d",d=[],l,p=0,g=50;for(;d.length<r&&p++<g;){let h=(await rt(a,{period:m,limit:Math.min(r-d.length,200),start_date:l}))?.data||[];if(!h.length)break;d=[...h,...d],l=String(h[0].trade_date)}let f=d.slice(-r);return u({data:f,command:`quote kline ${a} -p ${o}`,source:"cls",toJSON:y=>yn(a,m,y)})}}catch{if(i&&!s)throw new Error("xq K\u7EBF\u8BF7\u6C42\u5931\u8D25\uFF0C\u5206\u949F\u7EBF\u65E0\u5907\u9009\u6570\u636E\u6E90");if((c?"cls":"xq")==="xq"){let d=await lt(a,{period:o,count:r}),l=d?.data?.item||d?.data||[];u({data:d,command:`quote kline ${a} -p ${o}`,source:"xq fallback",toJSON:()=>bn(a,o,l)})}else{let d=o==="w"?"w":o==="m"?"m":o==="y"?"y":o==="5d"?"5d":"d",l=[],p,g=0,f=50;for(;l.length<r&&g++<f;){let J=(await rt(a,{period:d,limit:Math.min(r-l.length,200),start_date:p}))?.data||[];if(!J.length)break;l=[...J,...l],p=String(J[0].trade_date)}let y=l.slice(-r);u({data:y,command:`quote kline ${a} -p ${o}`,source:"cls fallback",toJSON:h=>yn(a,d,h)})}}}).command("depth [code]","\u4E94\u6863\u76D8\u53E3",t=>t.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 t=>{let{src:o="cls"}=t,r=t.code,s=o;try{if(s==="xq"){let a=await Pt(r);return u({data:a,command:`quote depth ${r} --src xq`,source:"xq",toJSON:i=>wn(r,i?.data||{})})}else{let a=await Nt(r);return u({data:a,command:`quote depth ${r}`,source:"cls",toJSON:i=>_n(r,i?.data||{})})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Pt(r);u({data:i,command:`quote depth ${r} --src xq`,source:"xq fallback",toJSON:c=>wn(r,c?.data||{})})}else{let i=await Nt(r);u({data:i,command:`quote depth ${r}`,source:"cls fallback",toJSON:c=>_n(r,c?.data||{})})}}}).command("ticks [code]","\u9010\u7B14\u6210\u4EA4",t=>t.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 t=>{let{src:o="cls"}=t,r=t.code,s=o;try{if(s==="xq"){let a=await Ht(r);return u({data:a,command:`quote ticks ${r} --src xq`,source:"xq",toJSON:i=>xn(r,i)})}else{let a=await kt(r);return u({data:a,command:`quote ticks ${r}`,source:"cls",toJSON:i=>Sn(r,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Ht(r);u({data:i,command:`quote ticks ${r} --src xq`,source:"xq fallback",toJSON:c=>xn(r,c)})}else{let i=await kt(r);u({data:i,command:`quote ticks ${r}`,source:"cls fallback",toJSON:c=>Sn(r,c)})}}}).command("timeline [code]","\u5206\u65F6\u7EBF",t=>t.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 t=>{let{src:o="cls"}=t,r=t.code,s=o;try{if(s==="xq"){let a=await Mt(r,{period:"1d"});return u({data:a,command:`quote timeline ${r} --src xq`,source:"xq",toJSON:i=>kn(r,i)})}else{let a=await vt(r);return u({data:a,command:`quote timeline ${r}`,source:"cls",toJSON:i=>Nn(r,i)})}}catch{if((s==="xq"?"cls":"xq")==="xq"){let i=await Mt(r,{period:"1d"});u({data:i,command:`quote timeline ${r} --src xq`,source:"xq fallback",toJSON:c=>kn(r,c)})}else{let i=await vt(r);u({data:i,command:`quote timeline ${r}`,source:"cls fallback",toJSON:c=>Nn(r,c)})}}}).command("sector [code]","\u677F\u5757",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("rank","\u677F\u5757\u6392\u884C",o=>o.option("type",{alias:"t",type:"string",default:"industry"}),async o=>{let{t:r="industry"}=o,s=await xt({type:r}),a=Array.isArray(s?.data)?s.data:[];u({data:s,command:`quote sector rank -t ${r}`,source:"cls",toJSON:()=>vn(a,r)})}).command("plate <code>","\u4E2A\u80A1\u677F\u5757",o=>o,async o=>{let r=o.code,s=await At(r),a=Array.isArray(s?.data)?s.data:[];u({data:s,command:`quote sector plate ${r}`,source:"cls",toJSON:()=>An(a)})}).command("industry <code>","\u884C\u4E1A\u4FE1\u606F",o=>o,async o=>{let r=o.code,s=r.length<=6?r.toUpperCase().startsWith("SH")||r.toUpperCase().startsWith("SZ")?r:r.toUpperCase():r,a=await Ye(s);u({data:a,command:`quote sector industry ${r}`,source:"xq",toJSON:Qo})}).command("stocks <plate_code>","\u677F\u5757/\u6982\u5FF5\u6210\u5206\u80A1\uFF08plate_code \u6765\u81EA sector rank / sector plate\uFF09",o=>o.positional("plate_code",{type:"string"}).option("way",{type:"string",default:"change",describe:"\u6392\u5E8F\uFF1Achange(\u6DA8\u8DCC\u5E45)/last_px(\u4EF7)/amount"}),async o=>{let{way:r="change"}=o,s=o.plate_code,a=await pe(s,{way:r});u({data:a,command:`quote sector stocks ${s}`,source:"cls",toJSON:zo})}),async t=>{let{code:o}=t;if(o){let r=await At(o),s=Array.isArray(r?.data)?r.data:[];u({data:r,command:`quote sector ${o}`,source:"cls",toJSON:()=>An(s)})}else{let r=await xt({type:"industry"}),s=Array.isArray(r?.data)?r.data:[];u({data:r,command:"quote sector",source:"cls",toJSON:()=>vn(s,"industry")})}}).command("flow [code]","\u8D44\u91D1\u6D41\u5411",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("market","\u5317\u5411/\u5357\u5411\u8D44\u91D1",o=>o,async()=>{let o=await X();u({data:o,command:"quote flow market",source:"glh",toJSON:et})}).command("history <code>","\u5386\u53F2\u8D44\u91D1\u6D41",o=>o.option("count",{alias:"c",type:"number",default:20}),async o=>{let{c:r=20}=o,s=o.code,a=await We(s,{count:r});u({data:a,command:`quote flow history ${s}`,source:"xq",toJSON:qn})}).command("margin <code>","\u878D\u8D44\u878D\u5238",o=>o,async o=>{let r=o.code,s=await Xe(r);u({data:s,command:`quote flow margin ${r}`,source:"xq",toJSON:Vo})}).command("intraday <code>","\u5F53\u65E5\u8D44\u91D1\u6D41\u5411\uFF08xueqiu\uFF09",o=>o,async o=>{let r=o.code,a=await It(r);u({data:a,command:`quote flow intraday ${r}`,source:"xq",toJSON:qn})}).command("xq <code>","\u96EA\u7403\u8D44\u91D1\u6D41",o=>o,async o=>{let r=o.code,a=await It(r);u({data:a,command:`quote flow xq ${r}`,source:"xq",toJSON:nr})}),async t=>{let{code:o}=t;if(o){let r=await ge(o);u({data:r,command:`quote flow ${o}`,source:"cls",toJSON:Yo})}else{let r=await X();u({data:r,command:"quote flow market",source:"glh",toJSON:et})}}).command("f10 [code]","\u57FA\u672C\u9762",t=>t.positional("code",{type:"string"}).strictCommands(!1).command("holders <code>","\u5341\u5927\u80A1\u4E1C",o=>o,async o=>{let r=o.code,s=await ze(r);u({data:s,command:`quote f10 holders ${r}`,source:"xq",toJSON:Wo})}).command("bonus <code>","\u5206\u7EA2\u9001\u80A1",o=>o,async o=>{let r=o.code,s=await Ve(r);u({data:s,command:`quote f10 bonus ${r}`,source:"xq",toJSON:Xo})}).command("event <code>","\u516C\u53F8\u5927\u4E8B",o=>o,async o=>{let r=o.code,s=await Pe(r);u({data:s,command:`quote f10 event ${r}`,source:"xq",toJSON:Zo})}).command("indicator <code>","\u4E3B\u8981\u6307\u6807",o=>o,async o=>{let r=o.code,s=await Qe(r);u({data:s,command:`quote f10 indicator ${r}`,source:"xq",toJSON:On})})).command("finance [code]","\u8D22\u52A1\u62A5\u8868",t=>t.positional("code",{type:"string"}).option("type",{alias:"t",type:"string",choices:["indicator","cashflow","income","balance"],default:"indicator"}),async t=>{let{t:o="indicator"}=t,r=t.code;if(o==="indicator"){let s=await Ue(r);u({data:s,command:`quote finance indicator ${r}`,source:"xq",toJSON:On})}else{let a={cashflow:Fe,income:Ge,balance:Ke}[o];if(!a)return console.log(`\u672A\u77E5\u7C7B\u578B: ${o}`);let i=await a(r);u({data:i,command:`quote finance ${o} ${r}`,source:"xq",toJSON:c=>tr(c,o)})}}),handler:async e=>{let t=e.code;if(!t){console.log("\u8BF7\u63D0\u4F9B\u8BC1\u5238\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow quote sh600519 / finflow quote AAPL"),console.log("\u8FD0\u884C finflow quote --help \u67E5\u770B\u6240\u6709\u5B50\u547D\u4EE4");return}if(["search","batch","related","industry","board","kline","ta","depth","ticks","timeline","sector","flow","f10","finance"].includes(t)){console.log(`\u8BF7\u63D0\u4F9B\u5B50\u547D\u4EE4\u53C2\u6570\uFF0C\u4F8B\u5982: finflow quote ${t} <code>`);return}try{let a=await de(t);if(Bo(a)){u({data:a,command:`quote ${t}`,source:"cls",toJSON:Ho});return}}catch{}let r=null;try{r=await Go(t)}catch{}if(Uo(r)){u({data:r,command:`quote ${t}`,source:"xq fallback",toJSON:a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,change:a.chg??0,changePercent:Math.round((a.percent??0)*100)/100,open:a.open??0,high:a.high??0,low:a.low??0,preclose:a.last_close??0,volume:a.volume??0,amount:a.amount??0,turnoverRate:a.turnover_rate??0,amplitude:a.amplitude??0,avgPrice:a.avg_price??0,volumeRatio:a.volume_ratio??0,pe:a.pe_ttm??null,pb:a.pb??null,marketCap:a.market_capital??0,change3d:null,change5d:null,status:a.status===1?"trading":"closed",source:"xq fallback"})});return}let s=Fo(t);if(s){let a=await te(s);if(a){u({data:a,command:`quote ${t}`,source:"yahoo fallback",toJSON:Ko});return}}if(r){u({data:r,command:`quote ${t}`,source:"xq fallback",toJSON:a=>({code:a.symbol||"",name:a.name||"",price:a.current??0,change:a.chg??0,changePercent:Math.round((a.percent??0)*100)/100,open:a.open??0,high:a.high??0,low:a.low??0,preclose:a.last_close??0,volume:a.volume??0,amount:a.amount??0,turnoverRate:a.turnover_rate??0,amplitude:a.amplitude??0,avgPrice:a.avg_price??0,volumeRatio:a.volume_ratio??0,pe:a.pe_ttm??null,pb:a.pb??null,marketCap:a.market_capital??0,change3d:null,change5d:null,status:a.status===1?"trading":"closed",source:"xq fallback"})});return}throw new Error(`cls\u3001xq \u548C Yahoo \u5747\u65E0\u6CD5\u83B7\u53D6 ${t} \u7684\u884C\u60C5\u6570\u636E`)}})}function rr(n){let e=n?.data||{},t=e.limit_up_board||{},o=e.up_down_dis||{};return{marketDegree:e.market_degree||0,limitUp:Number(e.up_ratio_num||0),limitOpen:Number(e.up_open_num||0),sealRate:parseFloat(e.up_ratio)||0,turnover:e.shsz_balance||"",turnoverChange:e.shsz_balance_change_px||"",limitUpBoard:t.row2?{total:t.row2[0]||0,first:t.row2[1]||0,second:t.row2[2]||0,third:t.row2[3]||0,promoteRate:t.row3?{first:t.row3[1]||"",second:t.row3[2]||"",third:t.row3[3]||""}:{}}:null,prevPerformance:e.performance||"",gapUpRate:e.up_open_ratio||"",profitRate:e.profit_ratio||"",distribution:o.status?{limitUp:Number(o.up_num||0),limitDown:Number(o.down_num||0),rise:Number(o.rise_num||0),fall:Number(o.fall_num||0),flat:Number(o.flat_num||0),suspend:Number(o.suspend_num||0)}:null,source:"cls"}}function Tn(n){let e=n.result||[],t=e.filter(r=>r.category==="\u6307\u6570"),o=e.filter(r=>r.category==="\u6CAA\u6E2F\u6DF1\u901A");return{indices:t.map(r=>({name:r.name,value:Number(r.value||0),change:Number(r.change||0),changePercent:Number(r.netChange||0)})),capitalFlow:o.map(r=>({name:r.name,shanghai:r.sh??null,shenzhen:r.sz??null})),source:"glh"}}function ar(n){let e=n?.data,t=Array.isArray(e)?e:e?.data||[];return{items:t.map(o=>({code:o.secu_code||"",name:o.secu_name||"",change:o.change_px??null,changePercent:o.change??null})),total:t.length}}function sr(n){let e=n.result||[];return{items:e.map(t=>({name:t.stockName||"",code:(t.stockType||"")+(t.stockCode||""),price:t.currentPrice??null,changePercent:t.netChange??null})),total:e.length}}function ir(n){let e=(n?.data?.items||[]).map(t=>({code:t.symbol||"",name:t.name||"",close:t.close??null,changePercent:Math.round((t.percent??0)*100)/100,volume:t.volume??null,amount:t.amount??null,reasons:t.type_name||[]}));return{items:e,total:n?.data?.items_size??e.length}}function Jn(n){return n.command({command:"market",describe:"\u5E02\u573A\u603B\u89C8",builder:e=>e.strictCommands(!1).command("emotion","\u5E02\u573A\u60C5\u7EEA\uFF08cls\uFF09",t=>t,async()=>{let t=await he();u({data:t,command:"market emotion",source:"cls",toJSON:rr})}).command("rank [type]","\u6DA8\u8DCC\u6392\u884C\uFF08cls\uFF09",t=>t,async t=>{let o=t.type||"change",r=jt[o]||jt.change,s=await me({way:r.way});u({data:s,command:"market rank",source:"cls",toJSON:ar})}).command("index","\u5927\u76D8\u6307\u6570\uFF08glh\uFF09",t=>t,async()=>{let t=await Ft();u({data:t,command:"market index",source:"glh",toJSON:Tn})}).command("hk [sort]","\u6E2F\u80A1\u6392\u884C\uFF08glh\uFF09",t=>t.option("order",{alias:"o",type:"string",choices:["asc","desc"],default:"desc",describe:"\u6392\u5E8F\u65B9\u5411"}),async t=>{let o=t.sort,r=t.order||"desc",s=ln(o),a=await cn({sort:s.id,order:r});u({data:a,command:"market hk",source:"glh",toJSON:sr})}).command("flow","\u6CAA\u6DF1\u6E2F\u901A\u8D44\u91D1\u6D41\u5411",t=>t,async()=>{let t=await X();u({data:t,command:"market flow",source:"glh",toJSON:et})}).command("rates","\u5168\u7403\u592E\u884C\u5229\u7387\uFF08jin10\uFF09",t=>t,async()=>{let t=await Ne(),o=t?.data?.list||[];u({data:t,command:"market rates",source:"jin10",toJSON:()=>({items:o.map(r=>({bank:r.bankName,rate:r.interestRate,date:r.publishTime}))})})}).command("longhu [date]","\u9F99\u864E\u699C\uFF08\u96EA\u7403\uFF0C\u9700\u767B\u5F55\uFF09",t=>t.positional("date",{type:"string",describe:"\u65E5\u671F YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u4ECA\u5929"}),async t=>{let o=t.date||O(),r=o.split("-").map(Number),s=Date.UTC(r[0],(r[1]||1)-1,r[2]||1)-480*60*1e3;if(!Number.isFinite(s))throw new Error(`\u65E0\u6548\u65E5\u671F: ${o}\uFF08\u683C\u5F0F YYYY-MM-DD\uFF09`);let a=await Be(s);if(a?.error_code)throw new Error(`\u96EA\u7403\u63A5\u53E3\u9519\u8BEF: ${a.error_description||a.error_code}`);u({data:a,command:`market longhu ${o}`,source:"xq",toJSON:ir})}),handler:async()=>{let e=await Ft();u({data:e,command:"market",source:"glh",toJSON:Tn})}})}import{inflateSync as cr}from"zlib";var lr="wss://wss-flash-2.jin10.com/",ft={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},ht={LOGIN:4002,CACHE_DATA:2006,CALENDAR_DATA:2001,CALENDAR_EVENT:2003,CALENDAR_HOLIDAY:2004,CALENDAR_HOLIDAY_PAGE:2005},Q=class{buffer;dv;pos;constructor(e){this.buffer=e instanceof ArrayBuffer?e:e instanceof Uint8Array?e.buffer:new ArrayBuffer(2048),this.dv=new DataView(this.buffer),this.pos=0}w16L(e){this.dv.setInt16(this.pos,e,!0),this.pos+=2}wU16L(e){this.dv.setUint16(this.pos,e,!0),this.pos+=2}w32L(e){this.dv.setInt32(this.pos,e,!0),this.pos+=4}wU32L(e){this.dv.setUint32(this.pos,e,!0),this.pos+=4}wStrL(e){let t=Buffer.from(e,"utf-8");this.wU16L(t.length);for(let o=0;o<t.length;o++)this.dv.setUint8(this.pos++,t[o])}r16L(){let e=this.dv.getInt16(this.pos,!0);return this.pos+=2,e}rU16L(){let e=this.dv.getUint16(this.pos,!0);return this.pos+=2,e}rU32L(){let e=this.dv.getUint32(this.pos,!0);return this.pos+=4,e}rStrL(){let e=this.rU16L(),t=Buffer.from(this.buffer,this.pos,e).toString("utf-8");return this.pos+=e,t}toBuffer(){return this.buffer.slice(0,this.pos)}};function Rn(n,e){let t;n instanceof Uint8Array?t=new Uint8Array(n.buffer,n.byteOffset,n.byteLength):t=new Uint8Array(n);let o=new Uint8Array(t.length),r=e.charCodeAt(0);for(let s=0;s<t.length;s++)o[s]=t[s]^e.charCodeAt((s+r)%e.length);return o.buffer}function ur(n,e){return Rn(n,e)}function mr(n){try{return cr(Buffer.from(n,"base64")).toString("utf-8")}catch{return null}}var ne=class{ws=null;encryptKey="";requestId=Math.floor(Math.random()*1e6);userId;loginType;userLevel;userAgent;timeout;_pending=new Map;constructor(e={}){this.userId=e.userId||"",this.loginType=e.loginType||"calendar",this.userLevel=e.userLevel||1,this.userAgent=e.userAgent||"chrome",this.timeout=e.timeout||5e3}connect(){return new Promise((e,t)=>{let o=setTimeout(()=>{this.ws?.close(),t(new Error("WebSocket \u8FDE\u63A5\u8D85\u65F6"))},this.timeout);this.ws=new WebSocket(lr),this.ws.binaryType="arraybuffer",this.ws.onmessage=r=>{let s=r.data;if(!this.encryptKey){let m=new Q(s);m.rU32L();let d=m.rU32L(),l=m.rU32L();this.encryptKey=`${l}.${d}`,this._sendLogin();return}let a=Rn(s,this.encryptKey),i=new Q(a),c=i.r16L();if(c===ht.LOGIN){clearTimeout(o),e();return}if(c===ht.CACHE_DATA){i.rU32L(),i.rStrL();let m=i.rU32L(),d=i.rStrL(),l=this._pending.get(m);if(l){this._pending.delete(m),clearTimeout(l.timer);try{let p=JSON.parse(d);if(p.data){let g=mr(p.data);l.resolve(g?JSON.parse(g):null)}else l.resolve(null)}catch(p){l.reject(p)}}}},this.ws.onerror=()=>{clearTimeout(o),t(new Error("WebSocket \u8FDE\u63A5\u5931\u8D25"))}})}_sendLogin(){let e=new Q;e.w16L(ht.LOGIN),e.w32L(parseInt(this.userId)||0),e.wStrL(""),e.wStrL(this.userAgent),e.w32L(this.userLevel),e.wStrL(this.loginType),this._send(e)}_send(e){let t=e.toBuffer(),o=this.encryptKey?ur(t,this.encryptKey):t;this.ws.send(o)}_request(e,t){return new Promise((o,r)=>{let s=this.requestId++,a=setTimeout(()=>{this._pending.delete(s),r(new Error("\u8BF7\u6C42\u8D85\u65F6"))},this.timeout);this._pending.set(s,{resolve:o,reject:r,timer:a});let i=new Q;i.w16L(ht.CACHE_DATA),i.wU32L(e),i.wStrL(t),i.wU32L(s),this._send(i)})}close(){this.ws?.close(),this.ws=null,this.encryptKey="",this._pending.clear()}getFuturesData(e){return this._request(ft.QH_DATA,e)}getHKStockData(e){return this._request(ft.HK_DATA,e)}getUSStockData(e){return this._request(ft.US_DATA,e)}getAShareData(e={}){let t=[];return e.page&&t.push(`page=${e.page}`),e.limit!=null&&t.push(`limit=${e.limit}`),e.region&&t.push(`region=${e.region}`),e.star!=null&&t.push(`star=${e.star}`),e.determine!=null&&t.push(`determine=${e.determine}`),this._request(ft.A_SHARE,t.join("&"))}};async function Ln(n){let e=new ne(n);return await e.connect(),e}async function oe(n,...e){let t=await Ln();try{return await t[n](...e)}finally{t.close()}}function re(n){return{items:n.map(e=>({time:e.pub_time||"",indicator:e.indicator_name||e.name||"",importance:e.star??0,previous:e.previous??null,consensus:e.consensus??null,actual:e.actual??null,country:e.country||""})),total:n.length}}function Dn(n){let e=n?.data||[];return{items:e.map(t=>({time:t.c_time?t.c_time.slice(5,16):"",name:t.symbol_name||t.event||"",direction:t.float==="up"?"up":t.float==="down"?"down":""})),total:e.length}}function dr(n){let e=n?.data||[];return{items:e.map(t=>({time:t.event_time||"",country:t.country||"",importance:t.star??0,event:t.event_content||"",people:t.people||""})),total:e.length}}function pr(n){let e=n?.data?.data||n?.data,t=Array.isArray(e)?e:e?Object.values(e):[];return{items:t.map(o=>({date:(o.date||"").slice(5,16),market:o.exchange_name||"",name:o.name||"",note:o.rest_note||""})),total:t.length}}function gr(n){let e=n?.data||[];return{items:e.map(t=>({date:(t.date||"").slice(5,16),event:t.event||"",importance:t.star??0,stocks:(t.stocks||[]).map(o=>({name:o.name,code:o.code})),regions:(t.region||[]).map(o=>({name:o.name}))})),total:e.length}}function fr(n){let e=n?.data||[];return{items:e.map(t=>({time:t.public_time||"",country:t.country||"",event:t.eventcontent||""})),total:e.length}}function hr(n){let e=n?.data||[];return{items:e.map(t=>({time:t.holiday_time||"",country:t.country||"",market:t.market||"",name:t.holiday_name||"",description:t.description||""})),total:e.length}}function En(n){return n.command({command:"calendar",describe:"\u5B8F\u89C2\u65E5\u5386",builder:e=>e.strictCommands(!1).command("invest [date]","A\u80A1\u6295\u8D44\u65E5\u5386\uFF08cls\uFF0C\u9ED8\u8BA4\u4ECA\u5929\uFF09",t=>t,async t=>{let o=t.date||O(),r=await qt({date:o});u({data:r,command:"calendar invest",source:"cls",toJSON:Dn})}).command("macro [date]","\u5168\u7403\u5B8F\u89C2\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=F(),s=await Ae(o,"cj",r?{cookie:r}:void 0);u({data:s,command:"calendar macro",source:"jin10",toJSON:a=>re(a?.data||[])})}).command("event [date]","\u5B8F\u89C2\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=F(),s=await qe(o,"cj",r?{cookie:r}:void 0);u({data:s,command:"calendar event",source:"jin10",toJSON:dr})}).command("holiday [date]","\u5168\u7403\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=F(),s=await Oe(o,"cj",r?{cookie:r}:void 0);u({data:s,command:"calendar holiday",source:"jin10",toJSON:pr})}).command("ashare","A\u80A1\u5927\u4E8B\uFF08jin10\uFF09",t=>t,async()=>{let t=await oe("getAShareData",{page:1});u({data:t,command:"calendar ashare",source:"jin10",toJSON:gr})}).command("hk [date]","\u6E2F\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await oe("getHKStockData",o);u({data:r,command:"calendar hk",source:"jin10",toJSON:s=>re(Array.isArray(s)?s:[])})}).command("us [date]","\u7F8E\u80A1\u6570\u636E\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await oe("getUSStockData",o);u({data:r,command:"calendar us",source:"jin10",toJSON:s=>re(Array.isArray(s)?s:[])})}).command("future-event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await st(o);u({data:r,command:"calendar future-event",source:"jin10",toJSON:fr})}).command("future-holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t,async t=>{let o=t.date||O(),r=await it(o);u({data:r,command:"calendar future-holiday",source:"jin10",toJSON:hr})}),handler:async()=>{let e=await qt({date:O()});u({data:e,command:"calendar",source:"cls",toJSON:Dn})}})}var yt={all:-1,oil:19,steel:20,coal:21,gas:22,metal:23,nonferrous:24,chemical:25,sugar:27,grain:28,pig:29,macro:30};function yr(n){let e=n?.data?.list||[];return{items:e.map(t=>({title:t.title||"",hot:!!t.hot,updatedAt:t.updated_at||""})),total:e.length}}function br(n){return{groups:(n?.data?.list||[]).map(t=>({name:t.name||"",items:(t.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}))}))}}function _r(n){let e=n?.data||[];return{items:e.map(t=>({time:t.time_show||"",country:t.country||"",indicator:t.name||"",importance:t.star??0,previous:t.previous??null,consensus:t.consensus??null,actual:t.actual??null,unit:t.unit||"",impact:t.qh_affect_text||""})),total:e.length}}function wr(n){let e=n?.data||[];return{items:e.map(t=>({time:mn(t.time),content:pt(t.data?.content||t.data?.title||"",t),importance:t.important??0,source:t.data?.source||"",remark:Z(t.remark)||""})),total:e.length}}function Pn(n){return n.command("future","\u671F\u8D27",e=>e.option("channel",{alias:"c",type:"string",default:"all",describe:`\u9891\u9053: ${Object.keys(yt).join("/")}`}).command("headline","\u671F\u8D27\u5934\u6761",{},async()=>{let t=await je();u({data:t,command:"future headline",source:"jin10",toJSON:yr})}).command("basis [date]","\u671F\u73B0\u57FA\u5DEE",t=>t.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 t=>{let o=t.date||O(),r=await $e(o);u({data:r,command:"future basis",source:"jin10",toJSON:br})}).command("calendar [date]","\u671F\u8D27\u65E5\u5386",t=>t.positional("date",{type:"string"}),async t=>{let o=t.date||O(),r=await Ce(o);u({data:r,command:"future calendar",source:"jin10",toJSON:_r})}).command("event [date]","\u671F\u8D27\u65E5\u5386\u4E8B\u4EF6\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let o=t.date||O(),r=await st(o);u({data:r,command:`future event ${o}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.public_time,country:i.country,event:i.eventcontent}))})})}).command("holiday [date]","\u671F\u8D27\u65E5\u5386\u5047\u671F\uFF08jin10\uFF09",t=>t.positional("date",{type:"string"}),async t=>{let o=t.date||O(),r=await it(o);u({data:r,command:`future holiday ${o}`,source:"jin10",toJSON:s=>({items:(s?.data||[]).map(i=>({time:i.holiday_time,country:i.country,market:i.market,name:i.holiday_name,description:i.description}))})})}),async e=>{let{channel:t="all",n:o=10}=e,r=yt[t];r===void 0&&(console.error(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u9891\u9053 "${t}"\uFF0C\u53EF\u9009: ${Object.keys(yt).join(", ")}`),process.exit(1));let s=new Set,a=[],i=await Tt(r);for(let l of i?.data||[])s.has(l.id)||(s.add(l.id),a.push(l));let c=0,m=50;for(;a.length<o&&c++<m;){let l=a[a.length-1];if(!l)break;let g=(await Tt(r,{max_time:l.time}))?.data||[];if(!g.length)break;let f=0;for(let y of g)s.has(y.id)||(s.add(y.id),a.push(y),f++);if(f===0)break;a.length<o&&await new Promise(y=>setTimeout(y,200))}let d={...i,data:a};u({data:d,command:"future",source:"jin10",toJSON:wr})})}function Sr(n){let e=n?.data||{};return{stocks:(e.stocks||[]).map(t=>({id:t.id,name:t.name,symbolCount:t.symbol_count||0})),cubes:(e.cubes||[]).map(t=>({id:t.id,name:t.name})),funds:(e.funds||[]).map(t=>({id:t.id,name:t.name}))}}function xr(n){let e=n?.data?.stocks||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({symbol:t.symbol||t.stock_code||"",name:t.name||t.stock_name||"",price:t.current??t.price??null,changePercent:typeof t.percent=="number"?Math.round(t.percent*1e4)/100:t.chg_pct??null,marketCap:t.market_capital??t.mc??null})),total:e.length}:{items:[],total:0}}function Nr(n){let e=n?.data||[];return Array.isArray(e)?{items:e.map(t=>({date:t.time?String(t.time).slice(0,10):"",nav:t.nav??t.unit_nav??null,accumulatedNav:t.accumulated_nav??null,dailyReturn:t.daily_return??t.nav_chg_pct??null})),total:e.length}:{items:[],total:0}}function kr(n){let e=n?.data?.list||n?.data?.holdings||n?.data||[];return Array.isArray(e)?{items:e.map(t=>({symbol:t.stock_symbol||t.symbol||t.code||"",name:t.stock_name||t.name||"",weight:t.weight??t.proportion??null,price:t.price??t.current??null,changePercent:t.chg_pct??t.percent??null,marketCap:t.market_capital??t.mc??null})),total:e.length}:{items:[],total:0}}async function vr(n){if(!n.length)return;let e=n.map(t=>t.symbol).filter(Boolean);try{let t=await V(e),o={};for(let r of t?.data?.items||[]){let s=r.quote;s&&(o[s.symbol]=s)}for(let r of n){let s=o[r.symbol];s&&(r.current=s.current,r.percent=s.percent,r.market_capital=s.market_capital)}}catch{}}function Mn(n,e){let t=n?.data?.stocks||[];vr(t).then(()=>{u({data:n,command:e,source:"xq",toJSON:xr})})}function Hn(n){return n.command({command:"portfolio",describe:"\u81EA\u9009/\u7EC4\u5408\uFF08\u96EA\u7403\uFF0C\u9700 cookie\uFF09",builder:e=>(e.command({command:"stocks",describe:"\u67E5\u770B/\u7BA1\u7406\u81EA\u9009\u80A1",builder:t=>(t.command({command:"list [pid]",describe:"\u67E5\u770B\u5206\u7EC4\u4E0B\u7684\u80A1\u7968\uFF08\u9ED8\u8BA4\u5168\u90E8\uFF09",builder:o=>o.positional("pid",{type:"string",describe:"\u5206\u7EC4 ID\uFF0C\u5982 -1(\u5168\u90E8) -5(\u6CAA\u6DF1)"}),handler:async o=>{let r=o.pid||"-1",s=await Bt(r);Mn(s,"portfolio stocks "+r)}}),t.command({command:"add <symbol>",describe:"\u6DFB\u52A0\u80A1\u7968\u5230\u81EA\u9009",builder:o=>o.positional("symbol",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 SH600519"}).option("category",{alias:"c",type:"number",default:1,describe:"\u5206\u7EC4 ID\uFF0C\u9ED8\u8BA4\u5168\u90E8"}),handler:async o=>{let r=o.symbol,s=o.category,a=await tn(r,{category:s});console.log(a?.data?"\u5DF2\u6DFB\u52A0":"\u6DFB\u52A0\u5931\u8D25")}}),t.command({command:"remove <symbol>",describe:"\u4ECE\u81EA\u9009\u5220\u9664\u80A1\u7968",builder:o=>o.positional("symbol",{type:"string",describe:"\u80A1\u7968\u4EE3\u7801\uFF0C\u5982 SH600519"}).option("category",{alias:"c",type:"number",default:1,describe:"\u5206\u7EC4 ID\uFF0C\u9ED8\u8BA4\u5168\u90E8"}),handler:async o=>{let r=o.symbol,s=o.category,a=await en(r,{category:s});console.log(a?.data?"\u5DF2\u5220\u9664":"\u5220\u9664\u5931\u8D25")}}),t.strictCommands(!1)),handler:async()=>{let t=await Bt("-1");Mn(t,"portfolio stocks")}}),e.command({command:"cube [code]",describe:"\u7EC4\u5408\u51C0\u503C\u8D70\u52BF",builder:t=>(t.positional("code",{type:"string",describe:"\u7EC4\u5408\u4EE3\u7801"}),t.command({command:"holding <code>",describe:"\u67E5\u770B\u7EC4\u5408\u6301\u4ED3",builder:o=>o.positional("code",{type:"string",describe:"\u7EC4\u5408\u4EE3\u7801"}),handler:async o=>{let r=o.code,s=await on(r);u({data:s,command:"portfolio cube holding "+r,source:"xq",toJSON:kr})}}),t.strictCommands(!1)),handler:async t=>{let o=t.code;if(!o){console.log("\u8BF7\u63D0\u4F9B\u7EC4\u5408\u4EE3\u7801\uFF0C\u4F8B\u5982: finflow portfolio cube <code>");return}let r=await nn(o);u({data:r,command:"portfolio cube "+o,source:"xq",toJSON:Nr})}}),e.strictCommands(!1)),handler:async()=>{let e=await Ze();u({data:e,command:"portfolio",source:"xq",toJSON:Sr})}}),n}function In(n){return n.command("config","\u914D\u7F6E\u7BA1\u7406",e=>e.command("cookie [value]","\u67E5\u770B/\u8BBE\u7F6E\u96EA\u7403 Cookie",t=>t.positional("value",{type:"string"}),t=>{let{value:o}=t;if(o)Lt(o),console.log("Cookie \u5DF2\u4FDD\u5B58");else{let r=Rt();console.log(r?`\u5F53\u524D Cookie: ${r.slice(0,40)}...`:"\u672A\u8BBE\u7F6E Cookie\u3002\u8FD0\u884C finflow config login \u6216 finflow config cookie <value> \u8BBE\u7F6E")}}).command("login","\u4ECE\u6D4F\u89C8\u5668\u81EA\u52A8\u83B7\u53D6 Cookie",{},()=>{try{console.log("\u6B63\u5728\u4ECE\u6D4F\u89C8\u5668\u83B7\u53D6 Cookie...");let t=z("xueqiu.com");Lt(t),console.log("Cookie \u5DF2\u4FDD\u5B58")}catch(t){console.error(t.message),process.exit(1)}}))}var I=Ar(qr(process.argv)).scriptName("finflow").version("1.6.0").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");fn(I);$n(I);Jn(I);En(I);Pn(I);Hn(I);In(I);I.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openduo/finflow",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "Unified financial CLI — jin10, cls, xueqiu, gelonghui",
5
5
  "type": "module",
6
6
  "bin": {