PageSourceSearch

https://app.posetracker.com/_next/static/chunks/7430-ce825714b03471e9.js

js posetracker.com collected 2026-09-30 23:54:09 UTC 22,933 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7430],{37430:function(e,t,i){i.d(t,{bt:function(){return l},nW:function(){return n},wY:function(){return r}});var s=i(1373);let l={minJumpHeightCm:10,jumpCooldownMs:900,landingEpsPx:14,landingStableFrames:3};class n{getInitialPosture(){return this.initialPosture}getReady(){return this.ready}validatePlacement(e,t,i){return(0,s.VP)(e,t,i)}detectIsReady(e,t,i){if(!e)return{correct:!1,message:"waiting for keypoints",keypoints:e,requirements:this.initialPosture};let s=e.get("left_hip"),l=e.get("right_hip"),n=s&&s.score>.4,r=l&&l.score>.4;if(!n&&!r)return{correct:!1,message:"hips not visible - ensure at least one hip (left or right) is visible with good score (profile/side view is supported)",keypoints:e,requirements:this.initialPosture};let a=.1*t,h=.1*i;return[s,l].filter(e=>e&&e.score>.4).every(e=>e.x>=a&&e.x<=t-a&&e.y>=h&&e.y<=i-h)?(this.ready=!0,{correct:!0,message:"ready",keypoints:e,requirements:this.initialPosture}):{correct:!1,message:"hips not in the detection frame",keypoints:e,requirements:this.initialPosture}}compute(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:640,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:480,l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};if(this.simpleRealtime)return this._computeSimpleRealtime(e,t,i,s);if(!this.ready||!e)return null;(null==l?void 0:l.isVideo)===!0&&"offline"!==this.detector.mode&&(this.detector.mode="offline");let n=this.detector.update(e,t);if(this.visibleHips=this.detector.visibleHips,n.discarded)return this._resetMeasuring(),{discarded:!0,reason:n.reason,userMessage:n.userMessage};if("push_off_detected"!==n.event||this.jumpStarted||(this.jumpStarted=!0,this.measuring=!0,this.jumpStartTime=t),this.detector.takeoffTs&&this.jumpStartTime!==this.detector.takeoffTs&&(this.jumpStartTime=this.detector.takeoffTs),n.finalJump){this.landed=!0,this.measuring=!1,this.landingTime=n.finalJump.landingTs;let e=n.finalJump.flightTimeMs,t=this._fromAirTime(e);return t<10||t>130?(this._resetMeasuring(),null):{jumpHeightCm:Math.round(10*t)/10,airTimeMs:Math.round(e),airTimeSeconds:Math.round(e/1e3*100)/100,measuring:!1,landed:!0,final:!0,baselineY:Math.round(10*n.finalJump.baselineHipY)/10,minY:null!=n.finalJump.peakHipY?Math.round(10*n.finalJump.peakHipY)/10:null,sideUsed:n.finalJump.sideUsed,visibleHips:this.visibleHips}}return this.measuring&&null!=this.jumpStartTime?{measuring:!0,landed:!1,airTimeMs:Math.round(t-this.jumpStartTime)}:null}_computeSimpleRealtime(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:640,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:480;if(!this.ready||!e)return null;let n=t||Date.now();if(n<this.realtimeCooldownUntilTs)return null;let r={timestamp:n,width:i,height:l,keypoints:[]};for(let[t,i]of e.entries())i&&r.keypoints.push({name:t,x:i.x,y:i.y,score:i.score});this.realtimeFrames.push(r);let a=n-2500;if(this.realtimeFrames=this.realtimeFrames.filter(e=>{var t;return(null!==(t=e.timestamp)&&void 0!==t?t:0)>=a}),this.realtimeFrames.length<20)return null;let h=(0,s.PS)(this.realtimeFrames,{frameWidth:i,frameHeight:l,debug:!1,minFlightMs:120,maxFlightMs:700,allowTakeoffFallback:!1});if(!h||!h.finalJump)return null;let{finalJump:o}=h,u=this._getRealtimeHipY(e);if(!(null!=u&&(null==o?void 0:o.baselineHipY)!=null&&Math.abs(u-o.baselineHipY)<=this.realtimeGuards.landingEpsPx))return this.realtimeLandingStableCount=0,null;if(this.realtimeLandingStableCount++,this.realtimeLandingStableCount<this.realtimeGuards.landingStableFrames||null!=this.lastJumpLandingTs&&80>Math.abs(o.landingTs-this.lastJumpLandingTs))return null;let d=o.flightTimeMs,m=this._fromAirTime(d);return!d||d<=0||m<this.realtimeGuards.minJumpHeightCm||m>130?null:(this.lastJumpLandingTs=o.landingTs,this.realtimeCooldownUntilTs=n+this.realtimeGuards.jumpCooldownMs,this.realtimeLandingStableCount=0,this.jumpStarted=!0,this.measuring=!1,this.landed=!0,this.realtimeFrames=[],{jumpHeightCm:Math.round(10*m)/10,airTimeMs:Math.round(d),airTimeSeconds:Math.round(d/1e3*100)/100,measuring:!1,landed:!0,final:!0,baselineY:Math.round(10*o.baselineHipY)/10,minY:Math.round(10*o.peakHipY)/10,sideUsed:o.sideUsed,visibleHips:this.visibleHips})}_fromAirTime(e){if(!e||e<=0)return 0;let t=e/1e3;
1return Math.max(0,1/8*9.81*t*t*100)}_getRealtimeHipY(e){if(!e)return null;let t=e.get("left_hip"),i=e.get("right_hip"),s=t&&t.score>.4,l=i&&i.score>.4;return s&&l?(t.y+i.y)/2:s?t.y:l?i.y:null}_resetMeasuring(){this.jumpStarted=!1,this.measuring=!1,this.landed=!1,this.jumpStartTime=null,this.landingTime=null}reset(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._resetMeasuring(),this.detector?e?this.detector.resetForNextJump():(this.detector.fullReset(),this.ready=!1):e||(this.ready=!1),this.visibleHips={left:!1,right:!1}}startMeasurement(){}getJumpHeight(e){var t,i;if(!this.jumpStartTime)return null;let s=(this.landingTime||(void 0!==e?e:Date.now()))-this.jumpStartTime,l=this._fromAirTime(s);return l<10||l>130?null:{jumpHeightCm:Math.max(0,Math.round(10*l)/10),airTimeMs:Math.round(s),airTimeSeconds:Math.round(s/1e3*100)/100,baselineY:(null===(t=this.detector)||void 0===t?void 0:t.baselineHipY)!=null?Math.round(10*this.detector.baselineHipY)/10:null,minY:(null===(i=this.detector)||void 0===i?void 0:i.peakHipY)!=null?Math.round(10*this.detector.peakHipY)/10:null,landed:this.landed,visibleHips:this.visibleHips}}constructor(e={}){this.devicePitchDeg=e.devicePitchDeg||null,this.simpleRealtime=!!e.simpleRealtime;let t=e.mode||"realtime";this.detector=this.simpleRealtime?null:new s.kg({mode:t}),this.ready=!1,this.jumpStarted=!1,this.landed=!1,this.measuring=!1,this.jumpStartTime=null,this.landingTime=null,this.visibleHips={left:!1,right:!1},this.realtimeFrames=[],this.lastJumpLandingTs=null,this.realtimeCooldownUntilTs=0,this.realtimeLandingStableCount=0,this.realtimeGuards={...l,...e.realtimeGuards||{}},this.initialPosture={padding_horizontal:10,padding_vertical:10,required_points:["left_hip||right_hip","left_shoulder||right_shoulder","left_ankle||right_ankle","left_eye||right_eye"],orientation:"face"}}}function r(e,t){let i=[],l=new n({...t,mode:"offline"});l.ready=!0;let r=640,a=480;e.length>0&&e[0].width&&e[0].height&&(r=e[0].width,a=e[0].height);let h=null;for(let t=0;t<e.length;t++){let s=new Map;e[t].keypoints.forEach(e=>s.set(e.name,e));let n=l.compute(s,e[t].timestamp||33*t,r,a,{isVideo:!0});l.jumpStarted&&null===h&&(h=t),(!n||!n.discarded)&&n&&n.landed&&n.final&&(i.push({jumpHeightCm:n.jumpHeightCm,airTimeMs:n.airTimeMs,airTimeSeconds:n.airTimeSeconds,baselineY:n.baselineY,minY:n.minY,sideUsed:n.sideUsed,visibleHips:n.visibleHips,jumpStartFrame:h,jumpEndFrame:t}),l.reset(!0),l.ready=!0,h=null)}try{if(e.length>0){var o,u;let t=30,n=null!==(o=e[0].timestamp)&&void 0!==o?o:0,h=null!==(u=e[e.length-1].timestamp)&&void 0!==u?u:(e.length-1)*33.33,d=Math.max(1,h-n);d>0&&(t=Math.max(10,Math.min(120,e.length/d*1e3)));let m=i=>{var s;return null!==(s=e[i].timestamp)&&void 0!==s?s:1e3*i/t},p=m(0),f=m(e.length-1);for(let t=p;t<f;t+=1200){let n=t+3500,h=[],o=[];for(let i=0;i<e.length;i++){let s=m(i);s>=t&&s<=n&&(h.push(e[i]),o.push(i))}if(h.length<20)continue;let u=(0,s.PS)(h,{frameWidth:r,frameHeight:a});if(!u||!u.finalJump)continue;let{finalJump:d,jumpStartFrameIndex:p,jumpEndFrameIndex:f}=u;if(null==p||null==f||p<0||f<0||p>=o.length||f>=o.length)continue;let c=o[p],g=o[f],_=d.flightTimeMs,b=l._fromAirTime(_),M=b>=10&&b>130?130:Math.round(10*b)/10;if(b<10)continue;let S={jumpHeightCm:M,airTimeMs:Math.round(_),airTimeSeconds:Math.round(_/1e3*100)/100,baselineY:Math.round(10*d.baselineHipY)/10,minY:Math.round(10*d.peakHipY)/10,sideUsed:d.sideUsed,visibleHips:{left:!0,right:!0},jumpStartFrame:c,jumpEndFrame:g},y=i.findIndex(e=>{if(null==e.jumpStartFrame||null==e.jumpEndFrame)return!1;let t=e.jumpStartFrame;return!(e.jumpEndFrame<c-10||t>g+10)});if(y>=0){let e=i[y].airTimeMs||0;_>e&&(i[y]=S)}else i.push(S)}}}catch(e){}if(i.length>=3){let e=Math.max(...i.map(e=>e.jumpHeightCm||0)),t=i.filter(t=>{let i=t.jumpHeightCm||0;return i>=25||i>=.2*e});t.length<2&&(t=[...i].sort((e,t)=>(t.jumpHeightCm||0)-(e.jumpHeightCm||0)).slice(0,2)),i.length=0,i.push(...t)}let d=i.length,m=d>0?i.reduce((e,t)=>e+t.jumpHeightCm,0)/d:0,p=d>0?Math.round(i.reduce((e,t)=>e+(t.airTimeMs||0),0)/d/1e3*100)/100:0;return{jumps:i,totalJumps:d,avgJumpHeight:Math.round(10*m)/10,maxJumpHeight:d>0?Math.round(10*Math.max(...i.map(e=>e.jumpHeightCm)))/10:0,minJumpHeight:d>0?Math.round(10*Math.min(...i.map(e=>e.jumpHeightCm)))/10:0,avgAirTimeSeconds:p,success:d>0}}},1373:function(e,t,i){i.d(t,{PS:function(){return a},VP:function(){return h},kg:function(){return n}});var s,l=i(83454);
1class n{update(e,t){if(this._isRealtimeStrict()&&"WAIT_STABLE"===this.state&&t<this.realtimeRefractoryUntilTs||!e)return this._r();let i=this._extractFrame(e,t);if(!i)return"WAIT_STABLE"!==this.state&&null!=this.lastValidTs&&t-this.lastValidTs>500?(this._soft(),this._setRealtimeRefractory(t),this._r({discarded:!0,reason:"tracking_lost",userMessage:"Lost tracking during jump - try again"})):this._r();this.lastValidTs=t,this.currentHipY=i.hipY,this.buffer.push(i),this.buffer.length>30&&this.buffer.shift();let s=this._smoothed();if(null===s)return this._r();if(null!==this.dipStartTs&&t-this.dipStartTs>3e3||this._isRealtimeStrict()&&this._isActiveState()&&null!=this.dipStartTs&&t-this.dipStartTs>1400)return this._soft(),this._setRealtimeRefractory(t),this._r({discarded:!0,reason:"jump_timeout",userMessage:"Movement took too long"});switch(this.state){case"WAIT_STABLE":return this._onStable(i,s,t);case"DIP":return this._onDip(i,s,t);case"PUSH_OFF":return this._onPush(i,s,t);case"FLIGHT":return this._onFlight(i,s,t);case"LANDING":return this._onLand(i,s,t);default:return this._r()}}resetForNextJump(){this.state="WAIT_STABLE",this._clearJump(),this.buffer=[],this.lastValidTs=null}fullReset(){this.resetForNextJump(),this.baselineHipY=null,this.baselineScaleProxy=null,this.baselineScaleKind=null,this.baselineSet=!1,this.sideUsed=null,this.visibleHips={left:!1,right:!1},this.currentHipY=null}_onStable(e,t,i){if(!this.baselineSet){let e="offline"===this.mode,t=e?5:15;if(this.buffer.length>=t){let i=this.buffer.slice(-t),s=i.map(e=>e.hipY).filter(e=>null!=e);s.length>=Math.ceil(.7*t)&&Math.max(...s)-Math.min(...s)<=(e?14:8)&&this._setBaseline(i)}return(e&&!this.baselineSet&&this.buffer.length>=60&&this._setBaselineMedian(),this.baselineSet)?this._r({event:"baseline_set"}):this._r({userMessage:"Hold still / stabilize your position"})}return(t>this.baselineHipY+3?this.dipConfirmCount++:this.dipConfirmCount=0,this.dipConfirmCount>=2)?(this.state="DIP",this.dipStartTs=i,this.dipBottomY=t,this.dipConfirmCount=0,this._r({event:"dip_detected"})):this._r()}_onDip(e,t,i){return(t>this.dipBottomY&&(this.dipBottomY=t),this._dipScaleBad(e))?(this._soft(),this._r({discarded:!0,reason:"moved_toward_phone",userMessage:"Approach detected - not a jump"})):i-this.dipStartTs>1e3?(this._soft(),this._r()):this.dipBottomY-t>5?(this.state="PUSH_OFF",this.pushOffStartTs=i,this.pushOffFrameCount=0,this.peakHipY=t,this.peakTs=i,this.takeoffTs=null,this._r({event:"push_off_detected"})):this._r()}_onPush(e,t,i){return(this.pushOffFrameCount++,this._dipScaleBad(e))?(this._soft(),this._r({discarded:!0,reason:"moved_toward_phone",userMessage:"Approach detected - not a jump"})):(t<this.peakHipY&&(this.peakHipY=t,this.peakTs=i),null===this.takeoffTs&&t<this.baselineHipY&&(this.takeoffTs=i),i-this.pushOffStartTs>800)?(this._soft(),this._r({discarded:!0,reason:"slow_push_off_not_jump",userMessage:"Not a jump - stabilize and try again"})):this.pushOffFrameCount>=2&&t>this.peakHipY+2?(this.state="FLIGHT",this._r({event:"peak"})):this._r()}_onFlight(e,t,i){if(this._handleRealtimeReDip(t,i))return this._r({discarded:!0,reason:"jump_restarted",userMessage:"Restarting jump detection"});if(!this._scaleOk(e)){let t=e.scaleProxy&&this.baselineScaleProxy?Math.round(e.scaleProxy/this.baselineScaleProxy*100)/100:null;return this._soft(),this._r({discarded:!0,reason:"moved_toward_phone",userMessage:"Movement detected - not a jump",distanceRatio:t})}return(t<this.peakHipY&&(this.peakHipY=t,this.peakTs=i),15>=Math.abs(t-this.baselineHipY))?(this.state="LANDING",this.landingStableCount=1,null==this.landingCandidateTs&&(this.landingCandidateTs=i),this._r({event:"landing_detected"})):this._r()}_onLand(e,t,i){if(this._handleRealtimeReDip(t,i))return this._r({discarded:!0,reason:"jump_restarted",userMessage:"Restarting jump detection"});if(!this._scaleOk(e))return this._soft(),this._r({discarded:!0,reason:"moved_toward_phone",userMessage:"Movement detected - not a jump"});if(15>=Math.abs(t-this.baselineHipY))this.landingStableCount++;else if(this.landingStableCount=0,Math.abs(t-this.baselineHipY)>30)return this.state="FLIGHT",this._r();if(this.landingStableCount>=3){let e="offline"===this.mode?2:3;if("hipSpan"===this.baselineScaleKind&&(e=Math.min(e,2)),this.peakHipY>=this.baselineHipY-e)return this._soft(),this._r({discarded:!0,reason:"no_flight_detected",userMessage:"No jump detected - the body did not rise above standing height"});let t=this.takeoffTs||this.pushOffStartTs,s="offline"===this.mode&&null!=this.landingCandidateTs?this.landingCandidateTs:i,l={baselineHipY:this.baselineHipY,peakHipY:this.peakHipY,dipBottomY:this.dipBottomY,takeoffTs:t,peakTs:this.peakTs,landingTs:s,flightTimeMs:s-t,sideUsed:this.sideUsed};return this._soft(),this._setRealtimeRefractory(i),this._r({event:"jump_complete",finalJump:l})}return this._r()}_extractFrame(e,t){let i=this._pickSide(e);if(!i)return null;this.sideUsed=i;let s=this._hipY(e,i);if(null===s)return null;let l=this._scaleProxy(e,i);return{timestamp:t,hipY:s,scaleProxy:l.value,scaleKind:l.kind,side:i}}_pickSide(e){let t=t=>t.reduce((t,i)=>{let s=e.get(i);return s&&s.score>.4?t+1:t},0),i=t(["left_hip","left_knee","left_ankle","left_shoulder"]),s=t(["right_hip","right_knee","right_ankle","right_shoulder"]),l=e.get("left_hip"),n=e.get("right_hip"),r=l&&l.score>.4,a=n&&n.score>.4;return(this.visibleHips={left:!!r,right:!!a},r&&a&&i>=3&&s>=3)?"both":r&&i>=s&&i>=1?"left":a&&s>=1?"right":r?"left":null}_hipY(e,t){let i=e.get("left_hip"),s=e.get("right_hip");if("both"===t){let e=i&&i.score>.4?i.y:null,t=s&&s.score>.4?s.y:null;return null!==e&&null!==t?(e+t)/2:null!=e?e:t}return"left"===t?i&&i.score>.4?i.y:null:"right"===t&&s&&s.score>.4?s.y:null}_scaleProxy(e,t){let i=e.get("left_hip"),s=e.get("right_hip");if(i&&s&&i.score>.4&&s.score>.4){let e=Math.abs(s.x-i.x);if(e>5)return{value:e,kind:"hipSpan"}}let l="both"===t||"left"===t?"left":"right",n=e.get("".concat(l,"_hip")),r=e.get("".concat(l,"_shoulder"));if(n&&r&&n.score>.4&&r.score>.4){let e=Math.hypot(r.x-n.x,r.y-n.y);if(e>5)return{value:e,kind:"torsoVertical"}}let a=e.get("".concat(l,"_knee"));if(n&&a&&n.score>.4&&a.score>.4){let e=Math.hypot(a.x-n.x,a.y-n.y);if(e>10)return{value:e,kind:"hipKnee"}}let h=e.get("".concat(l,"_ankle"));if(n&&h&&n.score>.4&&h.score>.4){let e=Math.hypot(h.x-n.x,h.y-n.y);if(e>10)return{value:e,kind:"hipAnkle"}}let o=[];for(let[,t]of e)t&&t.score>.4&&o.push(t);if(o.length>=3){let e=o.map(e=>e.y),t=Math.max(...e)-Math.min(...e);if(t>20)return{value:t,kind:"bboxHeight"}}return{value:null,kind:null}}_smoothed(){let e=Math.min(3,this.buffer.length);if(0===e)return null;let t=this.buffer.slice(-e).map(e=>e.hipY).filter(e=>null!=e);if(0===t.length)return null;let i=[...t].sort((e,t)=>
1e-t);return i[Math.floor(i.length/2)]}_scaleOk(e){if(!this.baselineScaleProxy||!e.scaleProxy)return this.scaleAbortCount=0,!0;let t=new Set(["hipSpan","torsoVertical"]);if(e.scaleKind!==this.baselineScaleKind||!t.has(e.scaleKind))return this.scaleAbortCount=0,!0;let i=e.scaleProxy/this.baselineScaleProxy,s=.85,l=1.15,n="hipSpan"===e.scaleKind||"both"===e.side;return"offline"===this.mode&&n?(s=.7,l=1.3):n&&(s=.8,l=1.25),i<s||i>l?this.scaleAbortCount++:this.scaleAbortCount=0,this.scaleAbortCount<3}_dipScaleBad(e){if(!this.baselineScaleProxy||!e.scaleProxy||"hipSpan"!==e.scaleKind||"hipSpan"!==this.baselineScaleKind)return!1;let t=e.scaleProxy/this.baselineScaleProxy,i=.75,s=1.25;return"offline"===this.mode&&"both"===e.side?(i=.65,s=1.35):"both"===e.side&&(i=.7,s=1.3),t<i||t>s}_setBaseline(e){let t=e.map(e=>e.hipY).filter(e=>null!=e);this.baselineHipY=t.reduce((e,t)=>e+t,0)/t.length;let i=e.filter(e=>null!=e.scaleProxy&&e.scaleProxy>0);if(i.length>=1){let e={};i.forEach(t=>{e[t.scaleKind]=(e[t.scaleKind]||0)+1});let t=Object.entries(e).sort((e,t)=>t[1]-e[1])[0][0],s=i.filter(e=>e.scaleKind===t);this.baselineScaleProxy=s.reduce((e,t)=>e+t.scaleProxy,0)/s.length,this.baselineScaleKind=t}this.baselineSet=!0}_setBaselineMedian(){let e=this.buffer.map(e=>e.hipY).filter(e=>null!=e);if(0===e.length)return;let t=[...e].sort((e,t)=>e-t);this.baselineHipY=t[Math.floor(t.length/2)];let i=this.buffer.filter(e=>null!=e.scaleProxy&&e.scaleProxy>0);if(i.length>=1){let e={};i.forEach(t=>{e[t.scaleKind]=(e[t.scaleKind]||0)+1});let t=Object.entries(e).sort((e,t)=>t[1]-e[1])[0][0],s=i.filter(e=>e.scaleKind===t);this.baselineScaleProxy=s.reduce((e,t)=>e+t.scaleProxy,0)/s.length,this.baselineScaleKind=t}this.baselineSet=!0}_soft(){this.state="WAIT_STABLE",this._clearJump()}_clearJump(){this.dipStartTs=null,this.dipBottomY=null,this.dipConfirmCount=0,this.pushOffStartTs=null,this.pushOffFrameCount=0,this.takeoffTs=null,this.peakHipY=null,this.peakTs=null,this.landingStableCount=0,this.scaleAbortCount=0,this.landingCandidateTs=null,this.realtimeReDipCount=0}_isRealtimeStrict(){return"realtime"===this.mode&&this.strictRealtime}_isActiveState(){return"DIP"===this.state||"PUSH_OFF"===this.state||"FLIGHT"===this.state||"LANDING"===this.state}_setRealtimeRefractory(e){this._isRealtimeStrict()&&(this.realtimeRefractoryUntilTs=Math.max(this.realtimeRefractoryUntilTs||0,e+220))}_handleRealtimeReDip(e,t){return!!this._isRealtimeStrict()&&null!=this.baselineHipY&&(e>this.baselineHipY+3?this.realtimeReDipCount++:this.realtimeReDipCount=0,this.realtimeReDipCount>=2&&(this._soft(),this._setRealtimeRefractory(t),!0))}_r(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{state:this.state,event:null,finalJump:null,discarded:!1,reason:null,userMessage:null,hipY:this.currentHipY,baselineHipY:this.baselineHipY,peakHipY:this.peakHipY,sideUsed:this.sideUsed,...e}}constructor({mode:e="realtime",strictRealtime:t=!1}={}){this.mode=e,this.strictRealtime=!!t,this.state="WAIT_STABLE",this.buffer=[],this.baselineHipY=null,this.baselineScaleProxy=null,this.baselineScaleKind=null,this.baselineSet=!1,this.dipStartTs=null,this.dipBottomY=null,this.dipConfirmCount=0,this.pushOffStartTs=null,this.pushOffFrameCount=0,this.takeoffTs=null,this.peakHipY=null,this.peakTs=null,this.landingStableCount=0,this.landingCandidateTs=null,this.scaleAbortCount=0,this.lastValidTs=null,this.realtimeRefractoryUntilTs=0,this.realtimeReDipCount=0,this.sideUsed=null,this.visibleHips={left:!1,right:!1},this.currentHipY=null}}let r=void 0!==l&&(null===(s=l.env)||void 0===s?void 0:s.DEBUG_JUMP)==="1";function a(e){var t,i,s,l,a,h,o;let u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},d=null!==(t=u.minFlightMs)&&void 0!==t?t:150,m=null!==(i=u.maxFlightMs)&&void 0!==i?i:2500,p=null===(s=u.allowTakeoffFallback)||void 0===s||s,f=u.debug||r,c=(e,t)=>{f&&"undefined"!=typeof console&&console.warn("[detectMovingStart]",e,null!=t?t:"")};if(!e||e.length<20)return c("too_few_frames",{length:null!==(l=null==e?void 0:e.length)&&void 0!==l?l:0,min:20}),null;u.frameWidth,u.frameHeight;let g=new n({mode:"offline"}),_=[];for(let t=0;t<e.length;t++){let i=new Map,s=e[t].keypoints;if(!s||!Array.isArray(s))continue;
1s.forEach(e=>i.set(e.name,e));let l=null!==(a=e[t].timestamp)&&void 0!==a?a:33.33*t,n=g._extractFrame(i,l);if(!n||null==n.hipY){let e=i.get("left_hip"),t=i.get("right_hip"),s=e&&e.score>.25?e.y:null,l=t&&t.score>.25?t.y:null,r=null!==s&&null!==l?(s+l)/2:null!=s?s:l;null!=r&&(n={hipY:r,side:g.sideUsed})}n&&null!=n.hipY&&_.push({index:t,ts:l,hipY:n.hipY,side:null!==(h=n.side)&&void 0!==h?h:g.sideUsed})}if(_.length<10)return c("too_few_valid_frames",{seriesLength:_.length,totalFrames:e.length,min:10}),null;let b=((e,t)=>{let i=[];for(let s=0;s<e.length;s++){let l=Math.max(0,s-t),n=e.slice(l,s+1).map(e=>e.hipY).sort((e,t)=>e-t);i.push(n[Math.floor(n.length/2)])}return i})(_,3),M=Math.max(5,Math.floor(.95*b.length)),S=0,y=b[0];for(let e=1;e<M;e++)b[e]<y&&(y=b[e],S=e);let T=_[S].ts;_[S].index;let v=Math.max(S+1,Math.floor(.75*_.length)),H=_.length-v;if(H<2)return c("tail_too_small",{tailCount:H,peakIdx:S,seriesLength:_.length,tailStart:v}),null;let k=[...b.slice(v)].sort((e,t)=>e-t),Y=k[Math.floor(k.length/2)],x=Y-y;if(x<5)return c("peak_not_high_enough",{baselineHipY:Y,peakHipY:y,peakAbove:x,min:5}),null;let C=Y-22,j=S,P=Math.min(3,Math.floor(.05*_.length));for(let e=S-1;e>=P;e--)if(b[e]>=C){j=e;break}if(j===S&&P>0){if(!p)return c("takeoff_not_found_before_peak",{peakIdx:S,minTakeoffIdx:P}),null;j=P}let F=_[j].ts,R=_[j].index,w=Y-12,A=S;for(let e=S+1;e<b.length;e++)if(b[e]>=w){A=e;break}A===S&&_.length>S+1&&(A=_.length-1);let U=_[A].ts,J=_[A].index,L=U-F;return L<d||L>m?(c("flight_time_out_of_range",{flightTimeMs:L,takeoffTs:F,landingTs:U,min:d,max:m}),null):{finalJump:{baselineHipY:Y,peakHipY:y,dipBottomY:null,takeoffTs:F,peakTs:T,landingTs:U,flightTimeMs:L,sideUsed:null!==(o=_[S].side)&&void 0!==o?o:"both"},jumpStartFrameIndex:R,jumpEndFrameIndex:J}}function h(e,t,i){if(!e||0===e.size)return{correct:!1,message:"No keypoints detected"};let s=null,l=0;for(let t of["left","right"]){let i=0,n=e.get("".concat(t,"_hip")),r=e.get("".concat(t,"_shoulder")),a=e.get("".concat(t,"_ankle")),h=e.get("".concat(t,"_eye"));n&&n.score>.5&&i++,r&&r.score>.5&&i++,a&&a.score>.5&&i++,h&&h.score>.5&&i++,i>l&&(l=i,s=t)}if(l<4)return{correct:!1,message:"Stand in full view - hip, shoulder, ankle and eye must be visible on at least one side"};let n=e.get("".concat(s,"_hip")),r=e.get("".concat(s,"_shoulder")),a=e.get("".concat(s,"_knee")),h=e.get("".concat(s,"_ankle"));if(r.y>n.y+10)return{correct:!1,message:"Stand upright - you appear to be bent over"};let o=Math.abs(r.x-n.x),u=Math.abs(n.y-r.y);if(u>0&&180/Math.PI*Math.atan2(o,u)>35)return{correct:!1,message:"Stand upright - your torso appears tilted"};if(a&&a.score>.5){let e=n.x-a.x,t=n.y-a.y,i=h.x-a.x,s=h.y-a.y,l=Math.sqrt(e*e+t*t),r=Math.sqrt(i*i+s*s);if(l>0&&r>0&&180/Math.PI*Math.acos(Math.max(-1,Math.min(1,(e*i+t*s)/(l*r))))<140)return{correct:!1,message:"Stand with legs straight - you appear to be crouching"}}let d=[];for(let[,t]of e)t&&t.score>.5&&d.push(t);if(d.length>=3){let e=d.map(e=>e.y);if(Math.max(...e)-Math.min(...e)<.25*i)return{correct:!1,message:"Move closer - you appear too far from the camera"}}return n.y<.3*i?{correct:!1,message:"Position yourself so your full body is visible"}:{correct:!0,message:"ready"}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.