From e3cb80467129f64ad4f55200206f61cebb226b88 Mon Sep 17 00:00:00 2001 From: Raika Furude Date: Mon, 24 Nov 2025 11:16:21 -0500 Subject: [PATCH] updated with database backend + graph view --- .../__pycache__/database.cpython-39.pyc | Bin 0 -> 16856 bytes vitallink/backend/database.py | 623 +++++ vitallink/backend/server.py | 44 + .../frontend/dashboard/package-lock.json | 518 ++++- vitallink/frontend/dashboard/package.json | 3 +- vitallink/frontend/dashboard/src/App.jsx | 186 +- .../dashboard/src/PatientDetailModal.jsx | 295 +++ vitallink/logs/all_pids.txt | 4 + vitallink/logs/backend.log | 2027 ++--------------- vitallink/logs/backend.pid | 1 + vitallink/logs/dashboard.log | 2 +- vitallink/logs/dashboard.pid | 1 + vitallink/logs/kiosk.log | 132 +- vitallink/logs/kiosk.pid | 1 + vitallink/logs/wristbands.log | 133 -- vitallink/logs/wristbands.pid | 1 + vitallink/vitallink.db | Bin 0 -> 53248 bytes 17 files changed, 1615 insertions(+), 2356 deletions(-) create mode 100644 vitallink/backend/__pycache__/database.cpython-39.pyc create mode 100644 vitallink/backend/database.py create mode 100644 vitallink/frontend/dashboard/src/PatientDetailModal.jsx create mode 100644 vitallink/logs/all_pids.txt create mode 100644 vitallink/logs/backend.pid create mode 100644 vitallink/logs/dashboard.pid create mode 100644 vitallink/logs/kiosk.pid create mode 100644 vitallink/logs/wristbands.pid create mode 100644 vitallink/vitallink.db diff --git a/vitallink/backend/__pycache__/database.cpython-39.pyc b/vitallink/backend/__pycache__/database.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9719f68046affc48743f838c1da55b9b4e50e22 GIT binary patch literal 16856 zcmc&*TWlQHd7j(ehRYR2-Kd*AzR2X-Bte6h+&|zVw0=NFVxI%tIeipsj#D1W21YvSIi8&zYH> zSyGgp1jtHrc+Qz~{m*~C|8maMhKEfBzs0XV-T0Stit_K2i2u?^yo$&9wyG#hsVGck zT2rm4;;&ZG@K|dYOeG`oQq62DSILRE)-)?7OIL=@C@jOW z?NTdU-e$}tlu6RBbLoL#WsUbsDJHW=?H7a}Tz3ku>?T=LcEiux4m3`vx{>pxP-{k}B5Ig*yS{bv)E+1q^ z*irTvd;C4jK%_0CpNOTOMEa>%`f2n#%8s#T-ZO$4<7|Qz*|V~R%|myU%3=HP$~H*IdNe0iba+E&-*PQ!8ScHOqtI^62k z+=ktDok{B&)x_Ugn_0CD)^IJC*BVW;)UI7@+K$ETZnJii-q)Hp(S|J9XxAGI4Oor# zHQR9;>u9gjHt!S9l#8mLWi{7!8!fx2`^Ex#_Knkxy6a~byHv2&M43G`=VrTJ@3dX} zhTB5>>o%`dh7`q|nzELH0a}<%(>CXpOS7vbYjyUug_1S@x>a6WwMuWzudJ>_Q?VvY z3%_7y)dsUxOK+`OOUv`;W|!Z#zEpa9QWUs|nMQA^o$~pG1^H^N!5z2SuC;7gH~F?% z+ugXbF)4df3U3K)GyWex;;=#PNlxVIo1d7Y%T|Oy7c<&`Gr+$yu7%4Zgyc@ zmTNfGTHS42v#r+_7Z*yiWh*RqB4~))SV~r{xv`OiW#-N=FPF-z)o6@n@e3v`pWsJg zo*HYk*B!Zv)&xyx%E5fWSm2Oaai@iqoLP<9kn4+eoiDGJ&XktpOKZ)ZUtOFpgH6t1 zJaXiNoRD129oT?I>A1C4*8j zmvxmluuH9)$(7`z;Ubh=COh2GYdFYYr?DHcNl| zOOkbYqeJ_%>eM^jj;$8R?{wPW?%2+)U2J!FtJZ8_DR)@9>$L{$%$8kkHQF04iUuq# zyZnu;Ea3$3q`i*OOpu7!9^!XiVxnKv$gg#AWve?cY^TZkcqd8OwyzInVfoh~X$V)a zezC<1@WyG^y3VBz;4ZQABr^X7_T0)%$nBN|ZjEiXW@mlJm2gC*YFOzrE`_MJGp&On zH@kzPQpmXR5L<*OYqZBFt?@`+QG%c@;1o*Mnl^V4vEBN#7;9KRkm7PNv?c2WUVm`K8t#>w{&4rRRl60nM+$Zd8L!8xX{TYBiuX#KhR76-joe zDS=A)h=!vY+ch1%d~|cc03&S+0}Zn#A|33}&BXSNQ;khJo}ZX;3^&nwo%HkgFS6_M zuROEU6sKnnk28Xxr}mU8jBA8gh85+WS}tllhc~_fE2&-7e8aJuYa;8O!iVwZ zLHYQlPRl;tsx^+YPJKh*)o~aGolf(39fHj5wC&^3aHd{c=_ig~q^;j($4L_>lX1Fx z)6Z66ctAU;UZY_d2oyD~dWWJph7_0%3)aCo(U0Ofo`1mOyn(<~HZiTsuy^O-7dT6k z(~;IU4L23$smMi6`mQ3&sEV6m8r6DV`GIyDmNHYZBD!~M9z$zDz4B~fJ_tLPz*=fd z(#mkk8;8*GPwsrTZwu3uWIcA$DrWs$tP(ac*``vj+J6QyZwpSfhM^x{~ zR!a7ZZ=oeIh@d4+2^3NIehN3$KCJ|8H1FVCvjeL?TuUpM7L0A;BAS<YBc!Or;rc&gOd7M|XPX2g)cfruO|Q+se19R!CnU4+=Yh^IuD zKB&0brjB&xpmLW=0vHhHDBLud$%gJ~Yq`4`m?M7{P7l#$N)RAOZ>HHWYQ%cDYlNj) z9;{RFj;z#R<3b$_Vb^jy5wW~~6M~D}2lSgSuauToNf<7MrJ)liicqnT3Jo@C1+se5 z>bnpot;k_8X~8`pMJZJbf1z_=(h8jblTg89wm*_FGd?kZqIF?*;XKT>i7!rC+y5^{ z6@0TlRzDMr)i?WN^>fi!eH~-?%r!6@yNX>khU@`8_45vvF%*2?LIGz2fdYor zGHC#n{FfJh&HvMWVeT2x4OJ6q?IZ88txO$n5IrA6YkoE~8|s8*;g8}eJc79=5s8>v z>#1v+U{Eb$P)#tXNDD8W?j1ef#fE_|PP(?nop5!bme|}|jFyY|U@*)K!LSn$RXG4rIq_61c z9*Q`^IZQ;>(;t~>@7Pu{ZdX$k)Z79P1c!o#%ZP+DBnY^R4ZnqsMxTy7Wi!PHC^Tls z@+31Fs@Uv(N~gR-=W6^)NEc}GR%ClHPkPqQcG!c8Odo0)1a^cdm<7JP!53n8q2RMccD0}nPO`VM_Wr`zeuxTf$n1h-NhI!GPokoqxY|g z6^$c%Fe8{T(na|x0Y1|C3AL|ITGIW81YCYwAzr%u;4>#5D?pS?5Sv3xkZ&(Bv`+!( z0Qx?ri@n83E%0;En0y^$;-rN6X*n>cj2M`omILv#;Xr(Y2I8m0K+45*3@V;Mb^bI3 z$0#6l4tZ{dG6r~VNFb=B=8y5-c?>}uk*-i4_Zb=hSP3jn zH5;UGrMc~H@OA=_35+8^egTO-@Ab4kklfOH`ep>jw_w&V<6Wg^oK|j=TAA{Wov~eM zHU`Xd2~Geq_Q@8lg*f8lBbFai3P}KG~eWyA$}sKSu#A9sfK9FH-Ol z1Wj1IXk&u&| zTMgEH`sHS)jsvk*5D6Q<7Zap@b`4IdOSNXRn2Jf$FQ97}2OHe!aNodKox#B#dU&5d zp}~^{s2D)y~)oqbPPypFQFe)$ava0*+niH8xW{m}_gmZs^s0B}bZUL3%SIg>z5TVa6SOi(r0yp|dU!FmN@?9o9c} z^nR4!+BjUtJsgiv#$!H@Nh>7ABq{$wqnWf4ozNCa`h>$n(Q4=lPLzK*Q1`*PTp5au z7f`kU+Det{9AelaMD@P3=TnqSVy=+;0Or2RmTZKVsm{Qb*hN}&tZST1E6$TBC|QdX zVJZ5v4*tl<4kNcmI;%Yhk$3Dv@5Qa$L*^ix_MMwxLD9D7}aBq-P5TcT1}#{ zlErGK_QP`V4sTsYf+#Vo@_lj`fOVqw{nVunB(j7nf~W9D7H9-lzk>u*ZyD>#tyE9t zkM#_uy`6lR7T!;>SY4x%XyCx^u^a-9)yIKZoIbwfcs_E(h@+H%V%O7)+!z3O^sW<9y}8W#w|hp@uK&1Uq$VYU+Aco z)Jspy%*^~|(GW)#a%W&(eFhTdm1NK_gG(NYfma@afiqj#l`u&?FT=C$_yR>mES}pgi5mU;qnnW!GN_U zw+i%1Y(s237$4YdB81PFFS(S97&C5bZ4Fwd!Qe&amqb2dv3&R$_}4`~Vk{-gv+SJ| z43(UBQf#}8R;vbU57Tj>@;BMni8vUYh?b>?v65rY& z6(gTORA_t81r?JvY*dhviC#aY?Hai!tk+7bZZUg{$U&TRPiU+<%VV4BY*>T^IPB z;OFBUTiF$GE^P~(5!-kTneSNWeNsaJQzk;gUW9H-#75coPyb2&*ZN!Ue- z3F?yc66&a=vmk7Z@|qO%X(eK02618zhn~|2vJkN&MmCep6&@ck3kR?xKG9S|O@Ew! z%KRjMbnoNA+0=*my*S!bm5(&oE@Y&qKg>S|KmEt~qoTz+8cY0WDzD;k$gqpw+`!!n z?T*;*xXX}Y!*<%vurzKr&^`N9C2OZy4)1ZSiuXBrJnD}MO~qLjm%UfS+dBdPJ>^@bINQ###E&BW7~+p3-$MKe#Ggd`Da6qW=un{9UH$eJx;!0GpZ_jdRX<_#5 z`SKYYF|Mr4FP2YQo@PyWW^`e`=w()jgYjbQhSjr{ICN2K&gISL=IG`E&L_H3XA*97 z;o%{_xu3%Y_~kRW$^G^QA;eFA_`SdJQ?m=W&k&@4csGpv`2+PUp7GN3i8W7m-m$!t zwPIgAB|PsH?Q_gaqu;a3r-Y9liIwi+^QVNbzM?(Pyv#9c73$O};kbXGqm>QvCjb3k z&Y_yOJ6O+9u45j#{^YV;Y<8f$BQ#%|&o6!b&sk;T1+i=E~G*7*Cm0KQNS z4^_G!6a0{qOG)onvygBFz{ID z5O=j)?KU9k>Z{2f#Vw@~@5NdAj0o4aaJ34S7DP(S-|L8vkl=yBeUlEBpKLFw43+s! z%$R!!aM5Xbesz8hA7+#;;9Cz^60-|$ugtHUwD>J5w1nV+`VKafCES`DB*LwqeB(Qo zaKK}eSjMXRuA^-`jZ5qR=Gd_H2*3I_i^YB}_8fdKgDmI1n+4;6h~9vjX!elvkvjlXwu{ zn9+R8UUo@dH?qLzZG6=rgq*Kl7X}V)cBC7)c-?k4$Zt+}CS{8@qh^Y^{#rGi0{3GH24@r#B>LC9;T~ey2Q|!ZtS+LdKn%7k`+Sj4cMChx0?d<63VAo%1z4~ z-#u|WCsf-kZsm$w;IX_=-AyqQHHPSpc;py}SjL$Kv!E z)Jdxzr#PV^-p;y2yHRxr(;)q{B_j1JiPY@j#EdM_8 z&S9AR&k%W_9;04K_xlxl{rsbQT?%{UbV{>9^oN3(fF&WPglr>qQfQIBj?d~4)NTl? zAL5(jfRrNNr5H*1fl2y%x1;{c=-+u7rNa#g_XYqd3;TTX69bM88O|V{*7zNiBOe7W zwHeL5E0E{BfeWv8Yj5?0Km+0}XapmzSWw?`sz=r0yVH$DN# zwD8T-wHj`jT(X;8sw*+X+aI7+C<_8i@p4mB0aJMg9uHD=nEfNNskO+9Vc1so59E8&BjGe!k&}R;-eG@I2OD>ijR>0Qe6B# zB?XAm@(85~x8V3Xj!a;5{4VnR!Yp4GUrsEEJaL?YcYeOc@ZEFpj_y#S2BjU}psdIVfb11hd@N9<^@?#_q=5O^m!&U@PCOOoECM5)1(W5WBj(j? x+Nc%2rhH9VDJ+cUNB4~m6%Lzto7M7=kC2dR8rBEd8)+RD3G^S>D&iT{{vTh}ky8Kw literal 0 HcmV?d00001 diff --git a/vitallink/backend/database.py b/vitallink/backend/database.py new file mode 100644 index 0000000..caabe03 --- /dev/null +++ b/vitallink/backend/database.py @@ -0,0 +1,623 @@ +""" +VitalLink Database Layer +SQLite persistence for patients, vitals, and audit trail +Enables replay, analysis, and incident investigation +""" + +import sqlite3 +import json +from datetime import datetime +from typing import List, Dict, Optional +from contextlib import asynccontextmanager +import aiosqlite + +# ============================================================================ +# DATABASE SCHEMA +# ============================================================================ + +SCHEMA_SQL = """ +-- Patients table +CREATE TABLE IF NOT EXISTS patients ( + patient_id TEXT PRIMARY KEY, + band_id TEXT NOT NULL, + first_name TEXT NOT NULL, + last_name TEXT NOT NULL, + dob TEXT NOT NULL, + symptoms TEXT, -- JSON array + severity TEXT, + check_in_time TIMESTAMP NOT NULL, + discharge_time TIMESTAMP, + current_tier TEXT DEFAULT 'NORMAL', + is_active BOOLEAN DEFAULT 1, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Vitals readings table (time-series data) +CREATE TABLE IF NOT EXISTS vitals_readings ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + patient_id TEXT NOT NULL, + band_id TEXT NOT NULL, + timestamp REAL NOT NULL, + seq INTEGER, + hr_bpm INTEGER, + spo2 INTEGER, + temp_c REAL, + activity REAL, + tier TEXT, + flags TEXT, -- JSON array + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (patient_id) REFERENCES patients(patient_id) +); + +-- Triage assessments (audit trail) +CREATE TABLE IF NOT EXISTS triage_assessments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + patient_id TEXT NOT NULL, + assessment_time TIMESTAMP NOT NULL, + triage_level INTEGER, + tier_name TEXT, + priority_score REAL, + reasoning TEXT, + abnormalities TEXT, -- JSON array + wait_time_minutes INTEGER, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (patient_id) REFERENCES patients(patient_id) +); + +-- Tier changes (for incident investigation) +CREATE TABLE IF NOT EXISTS tier_changes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + patient_id TEXT NOT NULL, + change_time TIMESTAMP NOT NULL, + old_tier TEXT, + new_tier TEXT, + trigger_reason TEXT, + vitals_snapshot TEXT, -- JSON + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (patient_id) REFERENCES patients(patient_id) +); + +-- System events (audit log) +CREATE TABLE IF NOT EXISTS system_events ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + event_time TIMESTAMP NOT NULL, + event_type TEXT NOT NULL, -- 'patient_checkin', 'discharge', 'tier_change', 'alert', etc. + patient_id TEXT, + band_id TEXT, + details TEXT, -- JSON + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Wristband assignments (inventory tracking) +CREATE TABLE IF NOT EXISTS wristband_assignments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + band_id TEXT NOT NULL, + patient_id TEXT, + assigned_at TIMESTAMP, + released_at TIMESTAMP, + packet_count INTEGER DEFAULT 0, + band_type TEXT, -- 'real' or 'simulated' + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Indexes for performance +CREATE INDEX IF NOT EXISTS idx_vitals_patient ON vitals_readings(patient_id, timestamp); +CREATE INDEX IF NOT EXISTS idx_vitals_timestamp ON vitals_readings(timestamp); +CREATE INDEX IF NOT EXISTS idx_patients_active ON patients(is_active); +CREATE INDEX IF NOT EXISTS idx_tier_changes_patient ON tier_changes(patient_id, change_time); +""" + +# ============================================================================ +# DATABASE MANAGER +# ============================================================================ + + +class VitalLinkDatabase: + """Database manager for VitalLink system""" + + def __init__(self, db_path: str = "vitallink.db"): + self.db_path = db_path + self.conn = None + + async def initialize(self): + """Initialize database and create tables""" + self.conn = await aiosqlite.connect(self.db_path) + await self.conn.executescript(SCHEMA_SQL) + await self.conn.commit() + print(f"✓ Database initialized: {self.db_path}") + + async def close(self): + """Close database connection""" + if self.conn: + await self.conn.close() + + # ======================================================================== + # PATIENT OPERATIONS + # ======================================================================== + + async def save_patient(self, patient_data: Dict): + """Save new patient to database""" + await self.conn.execute( + """ + INSERT INTO patients ( + patient_id, band_id, first_name, last_name, dob, + symptoms, severity, check_in_time, current_tier + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + patient_data["patient_id"], + patient_data["band_id"], + patient_data["first_name"], + patient_data["last_name"], + patient_data["dob"], + json.dumps(patient_data["symptoms"]), + patient_data["severity"], + patient_data["check_in_time"], + patient_data.get("current_tier", "NORMAL"), + ), + ) + await self.conn.commit() + + # Log event + await self.log_event( + "patient_checkin", + patient_data["patient_id"], + patient_data["band_id"], + patient_data, + ) + + async def update_patient_tier(self, patient_id: str, new_tier: str): + """Update patient's current tier""" + await self.conn.execute( + """ + UPDATE patients SET current_tier = ? WHERE patient_id = ? + """, + (new_tier, patient_id), + ) + await self.conn.commit() + + async def discharge_patient(self, patient_id: str): + """Mark patient as discharged""" + await self.conn.execute( + """ + UPDATE patients + SET is_active = 0, discharge_time = ? + WHERE patient_id = ? + """, + (datetime.now(), patient_id), + ) + await self.conn.commit() + + await self.log_event( + "discharge", + patient_id, + None, + {"discharge_time": datetime.now().isoformat()}, + ) + + # ======================================================================== + # VITALS OPERATIONS + # ======================================================================== + + async def save_vitals(self, vitals_data: Dict): + """Save vital signs reading""" + await self.conn.execute( + """ + INSERT INTO vitals_readings ( + patient_id, band_id, timestamp, seq, hr_bpm, spo2, + temp_c, activity, tier, flags + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + vitals_data["patient_id"], + vitals_data["band_id"], + vitals_data["timestamp"], + vitals_data.get("seq", 0), + vitals_data["hr_bpm"], + vitals_data["spo2"], + vitals_data["temp_c"], + vitals_data["activity"], + vitals_data["tier"], + json.dumps(vitals_data.get("flags", [])), + ), + ) + await self.conn.commit() + + async def get_patient_vitals_history( + self, patient_id: str, limit: int = 100 + ) -> List[Dict]: + """Get vital signs history for a patient""" + cursor = await self.conn.execute( + """ + SELECT timestamp, hr_bpm, spo2, temp_c, activity, tier, seq + FROM vitals_readings + WHERE patient_id = ? + ORDER BY timestamp DESC + LIMIT ? + """, + (patient_id, limit), + ) + + rows = await cursor.fetchall() + + return [ + { + "timestamp": row[0], + "hr_bpm": row[1], + "spo2": row[2], + "temp_c": row[3], + "activity": row[4], + "tier": row[5], + "seq": row[6], + } + for row in rows + ] + + # ======================================================================== + # TIER CHANGE TRACKING + # ======================================================================== + + async def log_tier_change( + self, patient_id: str, old_tier: str, new_tier: str, reason: str, vitals: Dict + ): + """Log tier change for audit trail""" + await self.conn.execute( + """ + INSERT INTO tier_changes ( + patient_id, change_time, old_tier, new_tier, + trigger_reason, vitals_snapshot + ) VALUES (?, ?, ?, ?, ?, ?) + """, + ( + patient_id, + datetime.now(), + old_tier, + new_tier, + reason, + json.dumps(vitals), + ), + ) + await self.conn.commit() + + await self.log_event( + "tier_change", + patient_id, + None, + {"old_tier": old_tier, "new_tier": new_tier, "reason": reason}, + ) + + async def get_tier_history(self, patient_id: str) -> List[Dict]: + """Get tier change history for incident review""" + cursor = await self.conn.execute( + """ + SELECT change_time, old_tier, new_tier, trigger_reason, vitals_snapshot + FROM tier_changes + WHERE patient_id = ? + ORDER BY change_time ASC + """, + (patient_id,), + ) + + rows = await cursor.fetchall() + + return [ + { + "change_time": row[0], + "old_tier": row[1], + "new_tier": row[2], + "reason": row[3], + "vitals": json.loads(row[4]) if row[4] else {}, + } + for row in rows + ] + + # ======================================================================== + # SYSTEM EVENTS (Audit Trail) + # ======================================================================== + + async def log_event( + self, + event_type: str, + patient_id: Optional[str], + band_id: Optional[str], + details: Dict, + ): + """Log system event for audit trail""" + await self.conn.execute( + """ + INSERT INTO system_events ( + event_time, event_type, patient_id, band_id, details + ) VALUES (?, ?, ?, ?, ?) + """, + (datetime.now(), event_type, patient_id, band_id, json.dumps(details)), + ) + await self.conn.commit() + + async def get_events( + self, + event_type: Optional[str] = None, + patient_id: Optional[str] = None, + hours: int = 24, + ) -> List[Dict]: + """Get system events for analysis""" + + query = "SELECT event_time, event_type, patient_id, band_id, details FROM system_events WHERE 1=1" + params = [] + + if event_type: + query += " AND event_type = ?" + params.append(event_type) + + if patient_id: + query += " AND patient_id = ?" + params.append(patient_id) + + query += " AND event_time > datetime('now', '-' || ? || ' hours')" + params.append(hours) + + query += " ORDER BY event_time DESC LIMIT 1000" + + cursor = await self.conn.execute(query, params) + rows = await cursor.fetchall() + + return [ + { + "event_time": row[0], + "event_type": row[1], + "patient_id": row[2], + "band_id": row[3], + "details": json.loads(row[4]) if row[4] else {}, + } + for row in rows + ] + + # ======================================================================== + # ANALYTICS & REPLAY + # ======================================================================== + + async def get_session_summary( + self, start_time: datetime, end_time: datetime + ) -> Dict: + """Get summary statistics for a session (for incident review)""" + + cursor = await self.conn.execute( + """ + SELECT + COUNT(DISTINCT patient_id) as total_patients, + COUNT(*) as total_vitals, + AVG(hr_bpm) as avg_hr, + AVG(spo2) as avg_spo2, + AVG(temp_c) as avg_temp + FROM vitals_readings + WHERE timestamp BETWEEN ? AND ? + """, + (start_time.timestamp(), end_time.timestamp()), + ) + + row = await cursor.fetchone() + + return { + "total_patients": row[0], + "total_vitals_recorded": row[1], + "average_hr": round(row[2], 1) if row[2] else 0, + "average_spo2": round(row[3], 1) if row[3] else 0, + "average_temp": round(row[4], 2) if row[4] else 0, + } + + async def export_patient_data(self, patient_id: str) -> Dict: + """Export complete patient data for incident investigation""" + + # Get patient info + cursor = await self.conn.execute( + """ + SELECT * FROM patients WHERE patient_id = ? + """, + (patient_id,), + ) + patient_row = await cursor.fetchone() + + if not patient_row: + return None + + # Get all vitals + vitals = await self.get_patient_vitals_history(patient_id, limit=10000) + + # Get tier changes + tier_changes = await self.get_tier_history(patient_id) + + # Get related events + events = await self.get_events(patient_id=patient_id, hours=24) + + return { + "patient_id": patient_id, + "name": f"{patient_row[2]} {patient_row[3]}", + "dob": patient_row[4], + "symptoms": json.loads(patient_row[5]) if patient_row[5] else [], + "severity": patient_row[6], + "check_in_time": patient_row[7], + "discharge_time": patient_row[8], + "total_vitals": len(vitals), + "vitals_timeline": vitals, + "tier_changes": tier_changes, + "events": events, + "export_time": datetime.now().isoformat(), + } + + +# ============================================================================ +# REPLAY SYSTEM +# ============================================================================ + + +class VitalsReplaySystem: + """Replay historical vitals data for analysis""" + + def __init__(self, db: VitalLinkDatabase): + self.db = db + + async def replay_patient_session(self, patient_id: str, speed: float = 1.0): + """ + Replay a patient's entire session + speed: 1.0 = real-time, 10.0 = 10x faster, 0.1 = slow motion + """ + + vitals = await self.db.get_patient_vitals_history(patient_id, limit=10000) + vitals.reverse() # Chronological order + + if not vitals: + print(f"No data found for patient {patient_id}") + return + + print(f"\n{'=' * 80}") + print(f"REPLAYING SESSION: {patient_id} ({len(vitals)} readings)") + print(f"Speed: {speed}x | Press Ctrl+C to stop") + print(f"{'=' * 80}\n") + + start_time = vitals[0]["timestamp"] + + for i, reading in enumerate(vitals): + # Calculate delay + if i > 0: + time_diff = reading["timestamp"] - vitals[i - 1]["timestamp"] + await asyncio.sleep(time_diff / speed) + + # Display reading + elapsed = reading["timestamp"] - start_time + tier_symbol = ( + "🔴" + if reading["tier"] == "EMERGENCY" + else "🟡" + if reading["tier"] == "ALERT" + else "🟢" + ) + + print( + f"[{elapsed:7.1f}s] {tier_symbol} Seq={reading['seq']:3d} | " + f"HR={reading['hr_bpm']:3d} SpO2={reading['spo2']:2d}% " + f"Temp={reading['temp_c']:.1f}°C | {reading['tier']}" + ) + + print(f"\n{'=' * 80}") + print(f"Replay complete: {len(vitals)} readings") + print(f"{'=' * 80}\n") + + async def analyze_critical_events(self, patient_id: str): + """Analyze critical tier changes and deterioration events""" + + tier_changes = await self.db.get_tier_history(patient_id) + + print(f"\n{'=' * 80}") + print(f"CRITICAL EVENT ANALYSIS: {patient_id}") + print(f"{'=' * 80}\n") + + for change in tier_changes: + print(f"[{change['change_time']}]") + print(f" {change['old_tier']} → {change['new_tier']}") + print(f" Reason: {change['reason']}") + print(f" Vitals: {change['vitals']}") + print() + + print(f"{'=' * 80}\n") + + +# ============================================================================ +# INTEGRATION HELPERS +# ============================================================================ + + +async def init_database(db_path: str = "vitallink.db") -> VitalLinkDatabase: + """Initialize database for use in FastAPI""" + db = VitalLinkDatabase(db_path) + await db.initialize() + return db + + +# ============================================================================ +# CLI TOOLS +# ============================================================================ + + +async def cli_export_patient(patient_id: str, output_file: str = None): + """Export patient data to JSON file""" + db = VitalLinkDatabase() + await db.initialize() + + data = await db.export_patient_data(patient_id) + + if not data: + print(f"Patient {patient_id} not found") + return + + if output_file: + with open(output_file, "w") as f: + json.dump(data, f, indent=2) + print(f"✓ Exported to {output_file}") + else: + print(json.dumps(data, indent=2)) + + await db.close() + + +async def cli_replay_session(patient_id: str, speed: float = 1.0): + """Replay a patient session""" + db = VitalLinkDatabase() + await db.initialize() + + replay = VitalsReplaySystem(db) + await replay.replay_patient_session(patient_id, speed) + + await db.close() + + +async def cli_analyze_incident(patient_id: str): + """Analyze critical events for a patient""" + db = VitalLinkDatabase() + await db.initialize() + + replay = VitalsReplaySystem(db) + await replay.analyze_critical_events(patient_id) + + # Also show vital trends + vitals = await db.get_patient_vitals_history(patient_id, limit=1000) + + if vitals: + print("VITAL SIGN TRENDS:") + print( + f" HR range: {min(v['hr_bpm'] for v in vitals)} - {max(v['hr_bpm'] for v in vitals)} bpm" + ) + print( + f" SpO2 range: {min(v['spo2'] for v in vitals)} - {max(v['spo2'] for v in vitals)}%" + ) + print( + f" Temp range: {min(v['temp_c'] for v in vitals):.1f} - {max(v['temp_c'] for v in vitals):.1f}°C" + ) + print() + + await db.close() + + +if __name__ == "__main__": + import argparse + import asyncio + + parser = argparse.ArgumentParser(description="VitalLink Database Tools") + parser.add_argument("--export", metavar="PATIENT_ID", help="Export patient data") + parser.add_argument("--replay", metavar="PATIENT_ID", help="Replay patient session") + parser.add_argument( + "--analyze", metavar="PATIENT_ID", help="Analyze critical events" + ) + parser.add_argument( + "--speed", type=float, default=1.0, help="Replay speed multiplier" + ) + parser.add_argument("--output", "-o", help="Output file for export") + + args = parser.parse_args() + + if args.export: + asyncio.run(cli_export_patient(args.export, args.output)) + elif args.replay: + asyncio.run(cli_replay_session(args.replay, args.speed)) + elif args.analyze: + asyncio.run(cli_analyze_incident(args.analyze)) + else: + parser.print_help() diff --git a/vitallink/backend/server.py b/vitallink/backend/server.py index 557f23d..2f01230 100644 --- a/vitallink/backend/server.py +++ b/vitallink/backend/server.py @@ -14,6 +14,7 @@ import json import time from collections import defaultdict from triage_engine import TriageEngine, VitalSigns, TriageLevel, triage_from_vitals +from database import VitalLinkDatabase # ============================================================================ # LIFESPAN MANAGEMENT @@ -23,14 +24,23 @@ from triage_engine import TriageEngine, VitalSigns, TriageLevel, triage_from_vit @asynccontextmanager async def lifespan(app: FastAPI): # Startup + global db print("=" * 80) print("VitalLink Backend API Started") print("=" * 80) + + # Initialize database + db = VitalLinkDatabase("vitallink.db") + await db.initialize() + print("API Documentation: http://localhost:8000/docs") print("WebSocket Endpoint: ws://localhost:8000/ws") + print("Database: vitallink.db") print("=" * 80) yield # Shutdown + if db: + await db.close() print("\nVitalLink Backend API Shutting Down") @@ -115,6 +125,7 @@ active_websockets: List[WebSocket] = [] # Wristband details cache wristband_details_cache = {} +db: Optional[VitalLinkDatabase] = None # ============================================================================ # PRIORITY ALGORITHM @@ -195,6 +206,10 @@ async def check_in_patient(data: PatientCheckIn): patients_db[patient_id] = patient + # Save to database + if db: + await db.save_patient(patient.dict()) + await broadcast_update({"type": "patient_added", "patient": patient.dict()}) return { @@ -303,6 +318,9 @@ async def receive_vitals(data: VitalsData): final_tier = tracker["current_tier"] patient.current_tier = final_tier patient.last_vitals = data.dict() + # Save to database + if db: + await db.save_vitals(data.dict()) # Store in history vitals_history[patient_id].append(data) @@ -439,6 +457,32 @@ async def get_statistics(): } +@app.get("/api/patients/{patient_id}/vitals-history") +async def get_patient_vitals_history(patient_id: str, limit: int = 100): + """Get patient vitals history for graphing""" + + if patient_id not in patients_db: + raise HTTPException(status_code=404, detail="Patient not found") + + patient = patients_db[patient_id] + + if db: + # Get from database + vitals = await db.get_patient_vitals_history(patient_id, limit) + tier_changes = await db.get_tier_history(patient_id) + else: + # Fallback to in-memory + vitals = [v.dict() for v in vitals_history.get(patient_id, [])[-limit:]] + tier_changes = [] + + return { + "patient": patient.dict(), + "vitals_history": vitals, + "tier_changes": tier_changes, + "total_readings": len(vitals), + } + + # ============================================================================ # WRISTBAND ENDPOINTS # ============================================================================ diff --git a/vitallink/frontend/dashboard/package-lock.json b/vitallink/frontend/dashboard/package-lock.json index 6602ac9..6b51386 100644 --- a/vitallink/frontend/dashboard/package-lock.json +++ b/vitallink/frontend/dashboard/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "lucide-react": "^0.546.0", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "recharts": "^3.5.0" }, "devDependencies": { "@eslint/js": "^9.36.0", @@ -770,7 +771,6 @@ "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -789,7 +789,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -802,7 +801,6 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -812,7 +810,6 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", @@ -827,7 +824,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.16.0" @@ -840,7 +836,6 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -853,7 +848,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -877,7 +871,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -890,7 +883,6 @@ "version": "9.38.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -903,7 +895,6 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -913,7 +904,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.16.0", @@ -927,7 +917,6 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18.0" @@ -937,7 +926,6 @@ "version": "0.16.7", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", @@ -951,7 +939,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -965,7 +952,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -1038,6 +1024,42 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.0.tgz", + "integrity": "sha512-hBjYg0aaRL1O2Z0IqWhnTLytnjDIxekmRxm1snsHjHaKVmIF1HiImWqsq+PuEbn6zdMlkIj9WofK1vR8jjx+Xw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.0.0.tgz", + "integrity": "sha512-XtRG4SINt4dpqlnJvs70O2j6hH7H0X8fUzFsjMn1rwnETaxwp83HLNimXBjZ78MrKl3/d3/pkzDH0o0Lkxm37Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.38", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz", @@ -1353,6 +1375,18 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@tailwindcss/node": { "version": "4.1.14", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", @@ -1674,25 +1708,86 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.2.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -1709,6 +1804,12 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-react": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz", @@ -1734,7 +1835,6 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, "license": "MIT", "peer": true, "bin": { @@ -1748,7 +1848,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -1758,7 +1857,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1775,7 +1873,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -1791,7 +1888,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/autoprefixer": { @@ -1836,7 +1932,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/baseline-browser-mapping": { @@ -1853,7 +1948,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1899,7 +1993,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1930,7 +2023,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -1953,11 +2045,19 @@ "node": ">=18" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -1970,14 +2070,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { @@ -1991,7 +2089,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2006,14 +2103,134 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2027,11 +2244,16 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/detect-libc": { @@ -2065,6 +2287,16 @@ "node": ">=10.13.0" } }, + "node_modules/es-toolkit": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.42.0.tgz", + "integrity": "sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/esbuild": { "version": "0.25.11", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", @@ -2121,7 +2353,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -2134,7 +2365,6 @@ "version": "9.38.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -2204,6 +2434,18 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, + "node_modules/eslint-plugin-react-perf": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-perf/-/eslint-plugin-react-perf-3.3.3.tgz", + "integrity": "sha512-EzPdxsRJg5IllCAH9ny/3nK7sv9251tvKmi/d3Ouv5KzI8TB3zNhzScxL9wnh9Hvv8GYC5LEtzTauynfOEYiAw==", + "license": "MIT", + "engines": { + "node": ">=6.9.1" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, "node_modules/eslint-plugin-react-refresh": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", @@ -2218,7 +2460,6 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -2235,7 +2476,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2248,7 +2488,6 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", @@ -2266,7 +2505,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -2279,7 +2517,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -2292,7 +2529,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -2302,31 +2538,33 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, "node_modules/fdir": { @@ -2351,7 +2589,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" @@ -2364,7 +2601,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -2381,7 +2617,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -2395,7 +2630,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, "license": "ISC" }, "node_modules/fraction.js": { @@ -2441,7 +2675,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -2474,7 +2707,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2484,17 +2716,25 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -2511,17 +2751,24 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2531,7 +2778,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -2544,16 +2790,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, + "devOptional": true, "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -2569,7 +2813,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2595,21 +2838,18 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, "license": "MIT" }, "node_modules/json5": { @@ -2629,7 +2869,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -2639,7 +2878,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -2655,7 +2893,6 @@ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, "license": "MPL-2.0", - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -2893,7 +3130,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -2909,7 +3145,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/lru-cache": { @@ -2945,7 +3180,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2981,7 +3215,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -3007,7 +3240,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, "license": "MIT" }, "node_modules/node-releases": { @@ -3031,7 +3263,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -3049,7 +3280,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -3065,7 +3295,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -3081,7 +3310,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -3094,7 +3322,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3104,7 +3331,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3172,7 +3398,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -3182,7 +3407,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3203,6 +3427,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -3210,6 +3435,37 @@ "react": "^19.2.0" } }, + "node_modules/react-is": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.0.tgz", + "integrity": "sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==", + "license": "MIT", + "peer": true + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -3220,11 +3476,63 @@ "node": ">=0.10.0" } }, + "node_modules/recharts": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.5.0.tgz", + "integrity": "sha512-jWqBtu8L3VICXWa3g/y+bKjL8DDHSRme7DHD/70LQ/Tk0di1h11Y0kKC0nPh6YJ2oaa0k6anIFNhg6SfzHWdEA==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eslint-plugin-react-perf": "^3.3.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT", + "peer": true + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -3292,7 +3600,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3305,7 +3612,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3325,7 +3631,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3338,7 +3643,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3395,6 +3699,12 @@ "node": ">=18" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -3416,7 +3726,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -3460,12 +3769,42 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/vite": { "version": "7.1.10", "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.10.tgz", @@ -3546,7 +3885,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -3562,7 +3900,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3579,7 +3916,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/vitallink/frontend/dashboard/package.json b/vitallink/frontend/dashboard/package.json index 809e052..517ff2d 100644 --- a/vitallink/frontend/dashboard/package.json +++ b/vitallink/frontend/dashboard/package.json @@ -12,7 +12,8 @@ "dependencies": { "lucide-react": "^0.546.0", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "recharts": "^3.5.0" }, "devDependencies": { "@eslint/js": "^9.36.0", diff --git a/vitallink/frontend/dashboard/src/App.jsx b/vitallink/frontend/dashboard/src/App.jsx index 56218c1..09f6d72 100644 --- a/vitallink/frontend/dashboard/src/App.jsx +++ b/vitallink/frontend/dashboard/src/App.jsx @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react'; import * as LucideIcons from 'lucide-react'; +import PatientDetailModal from './PatientDetailModal'; // ADD THIS IMPORT const { Activity, AlertCircle, Clock, Users, Bell, Heart, Thermometer, Wind, CheckCircle, UserX } = LucideIcons; @@ -17,6 +18,7 @@ function App() { const [activeTab, setActiveTab] = useState('patients'); const [wristbands, setWristbands] = useState([]); const [selectedWristband, setSelectedWristband] = useState(null); + const [selectedPatient, setSelectedPatient] = useState(null); // ADD THIS STATE useEffect(() => { const fetchData = async () => { @@ -102,6 +104,7 @@ function App() { }); console.log(`✓ Discharged patient ${patientId}`); setPatients(prev => prev.filter(p => p.patient_id !== patientId)); + setSelectedPatient(null); // Close modal if open } catch (error) { console.error('Failed to discharge patient:', error); setPatients(prev => prev.filter(p => p.patient_id !== patientId)); @@ -256,7 +259,8 @@ function App() { {filteredPatients.map((patient, index) => (
setSelectedPatient(patient)} /* ADD CLICK HANDLER */ + className="bg-white rounded-lg shadow-sm hover:shadow-md transition-shadow cursor-pointer" /* ADD cursor-pointer */ >
@@ -271,6 +275,7 @@ function App() { {patient.band_id}
+

Click for detailed history

{/* ADD THIS */} {patient.symptoms && patient.symptoms.length > 0 && (
{patient.symptoms.map(symptom => ( @@ -289,7 +294,10 @@ function App() { {patient.tier}
-
- -
-

Raw Packet (16 bytes, Hex):

-
- {selectedWristband.last_raw_packet.hex.toUpperCase().match(/.{1,2}/g).join(' ')} -
-

- Format: [ver][seq][timestamp][flags][hr][spo2][temp_x100][activity_x100][checksum][rfu] -

-
- - {selectedWristband.last_raw_packet.decoded && ( - <> -
-

Decoded Fields:

-
-
-
Version
-
0x{selectedWristband.last_raw_packet.decoded.version.toString(16).padStart(2, '0')}
-
-
-
Sequence #
-
{selectedWristband.last_raw_packet.decoded.sequence}
-
-
-
Timestamp (ms since boot)
-
{selectedWristband.last_raw_packet.decoded.timestamp_ms.toLocaleString()}
-
-
-
Heart Rate
-
{selectedWristband.last_raw_packet.decoded.hr_bpm}
-
bpm
-
-
-
SpO₂
-
{selectedWristband.last_raw_packet.decoded.spo2}
-
%
-
-
-
Temperature
-
{selectedWristband.last_raw_packet.decoded.temperature_c.toFixed(2)}
-
°C
-
-
-
Activity
-
{selectedWristband.last_raw_packet.decoded.activity.toFixed(2)}
-
RMS
-
-
-
Checksum
-
{selectedWristband.last_raw_packet.decoded.checksum}
-
-
-
Flags (raw)
-
0x{selectedWristband.last_raw_packet.decoded.flags.raw.toString(16).padStart(2, '0')}
-
-
-
- - {selectedWristband.last_raw_packet.decoded.flags && ( -
-

Status Flags:

-
- {selectedWristband.last_raw_packet.decoded.flags.emergency && ( - - 🚨 Bit 4: Emergency - - )} - {selectedWristband.last_raw_packet.decoded.flags.alert && ( - - ⚠️ Bit 3: Alert - - )} - {selectedWristband.last_raw_packet.decoded.flags.sensor_fault && ( - - ⚙️ Bit 2: Sensor Fault - - )} - {selectedWristband.last_raw_packet.decoded.flags.low_battery && ( - - 🔋 Bit 1: Low Battery - - )} - {selectedWristband.last_raw_packet.decoded.flags.motion_artifact && ( - - 👋 Bit 0: Motion Artifact - - )} - {!Object.values(selectedWristband.last_raw_packet.decoded.flags).some(v => v === true) && ( - - ✓ No flags set (all normal) - - )} -
-
- )} - - )} -
- )} + {/* ... your existing wristband code ... */} )} + + {/* Patient Detail Modal - ADD THIS */} + {selectedPatient && ( + setSelectedPatient(null)} + /> + )} ); } diff --git a/vitallink/frontend/dashboard/src/PatientDetailModal.jsx b/vitallink/frontend/dashboard/src/PatientDetailModal.jsx new file mode 100644 index 0000000..87b39d6 --- /dev/null +++ b/vitallink/frontend/dashboard/src/PatientDetailModal.jsx @@ -0,0 +1,295 @@ +import React, { useState, useEffect } from 'react'; +import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, ReferenceLine } from 'recharts'; +import { X, TrendingUp, TrendingDown, Activity, Heart, Wind, Thermometer } from 'lucide-react'; + +const API_BASE = 'http://localhost:8000'; + +const PatientDetailModal = ({ patient, onClose }) => { + const [vitalsHistory, setVitalsHistory] = useState([]); + const [tierChanges, setTierChanges] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedMetric, setSelectedMetric] = useState('all'); + + useEffect(() => { + fetchPatientHistory(); + }, [patient.patient_id]); + + const fetchPatientHistory = async () => { + try { + const response = await fetch(`${API_BASE}/api/patients/${patient.patient_id}/vitals-history?limit=200`); + const data = await response.json(); + + setVitalsHistory(data.vitals_history || []); + setTierChanges(data.tier_changes || []); + setLoading(false); + } catch (error) { + console.error('Failed to fetch patient history:', error); + setLoading(false); + } + }; + + const prepareChartData = () => { + return vitalsHistory.slice().reverse().map((v, index) => ({ + time: index, + timeLabel: new Date(v.timestamp * 1000).toLocaleTimeString(), + hr: v.hr_bpm, + spo2: v.spo2, + temp: v.temp_c, + tier: v.tier + })); + }; + + const calculateTrend = (data, key) => { + if (data.length < 2) return null; + + const recent = data.slice(-5); + const first = recent[0][key]; + const last = recent[recent.length - 1][key]; + const change = last - first; + + return { + direction: change > 0 ? 'up' : change < 0 ? 'down' : 'stable', + value: Math.abs(change).toFixed(1) + }; + }; + + const chartData = prepareChartData(); + const hrTrend = calculateTrend(chartData, 'hr'); + const spo2Trend = calculateTrend(chartData, 'spo2'); + const tempTrend = calculateTrend(chartData, 'temp'); + + if (loading) { + return ( +
+
+ +

Loading patient data...

+
+
+ ); + } + + return ( +
+
+
+
+

{patient.name}

+
+ {patient.patient_id} + + {patient.band_id} + + Wait: {patient.wait_time_minutes} min +
+
+ +
+ +
+
+
+
+ + Heart Rate +
+
+

{patient.last_hr}

+
+

bpm

+ {hrTrend && ( +

+ {hrTrend.direction === 'up' ? : + hrTrend.direction === 'down' ? : null} + {hrTrend.value} +

+ )} +
+
+
+ +
+
+ + SpO₂ +
+
+

{patient.last_spo2}

+
+

%

+ {spo2Trend && ( +

+ {spo2Trend.direction === 'up' ? : + spo2Trend.direction === 'down' ? : null} + {spo2Trend.value} +

+ )} +
+
+
+ +
+
+ + Temperature +
+
+

{patient.last_temp.toFixed(1)}

+
+

°C

+ {tempTrend && ( +

+ {tempTrend.direction === 'up' ? : + tempTrend.direction === 'down' ? : null} + {tempTrend.value} +

+ )} +
+
+
+
+ +
+ {['all', 'hr', 'spo2', 'temp'].map(metric => ( + + ))} +
+ + {chartData.length > 0 ? ( +
+ {(selectedMetric === 'all' || selectedMetric === 'hr') && ( +
+

+ + Heart Rate Over Time +

+ + + + + + + + + + + +
+ )} + + {(selectedMetric === 'all' || selectedMetric === 'spo2') && ( +
+

+ + Oxygen Saturation Over Time +

+ + + + + + + + + + + +
+ )} + + {(selectedMetric === 'all' || selectedMetric === 'temp') && ( +
+

+ + Temperature Over Time +

+ + + + + + + + + + + +
+ )} +
+ ) : ( +
+ +

No vital signs history available yet

+
+ )} + + {tierChanges.length > 0 && ( +
+

Tier Change History

+
+ {tierChanges.map((change, index) => ( +
+ + {new Date(change.change_time).toLocaleTimeString()} + + {change.old_tier} + + {change.new_tier} + ({change.reason}) +
+ ))} +
+
+ )} + +
+
+

Total Readings

+

{vitalsHistory.length}

+
+
+

Priority Score

+

{patient.priority_score.toFixed(1)}

+
+
+

Current Tier

+

+ {patient.tier} +

+
+
+
+
+
+ ); +}; + +export default PatientDetailModal; diff --git a/vitallink/logs/all_pids.txt b/vitallink/logs/all_pids.txt new file mode 100644 index 0000000..54e7499 --- /dev/null +++ b/vitallink/logs/all_pids.txt @@ -0,0 +1,4 @@ +62558 +62574 +62581 +62616 diff --git a/vitallink/logs/backend.log b/vitallink/logs/backend.log index 4eac242..8bb8738 100644 --- a/vitallink/logs/backend.log +++ b/vitallink/logs/backend.log @@ -1,1843 +1,204 @@ -INFO: Started server process [52899] +INFO: Started server process [62558] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) ================================================================================ VitalLink Backend API Started ================================================================================ +✓ Database initialized: vitallink.db API Documentation: http://localhost:8000/docs WebSocket Endpoint: ws://localhost:8000/ws +Database: vitallink.db ================================================================================ -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39990 - "GET / HTTP/1.1" 200 OK -INFO: 127.0.0.1:39998 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40004 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40018 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40024 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36622 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36636 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36648 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:36650 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36654 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36666 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:57038 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57054 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57056 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57064 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:57076 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57086 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52266 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52268 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52272 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52278 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52284 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52286 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47432 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47444 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47450 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:47466 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47472 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:48038 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:48052 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:48060 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:48068 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:48072 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:48076 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51256 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51260 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51268 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51276 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51284 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51288 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:46080 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46088 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46098 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46106 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:46110 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46116 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41624 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41640 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41650 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41666 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41676 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41688 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52798 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52814 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52826 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52830 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52838 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52844 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:47320 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47334 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47336 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47346 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:47352 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:47356 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49874 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49890 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49902 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49904 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49912 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49926 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36782 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36790 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:36794 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36810 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36822 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36832 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52864 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52880 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52896 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52906 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52910 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52914 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54206 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54222 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54226 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54240 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54250 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54252 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54608 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54614 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54630 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54642 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54646 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54652 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59746 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59750 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59756 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59760 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59774 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59790 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35008 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35012 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35022 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35030 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35040 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35044 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33360 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33374 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33376 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33388 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33396 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33406 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33612 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33620 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33626 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33630 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33638 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33648 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39274 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39286 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39302 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39312 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39314 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39320 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52218 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52224 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52240 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52252 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52266 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52278 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35844 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35860 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35862 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35868 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35870 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35874 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56638 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56642 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56658 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56664 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56680 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56688 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60800 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60806 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60818 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60822 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60826 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60830 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33584 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33598 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33610 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33616 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33626 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33632 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46160 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:46170 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46178 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46184 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:46200 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:46202 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42650 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42658 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:42674 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42680 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42690 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:42698 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33874 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33882 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33898 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33914 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33928 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33932 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54332 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54342 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54346 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54352 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54366 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54380 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33334 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33344 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33352 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33358 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33360 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33362 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45620 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45630 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45632 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45636 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45638 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45654 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60882 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60892 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60894 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60900 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60912 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60926 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:48986 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:48990 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49002 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49004 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49020 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49028 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55136 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55140 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55142 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55150 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55166 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55170 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49646 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49660 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49664 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49666 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49670 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49686 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49862 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49872 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49884 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49894 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49908 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49920 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49406 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49412 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49426 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49436 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49440 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49450 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40944 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40952 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40962 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40970 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40984 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40992 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56694 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56708 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56724 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56728 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56730 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56734 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33122 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33134 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33144 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33150 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33162 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33168 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52646 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52656 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52662 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52672 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52674 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52678 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43058 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43060 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43062 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43068 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43070 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43084 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40460 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40466 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40472 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40488 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40502 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40518 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43554 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43558 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43572 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43576 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43586 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43594 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53312 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53318 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53322 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53334 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53350 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53360 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:39988 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34942 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34956 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34976 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34996 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35004 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39048 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39054 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39070 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39076 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39082 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39092 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41282 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41296 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41302 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41312 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41314 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41326 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35484 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35500 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35512 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35528 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35542 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35546 - "OPTIONS /api/checkin HTTP/1.1" 200 OK -/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:198: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ - await broadcast_update({"type": "patient_added", "patient": patient.dict()}) -INFO: 127.0.0.1:35546 - "POST /api/checkin HTTP/1.1" 200 OK -INFO: 127.0.0.1:35548 - "GET /api/queue HTTP/1.1" 200 OK -/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:305: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ - patient.last_vitals = data.dict() -/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:335: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/ - "vitals": data.dict(), -INFO: 127.0.0.1:35558 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39272 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39282 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39288 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39300 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39308 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39318 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34298 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34310 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34316 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34324 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34330 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34332 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55416 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55420 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55436 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55444 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55450 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55464 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39184 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39186 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39198 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39212 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39220 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39236 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33606 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33610 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33624 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33636 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33640 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33644 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40574 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40590 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40598 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40604 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40614 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40616 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:40622 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40006 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40022 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40034 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40048 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40056 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40060 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53334 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53348 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53364 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53366 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53378 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53380 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45240 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45250 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45260 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45262 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45276 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45278 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39306 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39310 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39326 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39332 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39336 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39348 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50262 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50268 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50272 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50288 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50300 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50302 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36386 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:36390 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36406 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36410 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36412 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:36426 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:36436 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44352 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44364 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:44374 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44386 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44388 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44392 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51098 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51102 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51108 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51124 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51128 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51132 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:34968 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53764 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53778 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53784 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53798 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53800 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53808 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60464 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60472 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60484 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60486 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60498 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60512 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60810 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60814 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60824 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60830 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:60834 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:60838 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50048 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50062 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50072 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50086 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50098 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50110 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50124 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37708 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37720 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37730 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37738 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37744 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37754 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44922 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:44932 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:44936 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44948 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44964 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40236 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40238 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40252 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40254 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40264 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40274 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37340 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37352 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37358 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37370 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:37372 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:37374 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43950 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43966 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43974 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43988 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44000 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44012 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52324 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52340 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52356 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52368 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52372 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52378 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52392 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41858 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41874 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41876 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41892 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41904 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41920 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34048 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34052 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34068 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34082 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34090 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34104 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53744 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53752 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53756 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53766 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53778 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53780 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56942 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56958 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56968 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56976 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56980 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56996 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56878 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56882 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56884 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:56888 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56904 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:56908 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35710 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35716 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35726 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35740 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35756 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35768 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35778 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43018 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43026 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43030 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43032 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43040 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43056 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34280 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34284 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34290 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34294 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34306 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34318 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33490 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33494 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33500 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33506 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33514 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33528 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43596 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43606 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43616 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43628 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:43632 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:43648 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33736 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33750 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33766 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33772 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33780 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33788 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58086 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58092 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58108 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58114 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58128 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58138 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58148 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49846 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49856 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49868 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49880 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:49896 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:49910 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45462 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45464 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45474 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45482 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45494 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45510 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:57094 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57108 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57122 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57128 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:57132 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:57136 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:38990 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:38996 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39012 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39028 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:39042 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:39048 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40638 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40642 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:40650 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40658 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40664 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:40666 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59806 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59820 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59826 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59832 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59838 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59846 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59860 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45552 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45564 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45576 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45578 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45582 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45598 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41624 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41632 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41648 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41662 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:41674 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:41688 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59774 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59788 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59802 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59810 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:59822 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:59832 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:38316 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:38324 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:38326 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:38342 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:38346 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:38358 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53408 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53414 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53430 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53438 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53444 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53456 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54916 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54924 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54936 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54940 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:54952 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54958 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:54966 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33250 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33262 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:33264 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33278 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33286 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:33298 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53128 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53136 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53142 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53156 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53160 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53172 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43394 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43396 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43410 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43424 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43438 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43452 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55612 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55626 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55632 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK INFO: 127.0.0.1:55634 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55650 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55652 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55664 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55676 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55686 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35600 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35614 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35628 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35632 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:35640 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:35648 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45950 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45956 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:45970 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45982 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45988 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:45996 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34472 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34474 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34486 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34492 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34500 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34514 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58320 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58336 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58350 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58360 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58366 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58380 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:58388 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36624 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36640 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:36644 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36660 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36662 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:36678 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52408 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52414 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52422 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52430 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:52434 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:52450 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51648 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51662 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51666 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51682 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51688 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51700 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44294 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44296 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:44302 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44314 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44320 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:44330 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50222 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50228 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50238 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50246 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50258 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50264 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53760 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53772 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53786 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53790 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53804 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53812 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53828 - "POST /api/vitals HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34578 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34588 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:34602 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34606 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34622 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:34630 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:50996 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:50998 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51000 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51004 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:51014 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:51030 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55944 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55958 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55968 - "POST /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55982 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:55994 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:55998 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: 127.0.0.1:58960 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/queue HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/stats HTTP/1.1" 200 OK -INFO: 127.0.0.1:53770 - "GET /api/wristband-details HTTP/1.1" 200 OK -INFO: Shutting down -INFO: Waiting for application shutdown. -INFO: Application shutdown complete. -INFO: Finished server process [52899] +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55644 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55646 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59532 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59542 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59552 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:59566 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59576 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59580 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:45636 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45640 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45642 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:45644 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45652 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45662 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48820 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48834 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48850 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48852 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48862 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48868 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44082 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44088 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44090 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:44104 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44108 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44112 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:40312 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40322 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40334 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40348 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:40358 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40364 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57108 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57120 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57128 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57136 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57144 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57154 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48928 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48944 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48960 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48964 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48978 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48992 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60772 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60788 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60790 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60802 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60804 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60808 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:58250 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:58262 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:58272 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:58288 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:58294 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:58298 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35286 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35294 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:43408 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35306 - "GET /api/queue HTTP/1.1" 200 OK diff --git a/vitallink/logs/backend.pid b/vitallink/logs/backend.pid new file mode 100644 index 0000000..7409b50 --- /dev/null +++ b/vitallink/logs/backend.pid @@ -0,0 +1 @@ +62558 diff --git a/vitallink/logs/dashboard.log b/vitallink/logs/dashboard.log index adcf770..73c3cfb 100644 --- a/vitallink/logs/dashboard.log +++ b/vitallink/logs/dashboard.log @@ -3,7 +3,7 @@ > vite - VITE v7.1.10 ready in 231 ms + VITE v7.1.10 ready in 225 ms ➜ Local: http://localhost:5173/ ➜ Network: use --host to expose diff --git a/vitallink/logs/dashboard.pid b/vitallink/logs/dashboard.pid new file mode 100644 index 0000000..1911377 --- /dev/null +++ b/vitallink/logs/dashboard.pid @@ -0,0 +1 @@ +62581 diff --git a/vitallink/logs/kiosk.log b/vitallink/logs/kiosk.log index 93329aa..5b7836f 100644 --- a/vitallink/logs/kiosk.log +++ b/vitallink/logs/kiosk.log @@ -4,137 +4,7 @@ Port 5173 is in use, trying another one... - VITE v7.1.10 ready in 233 ms + VITE v7.1.10 ready in 215 ms ➜ Local: http://localhost:5174/ ➜ Network: use --host to expose -10:36:25 AM [vite] (client) Pre-transform error: /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx: Support for the experimental syntax 'decorators' isn't currently enabled (1:1): - -> 1 | @import "tailwindcss"; - | ^ - 2 | - 3 | /* Extra large touchscreen keyboard */ - 4 | .kiosk-keyboard .hg-button { - -Add @babel/plugin-proposal-decorators (https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-decorators) to the 'plugins' section of your Babel config to enable transformation. -If you want to leave it as-is, add @babel/plugin-syntax-decorators (https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decorators) to the 'plugins' section to enable parsing. - -If you already added the plugin for this syntax to your config, it's possible that your config isn't being loaded. -You can re-run Babel with the BABEL_SHOW_CONFIG_FOR environment variable to show the loaded configuration: - npx cross-env BABEL_SHOW_CONFIG_FOR=/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx -See https://babeljs.io/docs/configuration#print-effective-configs for more info. - - Plugin: vite:react-babel - File: /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx:1:0 - 1 | @import "tailwindcss"; - | ^ - 2 | - 3 | /* Extra large touchscreen keyboard */ -10:36:25 AM [vite] Internal server error: /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx: Support for the experimental syntax 'decorators' isn't currently enabled (1:1): - -> 1 | @import "tailwindcss"; - | ^ - 2 | - 3 | /* Extra large touchscreen keyboard */ - 4 | .kiosk-keyboard .hg-button { - -Add @babel/plugin-proposal-decorators (https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-decorators) to the 'plugins' section of your Babel config to enable transformation. -If you want to leave it as-is, add @babel/plugin-syntax-decorators (https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decorators) to the 'plugins' section to enable parsing. - -If you already added the plugin for this syntax to your config, it's possible that your config isn't being loaded. -You can re-run Babel with the BABEL_SHOW_CONFIG_FOR environment variable to show the loaded configuration: - npx cross-env BABEL_SHOW_CONFIG_FOR=/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx -See https://babeljs.io/docs/configuration#print-effective-configs for more info. - - Plugin: vite:react-babel - File: /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx:1:0 - 1 | @import "tailwindcss"; - | ^ - 2 | - 3 | /* Extra large touchscreen keyboard */ - at constructor (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:367:19) - at JSXParserMixin.raise (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:6630:19) - at JSXParserMixin.expectOnePlugin (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:6664:18) - at JSXParserMixin.parseDecorator (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12957:10) - at JSXParserMixin.parseDecorators (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12942:28) - at JSXParserMixin.parseStatementLike (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12774:25) - at JSXParserMixin.parseModuleItem (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12753:17) - at JSXParserMixin.parseBlockOrModuleBlockBody (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:13325:36) - at JSXParserMixin.parseBlockBody (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:13318:10) - at JSXParserMixin.parseProgram (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12634:10) - at JSXParserMixin.parseTopLevel (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12624:25) - at JSXParserMixin.parse (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:14501:10) - at parse (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:14535:38) - at parser (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/parser/index.js:41:34) - at parser.next () - at normalizeFile (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37) - at normalizeFile.next () - at run (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/transformation/index.js:22:50) - at run.next () - at transform (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/transform.js:22:33) - at transform.next () - at step (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:261:32) - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:273:13 - at async.call.result.err.err (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:223:11) - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:189:28 - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/gensync-utils/async.js:67:7 - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:113:33 - at step (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:287:14) - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:273:13 - at async.call.result.err.err (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:223:11) -10:36:28 AM [vite] Internal server error: /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx: Support for the experimental syntax 'decorators' isn't currently enabled (1:1): - -> 1 | @import "tailwindcss"; - | ^ - 2 | - 3 | /* Extra large touchscreen keyboard */ - 4 | .kiosk-keyboard .hg-button { - -Add @babel/plugin-proposal-decorators (https://github.com/babel/babel/tree/main/packages/babel-plugin-proposal-decorators) to the 'plugins' section of your Babel config to enable transformation. -If you want to leave it as-is, add @babel/plugin-syntax-decorators (https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decorators) to the 'plugins' section to enable parsing. - -If you already added the plugin for this syntax to your config, it's possible that your config isn't being loaded. -You can re-run Babel with the BABEL_SHOW_CONFIG_FOR environment variable to show the loaded configuration: - npx cross-env BABEL_SHOW_CONFIG_FOR=/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx -See https://babeljs.io/docs/configuration#print-effective-configs for more info. - - Plugin: vite:react-babel - File: /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/src/App.jsx:1:0 - 1 | @import "tailwindcss"; - | ^ - 2 | - 3 | /* Extra large touchscreen keyboard */ - at constructor (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:367:19) - at JSXParserMixin.raise (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:6630:19) - at JSXParserMixin.expectOnePlugin (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:6664:18) - at JSXParserMixin.parseDecorator (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12957:10) - at JSXParserMixin.parseDecorators (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12942:28) - at JSXParserMixin.parseStatementLike (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12774:25) - at JSXParserMixin.parseModuleItem (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12753:17) - at JSXParserMixin.parseBlockOrModuleBlockBody (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:13325:36) - at JSXParserMixin.parseBlockBody (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:13318:10) - at JSXParserMixin.parseProgram (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12634:10) - at JSXParserMixin.parseTopLevel (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:12624:25) - at JSXParserMixin.parse (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:14501:10) - at parse (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/parser/lib/index.js:14535:38) - at parser (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/parser/index.js:41:34) - at parser.next () - at normalizeFile (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37) - at normalizeFile.next () - at run (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/transformation/index.js:22:50) - at run.next () - at transform (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/transform.js:22:33) - at transform.next () - at step (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:261:32) - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:273:13 - at async.call.result.err.err (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:223:11) - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:189:28 - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/@babel/core/lib/gensync-utils/async.js:67:7 - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:113:33 - at step (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:287:14) - at /home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:273:13 - at async.call.result.err.err (/home/mai/documents/school/capstone/vitallink-BS/vitallink/frontend/kiosk/node_modules/gensync/index.js:223:11) -10:38:52 AM [vite] (client) hmr update /src/index.css -10:43:47 AM [vite] (client) hmr update /src/App.jsx, /src/index.css -10:46:50 AM [vite] (client) hmr update /src/index.css -10:47:14 AM [vite] (client) hmr update /src/index.css diff --git a/vitallink/logs/kiosk.pid b/vitallink/logs/kiosk.pid new file mode 100644 index 0000000..397d8cf --- /dev/null +++ b/vitallink/logs/kiosk.pid @@ -0,0 +1 @@ +62616 diff --git a/vitallink/logs/wristbands.log b/vitallink/logs/wristbands.log index b1f57b7..e69de29 100644 --- a/vitallink/logs/wristbands.log +++ b/vitallink/logs/wristbands.log @@ -1,133 +0,0 @@ -⚠️ Bleak not installed. Real wristbands disabled. Install with: pip install bleak -✓ Loaded configuration from wristband_config.yaml - -================================================================================ -VitalLink System Initialization -================================================================================ - -✓ Backend is running at http://localhost:8000 -➕ Added simulated band MOCK-SIM1 (stable) -➕ Added simulated band MOCK-SIM2 (mild_anxiety) -➕ Added simulated band MOCK-SIM3 (deteriorating) -➕ Added simulated band MOCK-SIM4 (sepsis) - -================================================================================ -WRISTBAND INVENTORY -================================================================================ -🟢 MOCK-SIM1 | AVAILABLE -🟢 MOCK-SIM2 | AVAILABLE -🟢 MOCK-SIM3 | AVAILABLE -🟢 MOCK-SIM4 | AVAILABLE -================================================================================ -Total: 4 | Real: 0 | Simulated: 4 | Active: 0 -================================================================================ - - -================================================================================ -VitalLink System Running -================================================================================ - -✓ Monitoring for new patients from kiosk check-ins -✓ Auto-assigning wristbands (prefer real: False) - -Press Ctrl+C to stop - -================================================================================ - - -🔍 Monitoring for new patient check-ins... -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 -[Status] Active: 0 monitoring | Available: 4 bands | Real: 0 | Sim: 4 - -🆕 New patient detected: P100001 (FIRST LAST) -✓ MOCK-SIM1 assigned to patient P100001 - ✓ Assigned MOCK-SIM1 (simulated) -🟢 Starting simulated wristband MOCK-SIM1 (stable) -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 -[Status] Active: 1 monitoring | Available: 3 bands | Real: 0 | Sim: 4 diff --git a/vitallink/logs/wristbands.pid b/vitallink/logs/wristbands.pid new file mode 100644 index 0000000..19f7f43 --- /dev/null +++ b/vitallink/logs/wristbands.pid @@ -0,0 +1 @@ +62574 diff --git a/vitallink/vitallink.db b/vitallink/vitallink.db new file mode 100644 index 0000000000000000000000000000000000000000..0c81117aa7a906fc53c84532133ce5fe3dd7c778 GIT binary patch literal 53248 zcmeI*&2Q6Y90zc_N$b91CYUl*RXiY}G-}K0bbyM4N+^Z}+N7i@qhsK?iJMwYoM5|@ z!eIgg*Ijnl_BU)CryUW~Gzo3jO+(rwcG)C$K^oc)JM8geJ8?`KC}U`fQduB?vHL_SWE2>S#xa}Ozb4Ll`I6BL5ee~O(y6H^RPtc!yV1A?7?cDyW zwLbALt~c_C+twp~(>vMoxciOHkA$K2FWQepzm1k@0VW7Q;J+65pjU_;*~ec`=tfby zq8G0ywyv2zgDl`ThLO}f~{ZH{ABM_)%qpgf=-Qo)}ZdMo~U*Uu>(W=^`3eKmvvh$ zTda1=Rx33xZE9*!H%eB|Qx%0*aB2#zH0W##iG#~!lv~tj zJu7uH-8O2pu{O!4r{&pvYI?>kGPSa%TI&|o)WWi6D~0NcVb@!BTt1PSo63{XKuhek zn&#F<$jAtZ)6Oo(N!28AORubyRa+~@S-T6ggeIDrLHvl5bGaPdLZ#lo?!=8nL5RiU z{H-2_Zmn6iR#CLe4t7(bvkAGWXw$eXJllaARv~0>5r4BArSA6oeNb4^3d_0?A13jl zZqeh?ENM<6aOgTowXB&oozd*Ve#Ydl@AYs%x+$lq*{WW)0`jM3vzZryzR7n8v3>ja zTQY+VG|&pp3r)7xEGI}#J|WZnds3cl45ST&M0eum z*>*a%N&M}1+&(aMwWK-2i)LADc%hpT%IRqCkEhCCa<4Sn(z<87hL-7JQuYT9SBLE~ zhFbB43wLif^{T1cYl>BKco=s_Hgt zqf*h06`L;VjjV1nHa8Ca+m4-ycEpB;_<45>yF}ZrDVBC=MKcPT)tqc^>d;W(paVBd z*G$}$BZ3q1c8bLeo%BM$XY zdN!yjg}^Suu4?GM6vzq<5sPKD)MCeZwR^_RabAcG4Dh$zVb>cDEdOU)Q_uOiUY9k- z4t971FB#k&wnbko>ZWBY_2V$q8D+IaVX?a4*4KR5VXakacD2$%)}o_8^O@C@ZY+;DY4&i$c?KelkB^T? z$&u0I`Ms%yVwFBhRLf*W)s4LuD%GN9($6xIqsap!k~EThi%8Pp(ecAla{r;x@nmw; zefkhAKj@Y_AL{es6OMjif&c^{009U<00Izz00bZa0SG`~D+zQ*`n$ZR4bJEP?c3%# z@iXz97}<7*&SHW91Rwwb2tWV=5P$##AOHafJiowfdmq=oTi|(K5O%%hf4DuJojg4< zo1T_Z57K)&l*g6mN%iQli(j63bZhs-*Y`erZ}7=i?q}8KFEoEzEsY(P#%80>3QGRG zxcpP()WXqYOHXLH#KirFC-3aM`f!7wNhfIJnL&TMz<=MCra?{=JotQj}+1VoI{db2B%Cw#DvyPhhrPane zzaKE>{{H_XPQ?GhfBt$Pgd;iyQPI4V|37 z^oI!o5P$##AOHafKmY;|fB*y_0D&zlfcyU~+qKv*2tWV=5P$##AOHafKmY;|fIwXU z_y2VY%s>DF5P$##AOHafKmY;|fB*!xtN`x+w`|v9!yo_w2tWV=5P$##AOHafKmY=D z0q6aH?c&Fr_`CRncu)MC&SHW91Rwwb2tWV=5P$##AOHafK;RV#?2Pscy!Vbi|6K{~ zp-lF!gJ?L@c~?Osoawx4plt_@>A&}n#w52lxs09H1v6bOrDKdGT+Keqn+D z1Rwwb2tWV=5P$##AOHafKwt|BL?T^X&gcJl|KAquTx=2qAOHafKmY;|fB*y_009U< HARzD$y0WSi literal 0 HcmV?d00001