fixtureqa 0.1.2__tar.gz → 0.1.4__tar.gz
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.
- {fixtureqa-0.1.2/fixtureqa.egg-info → fixtureqa-0.1.4}/PKG-INFO +1 -1
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/ws.py +14 -2
- fixtureqa-0.1.2/fixture/static/assets/index-CTsKxGdI.js → fixtureqa-0.1.4/fixture/static/assets/index-Cb1uGbWD.js +1 -1
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/static/index.html +1 -1
- {fixtureqa-0.1.2 → fixtureqa-0.1.4/fixtureqa.egg-info}/PKG-INFO +1 -1
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixtureqa.egg-info/SOURCES.txt +1 -1
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/pyproject.toml +1 -1
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/LICENSE +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/README.md +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/__init__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/__main__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/__init__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/app.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/connection_manager.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/deps.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/__init__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/admin.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/auth.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/branding.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/fix_spec.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/messages.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/scenarios.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/sessions.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/setup.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/routers/templates.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/api/schemas.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/config/__init__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/__init__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/auth.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/config_store.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/events.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/fix_application.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/fix_parser.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/fix_spec_parser.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/fix_tags.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/housekeeping.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/message_log.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/message_store.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/models.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/scenario_runner.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/scenario_store.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/session.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/session_manager.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/template_store.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/user_store.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/core/venue_responses.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/fix_specs/FIX42.xml +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/fix_specs/FIX44.xml +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/server.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/static/assets/ag-grid-_QKprVdm.js +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/static/assets/index-B31-1dt-.css +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/static/assets/react-vendor-2eF0YfZT.js +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/static/favicon.svg +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixture/ui/__init__.py +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixtureqa.egg-info/dependency_links.txt +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixtureqa.egg-info/entry_points.txt +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixtureqa.egg-info/requires.txt +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/fixtureqa.egg-info/top_level.txt +0 -0
- {fixtureqa-0.1.2 → fixtureqa-0.1.4}/setup.cfg +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import logging
|
|
2
3
|
from typing import Annotated, Optional
|
|
3
4
|
|
|
4
5
|
from fastapi import APIRouter, Depends, Query, WebSocket, WebSocketDisconnect
|
|
@@ -10,6 +11,8 @@ from ..deps import get_session_manager, get_conn_manager
|
|
|
10
11
|
from ...core.auth import decode_token
|
|
11
12
|
from ...core.user_store import UserStore
|
|
12
13
|
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
13
16
|
router = APIRouter(tags=["websocket"])
|
|
14
17
|
|
|
15
18
|
SM = Annotated[SessionManager, Depends(get_session_manager)]
|
|
@@ -62,6 +65,7 @@ async def ws_all_sessions(
|
|
|
62
65
|
"""Subscribe to events from all sessions."""
|
|
63
66
|
uid, is_admin = _authenticate_ws(websocket, token)
|
|
64
67
|
if not uid:
|
|
68
|
+
logger.warning("WS /ws: auth failed (no token or invalid JWT)")
|
|
65
69
|
await websocket.close(code=4003, reason="Unauthorized")
|
|
66
70
|
return
|
|
67
71
|
|
|
@@ -69,14 +73,16 @@ async def ws_all_sessions(
|
|
|
69
73
|
store: UserStore = websocket.app.state.user_store
|
|
70
74
|
user = store.get_by_uid(uid)
|
|
71
75
|
if user is None or not user.is_active:
|
|
76
|
+
logger.warning("WS /ws: auth failed — user not found or inactive: uid=%s", uid)
|
|
72
77
|
await websocket.close(code=4003, reason="Unauthorized")
|
|
73
78
|
return
|
|
74
79
|
|
|
80
|
+
logger.info("WS /ws: client connected uid=%s is_admin=%s", uid, is_admin)
|
|
75
81
|
await conn_mgr.connect(websocket, session_id="*", uid=uid, is_admin=is_admin)
|
|
76
82
|
try:
|
|
77
83
|
await _send_snapshot(websocket, sm, uid, is_admin)
|
|
78
84
|
while True:
|
|
79
|
-
await asyncio.sleep(
|
|
85
|
+
await asyncio.sleep(5)
|
|
80
86
|
try:
|
|
81
87
|
await websocket.send_json({"type": "ping"})
|
|
82
88
|
except Exception:
|
|
@@ -84,6 +90,7 @@ async def ws_all_sessions(
|
|
|
84
90
|
except WebSocketDisconnect:
|
|
85
91
|
pass
|
|
86
92
|
finally:
|
|
93
|
+
logger.info("WS /ws: client disconnected uid=%s", uid)
|
|
87
94
|
conn_mgr.disconnect(websocket, session_id="*")
|
|
88
95
|
|
|
89
96
|
|
|
@@ -98,12 +105,14 @@ async def ws_single_session(
|
|
|
98
105
|
"""Subscribe to events from a single session."""
|
|
99
106
|
uid, is_admin = _authenticate_ws(websocket, token)
|
|
100
107
|
if not uid:
|
|
108
|
+
logger.warning("WS /ws/%s: auth failed (no token or invalid JWT)", session_id)
|
|
101
109
|
await websocket.close(code=4003, reason="Unauthorized")
|
|
102
110
|
return
|
|
103
111
|
|
|
104
112
|
store: UserStore = websocket.app.state.user_store
|
|
105
113
|
user = store.get_by_uid(uid)
|
|
106
114
|
if user is None or not user.is_active:
|
|
115
|
+
logger.warning("WS /ws/%s: auth failed — user not found or inactive: uid=%s", session_id, uid)
|
|
107
116
|
await websocket.close(code=4003, reason="Unauthorized")
|
|
108
117
|
return
|
|
109
118
|
|
|
@@ -111,14 +120,16 @@ async def ws_single_session(
|
|
|
111
120
|
configs = sm.list_sessions()
|
|
112
121
|
cfg = next((c for c in configs if c.session_id == session_id), None)
|
|
113
122
|
if cfg is None or (not is_admin and cfg.owner_uid != uid):
|
|
123
|
+
logger.warning("WS /ws/%s: access denied for uid=%s", session_id, uid)
|
|
114
124
|
await websocket.close(code=4003, reason="Access denied")
|
|
115
125
|
return
|
|
116
126
|
|
|
127
|
+
logger.info("WS /ws/%s: client connected uid=%s is_admin=%s", session_id, uid, is_admin)
|
|
117
128
|
await conn_mgr.connect(websocket, session_id=session_id, uid=uid, is_admin=is_admin)
|
|
118
129
|
try:
|
|
119
130
|
await _send_snapshot(websocket, sm, uid, is_admin, session_id=session_id)
|
|
120
131
|
while True:
|
|
121
|
-
await asyncio.sleep(
|
|
132
|
+
await asyncio.sleep(5)
|
|
122
133
|
try:
|
|
123
134
|
await websocket.send_json({"type": "ping"})
|
|
124
135
|
except Exception:
|
|
@@ -126,4 +137,5 @@ async def ws_single_session(
|
|
|
126
137
|
except WebSocketDisconnect:
|
|
127
138
|
pass
|
|
128
139
|
finally:
|
|
140
|
+
logger.info("WS /ws/%s: client disconnected uid=%s", session_id, uid)
|
|
129
141
|
conn_mgr.disconnect(websocket, session_id=session_id)
|
|
@@ -33,7 +33,7 @@ Please change the parent <Route path="${b}"> to <Route path="${b==="/"?"*":`${b}
|
|
|
33
33
|
*
|
|
34
34
|
* This source code is licensed under the MIT license found in the
|
|
35
35
|
* LICENSE file in the root directory of this source tree.
|
|
36
|
-
*/var jo=m,ej=QS;function tj(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var rj=typeof Object.is=="function"?Object.is:tj,nj=ej.useSyncExternalStore,aj=jo.useRef,ij=jo.useEffect,oj=jo.useMemo,sj=jo.useDebugValue;Hp.useSyncExternalStoreWithSelector=function(e,t,r,n,a){var i=aj(null);if(i.current===null){var o={hasValue:!1,value:null};i.current=o}else o=i.current;i=oj(function(){function l(p){if(!c){if(c=!0,u=p,p=n(p),a!==void 0&&o.hasValue){var v=o.value;if(a(v,p))return d=v}return d=p}if(v=d,rj(u,p))return v;var y=n(p);return a!==void 0&&a(v,y)?(u=p,v):(u=p,d=y)}var c=!1,u,d,h=r===void 0?null:r;return[function(){return l(t())},h===null?void 0:function(){return l(h())}]},[t,r,n,a]);var s=nj(e,i[0],i[1]);return ij(function(){o.hasValue=!0,o.value=s},[s]),sj(s),s};Up.exports=Hp;var Kp=Up.exports;const lj=Sr(Kp),Yp={},{useDebugValue:cj}=wp,{useSyncExternalStoreWithSelector:uj}=lj;let jd=!1;const dj=e=>e;function fj(e,t=dj,r){(Yp?"production":void 0)!=="production"&&r&&!jd&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),jd=!0);const n=uj(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return cj(n),n}const Od=e=>{(Yp?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?US(e):e,r=(n,a)=>fj(t,n,a);return Object.assign(r,t),r},hj=e=>e?Od(e):Od;let Rs=0;const mj=localStorage.getItem("theme")??"dark",pj=localStorage.getItem("auth_token"),vj=(()=>{try{const e=localStorage.getItem("auth_user");return e?JSON.parse(e):null}catch{return null}})(),re=hj(e=>({sessions:{},messages:{},openTabs:[],activeTabId:null,theme:mj,_pendingStatus:{},scenarioRuns:{},branding:null,setBranding:t=>e({branding:t}),token:pj,user:vj,login:(t,r)=>{localStorage.setItem("auth_token",t),localStorage.setItem("auth_user",JSON.stringify(r)),e({token:t,user:r})},logout:()=>{localStorage.removeItem("auth_token"),localStorage.removeItem("auth_user"),e({token:null,user:null,sessions:{},messages:{},openTabs:[],activeTabId:null})},setSessions:t=>e(r=>{const n=Object.fromEntries(t.map(a=>[a.session_id,a]));for(const[a,i]of Object.entries(r._pendingStatus))n[a]&&(n[a]={...n[a],...i});return{sessions:n,_pendingStatus:{}}}),upsertSession:t=>e(r=>{const n=r.sessions[t.session_id];return(n==null?void 0:n.status_changed_at)!=null&&t.status_changed_at!=null&&n.status_changed_at>t.status_changed_at?{sessions:{...r.sessions,[t.session_id]:{...t,status:n.status,status_changed_at:n.status_changed_at,last_heartbeat_at:n.last_heartbeat_at}}}:{sessions:{...r.sessions,[t.session_id]:t}}}),removeSession:t=>e(r=>{const{[t]:n,...a}=r.sessions,{[t]:i,...o}=r.messages,s=r.openTabs.filter(c=>c!==t);let l=r.activeTabId;if(l===t){const c=r.openTabs.indexOf(t);l=s[c]??s[c-1]??null}return{sessions:a,messages:o,openTabs:s,activeTabId:l}}),updateSessionStatus:(t,r,n={})=>e(a=>{const i=a.sessions[t];return i?{sessions:{...a.sessions,[t]:{...i,status:r,...n}}}:{_pendingStatus:{...a._pendingStatus,[t]:{status:r,...n}}}}),updateLastHeartbeat:(t,r)=>e(n=>{const a=n.sessions[t];return a?{sessions:{...n.sessions,[t]:{...a,last_heartbeat_at:r}}}:{}}),openTab:t=>e(r=>({openTabs:r.openTabs.includes(t)?r.openTabs:[...r.openTabs,t],activeTabId:t})),closeTab:t=>e(r=>{const n=r.openTabs.filter(i=>i!==t);let a=r.activeTabId;if(a===t){const i=r.openTabs.indexOf(t);a=n[i]??n[i-1]??null}return{openTabs:n,activeTabId:a}}),setActiveTab:t=>e({activeTabId:t}),setMessages:(t,r)=>e(n=>({messages:{...n.messages,[t]:r.map(a=>({...a,_id:++Rs}))}})),prependMessages:(t,r)=>e(n=>{const a=n.messages[t]??[],i=r.map(o=>({...o,_id:++Rs}));return{messages:{...n.messages,[t]:[...i,...a]}}}),appendMessage:(t,r)=>e(n=>{const a=n.messages[t]??[],i={...r,_id:++Rs},o=[...a,i],s=2e3;return{messages:{...n.messages,[t]:o.length>s?o.slice(-s):o}}}),clearMessages:t=>e(r=>({messages:{...r.messages,[t]:[]}})),toggleTheme:()=>e(t=>{const r=t.theme==="dark"?"light":"dark";return localStorage.setItem("theme",r),{theme:r}}),upsertScenarioRun:t=>e(r=>({scenarioRuns:{...r.scenarioRuns,[t.run_id]:t}})),updateScenarioStep:(t,r)=>e(n=>{const a=n.scenarioRuns[t];if(!a)return{};const i=[...a.steps],o=i.findIndex(s=>s.step_index===r.step_index);return o>=0?i[o]=r:i.push(r),{scenarioRuns:{...n.scenarioRuns,[t]:{...a,steps:i}}}}),completeScenarioRun:(t,r,n)=>e(a=>{const i=a.scenarioRuns[t];return i?{scenarioRuns:{...a.scenarioRuns,[t]:{...i,status:r,duration_ms:n}}}:{}})})),Xp="/api";async function X(e,t){const r=re.getState().token,n={"Content-Type":"application/json"};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Xp}${e}`,{headers:n,...t});if(a.status===401)throw re.getState().logout(),window.location.href="/login",new Error("Session expired");if(!a.ok){const o=(await a.json().catch(()=>({detail:a.statusText}))).detail,s=Array.isArray(o)?o.map(l=>{const c=Array.isArray(l.loc)?l.loc.filter(u=>u!=="body").join("."):"";return c?`${c}: ${l.msg}`:l.msg??JSON.stringify(l)}).join("; "):o??a.statusText;throw new Error(s)}if(a.status!==204)return a.json()}const K={sessions:{list:()=>X("/sessions/"),create:e=>X("/sessions/",{method:"POST",body:JSON.stringify(e)}),get:e=>X(`/sessions/${e}`),update:(e,t)=>X(`/sessions/${e}`,{method:"PATCH",body:JSON.stringify(t)}),remove:e=>X(`/sessions/${e}`,{method:"DELETE"}),start:e=>X(`/sessions/${e}/start`,{method:"POST"}),stop:(e,t=!1)=>X(`/sessions/${e}/stop?force=${t}`,{method:"POST"}),send:(e,t,r)=>X(`/sessions/${e}/send`,{method:"POST",body:JSON.stringify({raw:t,no_auto_ts:(r==null?void 0:r.noAutoTs)??!1})}),import:e=>X("/sessions/import",{method:"POST",body:JSON.stringify(e)}),getSeqnums:e=>X(`/sessions/${e}/seqnums`),setSeqnums:(e,t)=>X(`/sessions/${e}/seqnums`,{method:"PATCH",body:JSON.stringify(t)})},messages:{list:(e,t)=>{const r=new URLSearchParams;return t!=null&&t.direction&&r.set("direction",t.direction),t!=null&&t.limit&&r.set("limit",String(t.limit)),(t==null?void 0:t.beforeId)!=null&&r.set("before_id",String(t.beforeId)),X(`/sessions/${e}/messages?${r}`)},clear:e=>X(`/sessions/${e}/messages`,{method:"DELETE"}),export:async(e,t)=>{const r=re.getState().token,n={};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Xp}/sessions/${e}/messages/export?fmt=${t}`,{headers:n});if(!a.ok)throw new Error(await a.text());const i=await a.blob(),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=`${e}.${t}`,s.click(),URL.revokeObjectURL(o)}},admin:{users:{list:()=>X("/admin/users"),create:e=>X("/admin/users",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>X(`/admin/users/${e}`,{method:"DELETE"})},settings:{get:()=>X("/admin/settings"),update:e=>X("/admin/settings",{method:"PATCH",body:JSON.stringify(e)})},housekeeping:{get:()=>X("/admin/housekeeping"),update:e=>X("/admin/housekeeping",{method:"PATCH",body:JSON.stringify(e)}),runNow:()=>X("/admin/housekeeping/run",{method:"POST"})},branding:{get:()=>X("/admin/branding"),update:e=>X("/admin/branding",{method:"PATCH",body:JSON.stringify(e)})}},fixSpec:{messages:e=>X(`/fix-spec/messages?begin_string=${encodeURIComponent(e)}`),message:(e,t)=>X(`/fix-spec/messages/${encodeURIComponent(t)}?begin_string=${encodeURIComponent(e)}`)},templates:{list:()=>X("/templates"),create:e=>X("/templates",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/templates/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/templates/${e}`,{method:"DELETE"})},scenarios:{list:()=>X("/scenarios"),create:e=>X("/scenarios",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/scenarios/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/scenarios/${e}`,{method:"DELETE"}),run:e=>X(`/scenarios/${e}/run`,{method:"POST"}),abort:e=>X(`/scenarios/runs/${e}`,{method:"DELETE"})}},gj=Object.freeze(Object.defineProperty({__proto__:null,api:K},Symbol.toStringTag,{value:"Module"})),yj=3e3;function bj(){const e=m.useRef(null),{updateSessionStatus:t,appendMessage:r,upsertSession:n,updateLastHeartbeat:a,upsertScenarioRun:i,updateScenarioStep:o,completeScenarioRun:s}=re();m.useEffect(()=>{let l=!1,c;function u(){const d=window.location.protocol==="https:"?"wss:":"ws:",h=re.getState().token,p=`${d}//${window.location.host}/ws${h?`?token=${encodeURIComponent(h)}`:""}`,v=new WebSocket(p);e.current=v,v.onmessage=y=>{let g;try{g=JSON.parse(y.data)}catch{return}g.type!=="ping"&&(g.type==="session_status"?t(g.session_id,g.status,{last_sent_seq_num:g.last_sent_seq_num,last_recv_seq_num:g.last_recv_seq_num,status_changed_at:g.status_changed_at??void 0,last_heartbeat_at:g.last_heartbeat_at??void 0}):g.type==="message"?(r(g.session_id,{session_id:g.session_id,direction:g.direction,admin:g.admin,seq_num:g.seq_num,msg_type:g.msg_type,msg_type_name:g.msg_type_name,ts:g.ts,fields:g.fields,raw:g.raw}),g.msg_type==="0"&&a(g.session_id,Date.now()/1e3)):g.type==="scenario_start"?i({run_id:g.run_id,scenario_id:g.scenario_id,scenario_name:g.scenario_name,status:"running",step_count:g.step_count,steps:[],started_at:Date.now()}):g.type==="scenario_step"?o(g.run_id,{step_index:g.step_index,label:g.label,status:g.status,error:g.error??void 0,duration_ms:g.duration_ms}):g.type==="scenario_complete"&&s(g.run_id,g.status,g.duration_ms))},v.onclose=()=>{l||(c=setTimeout(u,yj))},v.onerror=()=>{v.close()}}return u(),()=>{var d;l=!0,clearTimeout(c),(d=e.current)==null||d.close()}},[])}const xj={display_name:"",begin_string:"FIX.4.2",sender_comp_id:"",target_comp_id:"",connection_type:"initiator",host:"localhost",port:9876,heartbeat_interval:30,session_role:"generic",auto_start:!0};function wj({onClose:e,onSubmit:t}){const[r,n]=m.useState(xj),[a,i]=m.useState(""),[o,s]=m.useState(!1),l=(u,d)=>n(h=>({...h,[u]:d}));async function c(u){if(u.preventDefault(),!r.sender_comp_id||!r.target_comp_id){i("SenderCompID and TargetCompID are required");return}i(""),s(!0);try{await t(r),e()}catch(d){i(d instanceof Error?d.message:String(d))}finally{s(!1)}}return f.jsx("div",{className:"modal-overlay",onClick:e,children:f.jsxs("div",{className:"modal",onClick:u=>u.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:"Add Session"}),f.jsx("button",{className:"btn-icon",onClick:e,children:"✕"})]}),f.jsxs("form",{onSubmit:c,children:[f.jsxs("div",{className:"form-grid",children:[f.jsx("label",{children:"Display Name"}),f.jsx("input",{value:r.display_name,onChange:u=>l("display_name",u.target.value),placeholder:"My Session"}),f.jsx("label",{children:"FIX Version"}),f.jsxs("select",{value:r.begin_string,onChange:u=>l("begin_string",u.target.value),children:[f.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),f.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),f.jsx("label",{children:"Connection Type"}),f.jsxs("select",{value:r.connection_type,onChange:u=>l("connection_type",u.target.value),children:[f.jsx("option",{value:"initiator",children:"Initiator"}),f.jsx("option",{value:"acceptor",children:"Acceptor"})]}),f.jsx("label",{children:"SenderCompID *"}),f.jsx("input",{value:r.sender_comp_id,onChange:u=>l("sender_comp_id",u.target.value),placeholder:"CLIENT",required:!0}),f.jsx("label",{children:"TargetCompID *"}),f.jsx("input",{value:r.target_comp_id,onChange:u=>l("target_comp_id",u.target.value),placeholder:"SERVER",required:!0}),r.connection_type==="initiator"&&f.jsxs(f.Fragment,{children:[f.jsx("label",{children:"Host"}),f.jsx("input",{value:r.host,onChange:u=>l("host",u.target.value)})]}),f.jsx("label",{children:"Port"}),f.jsx("input",{type:"number",value:r.port,onChange:u=>l("port",Number(u.target.value)),min:1,max:65535}),f.jsx("label",{children:"HeartBtInt (s)"}),f.jsx("input",{type:"number",value:r.heartbeat_interval,onChange:u=>l("heartbeat_interval",Number(u.target.value)),min:1}),f.jsx("label",{children:"Role"}),f.jsxs("select",{value:r.session_role,onChange:u=>l("session_role",u.target.value),children:[f.jsx("option",{value:"client",children:"Client — sends orders"}),f.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),f.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]}),f.jsx("label",{children:"Auto-start"}),f.jsx("input",{type:"checkbox",checked:r.auto_start,onChange:u=>l("auto_start",u.target.checked)})]}),a&&f.jsx("div",{className:"error-msg",children:a}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{type:"button",className:"btn btn-secondary",onClick:e,children:"Cancel"}),f.jsx("button",{type:"submit",className:"btn btn-primary",disabled:o,children:o?"Adding…":"Add Session"})]})]})]})})}const Sj="modulepreload",jj=function(e){return"/"+e},Pd={},Oj=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),s=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));a=Promise.allSettled(r.map(l=>{if(l=jj(l),l in Pd)return;Pd[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const d=document.createElement("link");if(d.rel=c?"stylesheet":Sj,c||(d.as="script"),d.crossOrigin="",d.href=l,s&&d.setAttribute("nonce",s),document.head.appendChild(d),c)return new Promise((h,p)=>{d.addEventListener("load",h),d.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o}return a.then(o=>{for(const s of o||[])s.status==="rejected"&&i(s.reason);return t().catch(i)})};function Pj({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState({display_name:e.display_name,begin_string:e.begin_string,sender_comp_id:e.sender_comp_id,target_comp_id:e.target_comp_id,connection_type:e.connection_type,host:e.host,port:e.port,heartbeat_interval:e.heartbeat_interval,reconnect_interval:e.reconnect_interval,use_file_log:e.use_file_log,start_time:e.start_time,end_time:e.end_time,reset_on_logon:e.reset_on_logon,reset_on_logout:e.reset_on_logout,session_role:e.session_role,auto_ack:e.auto_ack,auto_ack_delay_ms:e.auto_ack_delay_ms,auto_fill:e.auto_fill,auto_fill_delay_ms:e.auto_fill_delay_ms,data_dictionary_path:e.data_dictionary_path??""}),[i,o]=m.useState(""),[s,l]=m.useState(!1),[c,u]=m.useState(!1),d=re(v=>v.user),h=(v,y)=>a(g=>({...g,[v]:y}));async function p(v){v.preventDefault(),o(""),l(!0);try{const{api:y}=await Oj(async()=>{const{api:x}=await Promise.resolve().then(()=>gj);return{api:x}},[]),g={...n,data_dictionary_path:n.data_dictionary_path||null},b=await y.sessions.update(e.session_id,g);r(b),t()}catch(y){o(y instanceof Error?y.message:String(y))}finally{l(!1)}}return f.jsx("div",{className:"modal-overlay",onClick:t,children:f.jsxs("div",{className:"modal",onClick:v=>v.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:"Edit Session"}),f.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),f.jsxs("form",{onSubmit:p,children:[f.jsxs("div",{className:"form-grid",children:[(d==null?void 0:d.role)==="platform_admin"&&e.owner_username&&f.jsxs(f.Fragment,{children:[f.jsx("label",{children:"Owner"}),f.jsx("span",{className:"owner-badge",style:{justifySelf:"start"},children:e.owner_username})]}),f.jsx("label",{children:"Display Name"}),f.jsx("input",{value:n.display_name,onChange:v=>h("display_name",v.target.value),placeholder:"My Session"}),f.jsx("label",{children:"FIX Version"}),f.jsxs("select",{value:n.begin_string,onChange:v=>h("begin_string",v.target.value),children:[f.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),f.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),f.jsx("label",{children:"Connection Type"}),f.jsxs("select",{value:n.connection_type,onChange:v=>h("connection_type",v.target.value),children:[f.jsx("option",{value:"initiator",children:"Initiator"}),f.jsx("option",{value:"acceptor",children:"Acceptor"})]}),f.jsx("label",{children:"SenderCompID *"}),f.jsx("input",{value:n.sender_comp_id,onChange:v=>h("sender_comp_id",v.target.value),required:!0}),f.jsx("label",{children:"TargetCompID *"}),f.jsx("input",{value:n.target_comp_id,onChange:v=>h("target_comp_id",v.target.value),required:!0}),n.connection_type==="initiator"&&f.jsxs(f.Fragment,{children:[f.jsx("label",{children:"Host"}),f.jsx("input",{value:n.host,onChange:v=>h("host",v.target.value)})]}),f.jsx("label",{children:"Port"}),f.jsx("input",{type:"number",value:n.port,onChange:v=>h("port",Number(v.target.value)),min:1,max:65535}),f.jsx("label",{children:"HeartBtInt (s)"}),f.jsx("input",{type:"number",value:n.heartbeat_interval,onChange:v=>h("heartbeat_interval",Number(v.target.value)),min:1}),f.jsx("label",{children:"Role"}),f.jsxs("select",{value:n.session_role,onChange:v=>h("session_role",v.target.value),children:[f.jsx("option",{value:"client",children:"Client — sends orders"}),f.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),f.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]})]}),n.session_role==="venue"&&f.jsxs("div",{className:"venue-auto-section",children:[f.jsx("div",{className:"venue-auto-title",children:"Auto-responses (venue)"}),f.jsxs("div",{className:"form-grid",children:[f.jsx("label",{children:"Auto-ack"}),f.jsxs("div",{className:"venue-auto-row",children:[f.jsx("input",{type:"checkbox",checked:n.auto_ack,onChange:v=>h("auto_ack",v.target.checked),title:"Send Execution Report (OrdStatus=New) on each inbound New Order Single"}),f.jsx("span",{className:"venue-auto-label",children:"delay"}),f.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_ack_delay_ms,onChange:v=>h("auto_ack_delay_ms",Number(v.target.value)),min:0,disabled:!n.auto_ack}),f.jsx("span",{className:"venue-auto-label",children:"ms"})]}),f.jsx("label",{children:"Auto-fill"}),f.jsxs("div",{className:"venue-auto-row",children:[f.jsx("input",{type:"checkbox",checked:n.auto_fill,onChange:v=>h("auto_fill",v.target.checked),title:"Send Execution Report (OrdStatus=Filled) on each inbound New Order Single"}),f.jsx("span",{className:"venue-auto-label",children:"delay"}),f.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_fill_delay_ms,onChange:v=>h("auto_fill_delay_ms",Number(v.target.value)),min:0,disabled:!n.auto_fill}),f.jsx("span",{className:"venue-auto-label",children:"ms"})]})]})]}),f.jsx("div",{style:{margin:"8px 0 0"},children:f.jsx("button",{type:"button",className:"btn btn-sm btn-ghost",onClick:()=>u(v=>!v),children:c?"▲ Hide advanced":"▼ Show advanced"})}),c&&f.jsxs("div",{className:"form-grid",style:{marginTop:8},children:[f.jsx("label",{children:"ReconnectInterval (s)"}),f.jsx("input",{type:"number",value:n.reconnect_interval,onChange:v=>h("reconnect_interval",Number(v.target.value)),min:1}),f.jsx("label",{children:"StartTime"}),f.jsx("input",{value:n.start_time,onChange:v=>h("start_time",v.target.value),placeholder:"00:00:00"}),f.jsx("label",{children:"EndTime"}),f.jsx("input",{value:n.end_time,onChange:v=>h("end_time",v.target.value),placeholder:"00:00:00"}),f.jsx("label",{children:"ResetOnLogon"}),f.jsx("input",{type:"checkbox",checked:n.reset_on_logon,onChange:v=>h("reset_on_logon",v.target.checked),title:"Reset sequence numbers to 1 on each Logon"}),f.jsx("label",{children:"ResetOnLogout"}),f.jsx("input",{type:"checkbox",checked:n.reset_on_logout,onChange:v=>h("reset_on_logout",v.target.checked),title:"Reset sequence numbers on Logout"}),f.jsx("label",{children:"Data Dictionary"}),f.jsx("input",{value:n.data_dictionary_path,onChange:v=>h("data_dictionary_path",v.target.value),placeholder:"(use bundled)"}),f.jsx("label",{children:"File Log"}),f.jsx("input",{type:"checkbox",checked:n.use_file_log,onChange:v=>h("use_file_log",v.target.checked)})]}),i&&f.jsx("div",{className:"error-msg",children:i}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{type:"button",className:"btn btn-secondary",onClick:t,children:"Cancel"}),f.jsx("button",{type:"submit",className:"btn btn-primary",disabled:s,children:s?"Saving…":"Save"})]})]})]})})}function _j({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState(""),[i,o]=m.useState(""),[s,l]=m.useState(!0),[c,u]=m.useState(!1),[d,h]=m.useState(null),p=!["STOPPED","ERROR"].includes(e.status),v=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;m.useEffect(()=>{K.sessions.getSeqnums(e.session_id).then(b=>{a(String(b.sender)),o(String(b.target)),l(!1)}).catch(b=>{h(b.message),l(!1)})},[e.session_id]);async function y(){const b=parseInt(n,10),x=parseInt(i,10);if(isNaN(b)||isNaN(x)||b<1||x<1){h("Sequence numbers must be ≥ 1");return}u(!0),h(null);try{await K.sessions.setSeqnums(e.session_id,{sender:b,target:x}),r(),t()}catch(S){h(S.message??"Failed to set seqnums")}finally{u(!1)}}function g(){a("1"),o("1")}return f.jsx("div",{className:"modal-overlay",onClick:t,children:f.jsxs("div",{className:"modal",style:{width:340},onClick:b=>b.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsxs("span",{children:["Sequence Numbers — ",v]}),f.jsx("button",{className:"btn btn-ghost btn-sm",onClick:t,children:"✕"})]}),f.jsxs("div",{className:"modal-body",children:[p&&f.jsx("div",{className:"seqnum-warning",children:"⚠ Session is running — changing seqnums will trigger a sequence reset with the counterparty."}),s?f.jsx("div",{style:{color:"var(--text2)",padding:"12px 0"},children:"Loading…"}):f.jsxs("div",{className:"form-grid",style:{"--label-w":"140px"},children:[f.jsx("label",{children:"Next TX (outgoing)"}),f.jsx("input",{type:"number",min:1,value:n,onChange:b=>a(b.target.value),disabled:c}),f.jsx("label",{children:"Next RX (incoming)"}),f.jsx("input",{type:"number",min:1,value:i,onChange:b=>o(b.target.value),disabled:c})]}),d&&f.jsx("div",{className:"error-msg",children:d})]}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:g,disabled:s||c,children:"Reset 1/1"}),f.jsx("div",{style:{flex:1}}),f.jsx("button",{className:"btn btn-sm btn-secondary",onClick:t,children:"Cancel"}),f.jsx("button",{className:"btn btn-sm btn-primary",onClick:y,disabled:s||c,children:c?"Applying…":"Apply"})]})]})})}const Cj=["display_name","begin_string","sender_comp_id","target_comp_id","connection_type","host","port","heartbeat_interval","reconnect_interval","use_file_log","start_time","end_time","reset_on_logon","reset_on_logout","session_role","data_dictionary_path"];function qp(e){return Object.fromEntries(Cj.map(t=>[t,e[t]]))}function Vp(e,t){const r=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),n=URL.createObjectURL(r),a=document.createElement("a");a.href=n,a.download=t,a.click(),URL.revokeObjectURL(n)}const Ej={LOGGED_ON:"#4ade80",CONNECTING:"#facc15",LISTENING:"#facc15",LOGGED_OUT:"#94a3b8",STOPPED:"#94a3b8",ERROR:"#f87171"};function Nj({status:e}){return f.jsxs("span",{className:"status-badge",style:{color:Ej[e]??"#94a3b8"},children:["● ",e]})}function _d(e){const t=Math.floor(e/60),r=e%60;return t>0?`${t}m ${r}s`:`${r}s`}function Aj({session:e}){const[,t]=m.useState(0),r=e.status==="LOGGED_ON",n=e.connection_type==="initiator"&&["CONNECTING","LOGGED_OUT"].includes(e.status);m.useEffect(()=>{if(!r&&!n)return;const i=setInterval(()=>t(o=>o+1),1e3);return()=>clearInterval(i)},[r,n]);const a=Date.now()/1e3;if(r&&e.status_changed_at){const i=Math.floor(a-e.status_changed_at);let o=null;if(e.last_heartbeat_at){const s=Math.floor(a-e.last_heartbeat_at),l=s<2*e.heartbeat_interval?"var(--green)":s<3*e.heartbeat_interval?"var(--yellow)":"var(--red)";o=f.jsxs("span",{style:{color:l},children:["· HB ",_d(s)," ago"]})}return f.jsxs("div",{className:"session-status-details",children:[f.jsxs("span",{children:["Connected ",_d(i)]}),o]})}if(n&&e.status_changed_at){const i=a-e.status_changed_at,o=Math.ceil(e.reconnect_interval-i%e.reconnect_interval);return f.jsx("div",{className:"session-status-details",children:f.jsxs("span",{style:{color:"var(--text2)"},children:["Reconnecting in ",o,"s"]})})}return null}function Ij({session:e,active:t,onClick:r,showOwner:n}){const{upsertSession:a,removeSession:i}=re(),[o,s]=m.useState(!1),[l,c]=m.useState(!1),[u,d]=m.useState(!1),h=!["STOPPED","ERROR"].includes(e.status);async function p(){s(!0);try{const g=h?await K.sessions.stop(e.session_id):await K.sessions.start(e.session_id);a(g)}catch(g){console.error(g)}finally{s(!1)}}async function v(){confirm(`Remove session "${e.display_name||e.sender_comp_id}"?`)&&(await K.sessions.remove(e.session_id),i(e.session_id))}const y=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;return f.jsxs("div",{className:`session-card${t?" active":""}`,onClick:r,children:[f.jsx("div",{className:"session-card-name",children:y}),f.jsxs("div",{className:"session-card-meta",children:[e.begin_string," · ",e.connection_type,f.jsx("span",{className:`role-badge role-${e.session_role}`,children:e.session_role}),n&&e.owner_username&&f.jsx("span",{className:"owner-badge",children:e.owner_username})]}),f.jsx(Nj,{status:e.status}),f.jsx(Aj,{session:e}),f.jsxs("div",{className:"session-card-seqnums",children:[f.jsxs("span",{children:["↑",e.last_sent_seq_num]}),f.jsxs("span",{children:["↓",e.last_recv_seq_num]}),f.jsxs("span",{children:[e.message_count," msgs"]})]}),f.jsxs("div",{className:"session-card-actions",onClick:g=>g.stopPropagation(),children:[f.jsx("button",{className:`btn btn-sm ${h?"btn-stop":"btn-start"}`,onClick:p,disabled:o,children:h?"Stop":"Start"}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>c(!0),disabled:h,title:h?"Stop session to edit":"Edit config",children:"Edit"}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>d(!0),title:"Set sequence numbers",children:"Seq"}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>Vp([qp(e)],`${y}.json`),title:"Export this session",children:"⬇"}),f.jsx("button",{className:"btn btn-sm btn-danger",onClick:v,children:"✕"})]}),l&&f.jsx(Pj,{session:e,onClose:()=>c(!1),onSaved:g=>{a(g),c(!1)}}),u&&f.jsx(_j,{session:e,onClose:()=>d(!1),onSaved:async()=>{const g=await K.sessions.get(e.session_id);a(g)}})]})}function kj(){const{sessions:e,activeTabId:t,openTab:r,upsertSession:n,user:a}=re(),[i,o]=m.useState(!1),[s,l]=m.useState(""),[c,u]=m.useState(""),d=m.useRef(null);async function h(g){const b=await K.sessions.create({...g,auto_start:g.auto_start});n(b),r(b.session_id)}function p(){const g=Object.values(e);if(g.length===0)return;const b=new Date().toISOString().slice(0,10);Vp(g.map(qp),`fixture-sessions-${b}.json`)}async function v(g){var x;const b=(x=g.target.files)==null?void 0:x[0];if(d.current&&(d.current.value="",!!b)){l(""),u("");try{const S=await b.text();let j=JSON.parse(S);Array.isArray(j)||(j=[j]);const O=await K.sessions.import(j);O.length===0?l("No sessions imported — file may be empty or all entries conflicted."):(O.forEach(w=>{n(w)}),u(`Imported ${O.length} of ${j.length} session${j.length!==1?"s":""}.`),setTimeout(()=>u(""),4e3))}catch(S){l(S instanceof Error?S.message:"Import failed")}}}const y=Object.values(e);return f.jsxs("div",{className:"sessions-panel",children:[f.jsxs("div",{className:"sessions-panel-header",children:[f.jsx("span",{children:"Sessions"}),f.jsxs("div",{className:"sessions-panel-header-actions",children:[f.jsx("button",{className:"btn btn-ghost btn-sm",onClick:p,disabled:y.length===0,title:"Export all sessions to JSON",children:"⬇ Export"}),f.jsx("button",{className:"btn btn-ghost btn-sm",onClick:()=>{var g;return(g=d.current)==null?void 0:g.click()},title:"Import sessions from JSON",children:"⬆ Import"}),f.jsx("input",{ref:d,type:"file",accept:".json,application/json",style:{display:"none"},onChange:v}),f.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>o(!0),children:"+ Add"})]})]}),s&&f.jsx("div",{className:"import-feedback import-error",children:s}),c&&f.jsx("div",{className:"import-feedback import-ok",children:c}),f.jsxs("div",{className:"sessions-list",children:[y.length===0&&f.jsx("div",{className:"sessions-empty",children:"No sessions. Add one to get started."}),y.map(g=>f.jsx(Ij,{session:g,active:g.session_id===t,onClick:()=>r(g.session_id),showOwner:(a==null?void 0:a.role)==="platform_admin"},g.session_id))]}),i&&f.jsx(wj,{onClose:()=>o(!1),onSubmit:h})]})}const Tj={1:"Account",6:"AvgPx",7:"BeginSeqNo",8:"BeginString",9:"BodyLength",10:"CheckSum",11:"ClOrdID",14:"CumQty",15:"Currency",17:"ExecID",18:"ExecInst",20:"ExecTransType",21:"HandlInst",22:"IDSource",29:"LastCapacity",30:"LastMkt",31:"LastPx",32:"LastShares",34:"MsgSeqNum",35:"MsgType",37:"OrderID",38:"OrderQty",39:"OrdStatus",40:"OrdType",41:"OrigClOrdID",44:"Price",48:"SecurityID",49:"SenderCompID",50:"SenderSubID",52:"SendingTime",54:"Side",55:"Symbol",56:"TargetCompID",57:"TargetSubID",58:"Text",59:"TimeInForce",60:"TransactTime",63:"SettlmntTyp",64:"FutSettDate",76:"ExecBroker",77:"OpenClose",98:"EncryptMethod",99:"StopPx",100:"ExDestination",102:"CxlRejReason",103:"OrdRejReason",108:"HeartBtInt",109:"ClientID",110:"MinQty",111:"MaxFloor",112:"TestReqID",115:"OnBehalfOfCompID",117:"QuoteID",122:"OrigSendingTime",126:"ExpireTime",131:"QuoteReqID",132:"BidPx",133:"OfferPx",134:"BidSize",135:"OfferSize",140:"PrevClosePx",141:"ResetSeqNumFlag",150:"ExecType",151:"LeavesQty",167:"SecurityType",200:"MaturityMonthYear",201:"PutOrCall",202:"StrikePrice",207:"SecurityExchange",210:"MaxShow",369:"LastMsgSeqNumProcessed",371:"RefTagID",372:"RefMsgType",373:"SessionRejectReason",553:"Username",554:"Password"};function ra(e){const t=typeof e=="string"?parseInt(e,10):e;return Tj[t]??`Tag${t}`}const yc={D:{tag:"11",name:"ClOrdID"},F:{tag:"11",name:"ClOrdID"},G:{tag:"11",name:"ClOrdID"},AB:{tag:"11",name:"ClOrdID"},V:{tag:"262",name:"MDReqID"},R:{tag:"131",name:"QuoteReqID"},S:{tag:"117",name:"QuoteID"},x:{tag:"320",name:"SecurityReqID"}},$s={autoTs:!0,autoId:!0,idPrefix:"",idCounter:1};function Jp(e){return`fixture_send_opts_${e}`}function Qp(e){try{const t=JSON.parse(localStorage.getItem(Jp(e))??"null");return t?{...$s,...t}:{...$s}}catch{return{...$s}}}function ev(e,t){localStorage.setItem(Jp(e),JSON.stringify(t))}function Cd(e){return e.replace(/\x01/g,"|").replace(/\|$/,"")}function wi(e,t,r){const n=new RegExp(`(^|\\|)(${t}=[^|]*)`);return n.test(e)?e.replace(n,`$1${t}=${r}`):e?`${e}|${t}=${r}`:`${t}=${r}`}function tv(){const e=new Date().toISOString();return e.slice(0,10).replace(/-/g,"")+"-"+e.slice(11,19)}function rv({opts:e,onChange:t,expanded:r,onToggle:n,msgType:a}){const i=a?yc[a]:void 0;function o(l){t({...e,...l})}const s=`${e.idPrefix}${e.idCounter}`;return f.jsxs("div",{className:"send-opts",children:[f.jsxs("button",{type:"button",className:"btn btn-sm btn-ghost send-opts-toggle",onClick:n,children:[r?"▲":"▶"," Send Options"]}),r&&f.jsxs("div",{className:"send-opts-body",children:[f.jsxs("label",{className:"checkbox-label",children:[f.jsx("input",{type:"checkbox",checked:e.autoTs,onChange:l=>o({autoTs:l.target.checked})}),"Auto TransactTime (tag 60)"]}),f.jsxs("label",{className:"checkbox-label",children:[f.jsx("input",{type:"checkbox",checked:e.autoId,onChange:l=>o({autoId:l.target.checked})}),i?`Auto-generate ${i.name} (tag ${i.tag})`:a?`Auto-generate ID — no mapping for type ${a}`:"Auto-generate ID tag"]}),e.autoId&&f.jsxs("div",{className:"send-opts-id-row",children:[f.jsx("span",{className:"send-opts-label",children:"Prefix"}),f.jsx("input",{className:"send-opts-prefix",value:e.idPrefix,onChange:l=>o({idPrefix:l.target.value}),placeholder:"e.g. ORD",maxLength:20}),f.jsxs("span",{className:"send-opts-next",children:["Next: ",f.jsx("code",{children:s||e.idCounter})]})]})]})]})}const Dj=["FIX.4.2","FIX.4.4"];function Mj(e){const t={};for(const r of e.split("|")){const n=r.indexOf("=");if(n<1)continue;const a=r.slice(0,n).trim(),i=r.slice(n+1).trim();a&&!isNaN(Number(a))&&(t[a]=i)}return t}function Ed(e){return Object.entries(e).filter(([,t])=>t!=="").map(([t,r])=>`${t}=${r}`).join("|")}function Rj({fieldRef:e,value:t,onChange:r}){const n=String(e.tag||""),a=Object.keys(e.values).length>0;return f.jsxs("tr",{className:`tpl-field-row${e.required?" required":""}`,children:[f.jsx("td",{className:"tpl-field-tag",children:e.tag||"?"}),f.jsxs("td",{className:"tpl-field-name",children:[e.name,e.required&&f.jsx("span",{className:"tpl-req-badge",children:"req"})]}),f.jsx("td",{className:"tpl-field-value",children:a?f.jsxs("select",{className:"tpl-select",value:t,onChange:i=>r(n,i.target.value),children:[f.jsx("option",{value:"",children:"— pick —"}),Object.entries(e.values).map(([i,o])=>f.jsxs("option",{value:i,children:[i," – ",o.replace(/_/g," ")]},i))]}):f.jsx("input",{className:"tpl-input",type:"text",value:t,placeholder:e.type,onChange:i=>r(n,i.target.value)})})]})}function nv({template:e,defaultBeginString:t="FIX.4.2",onSaved:r,onClose:n}){const[a,i]=m.useState("fields"),[o,s]=m.useState((e==null?void 0:e.name)??""),[l,c]=m.useState((e==null?void 0:e.begin_string)??t),[u,d]=m.useState((e==null?void 0:e.msg_type)??""),[h,p]=m.useState((e==null?void 0:e.msg_type_name)??""),[v,y]=m.useState((e==null?void 0:e.fields)??{}),[g,b]=m.useState(()=>Ed((e==null?void 0:e.fields)??{})),[x,S]=m.useState([]),[j,O]=m.useState(null),[w,P]=m.useState(!1),[C,N]=m.useState(!1),[I,k]=m.useState("");m.useEffect(()=>{K.fixSpec.messages(l).then(S).catch(()=>S([]))},[l]),m.useEffect(()=>{if(!u){O(null);return}P(!0),K.fixSpec.message(l,u).then(D=>{O(D),P(!1)}).catch(()=>{O(null),P(!1)})},[l,u]);function _(D,ue){y(J=>({...J,[D]:ue}))}function Z(D){const ue=x.find(J=>J.msg_type===D);d(D),p((ue==null?void 0:ue.name)??D),D&&y(J=>({...J,35:D}))}function M(D){b(D);const ue=Mj(D);if(y(ue),ue[35]&&ue[35]!==u){const J=ue[35],L=x.find($=>$.msg_type===J);d(J),p((L==null?void 0:L.name)??J)}}function H(D){D==="raw"&&b(Ed(v)),i(D)}const A=new Set((j==null?void 0:j.fields.map(D=>String(D.tag)).filter(Boolean))??[]),R=Object.entries(v).filter(([D])=>!A.has(D)&&D!=="35"),[z,U]=m.useState(""),[Y,me]=m.useState("");function te(){!z||isNaN(Number(z))||(_(z,Y),U(""),me(""))}async function Oe(){if(!o.trim()){k("Template name is required");return}if(!u){k("Message type is required");return}N(!0),k("");try{const D=Object.fromEntries(Object.entries(v).filter(([,L])=>L!=="")),ue={name:o.trim(),msg_type:u,msg_type_name:h,begin_string:l,fields:D},J=e?await K.templates.update(e.id,ue):await K.templates.create(ue);r(J)}catch(D){k(D instanceof Error?D.message:"Save failed")}finally{N(!1)}}const ye=x.filter(D=>D.category==="app"),Ke=x.filter(D=>D.category==="admin");return f.jsx("div",{className:"modal-overlay",onClick:n,children:f.jsxs("div",{className:"modal tpl-form-modal",onClick:D=>D.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:e?"Edit Template":"New Template"}),f.jsx("button",{className:"btn-icon",onClick:n,children:"✕"})]}),f.jsxs("div",{className:"tpl-form-top",children:[f.jsxs("div",{className:"tpl-form-row",children:[f.jsx("label",{className:"tpl-label",children:"Name"}),f.jsx("input",{className:"tpl-input tpl-name-input",value:o,onChange:D=>s(D.target.value),placeholder:"e.g. Buy 100 AAPL",autoFocus:!0})]}),f.jsxs("div",{className:"tpl-form-row",children:[f.jsx("label",{className:"tpl-label",children:"FIX version"}),f.jsx("select",{className:"tpl-select",value:l,onChange:D=>c(D.target.value),children:Dj.map(D=>f.jsx("option",{value:D,children:D},D))}),f.jsx("label",{className:"tpl-label",style:{marginLeft:12},children:"Message type"}),f.jsxs("select",{className:"tpl-select tpl-msgtype-select",value:u,onChange:D=>Z(D.target.value),children:[f.jsx("option",{value:"",children:"— select —"}),ye.length>0&&f.jsx("optgroup",{label:"Application",children:ye.map(D=>f.jsxs("option",{value:D.msg_type,children:[D.name," (",D.msg_type,")"]},D.msg_type))}),Ke.length>0&&f.jsx("optgroup",{label:"Admin",children:Ke.map(D=>f.jsxs("option",{value:D.msg_type,children:[D.name," (",D.msg_type,")"]},D.msg_type))})]})]})]}),f.jsxs("div",{className:"analysis-tabs",style:{marginBottom:0},children:[f.jsx("button",{className:`analysis-tab-btn${a==="fields"?" active":""}`,onClick:()=>H("fields"),children:"Fields"}),f.jsx("button",{className:`analysis-tab-btn${a==="raw"?" active":""}`,onClick:()=>H("raw"),children:"Raw FIX"})]}),f.jsxs("div",{className:"tpl-form-body",children:[a==="fields"&&f.jsxs("div",{className:"tpl-fields-tab",children:[!u&&f.jsx("div",{className:"tpl-no-msgtype",children:"Select a message type above to see its field definitions."}),u&&w&&f.jsx("div",{className:"tpl-loading",children:"Loading fields…"}),u&&!w&&f.jsxs("table",{className:"tpl-field-table",children:[f.jsx("thead",{children:f.jsxs("tr",{children:[f.jsx("th",{children:"Tag"}),f.jsx("th",{children:"Field"}),f.jsx("th",{children:"Value"})]})}),f.jsxs("tbody",{children:[j==null?void 0:j.fields.map(D=>f.jsx(Rj,{fieldRef:D,value:v[String(D.tag)]??"",onChange:_},`${D.tag}-${D.name}`)),R.length>0&&f.jsxs(f.Fragment,{children:[f.jsx("tr",{className:"tpl-section-divider",children:f.jsx("td",{colSpan:3,children:"Custom / extra fields"})}),R.map(([D,ue])=>f.jsxs("tr",{className:"tpl-field-row",children:[f.jsx("td",{className:"tpl-field-tag",children:D}),f.jsx("td",{className:"tpl-field-name",children:ra(Number(D))}),f.jsx("td",{className:"tpl-field-value",children:f.jsx("input",{className:"tpl-input",value:ue,onChange:J=>_(D,J.target.value)})})]},D))]}),f.jsxs("tr",{className:"tpl-add-field-row",children:[f.jsx("td",{children:f.jsx("input",{className:"tpl-input tpl-add-tag",type:"number",placeholder:"tag",value:z,onChange:D=>U(D.target.value)})}),f.jsx("td",{className:"tpl-field-name",style:{color:"var(--text2)",fontSize:11},children:z&&!isNaN(Number(z))?ra(Number(z)):"add field"}),f.jsxs("td",{className:"tpl-field-value",style:{display:"flex",gap:4},children:[f.jsx("input",{className:"tpl-input",placeholder:"value",value:Y,onChange:D=>me(D.target.value),onKeyDown:D=>{D.key==="Enter"&&te()}}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:te,children:"+"})]})]})]})]})]}),a==="raw"&&f.jsxs("div",{className:"tpl-raw-tab",children:[f.jsx("textarea",{className:"tpl-raw-textarea",value:g,onChange:D=>M(D.target.value),placeholder:"35=D|49=CLIENT|56=VENUE|55=AAPL|54=1|38=100|40=2|44=100.00",spellCheck:!1}),Object.keys(v).length>0&&f.jsxs("div",{className:"tpl-raw-preview",children:[f.jsx("div",{className:"tpl-raw-preview-title",children:"Parsed fields"}),f.jsx("table",{className:"tpl-field-table tpl-preview-table",children:f.jsx("tbody",{children:Object.entries(v).map(([D,ue])=>f.jsxs("tr",{children:[f.jsx("td",{className:"tpl-field-tag",children:D}),f.jsx("td",{className:"tpl-field-name",children:ra(Number(D))}),f.jsx("td",{className:"tpl-field-value",style:{color:"var(--text)"},children:ue})]},D))})})]})]})]}),I&&f.jsx("div",{className:"tpl-error",children:I}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{className:"btn btn-ghost",onClick:n,children:"Cancel"}),f.jsx("button",{className:"btn btn-primary",onClick:Oe,disabled:C,children:C?"Saving…":"Save template"})]})]})})}function av({onSelect:e,onClose:t,defaultBeginString:r="FIX.4.2"}){const[n,a]=m.useState([]),[i,o]=m.useState(!0),[s,l]=m.useState(!1),[c,u]=m.useState(null);async function d(){o(!0);try{a(await K.templates.list())}finally{o(!1)}}m.useEffect(()=>{d()},[]);async function h(g,b){b.stopPropagation(),confirm(`Delete template "${g.name}"?`)&&(await K.templates.delete(g.id),a(x=>x.filter(S=>S.id!==g.id)))}function p(g,b){b.stopPropagation(),u(g),l(!0)}function v(g){l(!1),u(null),d()}const y=n.reduce((g,b)=>{const x=`${b.msg_type_name} (${b.msg_type})`;return(g[x]??(g[x]=[])).push(b),g},{});return s?f.jsx(nv,{template:c??void 0,defaultBeginString:r,onSaved:v,onClose:()=>{l(!1),u(null)}}):f.jsx("div",{className:"modal-overlay",onClick:t,children:f.jsxs("div",{className:"modal template-picker-modal",onClick:g=>g.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:"Templates"}),f.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),f.jsx("div",{className:"template-picker-toolbar",children:f.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>{u(null),l(!0)},children:"+ New template"})}),f.jsxs("div",{className:"template-picker-body",children:[i&&f.jsx("div",{className:"template-picker-empty",children:"Loading…"}),!i&&n.length===0&&f.jsx("div",{className:"template-picker-empty",children:"No templates yet. Create one to reuse pre-populated FIX messages."}),!i&&Object.entries(y).sort(([g],[b])=>g.localeCompare(b)).map(([g,b])=>f.jsxs("div",{className:"template-group",children:[f.jsx("div",{className:"template-group-title",children:g}),b.map(x=>f.jsxs("div",{className:"template-row",onClick:()=>{e(x),t()},children:[f.jsx("div",{className:"template-row-name",children:x.name}),f.jsxs("div",{className:"template-row-meta",children:[f.jsx("span",{className:"template-begin-string",children:x.begin_string}),f.jsxs("span",{className:"template-field-count",children:[Object.keys(x.fields).length," fields"]})]}),f.jsxs("div",{className:"template-row-actions",onClick:S=>S.stopPropagation(),children:[f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:S=>p(x,S),title:"Edit",children:"✎"}),f.jsx("button",{className:"btn btn-sm btn-danger",onClick:S=>h(x,S),title:"Delete",children:"✕"})]})]},x.id))]},g))]})]})})}function Nd(e){return`fixture_compose_${e}`}const $j=new Set(["8","9","10","34","49","56"]);function Ad(e){const t=e.includes("")?"":"|";return e.split(t).filter(r=>r.includes("=")).map(r=>{const n=r.indexOf("=");return{tag:r.slice(0,n).trim(),value:r.slice(n+1)}}).filter(r=>r.tag!=="")}function Lj({session:e,raw:t,onRawChange:r,onClose:n}){var k;const a=re(_=>_.user),[i,o]=m.useState(!1),[s,l]=m.useState(null),[c,u]=m.useState(()=>a?Qp(a.uid):{autoTs:!0,autoId:!0,idPrefix:"",idCounter:1}),[d,h]=m.useState(!1),[p,v]=m.useState(!1),[y,g]=m.useState(!1);m.useEffect(()=>{if(a&&!t){const _=localStorage.getItem(Nd(a.uid));_&&r(_)}},[]);function b(_){const Z=Object.entries(_.fields).filter(([,M])=>M!=="").map(([M,H])=>`${M}=${H}`).join("|");S(Z)}function x(){return Object.fromEntries(Ad(t).map(_=>[_.tag,_.value]))}function S(_){r(_),a&&localStorage.setItem(Nd(a.uid),_)}function j(_){u(_),a&&ev(a.uid,_)}const O=t.trim()?Ad(t):[],w=O.filter(_=>!$j.has(_.tag)),P=((k=O.find(_=>_.tag==="35"))==null?void 0:k.value)??"",C=!!P,N=C&&e.status==="LOGGED_ON";async function I(){if(N){o(!0),l(null);try{let _=t;if(c.autoId&&P){const Z=yc[P];if(Z){const M=`${c.idPrefix}${c.idCounter}`;_=wi(_,Z.tag,M),j({...c,idCounter:c.idCounter+1})}}c.autoTs&&(_=wi(_,"60",tv())),await K.sessions.send(e.session_id,_,{noAutoTs:!c.autoTs})}catch(_){l(_.message??"Send failed")}finally{o(!1)}}}return f.jsxs("div",{className:"compose-pane",children:[f.jsx("textarea",{className:"compose-textarea",placeholder:`Paste raw FIX (pipe- or SOH-delimited)
|
|
36
|
+
*/var jo=m,ej=QS;function tj(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var rj=typeof Object.is=="function"?Object.is:tj,nj=ej.useSyncExternalStore,aj=jo.useRef,ij=jo.useEffect,oj=jo.useMemo,sj=jo.useDebugValue;Hp.useSyncExternalStoreWithSelector=function(e,t,r,n,a){var i=aj(null);if(i.current===null){var o={hasValue:!1,value:null};i.current=o}else o=i.current;i=oj(function(){function l(p){if(!c){if(c=!0,u=p,p=n(p),a!==void 0&&o.hasValue){var v=o.value;if(a(v,p))return d=v}return d=p}if(v=d,rj(u,p))return v;var y=n(p);return a!==void 0&&a(v,y)?(u=p,v):(u=p,d=y)}var c=!1,u,d,h=r===void 0?null:r;return[function(){return l(t())},h===null?void 0:function(){return l(h())}]},[t,r,n,a]);var s=nj(e,i[0],i[1]);return ij(function(){o.hasValue=!0,o.value=s},[s]),sj(s),s};Up.exports=Hp;var Kp=Up.exports;const lj=Sr(Kp),Yp={},{useDebugValue:cj}=wp,{useSyncExternalStoreWithSelector:uj}=lj;let jd=!1;const dj=e=>e;function fj(e,t=dj,r){(Yp?"production":void 0)!=="production"&&r&&!jd&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),jd=!0);const n=uj(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return cj(n),n}const Od=e=>{(Yp?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?US(e):e,r=(n,a)=>fj(t,n,a);return Object.assign(r,t),r},hj=e=>e?Od(e):Od;let Rs=0;const mj=localStorage.getItem("theme")??"dark",pj=localStorage.getItem("auth_token"),vj=(()=>{try{const e=localStorage.getItem("auth_user");return e?JSON.parse(e):null}catch{return null}})(),re=hj(e=>({sessions:{},messages:{},openTabs:[],activeTabId:null,theme:mj,_pendingStatus:{},scenarioRuns:{},branding:null,setBranding:t=>e({branding:t}),token:pj,user:vj,login:(t,r)=>{localStorage.setItem("auth_token",t),localStorage.setItem("auth_user",JSON.stringify(r)),e({token:t,user:r})},logout:()=>{localStorage.removeItem("auth_token"),localStorage.removeItem("auth_user"),e({token:null,user:null,sessions:{},messages:{},openTabs:[],activeTabId:null})},setSessions:t=>e(r=>{const n=Object.fromEntries(t.map(a=>[a.session_id,a]));for(const[a,i]of Object.entries(r._pendingStatus))n[a]&&(n[a]={...n[a],...i});return{sessions:n,_pendingStatus:{}}}),upsertSession:t=>e(r=>{const n=r.sessions[t.session_id];return(n==null?void 0:n.status_changed_at)!=null&&t.status_changed_at!=null&&n.status_changed_at>t.status_changed_at?{sessions:{...r.sessions,[t.session_id]:{...t,status:n.status,status_changed_at:n.status_changed_at,last_heartbeat_at:n.last_heartbeat_at}}}:{sessions:{...r.sessions,[t.session_id]:t}}}),removeSession:t=>e(r=>{const{[t]:n,...a}=r.sessions,{[t]:i,...o}=r.messages,s=r.openTabs.filter(c=>c!==t);let l=r.activeTabId;if(l===t){const c=r.openTabs.indexOf(t);l=s[c]??s[c-1]??null}return{sessions:a,messages:o,openTabs:s,activeTabId:l}}),updateSessionStatus:(t,r,n={})=>e(a=>{const i=a.sessions[t];return i?{sessions:{...a.sessions,[t]:{...i,status:r,...n}}}:{_pendingStatus:{...a._pendingStatus,[t]:{status:r,...n}}}}),updateLastHeartbeat:(t,r)=>e(n=>{const a=n.sessions[t];return a?{sessions:{...n.sessions,[t]:{...a,last_heartbeat_at:r}}}:{}}),openTab:t=>e(r=>({openTabs:r.openTabs.includes(t)?r.openTabs:[...r.openTabs,t],activeTabId:t})),closeTab:t=>e(r=>{const n=r.openTabs.filter(i=>i!==t);let a=r.activeTabId;if(a===t){const i=r.openTabs.indexOf(t);a=n[i]??n[i-1]??null}return{openTabs:n,activeTabId:a}}),setActiveTab:t=>e({activeTabId:t}),setMessages:(t,r)=>e(n=>({messages:{...n.messages,[t]:r.map(a=>({...a,_id:++Rs}))}})),prependMessages:(t,r)=>e(n=>{const a=n.messages[t]??[],i=r.map(o=>({...o,_id:++Rs}));return{messages:{...n.messages,[t]:[...i,...a]}}}),appendMessage:(t,r)=>e(n=>{const a=n.messages[t]??[],i={...r,_id:++Rs},o=[...a,i],s=2e3;return{messages:{...n.messages,[t]:o.length>s?o.slice(-s):o}}}),clearMessages:t=>e(r=>({messages:{...r.messages,[t]:[]}})),toggleTheme:()=>e(t=>{const r=t.theme==="dark"?"light":"dark";return localStorage.setItem("theme",r),{theme:r}}),upsertScenarioRun:t=>e(r=>({scenarioRuns:{...r.scenarioRuns,[t.run_id]:t}})),updateScenarioStep:(t,r)=>e(n=>{const a=n.scenarioRuns[t];if(!a)return{};const i=[...a.steps],o=i.findIndex(s=>s.step_index===r.step_index);return o>=0?i[o]=r:i.push(r),{scenarioRuns:{...n.scenarioRuns,[t]:{...a,steps:i}}}}),completeScenarioRun:(t,r,n)=>e(a=>{const i=a.scenarioRuns[t];return i?{scenarioRuns:{...a.scenarioRuns,[t]:{...i,status:r,duration_ms:n}}}:{}})})),Xp="/api";async function X(e,t){const r=re.getState().token,n={"Content-Type":"application/json"};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Xp}${e}`,{headers:n,...t});if(a.status===401)throw re.getState().logout(),window.location.href="/login",new Error("Session expired");if(!a.ok){const o=(await a.json().catch(()=>({detail:a.statusText}))).detail,s=Array.isArray(o)?o.map(l=>{const c=Array.isArray(l.loc)?l.loc.filter(u=>u!=="body").join("."):"";return c?`${c}: ${l.msg}`:l.msg??JSON.stringify(l)}).join("; "):o??a.statusText;throw new Error(s)}if(a.status!==204)return a.json()}const K={sessions:{list:()=>X("/sessions/"),create:e=>X("/sessions/",{method:"POST",body:JSON.stringify(e)}),get:e=>X(`/sessions/${e}`),update:(e,t)=>X(`/sessions/${e}`,{method:"PATCH",body:JSON.stringify(t)}),remove:e=>X(`/sessions/${e}`,{method:"DELETE"}),start:e=>X(`/sessions/${e}/start`,{method:"POST"}),stop:(e,t=!1)=>X(`/sessions/${e}/stop?force=${t}`,{method:"POST"}),send:(e,t,r)=>X(`/sessions/${e}/send`,{method:"POST",body:JSON.stringify({raw:t,no_auto_ts:(r==null?void 0:r.noAutoTs)??!1})}),import:e=>X("/sessions/import",{method:"POST",body:JSON.stringify(e)}),getSeqnums:e=>X(`/sessions/${e}/seqnums`),setSeqnums:(e,t)=>X(`/sessions/${e}/seqnums`,{method:"PATCH",body:JSON.stringify(t)})},messages:{list:(e,t)=>{const r=new URLSearchParams;return t!=null&&t.direction&&r.set("direction",t.direction),t!=null&&t.limit&&r.set("limit",String(t.limit)),(t==null?void 0:t.beforeId)!=null&&r.set("before_id",String(t.beforeId)),X(`/sessions/${e}/messages?${r}`)},clear:e=>X(`/sessions/${e}/messages`,{method:"DELETE"}),export:async(e,t)=>{const r=re.getState().token,n={};r&&(n.Authorization=`Bearer ${r}`);const a=await fetch(`${Xp}/sessions/${e}/messages/export?fmt=${t}`,{headers:n});if(!a.ok)throw new Error(await a.text());const i=await a.blob(),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=`${e}.${t}`,s.click(),URL.revokeObjectURL(o)}},admin:{users:{list:()=>X("/admin/users"),create:e=>X("/admin/users",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t)}),delete:e=>X(`/admin/users/${e}`,{method:"DELETE"})},settings:{get:()=>X("/admin/settings"),update:e=>X("/admin/settings",{method:"PATCH",body:JSON.stringify(e)})},housekeeping:{get:()=>X("/admin/housekeeping"),update:e=>X("/admin/housekeeping",{method:"PATCH",body:JSON.stringify(e)}),runNow:()=>X("/admin/housekeeping/run",{method:"POST"})},branding:{get:()=>X("/admin/branding"),update:e=>X("/admin/branding",{method:"PATCH",body:JSON.stringify(e)})}},fixSpec:{messages:e=>X(`/fix-spec/messages?begin_string=${encodeURIComponent(e)}`),message:(e,t)=>X(`/fix-spec/messages/${encodeURIComponent(t)}?begin_string=${encodeURIComponent(e)}`)},templates:{list:()=>X("/templates"),create:e=>X("/templates",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/templates/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/templates/${e}`,{method:"DELETE"})},scenarios:{list:()=>X("/scenarios"),create:e=>X("/scenarios",{method:"POST",body:JSON.stringify(e)}),update:(e,t)=>X(`/scenarios/${e}`,{method:"PUT",body:JSON.stringify(t)}),delete:e=>X(`/scenarios/${e}`,{method:"DELETE"}),run:e=>X(`/scenarios/${e}/run`,{method:"POST"}),abort:e=>X(`/scenarios/runs/${e}`,{method:"DELETE"})}},gj=Object.freeze(Object.defineProperty({__proto__:null,api:K},Symbol.toStringTag,{value:"Module"})),yj=3e3;function bj(){const e=m.useRef(null),{updateSessionStatus:t,appendMessage:r,upsertSession:n,updateLastHeartbeat:a,upsertScenarioRun:i,updateScenarioStep:o,completeScenarioRun:s}=re();m.useEffect(()=>{let l=!1,c;function u(){const d=window.location.protocol==="https:"?"wss:":"ws:",h=re.getState().token,p=`${d}//${window.location.host}/ws${h?`?token=${encodeURIComponent(h)}`:""}`,v=new WebSocket(p);e.current=v,v.onmessage=y=>{let g;try{g=JSON.parse(y.data)}catch{return}g.type!=="ping"&&(g.type==="session_status"?t(g.session_id,g.status,{last_sent_seq_num:g.last_sent_seq_num,last_recv_seq_num:g.last_recv_seq_num,status_changed_at:g.status_changed_at??void 0,last_heartbeat_at:g.last_heartbeat_at??void 0}):g.type==="message"?(r(g.session_id,{session_id:g.session_id,direction:g.direction,admin:g.admin,seq_num:g.seq_num,msg_type:g.msg_type,msg_type_name:g.msg_type_name,ts:g.ts,fields:g.fields,raw:g.raw}),g.msg_type==="0"&&a(g.session_id,Date.now()/1e3)):g.type==="scenario_start"?i({run_id:g.run_id,scenario_id:g.scenario_id,scenario_name:g.scenario_name,status:"running",step_count:g.step_count,steps:[],started_at:Date.now()}):g.type==="scenario_step"?o(g.run_id,{step_index:g.step_index,label:g.label,status:g.status,error:g.error??void 0,duration_ms:g.duration_ms}):g.type==="scenario_complete"&&s(g.run_id,g.status,g.duration_ms))},v.onclose=()=>{l||(c=setTimeout(u,yj))},v.onerror=()=>{v.close()}}return u(),()=>{var d;l=!0,clearTimeout(c),(d=e.current)==null||d.close()}},[])}const xj={display_name:"",begin_string:"FIX.4.2",sender_comp_id:"",target_comp_id:"",connection_type:"initiator",host:"localhost",port:9876,heartbeat_interval:30,session_role:"generic",auto_start:!0};function wj({onClose:e,onSubmit:t}){const[r,n]=m.useState(xj),[a,i]=m.useState(""),[o,s]=m.useState(!1),l=(u,d)=>n(h=>({...h,[u]:d}));async function c(u){if(u.preventDefault(),!r.sender_comp_id||!r.target_comp_id){i("SenderCompID and TargetCompID are required");return}i(""),s(!0);try{await t(r),e()}catch(d){i(d instanceof Error?d.message:String(d))}finally{s(!1)}}return f.jsx("div",{className:"modal-overlay",onClick:e,children:f.jsxs("div",{className:"modal",onClick:u=>u.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:"Add Session"}),f.jsx("button",{className:"btn-icon",onClick:e,children:"✕"})]}),f.jsxs("form",{onSubmit:c,children:[f.jsxs("div",{className:"form-grid",children:[f.jsx("label",{children:"Display Name"}),f.jsx("input",{value:r.display_name,onChange:u=>l("display_name",u.target.value),placeholder:"My Session"}),f.jsx("label",{children:"FIX Version"}),f.jsxs("select",{value:r.begin_string,onChange:u=>l("begin_string",u.target.value),children:[f.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),f.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),f.jsx("label",{children:"Connection Type"}),f.jsxs("select",{value:r.connection_type,onChange:u=>l("connection_type",u.target.value),children:[f.jsx("option",{value:"initiator",children:"Initiator"}),f.jsx("option",{value:"acceptor",children:"Acceptor"})]}),f.jsx("label",{children:"SenderCompID *"}),f.jsx("input",{value:r.sender_comp_id,onChange:u=>l("sender_comp_id",u.target.value),placeholder:"CLIENT",required:!0}),f.jsx("label",{children:"TargetCompID *"}),f.jsx("input",{value:r.target_comp_id,onChange:u=>l("target_comp_id",u.target.value),placeholder:"SERVER",required:!0}),r.connection_type==="initiator"&&f.jsxs(f.Fragment,{children:[f.jsx("label",{children:"Host"}),f.jsx("input",{value:r.host,onChange:u=>l("host",u.target.value)})]}),f.jsx("label",{children:"Port"}),f.jsx("input",{type:"number",value:r.port,onChange:u=>l("port",Number(u.target.value)),min:1,max:65535}),f.jsx("label",{children:"HeartBtInt (s)"}),f.jsx("input",{type:"number",value:r.heartbeat_interval,onChange:u=>l("heartbeat_interval",Number(u.target.value)),min:1}),f.jsx("label",{children:"Role"}),f.jsxs("select",{value:r.session_role,onChange:u=>l("session_role",u.target.value),children:[f.jsx("option",{value:"client",children:"Client — sends orders"}),f.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),f.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]}),f.jsx("label",{children:"Auto-start"}),f.jsx("input",{type:"checkbox",checked:r.auto_start,onChange:u=>l("auto_start",u.target.checked)})]}),a&&f.jsx("div",{className:"error-msg",children:a}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{type:"button",className:"btn btn-secondary",onClick:e,children:"Cancel"}),f.jsx("button",{type:"submit",className:"btn btn-primary",disabled:o,children:o?"Adding…":"Add Session"})]})]})]})})}const Sj="modulepreload",jj=function(e){return"/"+e},Pd={},Oj=function(t,r,n){let a=Promise.resolve();if(r&&r.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),s=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));a=Promise.allSettled(r.map(l=>{if(l=jj(l),l in Pd)return;Pd[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const d=document.createElement("link");if(d.rel=c?"stylesheet":Sj,c||(d.as="script"),d.crossOrigin="",d.href=l,s&&d.setAttribute("nonce",s),document.head.appendChild(d),c)return new Promise((h,p)=>{d.addEventListener("load",h),d.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o}return a.then(o=>{for(const s of o||[])s.status==="rejected"&&i(s.reason);return t().catch(i)})};function Pj({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState({display_name:e.display_name,begin_string:e.begin_string,sender_comp_id:e.sender_comp_id,target_comp_id:e.target_comp_id,connection_type:e.connection_type,host:e.host,port:e.port,heartbeat_interval:e.heartbeat_interval,reconnect_interval:e.reconnect_interval,use_file_log:e.use_file_log,start_time:e.start_time,end_time:e.end_time,reset_on_logon:e.reset_on_logon,reset_on_logout:e.reset_on_logout,session_role:e.session_role,auto_ack:e.auto_ack,auto_ack_delay_ms:e.auto_ack_delay_ms,auto_fill:e.auto_fill,auto_fill_delay_ms:e.auto_fill_delay_ms,data_dictionary_path:e.data_dictionary_path??""}),[i,o]=m.useState(""),[s,l]=m.useState(!1),[c,u]=m.useState(!1),d=re(v=>v.user),h=(v,y)=>a(g=>({...g,[v]:y}));async function p(v){v.preventDefault(),o(""),l(!0);try{const{api:y}=await Oj(async()=>{const{api:x}=await Promise.resolve().then(()=>gj);return{api:x}},[]),g={...n,data_dictionary_path:n.data_dictionary_path||null},b=await y.sessions.update(e.session_id,g);r(b),t()}catch(y){o(y instanceof Error?y.message:String(y))}finally{l(!1)}}return f.jsx("div",{className:"modal-overlay",onClick:t,children:f.jsxs("div",{className:"modal",onClick:v=>v.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:"Edit Session"}),f.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),f.jsxs("form",{onSubmit:p,children:[f.jsxs("div",{className:"form-grid",children:[(d==null?void 0:d.role)==="platform_admin"&&e.owner_username&&f.jsxs(f.Fragment,{children:[f.jsx("label",{children:"Owner"}),f.jsx("span",{className:"owner-badge",style:{justifySelf:"start"},children:e.owner_username})]}),f.jsx("label",{children:"Display Name"}),f.jsx("input",{value:n.display_name,onChange:v=>h("display_name",v.target.value),placeholder:"My Session"}),f.jsx("label",{children:"FIX Version"}),f.jsxs("select",{value:n.begin_string,onChange:v=>h("begin_string",v.target.value),children:[f.jsx("option",{value:"FIX.4.2",children:"FIX 4.2"}),f.jsx("option",{value:"FIX.4.4",children:"FIX 4.4"})]}),f.jsx("label",{children:"Connection Type"}),f.jsxs("select",{value:n.connection_type,onChange:v=>h("connection_type",v.target.value),children:[f.jsx("option",{value:"initiator",children:"Initiator"}),f.jsx("option",{value:"acceptor",children:"Acceptor"})]}),f.jsx("label",{children:"SenderCompID *"}),f.jsx("input",{value:n.sender_comp_id,onChange:v=>h("sender_comp_id",v.target.value),required:!0}),f.jsx("label",{children:"TargetCompID *"}),f.jsx("input",{value:n.target_comp_id,onChange:v=>h("target_comp_id",v.target.value),required:!0}),n.connection_type==="initiator"&&f.jsxs(f.Fragment,{children:[f.jsx("label",{children:"Host"}),f.jsx("input",{value:n.host,onChange:v=>h("host",v.target.value)})]}),f.jsx("label",{children:"Port"}),f.jsx("input",{type:"number",value:n.port,onChange:v=>h("port",Number(v.target.value)),min:1,max:65535}),f.jsx("label",{children:"HeartBtInt (s)"}),f.jsx("input",{type:"number",value:n.heartbeat_interval,onChange:v=>h("heartbeat_interval",Number(v.target.value)),min:1}),f.jsx("label",{children:"Role"}),f.jsxs("select",{value:n.session_role,onChange:v=>h("session_role",v.target.value),children:[f.jsx("option",{value:"client",children:"Client — sends orders"}),f.jsx("option",{value:"venue",children:"Venue — receives orders, sends fills"}),f.jsx("option",{value:"generic",children:"Generic — post-trade, IOIs, etc."})]})]}),n.session_role==="venue"&&f.jsxs("div",{className:"venue-auto-section",children:[f.jsx("div",{className:"venue-auto-title",children:"Auto-responses (venue)"}),f.jsxs("div",{className:"form-grid",children:[f.jsx("label",{children:"Auto-ack"}),f.jsxs("div",{className:"venue-auto-row",children:[f.jsx("input",{type:"checkbox",checked:n.auto_ack,onChange:v=>h("auto_ack",v.target.checked),title:"Send Execution Report (OrdStatus=New) on each inbound New Order Single"}),f.jsx("span",{className:"venue-auto-label",children:"delay"}),f.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_ack_delay_ms,onChange:v=>h("auto_ack_delay_ms",Number(v.target.value)),min:0,disabled:!n.auto_ack}),f.jsx("span",{className:"venue-auto-label",children:"ms"})]}),f.jsx("label",{children:"Auto-fill"}),f.jsxs("div",{className:"venue-auto-row",children:[f.jsx("input",{type:"checkbox",checked:n.auto_fill,onChange:v=>h("auto_fill",v.target.checked),title:"Send Execution Report (OrdStatus=Filled) on each inbound New Order Single"}),f.jsx("span",{className:"venue-auto-label",children:"delay"}),f.jsx("input",{type:"number",className:"venue-delay-input",value:n.auto_fill_delay_ms,onChange:v=>h("auto_fill_delay_ms",Number(v.target.value)),min:0,disabled:!n.auto_fill}),f.jsx("span",{className:"venue-auto-label",children:"ms"})]})]})]}),f.jsx("div",{style:{margin:"8px 0 0"},children:f.jsx("button",{type:"button",className:"btn btn-sm btn-ghost",onClick:()=>u(v=>!v),children:c?"▲ Hide advanced":"▼ Show advanced"})}),c&&f.jsxs("div",{className:"form-grid",style:{marginTop:8},children:[f.jsx("label",{children:"ReconnectInterval (s)"}),f.jsx("input",{type:"number",value:n.reconnect_interval,onChange:v=>h("reconnect_interval",Number(v.target.value)),min:1}),f.jsx("label",{children:"StartTime"}),f.jsx("input",{value:n.start_time,onChange:v=>h("start_time",v.target.value),placeholder:"00:00:00"}),f.jsx("label",{children:"EndTime"}),f.jsx("input",{value:n.end_time,onChange:v=>h("end_time",v.target.value),placeholder:"00:00:00"}),f.jsx("label",{children:"ResetOnLogon"}),f.jsx("input",{type:"checkbox",checked:n.reset_on_logon,onChange:v=>h("reset_on_logon",v.target.checked),title:"Reset sequence numbers to 1 on each Logon"}),f.jsx("label",{children:"ResetOnLogout"}),f.jsx("input",{type:"checkbox",checked:n.reset_on_logout,onChange:v=>h("reset_on_logout",v.target.checked),title:"Reset sequence numbers on Logout"}),f.jsx("label",{children:"Data Dictionary"}),f.jsx("input",{value:n.data_dictionary_path,onChange:v=>h("data_dictionary_path",v.target.value),placeholder:"(use bundled)"}),f.jsx("label",{children:"File Log"}),f.jsx("input",{type:"checkbox",checked:n.use_file_log,onChange:v=>h("use_file_log",v.target.checked)})]}),i&&f.jsx("div",{className:"error-msg",children:i}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{type:"button",className:"btn btn-secondary",onClick:t,children:"Cancel"}),f.jsx("button",{type:"submit",className:"btn btn-primary",disabled:s,children:s?"Saving…":"Save"})]})]})]})})}function _j({session:e,onClose:t,onSaved:r}){const[n,a]=m.useState(""),[i,o]=m.useState(""),[s,l]=m.useState(!0),[c,u]=m.useState(!1),[d,h]=m.useState(null),p=!["STOPPED","ERROR"].includes(e.status),v=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;m.useEffect(()=>{K.sessions.getSeqnums(e.session_id).then(b=>{a(String(b.sender)),o(String(b.target)),l(!1)}).catch(b=>{h(b.message),l(!1)})},[e.session_id]);async function y(){const b=parseInt(n,10),x=parseInt(i,10);if(isNaN(b)||isNaN(x)||b<1||x<1){h("Sequence numbers must be ≥ 1");return}u(!0),h(null);try{await K.sessions.setSeqnums(e.session_id,{sender:b,target:x}),r(),t()}catch(S){h(S.message??"Failed to set seqnums")}finally{u(!1)}}function g(){a("1"),o("1")}return f.jsx("div",{className:"modal-overlay",onClick:t,children:f.jsxs("div",{className:"modal",style:{width:340},onClick:b=>b.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsxs("span",{children:["Sequence Numbers — ",v]}),f.jsx("button",{className:"btn btn-ghost btn-sm",onClick:t,children:"✕"})]}),f.jsxs("div",{className:"modal-body",children:[p&&f.jsx("div",{className:"seqnum-warning",children:"⚠ Session is running — changing seqnums will trigger a sequence reset with the counterparty."}),s?f.jsx("div",{style:{color:"var(--text2)",padding:"12px 0"},children:"Loading…"}):f.jsxs("div",{className:"form-grid",style:{"--label-w":"140px"},children:[f.jsx("label",{children:"Next TX (outgoing)"}),f.jsx("input",{type:"number",min:1,value:n,onChange:b=>a(b.target.value),disabled:c}),f.jsx("label",{children:"Next RX (incoming)"}),f.jsx("input",{type:"number",min:1,value:i,onChange:b=>o(b.target.value),disabled:c})]}),d&&f.jsx("div",{className:"error-msg",children:d})]}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:g,disabled:s||c,children:"Reset 1/1"}),f.jsx("div",{style:{flex:1}}),f.jsx("button",{className:"btn btn-sm btn-secondary",onClick:t,children:"Cancel"}),f.jsx("button",{className:"btn btn-sm btn-primary",onClick:y,disabled:s||c,children:c?"Applying…":"Apply"})]})]})})}const Cj=["display_name","begin_string","sender_comp_id","target_comp_id","connection_type","host","port","heartbeat_interval","reconnect_interval","use_file_log","start_time","end_time","reset_on_logon","reset_on_logout","session_role","data_dictionary_path"];function qp(e){return Object.fromEntries(Cj.map(t=>[t,e[t]]))}function Vp(e,t){const r=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),n=URL.createObjectURL(r),a=document.createElement("a");a.href=n,a.download=t,a.click(),URL.revokeObjectURL(n)}const Ej={LOGGED_ON:"#4ade80",CONNECTING:"#facc15",LISTENING:"#facc15",LOGGED_OUT:"#94a3b8",STOPPED:"#94a3b8",ERROR:"#f87171"};function Nj({status:e}){return f.jsxs("span",{className:"status-badge",style:{color:Ej[e]??"#94a3b8"},children:["● ",e]})}function _d(e){const t=Math.floor(e/60),r=e%60;return t>0?`${t}m ${r}s`:`${r}s`}function Aj({session:e}){const[,t]=m.useState(0),r=e.status==="LOGGED_ON",n=e.connection_type==="initiator"&&["CONNECTING","LOGGED_OUT"].includes(e.status);m.useEffect(()=>{if(!r&&!n)return;const i=setInterval(()=>t(o=>o+1),1e3);return()=>clearInterval(i)},[r,n]);const a=Date.now()/1e3;if(r&&e.status_changed_at){const i=Math.floor(a-e.status_changed_at);let o=null;if(e.last_heartbeat_at){const s=Math.floor(a-e.last_heartbeat_at),l=s<2*e.heartbeat_interval?"var(--green)":s<3*e.heartbeat_interval?"var(--yellow)":"var(--red)";o=f.jsxs("span",{style:{color:l},children:["· HB ",_d(s)," ago"]})}return f.jsxs("div",{className:"session-status-details",children:[f.jsxs("span",{children:["Connected ",_d(i)]}),o]})}if(n&&e.status_changed_at){const i=a-e.status_changed_at,o=Math.ceil(e.reconnect_interval-i%e.reconnect_interval);return f.jsx("div",{className:"session-status-details",children:f.jsxs("span",{style:{color:"var(--text2)"},children:["Reconnecting in ",o,"s"]})})}return null}function Ij({session:e,active:t,onClick:r,showOwner:n}){const{upsertSession:a,removeSession:i}=re(),[o,s]=m.useState(!1),[l,c]=m.useState(!1),[u,d]=m.useState(!1),h=!["STOPPED","ERROR"].includes(e.status);async function p(){s(!0);try{const g=h?await K.sessions.stop(e.session_id):await K.sessions.start(e.session_id);a(g)}catch(g){console.error(g)}finally{s(!1)}}async function v(){confirm(`Remove session "${e.display_name||e.sender_comp_id}"?`)&&(await K.sessions.remove(e.session_id),i(e.session_id))}const y=e.display_name||`${e.sender_comp_id}→${e.target_comp_id}`;return f.jsxs("div",{className:`session-card${t?" active":""}`,onClick:r,children:[f.jsx("div",{className:"session-card-name",children:y}),f.jsxs("div",{className:"session-card-meta",children:[e.begin_string," · ",e.connection_type,f.jsx("span",{className:`role-badge role-${e.session_role}`,children:e.session_role}),n&&e.owner_username&&f.jsx("span",{className:"owner-badge",children:e.owner_username})]}),f.jsx(Nj,{status:e.status}),f.jsx(Aj,{session:e}),f.jsxs("div",{className:"session-card-seqnums",children:[f.jsxs("span",{children:["↑",e.last_sent_seq_num]}),f.jsxs("span",{children:["↓",e.last_recv_seq_num]}),f.jsxs("span",{children:[e.message_count," msgs"]})]}),f.jsxs("div",{className:"session-card-actions",onClick:g=>g.stopPropagation(),children:[f.jsx("button",{className:`btn btn-sm ${h?"btn-stop":"btn-start"}`,onClick:p,disabled:o,children:h?"Stop":"Start"}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>c(!0),disabled:h,title:h?"Stop session to edit":"Edit config",children:"Edit"}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>d(!0),title:"Set sequence numbers",children:"Seq"}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>Vp([qp(e)],`${y}.json`),title:"Export this session",children:"⬇"}),f.jsx("button",{className:"btn btn-sm btn-danger",onClick:v,children:"✕"})]}),l&&f.jsx(Pj,{session:e,onClose:()=>c(!1),onSaved:g=>{a(g),c(!1)}}),u&&f.jsx(_j,{session:e,onClose:()=>d(!1),onSaved:async()=>{const g=await K.sessions.get(e.session_id);a(g)}})]})}function kj(){const{sessions:e,activeTabId:t,openTab:r,upsertSession:n,user:a}=re(),[i,o]=m.useState(!1),[s,l]=m.useState(""),[c,u]=m.useState(""),d=m.useRef(null);async function h(g){const b=await K.sessions.create({...g,auto_start:g.auto_start});n(b),r(b.session_id)}function p(){const g=Object.values(e);if(g.length===0)return;const b=new Date().toISOString().slice(0,10);Vp(g.map(qp),`fixture-sessions-${b}.json`)}async function v(g){var x;const b=(x=g.target.files)==null?void 0:x[0];if(d.current&&(d.current.value="",!!b)){l(""),u("");try{const S=await b.text();let j=JSON.parse(S);Array.isArray(j)||(j=[j]);const O=await K.sessions.import(j);O.length===0?l("No sessions imported — file may be empty or all entries conflicted."):(O.forEach(w=>{n(w)}),u(`Imported ${O.length} of ${j.length} session${j.length!==1?"s":""}.`),setTimeout(()=>u(""),4e3))}catch(S){l(S instanceof Error?S.message:"Import failed")}}}const y=Object.values(e);return f.jsxs("div",{className:"sessions-panel",children:[f.jsxs("div",{className:"sessions-panel-header",children:[f.jsx("span",{children:"Sessions"}),f.jsxs("div",{className:"sessions-panel-header-actions",children:[f.jsx("button",{className:"btn btn-ghost btn-sm",onClick:p,disabled:y.length===0,title:"Export all sessions to JSON",children:"⬇ Export"}),f.jsx("button",{className:"btn btn-ghost btn-sm",onClick:()=>{var g;return(g=d.current)==null?void 0:g.click()},title:"Import sessions from JSON",children:"⬆ Import"}),f.jsx("input",{ref:d,type:"file",accept:".json,application/json",style:{display:"none"},onChange:v}),f.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>o(!0),children:"+ Add"})]})]}),s&&f.jsx("div",{className:"import-feedback import-error",children:s}),c&&f.jsx("div",{className:"import-feedback import-ok",children:c}),f.jsxs("div",{className:"sessions-list",children:[y.length===0&&f.jsx("div",{className:"sessions-empty",children:"No sessions. Add one to get started."}),y.map(g=>f.jsx(Ij,{session:g,active:g.session_id===t,onClick:()=>r(g.session_id),showOwner:(a==null?void 0:a.role)==="platform_admin"},g.session_id))]}),i&&f.jsx(wj,{onClose:()=>o(!1),onSubmit:h})]})}const Tj={1:"Account",6:"AvgPx",7:"BeginSeqNo",8:"BeginString",9:"BodyLength",10:"CheckSum",11:"ClOrdID",14:"CumQty",15:"Currency",17:"ExecID",18:"ExecInst",20:"ExecTransType",21:"HandlInst",22:"IDSource",29:"LastCapacity",30:"LastMkt",31:"LastPx",32:"LastShares",34:"MsgSeqNum",35:"MsgType",37:"OrderID",38:"OrderQty",39:"OrdStatus",40:"OrdType",41:"OrigClOrdID",44:"Price",48:"SecurityID",49:"SenderCompID",50:"SenderSubID",52:"SendingTime",54:"Side",55:"Symbol",56:"TargetCompID",57:"TargetSubID",58:"Text",59:"TimeInForce",60:"TransactTime",63:"SettlmntTyp",64:"FutSettDate",76:"ExecBroker",77:"OpenClose",98:"EncryptMethod",99:"StopPx",100:"ExDestination",102:"CxlRejReason",103:"OrdRejReason",108:"HeartBtInt",109:"ClientID",110:"MinQty",111:"MaxFloor",112:"TestReqID",115:"OnBehalfOfCompID",117:"QuoteID",122:"OrigSendingTime",126:"ExpireTime",131:"QuoteReqID",132:"BidPx",133:"OfferPx",134:"BidSize",135:"OfferSize",140:"PrevClosePx",141:"ResetSeqNumFlag",150:"ExecType",151:"LeavesQty",167:"SecurityType",200:"MaturityMonthYear",201:"PutOrCall",202:"StrikePrice",207:"SecurityExchange",210:"MaxShow",369:"LastMsgSeqNumProcessed",371:"RefTagID",372:"RefMsgType",373:"SessionRejectReason",553:"Username",554:"Password"};function ra(e){const t=typeof e=="string"?parseInt(e,10):e;return Tj[t]??`Tag${t}`}const yc={D:{tag:"11",name:"ClOrdID"},F:{tag:"11",name:"ClOrdID"},G:{tag:"11",name:"ClOrdID"},AB:{tag:"11",name:"ClOrdID"},V:{tag:"262",name:"MDReqID"},R:{tag:"131",name:"QuoteReqID"},S:{tag:"117",name:"QuoteID"},x:{tag:"320",name:"SecurityReqID"}},$s={autoTs:!0,autoId:!0,idPrefix:"",idCounter:1};function Jp(e){return`fixture_send_opts_${e}`}function Qp(e){try{const t=JSON.parse(localStorage.getItem(Jp(e))??"null");return t?{...$s,...t}:{...$s}}catch{return{...$s}}}function ev(e,t){localStorage.setItem(Jp(e),JSON.stringify(t))}function Cd(e){return e.replace(/\x01/g,"|").replace(/\|$/,"")}function wi(e,t,r){const n=new RegExp(`(^|\\|)(${t}=[^|]*)`);return n.test(e)?e.replace(n,`$1${t}=${r}`):e?`${e}|${t}=${r}`:`${t}=${r}`}function tv(){const e=new Date().toISOString();return e.slice(0,10).replace(/-/g,"")+"-"+e.slice(11,19)}function rv({opts:e,onChange:t,expanded:r,onToggle:n,msgType:a}){const i=a?yc[a]:void 0;function o(l){t({...e,...l})}const s=`${e.idPrefix}${e.idCounter}`;return f.jsxs("div",{className:"send-opts",children:[f.jsxs("button",{type:"button",className:"btn btn-sm btn-ghost send-opts-toggle",onClick:n,children:[r?"▲":"▶"," Send Options"]}),r&&f.jsxs("div",{className:"send-opts-body",children:[f.jsxs("label",{className:"checkbox-label",children:[f.jsx("input",{type:"checkbox",checked:e.autoTs,onChange:l=>o({autoTs:l.target.checked})}),"Auto TransactTime (tag 60)"]}),f.jsxs("label",{className:"checkbox-label",children:[f.jsx("input",{type:"checkbox",checked:e.autoId,onChange:l=>o({autoId:l.target.checked})}),i?`Auto-generate ${i.name} (tag ${i.tag})`:a?`Auto-generate ID — no mapping for type ${a}`:"Auto-generate ID tag"]}),e.autoId&&f.jsxs("div",{className:"send-opts-id-row",children:[f.jsx("span",{className:"send-opts-label",children:"Prefix"}),f.jsx("input",{className:"send-opts-prefix",value:e.idPrefix,onChange:l=>o({idPrefix:l.target.value}),placeholder:"e.g. ORD",maxLength:20}),f.jsxs("span",{className:"send-opts-next",children:["Next: ",f.jsx("code",{children:s||e.idCounter})]})]})]})]})}const Dj=["FIX.4.2","FIX.4.4"];function Mj(e){const t={};for(const r of e.split("|")){const n=r.indexOf("=");if(n<1)continue;const a=r.slice(0,n).trim(),i=r.slice(n+1).trim();a&&!isNaN(Number(a))&&(t[a]=i)}return t}function Ed(e){return Object.entries(e).filter(([,t])=>t!=="").map(([t,r])=>`${t}=${r}`).join("|")}function Rj({fieldRef:e,value:t,onChange:r}){const n=String(e.tag||""),a=Object.keys(e.values).length>0;return f.jsxs("tr",{className:`tpl-field-row${e.required?" required":""}`,children:[f.jsx("td",{className:"tpl-field-tag",children:e.tag||"?"}),f.jsxs("td",{className:"tpl-field-name",children:[e.name,e.required&&f.jsx("span",{className:"tpl-req-badge",children:"req"})]}),f.jsx("td",{className:"tpl-field-value",children:a?f.jsxs("select",{className:"tpl-select",value:t,onChange:i=>r(n,i.target.value),children:[f.jsx("option",{value:"",children:"— pick —"}),Object.entries(e.values).map(([i,o])=>f.jsxs("option",{value:i,children:[i," – ",o.replace(/_/g," ")]},i))]}):f.jsx("input",{className:"tpl-input",type:"text",value:t,placeholder:e.type,onChange:i=>r(n,i.target.value)})})]})}function nv({template:e,defaultBeginString:t="FIX.4.2",onSaved:r,onClose:n}){const[a,i]=m.useState("fields"),[o,s]=m.useState((e==null?void 0:e.name)??""),[l,c]=m.useState((e==null?void 0:e.begin_string)??t),[u,d]=m.useState((e==null?void 0:e.msg_type)??""),[h,p]=m.useState((e==null?void 0:e.msg_type_name)??""),[v,y]=m.useState((e==null?void 0:e.fields)??{}),[g,b]=m.useState(()=>Ed((e==null?void 0:e.fields)??{})),[x,S]=m.useState([]),[j,O]=m.useState(null),[w,P]=m.useState(!1),[C,N]=m.useState(!1),[I,k]=m.useState("");m.useEffect(()=>{K.fixSpec.messages(l).then(S).catch(()=>S([]))},[l]),m.useEffect(()=>{if(!u){O(null);return}P(!0),K.fixSpec.message(l,u).then(D=>{O(D),P(!1)}).catch(()=>{O(null),P(!1)})},[l,u]);function _(D,ue){y(J=>({...J,[D]:ue}))}function Z(D){const ue=x.find(J=>J.msg_type===D);d(D),p((ue==null?void 0:ue.name)??D),D&&y(J=>({...J,35:D}))}function M(D){b(D);const ue=Mj(D);if(y(ue),ue[35]&&ue[35]!==u){const J=ue[35],L=x.find($=>$.msg_type===J);d(J),p((L==null?void 0:L.name)??J)}}function H(D){D==="raw"&&b(Ed(v)),i(D)}const A=new Set((j==null?void 0:j.fields.map(D=>String(D.tag)).filter(Boolean))??[]),R=Object.entries(v).filter(([D])=>!A.has(D)&&D!=="35"),[z,U]=m.useState(""),[Y,me]=m.useState("");function te(){!z||isNaN(Number(z))||(_(z,Y),U(""),me(""))}async function Oe(){if(!o.trim()){k("Template name is required");return}if(!u){k("Message type is required");return}N(!0),k("");try{const D=Object.fromEntries(Object.entries(v).filter(([,L])=>L!=="")),ue={name:o.trim(),msg_type:u,msg_type_name:h,begin_string:l,fields:D},J=e!=null&&e.id?await K.templates.update(e.id,ue):await K.templates.create(ue);r(J)}catch(D){k(D instanceof Error?D.message:"Save failed")}finally{N(!1)}}const ye=x.filter(D=>D.category==="app"),Ke=x.filter(D=>D.category==="admin");return f.jsx("div",{className:"modal-overlay",onClick:n,children:f.jsxs("div",{className:"modal tpl-form-modal",onClick:D=>D.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:e!=null&&e.id?"Edit Template":"New Template"}),f.jsx("button",{className:"btn-icon",onClick:n,children:"✕"})]}),f.jsxs("div",{className:"tpl-form-top",children:[f.jsxs("div",{className:"tpl-form-row",children:[f.jsx("label",{className:"tpl-label",children:"Name"}),f.jsx("input",{className:"tpl-input tpl-name-input",value:o,onChange:D=>s(D.target.value),placeholder:"e.g. Buy 100 AAPL",autoFocus:!0})]}),f.jsxs("div",{className:"tpl-form-row",children:[f.jsx("label",{className:"tpl-label",children:"FIX version"}),f.jsx("select",{className:"tpl-select",value:l,onChange:D=>c(D.target.value),children:Dj.map(D=>f.jsx("option",{value:D,children:D},D))}),f.jsx("label",{className:"tpl-label",style:{marginLeft:12},children:"Message type"}),f.jsxs("select",{className:"tpl-select tpl-msgtype-select",value:u,onChange:D=>Z(D.target.value),children:[f.jsx("option",{value:"",children:"— select —"}),ye.length>0&&f.jsx("optgroup",{label:"Application",children:ye.map(D=>f.jsxs("option",{value:D.msg_type,children:[D.name," (",D.msg_type,")"]},D.msg_type))}),Ke.length>0&&f.jsx("optgroup",{label:"Admin",children:Ke.map(D=>f.jsxs("option",{value:D.msg_type,children:[D.name," (",D.msg_type,")"]},D.msg_type))})]})]})]}),f.jsxs("div",{className:"analysis-tabs",style:{marginBottom:0},children:[f.jsx("button",{className:`analysis-tab-btn${a==="fields"?" active":""}`,onClick:()=>H("fields"),children:"Fields"}),f.jsx("button",{className:`analysis-tab-btn${a==="raw"?" active":""}`,onClick:()=>H("raw"),children:"Raw FIX"})]}),f.jsxs("div",{className:"tpl-form-body",children:[a==="fields"&&f.jsxs("div",{className:"tpl-fields-tab",children:[!u&&f.jsx("div",{className:"tpl-no-msgtype",children:"Select a message type above to see its field definitions."}),u&&w&&f.jsx("div",{className:"tpl-loading",children:"Loading fields…"}),u&&!w&&f.jsxs("table",{className:"tpl-field-table",children:[f.jsx("thead",{children:f.jsxs("tr",{children:[f.jsx("th",{children:"Tag"}),f.jsx("th",{children:"Field"}),f.jsx("th",{children:"Value"})]})}),f.jsxs("tbody",{children:[j==null?void 0:j.fields.map(D=>f.jsx(Rj,{fieldRef:D,value:v[String(D.tag)]??"",onChange:_},`${D.tag}-${D.name}`)),R.length>0&&f.jsxs(f.Fragment,{children:[f.jsx("tr",{className:"tpl-section-divider",children:f.jsx("td",{colSpan:3,children:"Custom / extra fields"})}),R.map(([D,ue])=>f.jsxs("tr",{className:"tpl-field-row",children:[f.jsx("td",{className:"tpl-field-tag",children:D}),f.jsx("td",{className:"tpl-field-name",children:ra(Number(D))}),f.jsx("td",{className:"tpl-field-value",children:f.jsx("input",{className:"tpl-input",value:ue,onChange:J=>_(D,J.target.value)})})]},D))]}),f.jsxs("tr",{className:"tpl-add-field-row",children:[f.jsx("td",{children:f.jsx("input",{className:"tpl-input tpl-add-tag",type:"number",placeholder:"tag",value:z,onChange:D=>U(D.target.value)})}),f.jsx("td",{className:"tpl-field-name",style:{color:"var(--text2)",fontSize:11},children:z&&!isNaN(Number(z))?ra(Number(z)):"add field"}),f.jsxs("td",{className:"tpl-field-value",style:{display:"flex",gap:4},children:[f.jsx("input",{className:"tpl-input",placeholder:"value",value:Y,onChange:D=>me(D.target.value),onKeyDown:D=>{D.key==="Enter"&&te()}}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:te,children:"+"})]})]})]})]})]}),a==="raw"&&f.jsxs("div",{className:"tpl-raw-tab",children:[f.jsx("textarea",{className:"tpl-raw-textarea",value:g,onChange:D=>M(D.target.value),placeholder:"35=D|49=CLIENT|56=VENUE|55=AAPL|54=1|38=100|40=2|44=100.00",spellCheck:!1}),Object.keys(v).length>0&&f.jsxs("div",{className:"tpl-raw-preview",children:[f.jsx("div",{className:"tpl-raw-preview-title",children:"Parsed fields"}),f.jsx("table",{className:"tpl-field-table tpl-preview-table",children:f.jsx("tbody",{children:Object.entries(v).map(([D,ue])=>f.jsxs("tr",{children:[f.jsx("td",{className:"tpl-field-tag",children:D}),f.jsx("td",{className:"tpl-field-name",children:ra(Number(D))}),f.jsx("td",{className:"tpl-field-value",style:{color:"var(--text)"},children:ue})]},D))})})]})]})]}),I&&f.jsx("div",{className:"tpl-error",children:I}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{className:"btn btn-ghost",onClick:n,children:"Cancel"}),f.jsx("button",{className:"btn btn-primary",onClick:Oe,disabled:C,children:C?"Saving…":"Save template"})]})]})})}function av({onSelect:e,onClose:t,defaultBeginString:r="FIX.4.2"}){const[n,a]=m.useState([]),[i,o]=m.useState(!0),[s,l]=m.useState(!1),[c,u]=m.useState(null);async function d(){o(!0);try{a(await K.templates.list())}finally{o(!1)}}m.useEffect(()=>{d()},[]);async function h(g,b){b.stopPropagation(),confirm(`Delete template "${g.name}"?`)&&(await K.templates.delete(g.id),a(x=>x.filter(S=>S.id!==g.id)))}function p(g,b){b.stopPropagation(),u(g),l(!0)}function v(g){l(!1),u(null),d()}const y=n.reduce((g,b)=>{const x=`${b.msg_type_name} (${b.msg_type})`;return(g[x]??(g[x]=[])).push(b),g},{});return s?f.jsx(nv,{template:c??void 0,defaultBeginString:r,onSaved:v,onClose:()=>{l(!1),u(null)}}):f.jsx("div",{className:"modal-overlay",onClick:t,children:f.jsxs("div",{className:"modal template-picker-modal",onClick:g=>g.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsx("span",{children:"Templates"}),f.jsx("button",{className:"btn-icon",onClick:t,children:"✕"})]}),f.jsx("div",{className:"template-picker-toolbar",children:f.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>{u(null),l(!0)},children:"+ New template"})}),f.jsxs("div",{className:"template-picker-body",children:[i&&f.jsx("div",{className:"template-picker-empty",children:"Loading…"}),!i&&n.length===0&&f.jsx("div",{className:"template-picker-empty",children:"No templates yet. Create one to reuse pre-populated FIX messages."}),!i&&Object.entries(y).sort(([g],[b])=>g.localeCompare(b)).map(([g,b])=>f.jsxs("div",{className:"template-group",children:[f.jsx("div",{className:"template-group-title",children:g}),b.map(x=>f.jsxs("div",{className:"template-row",onClick:()=>{e(x),t()},children:[f.jsx("div",{className:"template-row-name",children:x.name}),f.jsxs("div",{className:"template-row-meta",children:[f.jsx("span",{className:"template-begin-string",children:x.begin_string}),f.jsxs("span",{className:"template-field-count",children:[Object.keys(x.fields).length," fields"]})]}),f.jsxs("div",{className:"template-row-actions",onClick:S=>S.stopPropagation(),children:[f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:S=>p(x,S),title:"Edit",children:"✎"}),f.jsx("button",{className:"btn btn-sm btn-danger",onClick:S=>h(x,S),title:"Delete",children:"✕"})]})]},x.id))]},g))]})]})})}function Nd(e){return`fixture_compose_${e}`}const $j=new Set(["8","9","10","34","49","56"]);function Ad(e){const t=e.includes("")?"":"|";return e.split(t).filter(r=>r.includes("=")).map(r=>{const n=r.indexOf("=");return{tag:r.slice(0,n).trim(),value:r.slice(n+1)}}).filter(r=>r.tag!=="")}function Lj({session:e,raw:t,onRawChange:r,onClose:n}){var k;const a=re(_=>_.user),[i,o]=m.useState(!1),[s,l]=m.useState(null),[c,u]=m.useState(()=>a?Qp(a.uid):{autoTs:!0,autoId:!0,idPrefix:"",idCounter:1}),[d,h]=m.useState(!1),[p,v]=m.useState(!1),[y,g]=m.useState(!1);m.useEffect(()=>{if(a&&!t){const _=localStorage.getItem(Nd(a.uid));_&&r(_)}},[]);function b(_){const Z=Object.entries(_.fields).filter(([,M])=>M!=="").map(([M,H])=>`${M}=${H}`).join("|");S(Z)}function x(){return Object.fromEntries(Ad(t).map(_=>[_.tag,_.value]))}function S(_){r(_),a&&localStorage.setItem(Nd(a.uid),_)}function j(_){u(_),a&&ev(a.uid,_)}const O=t.trim()?Ad(t):[],w=O.filter(_=>!$j.has(_.tag)),P=((k=O.find(_=>_.tag==="35"))==null?void 0:k.value)??"",C=!!P,N=C&&e.status==="LOGGED_ON";async function I(){if(N){o(!0),l(null);try{let _=t;if(c.autoId&&P){const Z=yc[P];if(Z){const M=`${c.idPrefix}${c.idCounter}`;_=wi(_,Z.tag,M),j({...c,idCounter:c.idCounter+1})}}c.autoTs&&(_=wi(_,"60",tv())),await K.sessions.send(e.session_id,_,{noAutoTs:!c.autoTs})}catch(_){l(_.message??"Send failed")}finally{o(!1)}}}return f.jsxs("div",{className:"compose-pane",children:[f.jsx("textarea",{className:"compose-textarea",placeholder:`Paste raw FIX (pipe- or SOH-delimited)
|
|
37
37
|
8=FIX.4.2|35=D|49=SENDER|56=TARGET|11=ORD1|55=AAPL|54=1|38=100|40=2|44=150.00`,value:t,onChange:_=>{S(_.target.value),l(null)},rows:4,spellCheck:!1}),w.length>0&&f.jsx("div",{className:"compose-fields",children:f.jsxs("table",{className:"compose-fields-table",children:[f.jsx("thead",{children:f.jsxs("tr",{children:[f.jsx("th",{children:"Tag"}),f.jsx("th",{children:"Value"})]})}),f.jsx("tbody",{children:w.map((_,Z)=>f.jsxs("tr",{children:[f.jsx("td",{children:_.tag}),f.jsx("td",{children:_.value})]},Z))})]})}),w.length>0&&f.jsxs("div",{className:"compose-managed-note",children:["FIXture sets: 49=",e.sender_comp_id," · 56=",e.target_comp_id," · 8, 9, 10, 34"]}),f.jsx(rv,{opts:c,onChange:j,expanded:d,onToggle:()=>h(_=>!_),msgType:P||void 0}),f.jsxs("div",{className:"compose-footer",children:[f.jsx("button",{className:"btn btn-sm btn-primary",onClick:I,disabled:!N||i,title:C?e.status!=="LOGGED_ON"?"Session must be logged on":void 0:"Message needs tag 35 (MsgType)",children:i?"Sending…":`Send on ${e.sender_comp_id}→${e.target_comp_id}`}),f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>v(!0),title:"Load a template",children:"Templates"}),t.trim()&&f.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>g(!0),title:"Save current message as a template",children:"Save as template"}),s&&f.jsx("span",{className:"compose-error",children:s}),f.jsx("button",{className:"btn btn-sm btn-ghost compose-close",onClick:n,children:"✕"})]}),p&&f.jsx(av,{defaultBeginString:e.begin_string,onSelect:b,onClose:()=>v(!1)}),y&&f.jsx(nv,{defaultBeginString:e.begin_string,template:{id:"",name:"",msg_type:P,msg_type_name:"",begin_string:e.begin_string,fields:x()},onSaved:()=>g(!1),onClose:()=>g(!1)})]})}function Bj({row:e,sessionId:t,onClose:r}){const n=re(v=>v.user),[a,i]=m.useState(()=>n?Qp(n.uid):{autoTs:!0,autoId:!0,idPrefix:"",idCounter:1}),[o,s]=m.useState(!1),[l,c]=m.useState(""),[u,d]=m.useState(!1);function h(v){i(v),n&&ev(n.uid,v)}async function p(){c(""),d(!0);try{let v=Cd(e.raw);if(a.autoId){const y=yc[e.msg_type];if(y){const g=`${a.idPrefix}${a.idCounter}`;v=wi(v,y.tag,g),h({...a,idCounter:a.idCounter+1})}}a.autoTs&&(v=wi(v,"60",tv())),await K.sessions.send(t,v,{noAutoTs:!a.autoTs}),r()}catch(v){c(v instanceof Error?v.message:String(v))}finally{d(!1)}}return f.jsx("div",{className:"modal-overlay",onClick:r,children:f.jsxs("div",{className:"modal",onClick:v=>v.stopPropagation(),children:[f.jsxs("div",{className:"modal-header",children:[f.jsxs("span",{children:["Resend — ",e.msg_type_name," (seq ",e.seq_num,")"]}),f.jsx("button",{className:"btn-icon",onClick:r,children:"✕"})]}),f.jsxs("div",{style:{padding:"12px 16px",display:"flex",flexDirection:"column",gap:10},children:[f.jsx("div",{className:"resend-raw",children:Cd(e.raw)}),f.jsx(rv,{opts:a,onChange:h,expanded:o,onToggle:()=>s(v=>!v),msgType:e.msg_type})]}),l&&f.jsx("div",{className:"error-msg",style:{margin:"0 16px 8px"},children:l}),f.jsxs("div",{className:"modal-footer",children:[f.jsx("button",{className:"btn btn-secondary",onClick:r,children:"Cancel"}),f.jsx("button",{className:"btn btn-primary",onClick:p,disabled:u,children:u?"Sending…":"Send"})]})]})})}function iv(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(r=iv(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}function ne(){for(var e,t,r=0,n="",a=arguments.length;r<a;r++)(e=arguments[r])&&(t=iv(e))&&(n&&(n+=" "),n+=t);return n}var zj=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function bc(e){if(typeof e!="string")return!1;var t=zj;return t.includes(e)}var Fj=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],Wj=new Set(Fj);function ov(e){return typeof e!="string"?!1:Wj.has(e)}function sv(e){return typeof e=="string"&&e.startsWith("data-")}function Pt(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(ov(r)||sv(r))&&(t[r]=e[r]);return t}function Pa(e){if(e==null)return null;if(m.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return Pt(t)}return typeof e=="object"&&!Array.isArray(e)?Pt(e):null}function Je(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(ov(r)||sv(r)||bc(r))&&(t[r]=e[r]);return t}function Uj(e){return e==null?null:m.isValidElement(e)?Je(e.props):typeof e=="object"&&!Array.isArray(e)?Je(e):null}var Hj=["children","width","height","viewBox","className","style","title","desc"];function pl(){return pl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},pl.apply(null,arguments)}function Zj(e,t){if(e==null)return{};var r,n,a=Gj(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function Gj(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var xc=m.forwardRef((e,t)=>{var{children:r,width:n,height:a,viewBox:i,className:o,style:s,title:l,desc:c}=e,u=Zj(e,Hj),d=i||{width:n,height:a,x:0,y:0},h=ne("recharts-surface",o);return m.createElement("svg",pl({},Je(u),{className:h,width:n,height:a,style:s,viewBox:"".concat(d.x," ").concat(d.y," ").concat(d.width," ").concat(d.height),ref:t}),m.createElement("title",null,l),m.createElement("desc",null,c),r)}),Kj=["children","className"];function vl(){return vl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},vl.apply(null,arguments)}function Yj(e,t){if(e==null)return{};var r,n,a=Xj(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function Xj(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var st=m.forwardRef((e,t)=>{var{children:r,className:n}=e,a=Yj(e,Kj),i=ne("recharts-layer",n);return m.createElement("g",vl({className:i},Je(a),{ref:t}),r)}),lv=m.createContext(null),qj=()=>m.useContext(lv);function ce(e){return function(){return e}}const cv=Math.cos,Si=Math.sin,Nt=Math.sqrt,ji=Math.PI,Oo=2*ji,gl=Math.PI,yl=2*gl,Nr=1e-6,Vj=yl-Nr;function uv(e){this._+=e[0];for(let t=1,r=e.length;t<r;++t)this._+=arguments[t]+e[t]}function Jj(e){let t=Math.floor(e);if(!(t>=0))throw new Error(`invalid digits: ${e}`);if(t>15)return uv;const r=10**t;return function(n){this._+=n[0];for(let a=1,i=n.length;a<i;++a)this._+=Math.round(arguments[a]*r)/r+n[a]}}class Qj{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=t==null?uv:Jj(t)}moveTo(t,r){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,r){this._append`L${this._x1=+t},${this._y1=+r}`}quadraticCurveTo(t,r,n,a){this._append`Q${+t},${+r},${this._x1=+n},${this._y1=+a}`}bezierCurveTo(t,r,n,a,i,o){this._append`C${+t},${+r},${+n},${+a},${this._x1=+i},${this._y1=+o}`}arcTo(t,r,n,a,i){if(t=+t,r=+r,n=+n,a=+a,i=+i,i<0)throw new Error(`negative radius: ${i}`);let o=this._x1,s=this._y1,l=n-t,c=a-r,u=o-t,d=s-r,h=u*u+d*d;if(this._x1===null)this._append`M${this._x1=t},${this._y1=r}`;else if(h>Nr)if(!(Math.abs(d*l-c*u)>Nr)||!i)this._append`L${this._x1=t},${this._y1=r}`;else{let p=n-o,v=a-s,y=l*l+c*c,g=p*p+v*v,b=Math.sqrt(y),x=Math.sqrt(h),S=i*Math.tan((gl-Math.acos((y+h-g)/(2*b*x)))/2),j=S/x,O=S/b;Math.abs(j-1)>Nr&&this._append`L${t+j*u},${r+j*d}`,this._append`A${i},${i},0,0,${+(d*p>u*v)},${this._x1=t+O*l},${this._y1=r+O*c}`}}arc(t,r,n,a,i,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(a),l=n*Math.sin(a),c=t+s,u=r+l,d=1^o,h=o?a-i:i-a;this._x1===null?this._append`M${c},${u}`:(Math.abs(this._x1-c)>Nr||Math.abs(this._y1-u)>Nr)&&this._append`L${c},${u}`,n&&(h<0&&(h=h%yl+yl),h>Vj?this._append`A${n},${n},0,1,${d},${t-s},${r-l}A${n},${n},0,1,${d},${this._x1=c},${this._y1=u}`:h>Nr&&this._append`A${n},${n},0,${+(h>=gl)},${d},${this._x1=t+n*Math.cos(i)},${this._y1=r+n*Math.sin(i)}`)}rect(t,r,n,a){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+a}h${-n}Z`}toString(){return this._}}function wc(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new Qj(t)}function Sc(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function dv(e){this._context=e}dv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function Po(e){return new dv(e)}function fv(e){return e[0]}function hv(e){return e[1]}function mv(e,t){var r=ce(!0),n=null,a=Po,i=null,o=wc(s);e=typeof e=="function"?e:e===void 0?fv:ce(e),t=typeof t=="function"?t:t===void 0?hv:ce(t);function s(l){var c,u=(l=Sc(l)).length,d,h=!1,p;for(n==null&&(i=a(p=o())),c=0;c<=u;++c)!(c<u&&r(d=l[c],c,l))===h&&((h=!h)?i.lineStart():i.lineEnd()),h&&i.point(+e(d,c,l),+t(d,c,l));if(p)return i=null,p+""||null}return s.x=function(l){return arguments.length?(e=typeof l=="function"?l:ce(+l),s):e},s.y=function(l){return arguments.length?(t=typeof l=="function"?l:ce(+l),s):t},s.defined=function(l){return arguments.length?(r=typeof l=="function"?l:ce(!!l),s):r},s.curve=function(l){return arguments.length?(a=l,n!=null&&(i=a(n)),s):a},s.context=function(l){return arguments.length?(l==null?n=i=null:i=a(n=l),s):n},s}function Ga(e,t,r){var n=null,a=ce(!0),i=null,o=Po,s=null,l=wc(c);e=typeof e=="function"?e:e===void 0?fv:ce(+e),t=typeof t=="function"?t:ce(t===void 0?0:+t),r=typeof r=="function"?r:r===void 0?hv:ce(+r);function c(d){var h,p,v,y=(d=Sc(d)).length,g,b=!1,x,S=new Array(y),j=new Array(y);for(i==null&&(s=o(x=l())),h=0;h<=y;++h){if(!(h<y&&a(g=d[h],h,d))===b)if(b=!b)p=h,s.areaStart(),s.lineStart();else{for(s.lineEnd(),s.lineStart(),v=h-1;v>=p;--v)s.point(S[v],j[v]);s.lineEnd(),s.areaEnd()}b&&(S[h]=+e(g,h,d),j[h]=+t(g,h,d),s.point(n?+n(g,h,d):S[h],r?+r(g,h,d):j[h]))}if(x)return s=null,x+""||null}function u(){return mv().defined(a).curve(o).context(i)}return c.x=function(d){return arguments.length?(e=typeof d=="function"?d:ce(+d),n=null,c):e},c.x0=function(d){return arguments.length?(e=typeof d=="function"?d:ce(+d),c):e},c.x1=function(d){return arguments.length?(n=d==null?null:typeof d=="function"?d:ce(+d),c):n},c.y=function(d){return arguments.length?(t=typeof d=="function"?d:ce(+d),r=null,c):t},c.y0=function(d){return arguments.length?(t=typeof d=="function"?d:ce(+d),c):t},c.y1=function(d){return arguments.length?(r=d==null?null:typeof d=="function"?d:ce(+d),c):r},c.lineX0=c.lineY0=function(){return u().x(e).y(t)},c.lineY1=function(){return u().x(e).y(r)},c.lineX1=function(){return u().x(n).y(t)},c.defined=function(d){return arguments.length?(a=typeof d=="function"?d:ce(!!d),c):a},c.curve=function(d){return arguments.length?(o=d,i!=null&&(s=o(i)),c):o},c.context=function(d){return arguments.length?(d==null?i=s=null:s=o(i=d),c):i},c}class pv{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function e1(e){return new pv(e,!0)}function t1(e){return new pv(e,!1)}const jc={draw(e,t){const r=Nt(t/ji);e.moveTo(r,0),e.arc(0,0,r,0,Oo)}},r1={draw(e,t){const r=Nt(t/5)/2;e.moveTo(-3*r,-r),e.lineTo(-r,-r),e.lineTo(-r,-3*r),e.lineTo(r,-3*r),e.lineTo(r,-r),e.lineTo(3*r,-r),e.lineTo(3*r,r),e.lineTo(r,r),e.lineTo(r,3*r),e.lineTo(-r,3*r),e.lineTo(-r,r),e.lineTo(-3*r,r),e.closePath()}},vv=Nt(1/3),n1=vv*2,a1={draw(e,t){const r=Nt(t/n1),n=r*vv;e.moveTo(0,-r),e.lineTo(n,0),e.lineTo(0,r),e.lineTo(-n,0),e.closePath()}},i1={draw(e,t){const r=Nt(t),n=-r/2;e.rect(n,n,r,r)}},o1=.8908130915292852,gv=Si(ji/10)/Si(7*ji/10),s1=Si(Oo/10)*gv,l1=-cv(Oo/10)*gv,c1={draw(e,t){const r=Nt(t*o1),n=s1*r,a=l1*r;e.moveTo(0,-r),e.lineTo(n,a);for(let i=1;i<5;++i){const o=Oo*i/5,s=cv(o),l=Si(o);e.lineTo(l*r,-s*r),e.lineTo(s*n-l*a,l*n+s*a)}e.closePath()}},Ls=Nt(3),u1={draw(e,t){const r=-Nt(t/(Ls*3));e.moveTo(0,r*2),e.lineTo(-Ls*r,-r),e.lineTo(Ls*r,-r),e.closePath()}},ft=-.5,ht=Nt(3)/2,bl=1/Nt(12),d1=(bl/2+1)*3,f1={draw(e,t){const r=Nt(t/d1),n=r/2,a=r*bl,i=n,o=r*bl+r,s=-i,l=o;e.moveTo(n,a),e.lineTo(i,o),e.lineTo(s,l),e.lineTo(ft*n-ht*a,ht*n+ft*a),e.lineTo(ft*i-ht*o,ht*i+ft*o),e.lineTo(ft*s-ht*l,ht*s+ft*l),e.lineTo(ft*n+ht*a,ft*a-ht*n),e.lineTo(ft*i+ht*o,ft*o-ht*i),e.lineTo(ft*s+ht*l,ft*l-ht*s),e.closePath()}};function h1(e,t){let r=null,n=wc(a);e=typeof e=="function"?e:ce(e||jc),t=typeof t=="function"?t:ce(t===void 0?64:+t);function a(){let i;if(r||(r=i=n()),e.apply(this,arguments).draw(r,+t.apply(this,arguments)),i)return r=null,i+""||null}return a.type=function(i){return arguments.length?(e=typeof i=="function"?i:ce(i),a):e},a.size=function(i){return arguments.length?(t=typeof i=="function"?i:ce(+i),a):t},a.context=function(i){return arguments.length?(r=i??null,a):r},a}function Oi(){}function Pi(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function yv(e){this._context=e}yv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Pi(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Pi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function m1(e){return new yv(e)}function bv(e){this._context=e}bv.prototype={areaStart:Oi,areaEnd:Oi,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Pi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function p1(e){return new bv(e)}function xv(e){this._context=e}xv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Pi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function v1(e){return new xv(e)}function wv(e){this._context=e}wv.prototype={areaStart:Oi,areaEnd:Oi,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function g1(e){return new wv(e)}function Id(e){return e<0?-1:1}function kd(e,t,r){var n=e._x1-e._x0,a=t-e._x1,i=(e._y1-e._y0)/(n||a<0&&-0),o=(r-e._y1)/(a||n<0&&-0),s=(i*a+o*n)/(n+a);return(Id(i)+Id(o))*Math.min(Math.abs(i),Math.abs(o),.5*Math.abs(s))||0}function Td(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function Bs(e,t,r){var n=e._x0,a=e._y0,i=e._x1,o=e._y1,s=(i-n)/3;e._context.bezierCurveTo(n+s,a+s*t,i-s,o-s*r,i,o)}function _i(e){this._context=e}_i.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Bs(this,this._t0,Td(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,Bs(this,Td(this,r=kd(this,e,t)),r);break;default:Bs(this,this._t0,r=kd(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function Sv(e){this._context=new jv(e)}(Sv.prototype=Object.create(_i.prototype)).point=function(e,t){_i.prototype.point.call(this,t,e)};function jv(e){this._context=e}jv.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,a,i){this._context.bezierCurveTo(t,e,n,r,i,a)}};function y1(e){return new _i(e)}function b1(e){return new Sv(e)}function Ov(e){this._context=e}Ov.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Dd(e),a=Dd(t),i=0,o=1;o<r;++i,++o)this._context.bezierCurveTo(n[0][i],a[0][i],n[1][i],a[1][i],e[o],t[o]);(this._line||this._line!==0&&r===1)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(e,t){this._x.push(+e),this._y.push(+t)}};function Dd(e){var t,r=e.length-1,n,a=new Array(r),i=new Array(r),o=new Array(r);for(a[0]=0,i[0]=2,o[0]=e[0]+2*e[1],t=1;t<r-1;++t)a[t]=1,i[t]=4,o[t]=4*e[t]+2*e[t+1];for(a[r-1]=2,i[r-1]=7,o[r-1]=8*e[r-1]+e[r],t=1;t<r;++t)n=a[t]/i[t-1],i[t]-=n,o[t]-=n*o[t-1];for(a[r-1]=o[r-1]/i[r-1],t=r-2;t>=0;--t)a[t]=(o[t]-a[t+1])/i[t];for(i[r-1]=(e[r]+a[r-1])/2,t=0;t<r-1;++t)i[t]=2*e[t+1]-a[t+1];return[a,i]}function x1(e){return new Ov(e)}function _o(e,t){this._context=e,this._t=t}_o.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&this._point===2&&this._context.lineTo(this._x,this._y),(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function w1(e){return new _o(e,.5)}function S1(e){return new _o(e,0)}function j1(e){return new _o(e,1)}function zr(e,t){if((o=e.length)>1)for(var r=1,n,a,i=e[t[0]],o,s=i.length;r<o;++r)for(a=i,i=e[t[r]],n=0;n<s;++n)i[n][1]+=i[n][0]=isNaN(a[n][1])?a[n][0]:a[n][1]}function xl(e){for(var t=e.length,r=new Array(t);--t>=0;)r[t]=t;return r}function O1(e,t){return e[t]}function P1(e){const t=[];return t.key=e,t}function _1(){var e=ce([]),t=xl,r=zr,n=O1;function a(i){var o=Array.from(e.apply(this,arguments),P1),s,l=o.length,c=-1,u;for(const d of i)for(s=0,++c;s<l;++s)(o[s][c]=[0,+n(d,o[s].key,c,i)]).data=d;for(s=0,u=Sc(t(o));s<l;++s)o[u[s]].index=s;return r(o,u),o}return a.keys=function(i){return arguments.length?(e=typeof i=="function"?i:ce(Array.from(i)),a):e},a.value=function(i){return arguments.length?(n=typeof i=="function"?i:ce(+i),a):n},a.order=function(i){return arguments.length?(t=i==null?xl:typeof i=="function"?i:ce(Array.from(i)),a):t},a.offset=function(i){return arguments.length?(r=i??zr,a):r},a}function C1(e,t){if((n=e.length)>0){for(var r,n,a=0,i=e[0].length,o;a<i;++a){for(o=r=0;r<n;++r)o+=e[r][a][1]||0;if(o)for(r=0;r<n;++r)e[r][a][1]/=o}zr(e,t)}}function E1(e,t){if((a=e.length)>0){for(var r=0,n=e[t[0]],a,i=n.length;r<i;++r){for(var o=0,s=0;o<a;++o)s+=e[o][r][1]||0;n[r][1]+=n[r][0]=-s/2}zr(e,t)}}function N1(e,t){if(!(!((o=e.length)>0)||!((i=(a=e[t[0]]).length)>0))){for(var r=0,n=1,a,i,o;n<i;++n){for(var s=0,l=0,c=0;s<o;++s){for(var u=e[t[s]],d=u[n][1]||0,h=u[n-1][1]||0,p=(d-h)/2,v=0;v<s;++v){var y=e[t[v]],g=y[n][1]||0,b=y[n-1][1]||0;p+=g-b}l+=d,c+=p*d}a[n-1][1]+=a[n-1][0]=r,l&&(r-=c/l)}a[n-1][1]+=a[n-1][0]=r,zr(e,t)}}var Co={},Pv={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r==="__proto__"}e.isUnsafeProperty=t})(Pv);var Oc={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){switch(typeof r){case"number":case"symbol":return!1;case"string":return r.includes(".")||r.includes("[")||r.includes("]")}}e.isDeepKey=t})(Oc);var Eo={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){var n;return typeof r=="string"||typeof r=="symbol"?r:Object.is((n=r==null?void 0:r.valueOf)==null?void 0:n.call(r),-0)?"-0":String(r)}e.toKey=t})(Eo);var No={},_v={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){if(r==null)return"";if(typeof r=="string")return r;if(Array.isArray(r))return r.map(t).join(",");const n=String(r);return n==="0"&&Object.is(Number(r),-0)?"-0":n}e.toString=t})(_v);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=_v,r=Eo;function n(a){if(Array.isArray(a))return a.map(r.toKey);if(typeof a=="symbol")return[a];a=t.toString(a);const i=[],o=a.length;if(o===0)return i;let s=0,l="",c="",u=!1;for(a.charCodeAt(0)===46&&(i.push(""),s++);s<o;){const d=a[s];c?d==="\\"&&s+1<o?(s++,l+=a[s]):d===c?c="":l+=d:u?d==='"'||d==="'"?c=d:d==="]"?(u=!1,i.push(l),l=""):l+=d:d==="["?(u=!0,l&&(i.push(l),l="")):d==="."?l&&(i.push(l),l=""):l+=d,s++}return l&&i.push(l),i}e.toPath=n})(No);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Pv,r=Oc,n=Eo,a=No;function i(s,l,c){if(s==null)return c;switch(typeof l){case"string":{if(t.isUnsafeProperty(l))return c;const u=s[l];return u===void 0?r.isDeepKey(l)?i(s,a.toPath(l),c):c:u}case"number":case"symbol":{typeof l=="number"&&(l=n.toKey(l));const u=s[l];return u===void 0?c:u}default:{if(Array.isArray(l))return o(s,l,c);if(Object.is(l==null?void 0:l.valueOf(),-0)?l="-0":l=String(l),t.isUnsafeProperty(l))return c;const u=s[l];return u===void 0?c:u}}}function o(s,l,c){if(l.length===0)return c;let u=s;for(let d=0;d<l.length;d++){if(u==null||t.isUnsafeProperty(l[d]))return c;u=u[l[d]]}return u===void 0?c:u}e.get=i})(Co);var A1=Co.get;const bn=Sr(A1);var I1=4;function vr(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:I1,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function xe(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return e.reduce((a,i,o)=>{var s=r[o-1];return typeof s=="string"?a+s+i:s!==void 0?a+vr(s)+i:a+i},"")}var tt=e=>e===0?0:e>0?1:-1,Ft=e=>typeof e=="number"&&e!=+e,Fr=e=>typeof e=="string"&&e.indexOf("%")===e.length-1,W=e=>(typeof e=="number"||e instanceof Number)&&!Ft(e),Wt=e=>W(e)||typeof e=="string",k1=0,oa=e=>{var t=++k1;return"".concat(e||"").concat(t)},_t=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!W(t)&&typeof t!="string")return n;var i;if(Fr(t)){if(r==null)return n;var o=t.indexOf("%");i=r*parseFloat(t.slice(0,o))/100}else i=+t;return Ft(i)&&(i=n),a&&r!=null&&i>r&&(i=r),i},Cv=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;n<t;n++)if(!r[String(e[n])])r[String(e[n])]=!0;else return!0;return!1};function we(e,t,r){return W(e)&&W(t)?vr(e+r*(t-e)):t}function Ev(e,t,r){if(!(!e||!e.length))return e.find(n=>n&&(typeof t=="function"?t(n):bn(n,t))===r)}var ge=e=>e===null||typeof e>"u",_a=e=>ge(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function rt(e){return e!=null}function qr(){}var T1=["type","size","sizeType"];function wl(){return wl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},wl.apply(null,arguments)}function Md(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Rd(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?Md(Object(r),!0).forEach(function(n){D1(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Md(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function D1(e,t,r){return(t=M1(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function M1(e){var t=R1(e,"string");return typeof t=="symbol"?t:t+""}function R1(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function $1(e,t){if(e==null)return{};var r,n,a=L1(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function L1(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var Nv={symbolCircle:jc,symbolCross:r1,symbolDiamond:a1,symbolSquare:i1,symbolStar:c1,symbolTriangle:u1,symbolWye:f1},B1=Math.PI/180,z1=e=>{var t="symbol".concat(_a(e));return Nv[t]||jc},F1=(e,t,r)=>{if(t==="area")return e;switch(r){case"cross":return 5*e*e/9;case"diamond":return .5*e*e/Math.sqrt(3);case"square":return e*e;case"star":{var n=18*B1;return 1.25*e*e*(Math.tan(n)-Math.tan(n*2)*Math.tan(n)**2)}case"triangle":return Math.sqrt(3)*e*e/4;case"wye":return(21-10*Math.sqrt(3))*e*e/8;default:return Math.PI*e*e/4}},W1=(e,t)=>{Nv["symbol".concat(_a(e))]=t},Pc=e=>{var{type:t="circle",size:r=64,sizeType:n="area"}=e,a=$1(e,T1),i=Rd(Rd({},a),{},{type:t,size:r,sizeType:n}),o="circle";typeof t=="string"&&(o=t);var s=()=>{var h=z1(o),p=h1().type(h).size(F1(r,n,o)),v=p();if(v!==null)return v},{className:l,cx:c,cy:u}=i,d=Je(i);return W(c)&&W(u)&&W(r)?m.createElement("path",wl({},d,{className:ne("recharts-symbols",l),transform:"translate(".concat(c,", ").concat(u,")"),d:s()})):null};Pc.registerSymbol=W1;var Av=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,_c=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(m.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(a=>{bc(a)&&typeof r[a]=="function"&&(n[a]=i=>r[a](r,i))}),n},U1=(e,t,r)=>n=>(e(t,r,n),null),Ao=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(a=>{var i=e[a];bc(a)&&typeof i=="function"&&(n||(n={}),n[a]=U1(i,t,r))}),n};function $d(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function H1(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?$d(Object(r),!0).forEach(function(n){Z1(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):$d(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function Z1(e,t,r){return(t=G1(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function G1(e){var t=K1(e,"string");return typeof t=="symbol"?t:t+""}function K1(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Fe(e,t){var r=H1({},e),n=t,a=Object.keys(t),i=a.reduce((o,s)=>(o[s]===void 0&&n[s]!==void 0&&(o[s]=n[s]),o),r);return i}function Ci(){return Ci=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Ci.apply(null,arguments)}function Ld(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),r.push.apply(r,n)}return r}function Iv(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?Ld(Object(r),!0).forEach(function(n){Y1(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Ld(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function Y1(e,t,r){return(t=X1(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function X1(e){var t=q1(e,"string");return typeof t=="symbol"?t:t+""}function q1(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var pt=32,V1={align:"center",iconSize:14,inactiveColor:"#ccc",layout:"horizontal",verticalAlign:"middle",labelStyle:{}};function J1(e){if(typeof e=="object"&&e!==null&&"strokeDasharray"in e)return String(e.strokeDasharray)}function Q1(e){var{data:t,iconType:r,inactiveColor:n}=e,a=pt/2,i=pt/6,o=pt/3,s=t.inactive?n:t.color,l=r??t.type;if(l==="none")return null;if(l==="plainline")return m.createElement("line",{strokeWidth:4,fill:"none",stroke:s,strokeDasharray:J1(t.payload),x1:0,y1:a,x2:pt,y2:a,className:"recharts-legend-icon"});if(l==="line")return m.createElement("path",{strokeWidth:4,fill:"none",stroke:s,d:"M0,".concat(a,"h").concat(o,`
|
|
38
38
|
A`).concat(i,",").concat(i,",0,1,1,").concat(2*o,",").concat(a,`
|
|
39
39
|
H`).concat(pt,"M").concat(2*o,",").concat(a,`
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
7
7
|
<title>FIXture</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-Cb1uGbWD.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/ag-grid-_QKprVdm.js">
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/index-B31-1dt-.css">
|
|
11
11
|
</head>
|
|
@@ -46,7 +46,7 @@ fixture/static/favicon.svg
|
|
|
46
46
|
fixture/static/index.html
|
|
47
47
|
fixture/static/assets/ag-grid-_QKprVdm.js
|
|
48
48
|
fixture/static/assets/index-B31-1dt-.css
|
|
49
|
-
fixture/static/assets/index-
|
|
49
|
+
fixture/static/assets/index-Cb1uGbWD.js
|
|
50
50
|
fixture/static/assets/react-vendor-2eF0YfZT.js
|
|
51
51
|
fixture/ui/__init__.py
|
|
52
52
|
fixtureqa.egg-info/PKG-INFO
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|