@rr0/ufoathome 0.137.0 → 0.138.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-embed-scene/BeamSystem-Dp1WU1Zx.js +1 -0
- package/dist-embed-scene/ContrailGrowth-DwHS8If9.js +1 -0
- package/dist-embed-scene/ContrailSystem-GO0Hkyj3.js +1 -0
- package/dist-embed-scene/{SceneNames_es-D_98QraV.js → SceneNames_es-BS2ioieu.js} +1 -1
- package/dist-embed-scene/{SceneNames_fr-y6Z57BDf.js → SceneNames_fr-B-fRwUUu.js} +1 -1
- package/dist-embed-scene/{SceneNames_it-DQt9yIh1.js → SceneNames_it-B-QEwmuM.js} +1 -1
- package/dist-embed-scene/rr0-scene.mjs +337 -337
- package/dist-embed-scene/{sightingSchema-CNCtrneh.js → sightingSchema-DT9g-OyF.js} +1 -1
- package/{dist-embed-sighting/trafficRuntime-sSIo5Lms.js → dist-embed-scene/trafficRuntime-BPEJW9KZ.js} +2 -2
- package/dist-embed-sighting/BeamSystem-Ddt2lTBT.js +1 -0
- package/dist-embed-sighting/ContrailGrowth-DwHS8If9.js +1 -0
- package/dist-embed-sighting/ContrailSystem-D_EBfThB.js +1 -0
- package/dist-embed-sighting/{SceneNames_es-Zb4vw-Vp.js → SceneNames_es-wkWHMHet.js} +1 -1
- package/dist-embed-sighting/{SceneNames_fr-C6_IIN2c.js → SceneNames_fr-DbbzZ1bB.js} +1 -1
- package/dist-embed-sighting/{SceneNames_it-D7GivBq2.js → SceneNames_it-BsxnweGu.js} +1 -1
- package/dist-embed-sighting/rr0-sighting.mjs +326 -326
- package/dist-embed-sighting/{sightingSchema-CNCtrneh.js → sightingSchema-DT9g-OyF.js} +1 -1
- package/dist-embed-sighting/trafficRuntime-CfPqH9j0.js +2 -0
- package/dist-embed-sighting-editor/BeamSystem-B3qYVuHd.js +1 -0
- package/dist-embed-sighting-editor/ContrailGrowth-DwHS8If9.js +1 -0
- package/dist-embed-sighting-editor/ContrailSystem-D9rPfOBE.js +1 -0
- package/dist-embed-sighting-editor/{InterviewEditorElement-DHxRISPC.js → InterviewEditorElement-D6TqSXYB.js} +2 -2
- package/dist-embed-sighting-editor/LaunchEditor-CPa-pltK.js +18 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_en-DH8gI1vo.js +1 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_es-WCfaY4uY.js +1 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_fr-CWCGUG_A.js +1 -0
- package/dist-embed-sighting-editor/LaunchEditorMessages_it-DxSSiAd7.js +1 -0
- package/dist-embed-sighting-editor/{SceneNames_es-7RR79EmC.js → SceneNames_es-umTyyCxN.js} +1 -1
- package/dist-embed-sighting-editor/{SceneNames_fr-Da_S9KXa.js → SceneNames_fr-BNgnxIHx.js} +1 -1
- package/dist-embed-sighting-editor/{SceneNames_it-BwFZROII.js → SceneNames_it-5UYhmJHo.js} +1 -1
- package/dist-embed-sighting-editor/SightingEditorMessages_es-UiUywEk4.js +12 -0
- package/dist-embed-sighting-editor/{SightingEditorMessages_fr-90Ojknvv.js → SightingEditorMessages_fr-D5pajHZd.js} +2 -2
- package/dist-embed-sighting-editor/SightingEditorMessages_it-9SduHYDB.js +12 -0
- package/dist-embed-sighting-editor/{SightingFileEditor-DcOCyimm.js → SightingFileEditor-DkRqrb-a.js} +1 -1
- package/dist-embed-sighting-editor/rr0-sighting-editor.mjs +401 -393
- package/dist-embed-sighting-editor/{sightingSchema-CNCtrneh.js → sightingSchema-DT9g-OyF.js} +1 -1
- package/dist-embed-sighting-editor/trafficRuntime-BAGbGiVc.js +2 -0
- package/package.json +1 -1
- package/dist-embed-scene/BeamSystem-DDqbr8Bb.js +0 -1
- package/dist-embed-scene/ContrailGrowth-CuAzwIoc.js +0 -1
- package/dist-embed-scene/ContrailSystem-CG5BhBF7.js +0 -1
- package/dist-embed-scene/trafficRuntime-CgM31CwB.js +0 -2
- package/dist-embed-sighting/BeamSystem-wkZ6I_8Y.js +0 -1
- package/dist-embed-sighting/ContrailGrowth-CuAzwIoc.js +0 -1
- package/dist-embed-sighting/ContrailSystem-XVzDvxFV.js +0 -1
- package/dist-embed-sighting-editor/BeamSystem-YGYbbAkU.js +0 -1
- package/dist-embed-sighting-editor/ContrailGrowth-CuAzwIoc.js +0 -1
- package/dist-embed-sighting-editor/ContrailSystem-CyYvtUTV.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditor-qoB8RSgQ.js +0 -13
- package/dist-embed-sighting-editor/LaunchEditorMessages_en-BzymQ_VU.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditorMessages_es-DzI2xAcW.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditorMessages_fr-BLOwKfkH.js +0 -1
- package/dist-embed-sighting-editor/LaunchEditorMessages_it-CuovusOf.js +0 -1
- package/dist-embed-sighting-editor/SightingEditorMessages_es-BFzjoSef.js +0 -12
- package/dist-embed-sighting-editor/SightingEditorMessages_it-BtQIjKie.js +0 -12
- package/dist-embed-sighting-editor/trafficRuntime-lbQ2eKSF.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as ht,L as ut,T as K,R as P,a as L,r as dt,l as X}from"./rr0-sighting.mjs";import{C as J}from"./ContrailGrowth-CuAzwIoc.js";class f{static OCTAVES=[63,125,250,500,1e3,2e3,4e3,8e3];static STANDARD={temperatureC:15,relativeHumidity:.7,pressureKPa:101.325};static REFERENCE_PRESSURE_KPA=101.325;static REFERENCE_TEMPERATURE_K=293.15;static TRIPLE_POINT_K=273.16;static speedOfSound(t){return 20.0468*Math.sqrt(t+273.15)}static absorptionDbPerKm(t,e=f.STANDARD){const a=e.temperatureC+273.15,n=f.REFERENCE_TEMPERATURE_K,i=e.pressureKPa/f.REFERENCE_PRESSURE_KPA,o=10**(-6.8346*(f.TRIPLE_POINT_K/a)**1.261+4.6151),s=e.relativeHumidity*100*o/i,r=i*(24+40400*s*(.02+s)/(.391+s)),h=i*(a/n)**-.5*(9+280*s*Math.exp(-4.17*((a/n)**(-1/3)-1))),c=t*t;return 8.686*c*(184e-13*(1/i)*Math.sqrt(a/n)+(a/n)**-2.5*(.01275*Math.exp(-2239.1/a)/(r+c/r)+.1068*Math.exp(-3352/a)/(h+c/h)))*1e3}static aWeightingDb(t){const e=t*t,a=12194**2*e*e/((e+20.6**2)*Math.sqrt((e+107.7**2)*(e+737.9**2))*(e+12194**2));return 20*Math.log10(a)+2}static sumDb(t){return 10*Math.log10(t.reduce((e,a)=>e+10**(a/10),0))}}const pt=.25,x=.4,Z=6,U=12,mt=3,Q=.2,gt=.2,ft=24,Mt=3,At=12,tt=1,Et=.7,bt=1.5,Dt=.8,St=1.3,et=.9,at=5,Rt=25,vt=.5,Ot=.12,nt=[.13,.31],Bt=.16,It=1.6,Tt=3.6,it=1.1,_t=.3,Ct=1e3,st=.7;class ${context;noiseBuffer;roughBuffers=new Map;voices=new Map;bus;reverb;reverbOut;level=1;master;paused=!0;requested=[];headingDeg=0;resume(){if(!this.context){if(typeof AudioContext>"u")return;try{this.context=new AudioContext}catch(t){console.warn("AircraftAudio: Web Audio unavailable, aircraft stay silent:",t);return}}ht.unlock(this.context),this.apply()}setLevel(t){this.level=t,this.master&&(this.master.gain.value=t)}setPaused(t){t!==this.paused&&(this.paused=t,this.apply())}setVoices(t,e=0){this.requested=t,this.headingDeg=e,this.apply()}dispose(){for(const t of[...this.voices.keys()])this.release(t);this.context?.close(),this.context=void 0,this.master=void 0,this.bus=void 0}apply(){const t=this.context;if(!t)return;const e=this.paused?[]:this.requested,a=new Set(e.map(n=>n.id));for(const n of[...this.voices.keys()])a.has(n)||this.release(n);for(const n of e){const i=this.voices.get(n.id)??this.build(t,n);this.retarget(t,i,n)}}build(t,e){const a=t.createGain();a.gain.value=0;let n;const i=this.busOf(t);typeof t.createStereoPanner=="function"?(n=t.createStereoPanner(),a.connect(n).connect(i)):a.connect(i);const o=t.createGain(),s=e.character?.modulationDepth??0;o.gain.value=1-s/2;const r=t.createOscillator();r.type="sine";const h=t.createGain();h.gain.value=s/2,r.connect(h).connect(o.gain),o.connect(a);const c=t.createBufferSource();c.buffer=this.noise(t),c.loop=!0,c.loopStart=Math.random()*Z*.5;const d=[],l=[],u=[];for(const S of f.OCTAVES){const O=t.createBiquadFilter();O.type="bandpass",O.frequency.value=S,O.Q.value=tt;const C=t.createBiquadFilter();C.type="bandpass",C.frequency.value=S,C.Q.value=tt;const y=t.createGain();y.gain.value=0,c.connect(O).connect(C).connect(y).connect(o),d.push(O),l.push(C),u.push(y)}const p=[];for(const[S,O]of[[e.character?.toneHz,e.character?.toneShare],[e.character?.humHz,e.character?.humShare]])if(S!==void 0)for(let C=1;C<=Mt;C++){const y=t.createOscillator();y.type="sine",y.frequency.value=S*C;const V=t.createGain();V.gain.value=0,y.connect(V).connect(a),p.push({oscillator:y,gain:V,harmonic:C,baseHz:S,share:O??0})}const m=t.createGain();m.gain.value=0,m.connect(a.gain);const A=nt.map(S=>{const O=t.createOscillator();return O.type="sine",O.frequency.value=S,O.connect(m),O}),b=t.createGain();b.gain.value=e.character?.roughness??Q;const w=t.createBufferSource();w.buffer=this.roughTable(t,mt),w.loop=!0,w.loopStart=Math.random()*U*.5,w.connect(b).connect(o.gain);const _=t.createGain();_.gain.value=(e.character?.roughness??Q)*gt;const R=t.createBufferSource();R.buffer=this.roughTable(t,ft),R.loop=!0,R.loopStart=Math.random()*U*.5,R.connect(_).connect(o.gain);let B;const j=this.busOf(t)&&this.reverb;j&&(B=t.createGain(),B.gain.value=0,a.connect(B).connect(j));const W=[c,w,R,r,...p.map(S=>S.oscillator),...A];for(const S of W)S.start();const Y={nodes:[a,o,h,b,_,m,...p.map(S=>S.gain),...d,...l,...u,...B?[B]:[],...n?[n]:[],...W],sources:W,filters:d,seconds:l,gains:u,tones:p,lfo:r,lfoDepth:h,wander:A,wanderDepth:m,roughDepth:b,crackleDepth:_,beat:o,output:a,panner:n,send:B};return this.voices.set(e.id,Y),Y}retarget(t,e,a){const n=t.currentTime,i=(p,m)=>p.setTargetAtTime(m,n,pt),o=Math.min(bt,Math.max(Et,a.dopplerRatio)),s=Math.min(St,Math.max(Dt,Math.sqrt(a.dopplerRatio))),r=t.sampleRate*.45,h=a.bandAmplitudes.map((p,m)=>p*$.unweighting(f.OCTAVES[m])),c=Math.sqrt(h.reduce((p,m)=>p+m*m,0)),d=Math.min(1,Math.max(0,(a.distanceKm-at)/(Rt-at)));f.OCTAVES.forEach((p,m)=>{i(e.filters[m].frequency,Math.min(r,p*s)),i(e.seconds[m].frequency,Math.min(r,p*s)),i(e.gains[m].gain,h[m]*Math.sqrt(Ct/p))});const l=a.character;for(const{oscillator:p,gain:m,harmonic:A,baseHz:b,share:w}of e.tones){const _=b*A;i(p.frequency,_*o);const R=_*o;i(m.gain,R<r?w*Bt*h[$.bandOf(R)]/A:0)}l?.modulationHz!==void 0&&i(e.lfo.frequency,l.modulationHz*o);const u=c>0?st*(1-Math.exp(-c/st))/c:1;if(i(e.output.gain,u*(1-_t*d)),i(e.wanderDepth.gain,u*Ot*d/nt.length),e.send&&i(e.send.gain,It*d),e.panner){const p=(a.azimuthDeg-this.headingDeg)*Math.PI/180;i(e.panner.pan,Math.max(-et,Math.min(et,Math.sin(p)))*(1-vt*d))}}static unweighting(t){return 10**(Math.min(At,Math.max(0,-f.aWeightingDb(t)))/20)}static bandOf(t){let e=0;return f.OCTAVES.forEach((a,n)=>{Math.abs(Math.log(t/a))<Math.abs(Math.log(t/f.OCTAVES[e]))&&(e=n)}),e}roughTable(t,e){const a=this.roughBuffers.get(e);if(a)return a;const n=Math.floor(t.sampleRate*U),i=t.createBuffer(1,n,t.sampleRate),o=i.getChannelData(0),s=Array.from({length:U*e},()=>(Math.random()*2-1)**3),r=t.sampleRate/e;for(let h=0;h<o.length;h++){const c=h/r,d=Math.floor(c),l=c-d,u=l*l*(3-2*l);o[h]=s[d%s.length]*(1-u)+s[(d+1)%s.length]*u}return this.roughBuffers.set(e,i),i}roomImpulse(t){const e=Math.floor(t.sampleRate*Tt),a=t.createBuffer(2,e,t.sampleRate);for(let n=0;n<2;n++){const i=a.getChannelData(n);let o=0;for(let s=0;s<e;s++){const r=s/t.sampleRate,h=.6*Math.exp(-r/(it*2))+.04;o+=h*(Math.random()*2-1-o),i[s]=o*Math.exp(-r/it)}}return a}busOf(t){if(this.bus)return this.bus;const e=t.createGain();if(e.gain.value=this.level,e.connect(t.destination),this.master=e,typeof t.createConvolver=="function"){const a=t.createConvolver();a.buffer=this.roomImpulse(t);const n=t.createGain();n.gain.value=.9,a.connect(n),this.reverb=a,this.reverbOut=n}if(typeof t.createDynamicsCompressor=="function"){const a=t.createDynamicsCompressor();a.threshold.value=-6,a.knee.value=3,a.ratio.value=4,a.attack.value=.005,a.release.value=.25,a.connect(e),this.bus=a}else this.bus=e;return this.reverbOut?.connect(this.bus),this.bus}release(t){const e=this.voices.get(t);if(!e)return;this.voices.delete(t);const a=this.context;a&&(e.output.gain.setTargetAtTime(0,a.currentTime,x/3),setTimeout(()=>{for(const n of e.sources)try{n.stop()}catch{}for(const n of e.nodes)n.disconnect()},x*1e3*3))}noise(t){if(this.noiseBuffer)return this.noiseBuffer;const e=t.createBuffer(1,t.sampleRate*Z,t.sampleRate),a=e.getChannelData(0);for(let n=0;n<a.length;n++)a[n]=Math.random()*2-1;return this.noiseBuffer=e,e}}class I{static BASE_DB_A=30;static WIND_DB_A=[[0,10],[1,28],[2,36],[3,40],[5,46],[8,52],[12,58],[20,66]];static RAIN_DB_A=[[0,0],[.1,42],[.3,50],[.6,58],[1,65]];static BED_RMS=.2;static MINIMUM_REFERENCE=.008;static WIND_BED_MIN_MS=1;static WIND_BED_FULL_MS=20;static dbA(t){const e=[I.BASE_DB_A,I.along(I.WIND_DB_A,t.windSpeed)];return(t.precipitationType==="rain"||t.precipitationType==="hail")&&e.push(I.along(I.RAIN_DB_A,t.precipitationIntensity)),10*Math.log10(e.filter(a=>a>0).reduce((a,n)=>a+10**(n/10),0))}static bedVolume(t){const e=t.windSpeed>I.WIND_BED_MIN_MS?Math.min(t.windSpeed/I.WIND_BED_FULL_MS,1):0,a=t.precipitationType==="hail"?Math.min(1,t.precipitationIntensity*1.3+.2):t.precipitationType==="rain"?t.precipitationIntensity:0;return Math.hypot(e,a)}static referenceAmplitude(t){return Math.max(I.BED_RMS*I.bedVolume(t),I.MINIMUM_REFERENCE)}static along(t,e){if(e<=t[0][0])return t[0][1];for(let a=1;a<t.length;a++)if(e<=t[a][0]){const[n,i]=t[a-1],[o,s]=t[a];return i+(s-i)*(e-n)/(o-n)}return t[t.length-1][1]}}class N{static TYPES={A318:["Airbus A318","airliner-narrow",34.1,31.4],A319:["Airbus A319","airliner-narrow",34.1,33.8],A320:["Airbus A320","airliner-narrow",34.1,37.6],A321:["Airbus A321","airliner-narrow",34.1,44.5],A19N:["Airbus A319neo","airliner-narrow",35.8,33.8],A20N:["Airbus A320neo","airliner-narrow",35.8,37.6],A21N:["Airbus A321neo","airliner-narrow",35.8,44.5],B737:["Boeing 737-700","airliner-narrow",34.3,33.6],B738:["Boeing 737-800","airliner-narrow",35.8,39.5],B739:["Boeing 737-900","airliner-narrow",35.8,42.1],B38M:["Boeing 737 MAX 8","airliner-narrow",35.9,39.5],B39M:["Boeing 737 MAX 9","airliner-narrow",35.9,42.2],B752:["Boeing 757-200","airliner-narrow",38,47.3],B753:["Boeing 757-300","airliner-narrow",38,54.4],B762:["Boeing 767-200","airliner-wide",47.6,48.5],B763:["Boeing 767-300","airliner-wide",47.6,54.9],B764:["Boeing 767-400","airliner-wide",51.9,61.4],B772:["Boeing 777-200","airliner-wide",60.9,63.7],B77L:["Boeing 777-200LR","airliner-wide",64.8,63.7],B77W:["Boeing 777-300ER","airliner-wide",64.8,73.9],B788:["Boeing 787-8","airliner-wide",60.1,56.7],B789:["Boeing 787-9","airliner-wide",60.1,62.8],B78X:["Boeing 787-10","airliner-wide",60.1,68.3],B744:["Boeing 747-400","airliner-wide",64.4,70.7],B748:["Boeing 747-8","airliner-wide",68.4,76.3],A306:["Airbus A300-600","airliner-wide",44.8,54.1],A310:["Airbus A310","airliner-wide",43.9,46.7],A332:["Airbus A330-200","airliner-wide",60.3,58.8],A333:["Airbus A330-300","airliner-wide",60.3,63.7],A338:["Airbus A330-800","airliner-wide",64,58.8],A339:["Airbus A330-900","airliner-wide",64,63.7],A343:["Airbus A340-300","airliner-wide",60.3,63.7],A346:["Airbus A340-600","airliner-wide",63.5,75.4],A359:["Airbus A350-900","airliner-wide",64.8,66.8],A35K:["Airbus A350-1000","airliner-wide",64.8,73.8],A388:["Airbus A380-800","airliner-wide",79.8,72.7],E170:["Embraer 170","regional-jet",26,29.9],E75L:["Embraer 175","regional-jet",26,31.7],E75S:["Embraer 175","regional-jet",26,31.7],E190:["Embraer 190","regional-jet",28.7,36.2],E195:["Embraer 195","regional-jet",28.7,38.7],E290:["Embraer 190-E2","regional-jet",33.7,36.2],E295:["Embraer 195-E2","regional-jet",33.7,41.5],CRJ2:["Bombardier CRJ200","regional-jet",21.2,26.8],CRJ7:["Bombardier CRJ700","regional-jet",23.2,32.3],CRJ9:["Bombardier CRJ900","regional-jet",24.9,36.2],CRJX:["Bombardier CRJ1000","regional-jet",26.2,39.1],AT72:["ATR 72","regional-turboprop",27.1,27.2],AT76:["ATR 72-600","regional-turboprop",27.1,27.2],AT45:["ATR 42","regional-turboprop",24.6,22.7],DH8D:["Dash 8 Q400","regional-turboprop",28.4,32.8],DH8C:["Dash 8-300","regional-turboprop",27.4,25.7],SF34:["Saab 340","regional-turboprop",21.4,19.7],B190:["Beechcraft 1900","regional-turboprop",17.7,17.6],C25A:["Cessna CitationJet CJ2","business-jet",14.3,14.4],C56X:["Cessna Citation Excel","business-jet",17.2,16],C68A:["Cessna Citation Latitude","business-jet",22,18.9],C550:["Cessna Citation II","business-jet",15.8,14.4],E55P:["Embraer Phenom 300","business-jet",15.9,15.6],E50P:["Embraer Phenom 100","business-jet",12.3,12.8],GLF5:["Gulfstream G550","business-jet",28.5,29.4],FA7X:["Dassault Falcon 7X","business-jet",26.2,23.4],CL60:["Bombardier Challenger 600","business-jet",19.6,20.9],LJ45:["Learjet 45","business-jet",14.6,17.7],H25B:["Hawker 800","business-jet",15.7,15.6],C172:["Cessna 172","light-piston",11,8.3],C152:["Cessna 152","light-piston",10.2,7.3],C182:["Cessna 182","light-piston",10.9,8.8],P28A:["Piper Cherokee","light-piston",10.7,7.2],PA34:["Piper Seneca","light-piston",11.8,8.7],SR20:["Cirrus SR20","light-piston",10.9,7.9],SR22:["Cirrus SR22","light-piston",11.7,7.9],S22T:["Cirrus SR22T","light-piston",11.7,7.9],DA40:["Diamond DA40","light-piston",11.6,8.1],DA42:["Diamond DA42","light-piston",13.4,8.6],BE20:["Beechcraft King Air 200","turboprop-light",16.6,13.3],BE58:["Beechcraft Baron","light-piston",11.5,9.1],C208:["Cessna Caravan","turboprop-light",15.9,11.5],PC12:["Pilatus PC-12","turboprop-light",16.3,14.4],TBM9:["Daher TBM 900","turboprop-light",12.8,10.7],EC35:["Airbus H135","helicopter-light",10.2,12.1],EC45:["Airbus H145","helicopter-medium",11,13.6],AS50:["Airbus H125","helicopter-light",10.7,12.9],EC30:["Airbus H130","helicopter-light",10.7,12.6],B407:["Bell 407","helicopter-light",10.7,12.7],B06:["Bell 206","helicopter-light",10.2,12],B429:["Bell 429","helicopter-medium",10.9,13],B505:["Bell 505","helicopter-light",10.4,11.9],R44:["Robinson R44","helicopter-light",10.1,11.7],R22:["Robinson R22","helicopter-light",7.7,8.8],A109:["Agusta A109","helicopter-medium",11,13],A139:["Leonardo AW139","helicopter-medium",13.8,16.7],S92:["Sikorsky S-92","helicopter-heavy",17.2,20.9],H60:["Sikorsky UH-60 Black Hawk","helicopter-heavy",16.4,19.8],T38:["Northrop T-38 Talon","military-jet",7.7,14.1],HAWK:["BAE Hawk","military-jet",9.4,11.9],GLID:["Glider","glider",17,7],BALL:["Balloon","balloon",15,20],ULAC:["Ultralight","ultralight",9.5,6],C42:["Ikarus C42","ultralight",9.4,6.3],DRON:["Drone","unmanned",1,.6]};static CATEGORIES={A1:["Light aircraft","light-piston",11,8.3],A2:["Small aircraft","business-jet",15,15],A3:["Large aircraft","airliner-narrow",34.1,37.6],A4:["High-vortex large aircraft","airliner-narrow",38,47.3],A5:["Heavy aircraft","airliner-wide",60.3,63.7],A6:["High-performance aircraft","military-jet",8,14],A7:["Rotorcraft","helicopter-medium",10.7,12.7],B1:["Glider","glider",17,7],B2:["Lighter-than-air","balloon",15,20],B4:["Ultralight","ultralight",9.5,6],B6:["Unmanned aircraft","unmanned",1.5,1]};static GENERIC={name:"Airliner",kind:"airliner-narrow",spanM:34.1,lengthM:37.6,basis:"nothing"};static of(t){const e=t?.type?.toUpperCase(),a=e?N.TYPES[e]:void 0;if(a)return{code:e,name:a[0],kind:a[1],spanM:a[2],lengthM:a[3],basis:"type"};const n=t?.category?N.CATEGORIES[t.category]:void 0;return n?{name:n[0],kind:n[1],spanM:n[2],lengthM:n[3],basis:"category"}:{...N.GENERIC}}static isHelicopter(t){return t.kind.startsWith("helicopter")}}class H{static DUSK_SUN_ELEVATION_DEG=-.83;static ALWAYS=new Set(["airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet"]);static NONE=new Set(["glider","balloon"]);static BRIGHTNESS={"light-piston":[.5,.2,.5],"turboprop-light":[.7,.4,.8],ultralight:[.4,.2,.4],unmanned:[0,.05,0],"helicopter-light":[1,1,1],"helicopter-medium":[1,1,1],"helicopter-heavy":[1,1,1],"military-jet":[1,1,1]};static lampsOn(t,e){if(H.NONE.has(t))return{navigation:!1,beacon:!1,strobes:!1};if(H.ALWAYS.has(t))return{navigation:!0,beacon:!0,strobes:!0};const a=e<H.DUSK_SUN_ELEVATION_DEG;return t==="unmanned"?{navigation:!1,beacon:!1,strobes:a}:{navigation:a,beacon:a,strobes:a}}static lights(t,e){const a=H.lampsOn(t.kind,e),n=t.kind.startsWith("helicopter"),i=ut.find(u=>u.id===(n?"helicopter":"airliner")).create(),[o,s]=n?[5,7]:[17,18],r=t.spanM/2/o,h=t.lengthM/2/s,[c,d,l]=H.BRIGHTNESS[t.kind]??[1,1,1];return i.filter(u=>u.id.startsWith("nav")?a.navigation:u.id.startsWith("strobe")?a.strobes:u.id.startsWith("beacon")?a.beacon:!0).filter(u=>!(u.id.startsWith("beacon")&&!a.beacon)).map(u=>{const p=u.id.startsWith("nav")?c:u.id.startsWith("strobe")?d:l;return{...u,offsetM:{x:u.offsetM.x*r,y:u.offsetM.y,z:u.offsetM.z*h},intensity:(u.intensity??1)*p}}).filter(u=>(u.intensity??1)>0)}static bodyColor(t){return t.kind==="military-jet"?"#8a8e94":t.kind.startsWith("helicopter")?"#c8ccd1":t.kind==="unmanned"?"#2c2e33":"#dde0e4"}}class G{static FAMILIES={"amvlab-a320":["A318","A319","A320","A321","A19N","A20N","A21N"],"amvlab-b737":["B732","B733","B734","B735","B736","B737","B738","B739","B37M","B38M","B39M","B3XM"],"amvlab-a350":["A359","A35K"],"amvlab-a380":["A388"],"amvlab-b787":["B788","B789","B78X"]};static BY_TYPE=new Map(Object.entries(G.FAMILIES).flatMap(([t,e])=>e.map(a=>[a,t])));static idOf(t){return t?G.BY_TYPE.get(t.toUpperCase()):void 0}}class E{static ID_PREFIX=K.ID_PREFIX;static MAX_OBJECTS=40;static FT_TO_M=.3048;static DEG=Math.PI/180;static from(t,e,a,n=E.MAX_OBJECTS,i={}){return new wt(t,e,a,n,i).build()}static idOf(t,e){return K.idOf(t,e)}static keyOf(t){return K.keyOf(t)}static HEIGHT_OVER_LENGTH=.29;static sizeOf(t){return{widthM:t.spanM,lengthM:t.lengthM,heightM:t.lengthM*E.HEIGHT_OVER_LENGTH}}static offsetOf(t,e){const a=P.seenFrom(t,{lat:e.lat,lng:e.lng,heightM:e.altitudeFt*E.FT_TO_M}),n=a.distanceKm*1e3,i=n*Math.cos(a.altitudeDeg*E.DEG);return{eastM:i*Math.sin(a.azimuthDeg*E.DEG),northM:i*Math.cos(a.azimuthDeg*E.DEG),upM:n*Math.sin(a.altitudeDeg*E.DEG),altitudeDeg:a.altitudeDeg,distanceKm:a.distanceKm}}static segments(t){const e=[];let a=[];for(const n of t.points){const i=a[a.length-1];i&&n.t-i.t>L.MAX_GAP_S*1e3&&(e.push(a),a=[]),a.push(n)}return e.push(a),e.filter(n=>n.length>=2)}static bearingDeg(t,e){return(Math.atan2(e.eastM-t.eastM,e.northM-t.northM)/E.DEG+360)%360}}class wt{constructor(t,e,a,n,i){this.tracks=t,this.observer=e,this.startMs=a,this.maxObjects=n,this.options=i}build(){const t=[];for(const a of this.tracks){const n=E.keyOf(a),i=this.options.models?.get(n)??N.of(void 0);E.segments(a).forEach((o,s)=>{const r=o.map(u=>({point:u,at:E.offsetOf(this.observer,u)}));if(!r.some(u=>u.at.altitudeDeg>=0))return;const h=r.map((u,p)=>({t:u.point.t-this.startMs,eastM:u.at.eastM,northM:u.at.northM,altitudeM:u.at.upM,headingDeg:u.point.trackDeg??(p+1<r.length?E.bearingDeg(u.at,r[p+1].at):E.bearingDeg(r[p-1].at,u.at))})),c=E.idOf(a,s),d=r[Math.floor(r.length/2)].point,l=this.options.sunElevationAt?.(d)??90;t.push({object:{id:c,kind:"aircraft",eastM:h[0].eastM,northM:h[0].northM,headingDeg:h[0].headingDeg,sizeM:E.sizeOf(i),model:G.idOf(i.code)?{id:G.idOf(i.code)}:void 0,color:H.bodyColor(i),lights:H.lights(i,l),track:h},presence:{fromMs:h[0].t,untilMs:h[h.length-1].t},flight:{icao:a.icao,nonIcao:a.nonIcao,points:o},closestKm:Math.min(...r.map(u=>u.at.distanceKm))})})}t.sort((a,n)=>a.closestKm-n.closestKm);const e=t.slice(0,this.maxObjects);return{objects:e.map(a=>a.object),presence:new Map(e.map(a=>[a.object.id,a.presence])),flights:new Map(e.map(a=>[a.object.id,a.flight])),total:t.length,shown:e.length}}}const lt=[{id:"turbofan-narrow-body",name:"Turbofan airliner, narrow-body",kinds:["airliner-narrow"],totalDbA:148,shapeDb:[-32,-17,-9,-6,-5,-7,-12,-22],character:{toneHz:1800,toneShare:.3,humHz:90,humShare:.7}},{id:"turbofan-wide-body",name:"Turbofan airliner, wide-body",kinds:["airliner-wide"],totalDbA:151,shapeDb:[-28,-14,-7,-4,-3,-6,-12,-22],character:{toneHz:1200,toneShare:.3,humHz:70,humShare:.7}},{id:"regional-jet",name:"Regional jet",kinds:["regional-jet"],totalDbA:144,shapeDb:[-32,-17,-9,-5,-4,-6,-11,-21],character:{toneHz:1900,toneShare:.3,humHz:95,humShare:.7}},{id:"business-jet",name:"Business jet",kinds:["business-jet"],totalDbA:141,shapeDb:[-30,-15,-8,-4,-3,-4,-9,-19],character:{toneHz:2500,toneShare:.25,humHz:110,humShare:.7}},{id:"turboprop",name:"Turboprop",kinds:["regional-turboprop","turboprop-light"],totalDbA:138,shapeDb:[-14,-9,-8,-6,-8,-13,-20,-28],character:{toneHz:80,toneShare:.5}},{id:"light-piston",name:"Light piston aircraft",kinds:["light-piston"],totalDbA:130,shapeDb:[-18,-9,-5,-4,-8,-14,-22,-30],character:{toneHz:80,toneShare:.4}},{id:"ultralight",name:"Ultralight",kinds:["ultralight"],totalDbA:124,shapeDb:[-16,-8,-5,-4,-9,-15,-23,-31],character:{toneHz:140,toneShare:.4}},{id:"helicopter-light",name:"Light helicopter",kinds:["helicopter-light"],totalDbA:134,shapeDb:[-15,-8,-4,-3,-6,-10,-16,-24],character:{modulationHz:20,modulationDepth:.5}},{id:"helicopter-medium",name:"Medium helicopter",kinds:["helicopter-medium"],totalDbA:138,shapeDb:[-14,-7,-4,-3,-6,-10,-16,-24],character:{modulationHz:22,modulationDepth:.5}},{id:"helicopter-heavy",name:"Heavy helicopter",kinds:["helicopter-heavy"],totalDbA:144,shapeDb:[-12,-6,-4,-4,-7,-11,-17,-25],character:{modulationHz:17,modulationDepth:.5}},{id:"military-jet",name:"Military jet",kinds:["military-jet"],totalDbA:152,shapeDb:[-26,-12,-6,-3,-2,-3,-7,-15]},{id:"glider",name:"Glider",kinds:["glider"],totalDbA:85,shapeDb:[-30,-22,-15,-10,-8,-8,-14,-22]},{id:"balloon",name:"Hot-air balloon",kinds:["balloon"],totalDbA:100,shapeDb:[-25,-15,-9,-5,-3,-6,-12,-20]},{id:"unmanned",name:"Unmanned aircraft",kinds:["unmanned"],totalDbA:88,shapeDb:[-40,-30,-20,-12,-6,-3,-3,-8],character:{toneHz:450,toneShare:1}}],rt=lt.map(T=>({id:T.id,name:T.name,soundPowerA:T.shapeDb.map(t=>t+T.totalDbA-f.sumDb(T.shapeDb)),character:T.character}));class g{static DEFAULT_AMBIENT_DB_A=35;static DETECTION_MARGIN_DB=3;static AMBIENT_SHAPE_DB=[-12,-7,-5,-5,-7,-11,-17,-25];static HEARING_FLOOR_DB_A=0;static ITERATIONS=30;static CONVERGED_MS=.5;static VELOCITY_STEP_MS=500;static noiseOfKind(t){const e=lt.find(a=>a.kinds.includes(t));return rt.find(a=>a.id===(e?.id??"turbofan-narrow-body"))}static bandsAt(t,e,a=f.STANDARD){const n=20*Math.log10(Math.max(e*1e3,1))+11;return f.OCTAVES.map((i,o)=>t.soundPowerA[o]-n-f.absorptionDbPerKm(i,a)*e)}static couldBeHeard(t,e,a=g.DEFAULT_AMBIENT_DB_A,n=f.STANDARD){const i=g.ambientBands(a);return g.bandsAt(t,e,n).some((o,s)=>o>=Math.max(i[s]+g.DETECTION_MARGIN_DB,g.HEARING_FLOOR_DB_A))}static ambientBands(t){const e=g.AMBIENT_SHAPE_DB,a=f.sumDb(e);return e.map(n=>t+n-a)}static heardAt(t,e,a,n={}){const i=n.air??f.STANDARD,o=f.speedOfSound(i.temperatureC),s=t.points[t.points.length-1]?.t;if(s===void 0)return;let r=Math.min(a,s),h=L.positionAt(t,r);if(!h)return;let c=P.seenFrom(e,h.geo);for(let R=0;R<g.ITERATIONS;R++){const B=a-c.distanceKm*1e3*1e3/o,j=Math.abs(B-r);if(r=B,h=L.positionAt(t,r),!h)return;if(c=P.seenFrom(e,h.geo),j<g.CONVERGED_MS)break}const d=L.positionAt(t,a),l=d?P.seenFrom(e,d.geo):c,u=n.noise??rt[0],p=n.ambientDbA??g.DEFAULT_AMBIENT_DB_A,m=g.ambientBands(p),A=g.bandsAt(u,c.distanceKm,i),b=A.map((R,B)=>R>=Math.max(m[B]+g.DETECTION_MARGIN_DB,g.HEARING_FLOOR_DB_A)),w=A.indexOf(Math.max(...A)),_=b.lastIndexOf(!0);return{track:t,audible:b.some(Boolean),levelDbA:f.sumDb(A),bandsDbA:A,ambientDbA:p,delayS:(a-r)/1e3,emittedAtMs:r,sound:c,seen:l,lagDeg:g.angleBetween(c,l),dopplerRatio:g.doppler(t,e,r,o),dominantHz:f.OCTAVES[w],cutoffHz:_<0?void 0:f.OCTAVES[_]}}static profile(t,e,a,n,i=2e3,o={}){const s=[];let r,h,c=a;for(let d=a;d<=n;d+=i){const l=g.heardAt(t,e,d,o);l&&(!h||l.levelDbA>h.levelDbA)&&(h=l,c=d),l?.audible?r?r.untilMs=d:s.push(r={fromMs:d,untilMs:d}):r=void 0}return{track:t,audible:s,peakDbA:h?.levelDbA??-1/0,peakAtMs:c,peakDelayS:h?.delayS??0}}static angleBetween(t,e){const a=c=>{const d=c.altitudeDeg*Math.PI/180,l=c.azimuthDeg*Math.PI/180;return[Math.cos(d)*Math.sin(l),Math.cos(d)*Math.cos(l),Math.sin(d)]},[n,i,o]=a(t),[s,r,h]=a(e);return Math.acos(Math.min(1,Math.max(-1,n*s+i*r+o*h)))*180/Math.PI}static doppler(t,e,a,n){const i=g.VELOCITY_STEP_MS,o=L.positionAt(t,a-i),s=L.positionAt(t,a+i);if(!o||!s)return 1;const r=P.seenFrom(e,o.geo).distanceKm*1e3,h=P.seenFrom(e,s.geo).distanceKm*1e3;return 1/(1-(r-h)/(2*i/1e3)/n)}}class Lt{static at(t,e,a,n,i={}){const o=L.seenFrom(t,a,n);if(!o)return;const s=N.of(e),r=g.heardAt(t,a,n,{noise:g.noiseOfKind(s.kind),...i});return{hex:`${t.nonIcao?"~":""}${t.icao.toString(16).padStart(6,"0")}`,registration:e?.registration,typeCode:s.code??e?.type,name:s.basis==="nothing"?void 0:s.name,kind:s.kind,basis:s.basis,military:e?.military===!0,restricted:e?.restricted===!0,altitudeFt:o.altitudeFt,groundSpeedKt:o.groundSpeedKt,trackDeg:o.trackDeg,sky:o.sky,angularRateDegPerS:o.angularRateDegPerS,hearing:r&&{audible:r.audible,levelDbA:r.levelDbA,ambientDbA:r.ambientDbA,delayS:r.delayS,lagDeg:r.lagDeg,dopplerRatio:r.dopplerRatio,cutoffHz:r.cutoffHz,dominantHz:r.dominantHz}}}}class D{static REFERENCE_AMPLITUDE=.02;static MASKING_RANGE_DB=6;static KNEE_DB=20;static COMPRESSION_RATIO=1.5;static EXPANSION_RATIO=1.8;static DEFAULT_MAX_VOICES=4;static candidates(t,e,a,n,i={}){const o=new Set;for(const[s,r]of t){const h=g.noiseOfKind(N.of(e.get(a(r))).kind);let c=1/0;for(const d of r.points)c=Math.min(c,P.seenFrom(n,{lat:d.lat,lng:d.lng,heightM:d.altitudeFt*.3048}).distanceKm);g.couldBeHeard(h,c,i.ambientDbA,i.air)&&o.add(s)}return o}static voices(t,e,a,n,i,o,s={}){const r=[];for(const h of t){const c=e.get(h);if(!c||s.only?.(h)===!1)continue;const d=s.kindOf?.(h)??N.of(a.get(n(c))).kind,l=s.noiseOf?.(h)??g.noiseOfKind(d),u=g.heardAt(c,i,o,{...s,noise:l});u?.audible&&r.push({id:h,kind:d,bandAmplitudes:D.bandAmplitudes(u.bandsDbA,u.ambientDbA,s.referenceAmplitude),levelDbA:u.levelDbA,distanceKm:u.sound.distanceKm,dopplerRatio:u.dopplerRatio,azimuthDeg:u.sound.azimuthDeg,elevationDeg:u.sound.altitudeDeg,character:l.character})}return r.sort((h,c)=>c.levelDbA-h.levelDbA).slice(0,s.maxVoices??D.DEFAULT_MAX_VOICES)}static bandAmplitudes(t,e,a=D.REFERENCE_AMPLITUDE){const n=g.ambientBands(e),i=g.DETECTION_MARGIN_DB,o=f.sumDb(t),s=o-e,r=s>=D.KNEE_DB?D.KNEE_DB+(s-D.KNEE_DB)/D.COMPRESSION_RATIO:D.KNEE_DB-(D.KNEE_DB-s)*D.EXPANSION_RATIO,h=a*10**(r/20);return t.map((c,d)=>{const l=Math.min(1,Math.max(0,(c-n[d]-i+D.MASKING_RANGE_DB)/(2*D.MASKING_RANGE_DB)));return l*l*(3-2*l)*h*10**((c-o)/20)})}static BANDS_HZ=f.OCTAVES}class z{static ENGLISH={unnamed:"Aircraft {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"heading {value}°",position:"{distance} km away, {elevation}° above the horizon, {bearing}",heard:"Heard at {level} dB(A), left the aircraft {delay} s ago, {lag}° behind it: {character}{pitch}",rumble:"a low rumble, nothing above {cutoff} Hz",muffled:"a dull noise, nothing above {cutoff} Hz",broad:"a broad roar",pitchHigher:", pitch {percent} % higher",pitchLower:", pitch {percent} % lower",inaudible:"Not audible here: {level} dB(A) against {ambient} dB(A) of ambient noise",soundUnknown:"Its sound cannot be worked out: the aircraft was not recorded yet when it left",contrailPersistent:"Leaves a trail that lasts: the air is supersaturated over ice ({rhi} % over ice)",contrailShort:"Leaves a short-lived trail: the air is dry over ice ({rhi} % over ice)",military:"military",restricted:"identity withheld by its owner",candidate:"A compatible candidate, not an identification"};static RUMBLE_BELOW_HZ=500;static DULL_BELOW_HZ=2e3;static PITCH_NOTICED=.03;static text(t,e,a,n){const i=(l,u=0)=>l.toLocaleString(n,{maximumFractionDigits:u}),o=(l,u)=>l.replace(/\{(\w+)\}/g,(p,m)=>u[m]??`{${m}}`),s=[],r=[t.registration,t.name].filter(Boolean).join(" · ");s.push(r||o(e.unnamed,{hex:t.hex}));const h=[o(e.altitude,{value:i(Math.round(t.altitudeFt/100)*100)}),t.groundSpeedKt===void 0?void 0:o(e.speed,{value:i(Math.round(t.groundSpeedKt))}),t.trackDeg===void 0?void 0:o(e.heading,{value:i(Math.round(t.trackDeg))})].filter(Boolean);s.push(h.join(" · ")),s.push(o(e.position,{distance:i(t.sky.distanceKm,t.sky.distanceKm<10?1:0),elevation:i(Math.round(t.sky.altitudeDeg)),bearing:a(t.sky.azimuthDeg)}));const c=t.hearing;if(!c)s.push(e.soundUnknown);else if(!c.audible)s.push(o(e.inaudible,{level:i(Math.round(c.levelDbA)),ambient:i(Math.round(c.ambientDbA))}));else{const l=c.cutoffHz??0,u=l<=z.RUMBLE_BELOW_HZ?e.rumble:l<=z.DULL_BELOW_HZ?e.muffled:e.broad,p=c.dopplerRatio-1,m=Math.abs(p)<z.PITCH_NOTICED?"":o(p>0?e.pitchHigher:e.pitchLower,{percent:i(Math.round(Math.abs(p)*100))});s.push(o(e.heard,{level:i(Math.round(c.levelDbA)),delay:i(Math.round(c.delayS)),lag:i(Math.round(c.lagDeg)),character:o(u,{cutoff:i(l)}),pitch:m}))}t.contrail&&s.push(o(t.contrail.persistent?e.contrailPersistent:e.contrailShort,{rhi:i(Math.round(t.contrail.iceRelativeHumidity*100))}));const d=[t.military?e.military:void 0,t.restricted?e.restricted:void 0].filter(Boolean);return d.length>0&&s.push(d.join(" · ")),s.push(e.candidate),s.join(`
|
|
2
|
-
`)}}class
|
|
1
|
+
import{A as ut,L as dt,T as z,R as L,a as F,r as pt,l as $}from"./rr0-scene.mjs";import{C as Z}from"./ContrailGrowth-DwHS8If9.js";class E{static OCTAVES=[63,125,250,500,1e3,2e3,4e3,8e3];static STANDARD={temperatureC:15,relativeHumidity:.7,pressureKPa:101.325};static REFERENCE_PRESSURE_KPA=101.325;static REFERENCE_TEMPERATURE_K=293.15;static TRIPLE_POINT_K=273.16;static speedOfSound(t){return 20.0468*Math.sqrt(t+273.15)}static absorptionDbPerKm(t,e=E.STANDARD){const a=e.temperatureC+273.15,n=E.REFERENCE_TEMPERATURE_K,i=e.pressureKPa/E.REFERENCE_PRESSURE_KPA,o=10**(-6.8346*(E.TRIPLE_POINT_K/a)**1.261+4.6151),s=e.relativeHumidity*100*o/i,r=i*(24+40400*s*(.02+s)/(.391+s)),h=i*(a/n)**-.5*(9+280*s*Math.exp(-4.17*((a/n)**(-1/3)-1))),c=t*t;return 8.686*c*(184e-13*(1/i)*Math.sqrt(a/n)+(a/n)**-2.5*(.01275*Math.exp(-2239.1/a)/(r+c/r)+.1068*Math.exp(-3352/a)/(h+c/h)))*1e3}static aWeightingDb(t){const e=t*t,a=12194**2*e*e/((e+20.6**2)*Math.sqrt((e+107.7**2)*(e+737.9**2))*(e+12194**2));return 20*Math.log10(a)+2}static sumDb(t){return 10*Math.log10(t.reduce((e,a)=>e+10**(a/10),0))}}const mt=.25,x=.4,Q=6,K=12,gt=3,tt=.2,Et=.2,Mt=24,At=3,ft=12,et=1,bt=.7,St=1.5,Dt=.8,Rt=1.3,at=.9,nt=5,Ot=25,vt=.5,It=.12,it=[.13,.31],Tt=.16,Bt=1.6,_t=3.6,st=1.1,Nt=.3,Ct=1e3,rt=.7;class q{context;noiseBuffer;roughBuffers=new Map;voices=new Map;bus;reverb;reverbOut;level=1;master;paused=!0;requested=[];headingDeg=0;resume(){if(!this.context){if(typeof AudioContext>"u")return;try{this.context=new AudioContext}catch(t){console.warn("AircraftAudio: Web Audio unavailable, aircraft stay silent:",t);return}}ut.unlock(this.context),this.apply()}setLevel(t){this.level=t,this.master&&(this.master.gain.value=t)}setPaused(t){t!==this.paused&&(this.paused=t,this.apply())}setVoices(t,e=0){this.requested=t,this.headingDeg=e,this.apply()}dispose(){for(const t of[...this.voices.keys()])this.release(t);this.context?.close(),this.context=void 0,this.master=void 0,this.bus=void 0}apply(){const t=this.context;if(!t)return;const e=this.paused?[]:this.requested,a=new Set(e.map(n=>n.id));for(const n of[...this.voices.keys()])a.has(n)||this.release(n);for(const n of e){const i=this.voices.get(n.id)??this.build(t,n);this.retarget(t,i,n)}}build(t,e){const a=t.createGain();a.gain.value=0;let n;const i=this.busOf(t);typeof t.createStereoPanner=="function"?(n=t.createStereoPanner(),a.connect(n).connect(i)):a.connect(i);const o=t.createGain(),s=e.character?.modulationDepth??0;o.gain.value=1-s/2;const r=t.createOscillator();r.type="sine";const h=t.createGain();h.gain.value=s/2,r.connect(h).connect(o.gain),o.connect(a);const c=t.createBufferSource();c.buffer=this.noise(t),c.loop=!0,c.loopStart=Math.random()*Q*.5;const d=[],l=[],u=[];for(const v of E.OCTAVES){const T=t.createBiquadFilter();T.type="bandpass",T.frequency.value=v,T.Q.value=et;const N=t.createBiquadFilter();N.type="bandpass",N.frequency.value=v,N.Q.value=et;const k=t.createGain();k.gain.value=0,c.connect(T).connect(N).connect(k).connect(o),d.push(T),l.push(N),u.push(k)}const p=[];for(const[v,T]of[[e.character?.toneHz,e.character?.toneShare],[e.character?.humHz,e.character?.humShare]])if(v!==void 0)for(let N=1;N<=At;N++){const k=t.createOscillator();k.type="sine",k.frequency.value=v*N;const X=t.createGain();X.gain.value=0,k.connect(X).connect(a),p.push({oscillator:k,gain:X,harmonic:N,baseHz:v,share:T??0})}const m=t.createGain();m.gain.value=0,m.connect(a.gain);const A=it.map(v=>{const T=t.createOscillator();return T.type="sine",T.frequency.value=v,T.connect(m),T}),b=t.createGain();b.gain.value=e.character?.roughness??tt;const R=t.createBufferSource();R.buffer=this.roughTable(t,gt),R.loop=!0,R.loopStart=Math.random()*K*.5,R.connect(b).connect(o.gain);const S=t.createGain();S.gain.value=(e.character?.roughness??tt)*Et;const f=t.createBufferSource();f.buffer=this.roughTable(t,Mt),f.loop=!0,f.loopStart=Math.random()*K*.5,f.connect(S).connect(o.gain);let B;const j=this.busOf(t)&&this.reverb;j&&(B=t.createGain(),B.gain.value=0,a.connect(B).connect(j));const V=[c,R,f,r,...p.map(v=>v.oscillator),...A];for(const v of V)v.start();const J={nodes:[a,o,h,b,S,m,...p.map(v=>v.gain),...d,...l,...u,...B?[B]:[],...n?[n]:[],...V],sources:V,filters:d,seconds:l,gains:u,tones:p,lfo:r,lfoDepth:h,wander:A,wanderDepth:m,roughDepth:b,crackleDepth:S,beat:o,output:a,panner:n,send:B};return this.voices.set(e.id,J),J}retarget(t,e,a){const n=t.currentTime,i=(p,m)=>p.setTargetAtTime(m,n,mt),o=Math.min(St,Math.max(bt,a.dopplerRatio)),s=Math.min(Rt,Math.max(Dt,Math.sqrt(a.dopplerRatio))),r=t.sampleRate*.45,h=a.bandAmplitudes.map((p,m)=>p*q.unweighting(E.OCTAVES[m])),c=Math.sqrt(h.reduce((p,m)=>p+m*m,0)),d=Math.min(1,Math.max(0,(a.distanceKm-nt)/(Ot-nt)));E.OCTAVES.forEach((p,m)=>{i(e.filters[m].frequency,Math.min(r,p*s)),i(e.seconds[m].frequency,Math.min(r,p*s)),i(e.gains[m].gain,h[m]*Math.sqrt(Ct/p))});const l=a.character;for(const{oscillator:p,gain:m,harmonic:A,baseHz:b,share:R}of e.tones){const S=b*A;i(p.frequency,S*o);const f=S*o;i(m.gain,f<r?R*Tt*h[q.bandOf(f)]/A:0)}l?.modulationHz!==void 0&&i(e.lfo.frequency,l.modulationHz*o);const u=c>0?rt*(1-Math.exp(-c/rt))/c:1;if(i(e.output.gain,u*(1-Nt*d)),i(e.wanderDepth.gain,u*It*d/it.length),e.send&&i(e.send.gain,Bt*d),e.panner){const p=(a.azimuthDeg-this.headingDeg)*Math.PI/180;i(e.panner.pan,Math.max(-at,Math.min(at,Math.sin(p)))*(1-vt*d))}}static unweighting(t){return 10**(Math.min(ft,Math.max(0,-E.aWeightingDb(t)))/20)}static bandOf(t){let e=0;return E.OCTAVES.forEach((a,n)=>{Math.abs(Math.log(t/a))<Math.abs(Math.log(t/E.OCTAVES[e]))&&(e=n)}),e}roughTable(t,e){const a=this.roughBuffers.get(e);if(a)return a;const n=Math.floor(t.sampleRate*K),i=t.createBuffer(1,n,t.sampleRate),o=i.getChannelData(0),s=Array.from({length:K*e},()=>(Math.random()*2-1)**3),r=t.sampleRate/e;for(let h=0;h<o.length;h++){const c=h/r,d=Math.floor(c),l=c-d,u=l*l*(3-2*l);o[h]=s[d%s.length]*(1-u)+s[(d+1)%s.length]*u}return this.roughBuffers.set(e,i),i}roomImpulse(t){const e=Math.floor(t.sampleRate*_t),a=t.createBuffer(2,e,t.sampleRate);for(let n=0;n<2;n++){const i=a.getChannelData(n);let o=0;for(let s=0;s<e;s++){const r=s/t.sampleRate,h=.6*Math.exp(-r/(st*2))+.04;o+=h*(Math.random()*2-1-o),i[s]=o*Math.exp(-r/st)}}return a}busOf(t){if(this.bus)return this.bus;const e=t.createGain();if(e.gain.value=this.level,e.connect(t.destination),this.master=e,typeof t.createConvolver=="function"){const a=t.createConvolver();a.buffer=this.roomImpulse(t);const n=t.createGain();n.gain.value=.9,a.connect(n),this.reverb=a,this.reverbOut=n}if(typeof t.createDynamicsCompressor=="function"){const a=t.createDynamicsCompressor();a.threshold.value=-6,a.knee.value=3,a.ratio.value=4,a.attack.value=.005,a.release.value=.25,a.connect(e),this.bus=a}else this.bus=e;return this.reverbOut?.connect(this.bus),this.bus}release(t){const e=this.voices.get(t);if(!e)return;this.voices.delete(t);const a=this.context;a&&(e.output.gain.setTargetAtTime(0,a.currentTime,x/3),setTimeout(()=>{for(const n of e.sources)try{n.stop()}catch{}for(const n of e.nodes)n.disconnect()},x*1e3*3))}noise(t){if(this.noiseBuffer)return this.noiseBuffer;const e=t.createBuffer(1,t.sampleRate*Q,t.sampleRate),a=e.getChannelData(0);for(let n=0;n<a.length;n++)a[n]=Math.random()*2-1;return this.noiseBuffer=e,e}}class _{static BASE_DB_A=30;static WIND_DB_A=[[0,10],[1,28],[2,36],[3,40],[5,46],[8,52],[12,58],[20,66]];static RAIN_DB_A=[[0,0],[.1,42],[.3,50],[.6,58],[1,65]];static BED_RMS=.2;static MINIMUM_REFERENCE=.008;static WIND_BED_MIN_MS=1;static WIND_BED_FULL_MS=20;static dbA(t){const e=[_.BASE_DB_A,_.along(_.WIND_DB_A,t.windSpeed)];return(t.precipitationType==="rain"||t.precipitationType==="hail")&&e.push(_.along(_.RAIN_DB_A,t.precipitationIntensity)),10*Math.log10(e.filter(a=>a>0).reduce((a,n)=>a+10**(n/10),0))}static bedVolume(t){const e=t.windSpeed>_.WIND_BED_MIN_MS?Math.min(t.windSpeed/_.WIND_BED_FULL_MS,1):0,a=t.precipitationType==="hail"?Math.min(1,t.precipitationIntensity*1.3+.2):t.precipitationType==="rain"?t.precipitationIntensity:0;return Math.hypot(e,a)}static referenceAmplitude(t){return Math.max(_.BED_RMS*_.bedVolume(t),_.MINIMUM_REFERENCE)}static along(t,e){if(e<=t[0][0])return t[0][1];for(let a=1;a<t.length;a++)if(e<=t[a][0]){const[n,i]=t[a-1],[o,s]=t[a];return i+(s-i)*(e-n)/(o-n)}return t[t.length-1][1]}}class y{static TYPES={A318:["Airbus A318","airliner-narrow",34.1,31.4],A319:["Airbus A319","airliner-narrow",34.1,33.8],A320:["Airbus A320","airliner-narrow",34.1,37.6],A321:["Airbus A321","airliner-narrow",34.1,44.5],A19N:["Airbus A319neo","airliner-narrow",35.8,33.8],A20N:["Airbus A320neo","airliner-narrow",35.8,37.6],A21N:["Airbus A321neo","airliner-narrow",35.8,44.5],B737:["Boeing 737-700","airliner-narrow",34.3,33.6],B738:["Boeing 737-800","airliner-narrow",35.8,39.5],B739:["Boeing 737-900","airliner-narrow",35.8,42.1],B38M:["Boeing 737 MAX 8","airliner-narrow",35.9,39.5],B39M:["Boeing 737 MAX 9","airliner-narrow",35.9,42.2],B752:["Boeing 757-200","airliner-narrow",38,47.3],B753:["Boeing 757-300","airliner-narrow",38,54.4],B762:["Boeing 767-200","airliner-wide",47.6,48.5],B763:["Boeing 767-300","airliner-wide",47.6,54.9],B764:["Boeing 767-400","airliner-wide",51.9,61.4],B772:["Boeing 777-200","airliner-wide",60.9,63.7],B77L:["Boeing 777-200LR","airliner-wide",64.8,63.7],B77W:["Boeing 777-300ER","airliner-wide",64.8,73.9],B788:["Boeing 787-8","airliner-wide",60.1,56.7],B789:["Boeing 787-9","airliner-wide",60.1,62.8],B78X:["Boeing 787-10","airliner-wide",60.1,68.3],B744:["Boeing 747-400","airliner-wide",64.4,70.7],B748:["Boeing 747-8","airliner-wide",68.4,76.3],A306:["Airbus A300-600","airliner-wide",44.8,54.1],A310:["Airbus A310","airliner-wide",43.9,46.7],A332:["Airbus A330-200","airliner-wide",60.3,58.8],A333:["Airbus A330-300","airliner-wide",60.3,63.7],A338:["Airbus A330-800","airliner-wide",64,58.8],A339:["Airbus A330-900","airliner-wide",64,63.7],A343:["Airbus A340-300","airliner-wide",60.3,63.7],A346:["Airbus A340-600","airliner-wide",63.5,75.4],A359:["Airbus A350-900","airliner-wide",64.8,66.8],A35K:["Airbus A350-1000","airliner-wide",64.8,73.8],A388:["Airbus A380-800","airliner-wide",79.8,72.7],E170:["Embraer 170","regional-jet",26,29.9],E75L:["Embraer 175","regional-jet",26,31.7],E75S:["Embraer 175","regional-jet",26,31.7],E190:["Embraer 190","regional-jet",28.7,36.2],E195:["Embraer 195","regional-jet",28.7,38.7],E290:["Embraer 190-E2","regional-jet",33.7,36.2],E295:["Embraer 195-E2","regional-jet",33.7,41.5],CRJ2:["Bombardier CRJ200","regional-jet",21.2,26.8],CRJ7:["Bombardier CRJ700","regional-jet",23.2,32.3],CRJ9:["Bombardier CRJ900","regional-jet",24.9,36.2],CRJX:["Bombardier CRJ1000","regional-jet",26.2,39.1],AT72:["ATR 72","regional-turboprop",27.1,27.2],AT76:["ATR 72-600","regional-turboprop",27.1,27.2],AT45:["ATR 42","regional-turboprop",24.6,22.7],DH8D:["Dash 8 Q400","regional-turboprop",28.4,32.8],DH8C:["Dash 8-300","regional-turboprop",27.4,25.7],SF34:["Saab 340","regional-turboprop",21.4,19.7],B190:["Beechcraft 1900","regional-turboprop",17.7,17.6],C25A:["Cessna CitationJet CJ2","business-jet",14.3,14.4],C56X:["Cessna Citation Excel","business-jet",17.2,16],C68A:["Cessna Citation Latitude","business-jet",22,18.9],C550:["Cessna Citation II","business-jet",15.8,14.4],E55P:["Embraer Phenom 300","business-jet",15.9,15.6],E50P:["Embraer Phenom 100","business-jet",12.3,12.8],GLF5:["Gulfstream G550","business-jet",28.5,29.4],FA7X:["Dassault Falcon 7X","business-jet",26.2,23.4],CL60:["Bombardier Challenger 600","business-jet",19.6,20.9],LJ45:["Learjet 45","business-jet",14.6,17.7],H25B:["Hawker 800","business-jet",15.7,15.6],C172:["Cessna 172","light-piston",11,8.3],C152:["Cessna 152","light-piston",10.2,7.3],C182:["Cessna 182","light-piston",10.9,8.8],P28A:["Piper Cherokee","light-piston",10.7,7.2],PA34:["Piper Seneca","light-piston",11.8,8.7],SR20:["Cirrus SR20","light-piston",10.9,7.9],SR22:["Cirrus SR22","light-piston",11.7,7.9],S22T:["Cirrus SR22T","light-piston",11.7,7.9],DA40:["Diamond DA40","light-piston",11.6,8.1],DA42:["Diamond DA42","light-piston",13.4,8.6],BE20:["Beechcraft King Air 200","turboprop-light",16.6,13.3],BE58:["Beechcraft Baron","light-piston",11.5,9.1],C208:["Cessna Caravan","turboprop-light",15.9,11.5],PC12:["Pilatus PC-12","turboprop-light",16.3,14.4],TBM9:["Daher TBM 900","turboprop-light",12.8,10.7],EC35:["Airbus H135","helicopter-light",10.2,12.1],EC45:["Airbus H145","helicopter-medium",11,13.6],AS50:["Airbus H125","helicopter-light",10.7,12.9],EC30:["Airbus H130","helicopter-light",10.7,12.6],B407:["Bell 407","helicopter-light",10.7,12.7],B06:["Bell 206","helicopter-light",10.2,12],B429:["Bell 429","helicopter-medium",10.9,13],B505:["Bell 505","helicopter-light",10.4,11.9],R44:["Robinson R44","helicopter-light",10.1,11.7],R22:["Robinson R22","helicopter-light",7.7,8.8],A109:["Agusta A109","helicopter-medium",11,13],A139:["Leonardo AW139","helicopter-medium",13.8,16.7],S92:["Sikorsky S-92","helicopter-heavy",17.2,20.9],H60:["Sikorsky UH-60 Black Hawk","helicopter-heavy",16.4,19.8],T38:["Northrop T-38 Talon","military-jet",7.7,14.1],HAWK:["BAE Hawk","military-jet",9.4,11.9],GLID:["Glider","glider",17,7],BALL:["Balloon","balloon",15,20],ULAC:["Ultralight","ultralight",9.5,6],C42:["Ikarus C42","ultralight",9.4,6.3],DRON:["Drone","unmanned",1,.6]};static CATEGORIES={A1:["Light aircraft","light-piston",11,8.3],A2:["Small aircraft","business-jet",15,15],A3:["Large aircraft","airliner-narrow",34.1,37.6],A4:["High-vortex large aircraft","airliner-narrow",38,47.3],A5:["Heavy aircraft","airliner-wide",60.3,63.7],A6:["High-performance aircraft","military-jet",8,14],A7:["Rotorcraft","helicopter-medium",10.7,12.7],B1:["Glider","glider",17,7],B2:["Lighter-than-air","balloon",15,20],B4:["Ultralight","ultralight",9.5,6],B6:["Unmanned aircraft","unmanned",1.5,1]};static GENERIC={name:"Airliner",kind:"airliner-narrow",spanM:34.1,lengthM:37.6,basis:"nothing"};static of(t){const e=t?.type?.toUpperCase(),a=e?y.TYPES[e]:void 0;if(a)return{code:e,name:a[0],kind:a[1],spanM:a[2],lengthM:a[3],basis:"type"};const n=t?.category?y.CATEGORIES[t.category]:void 0;return n?{name:n[0],kind:n[1],spanM:n[2],lengthM:n[3],basis:"category"}:{...y.GENERIC}}static isHelicopter(t){return t.kind.startsWith("helicopter")}}class P{static DUSK_SUN_ELEVATION_DEG=-.83;static ALWAYS=new Set(["airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet"]);static NONE=new Set(["glider","balloon"]);static BRIGHTNESS={"light-piston":[.5,.2,.5],"turboprop-light":[.7,.4,.8],ultralight:[.4,.2,.4],unmanned:[0,.05,0],"helicopter-light":[1,1,1],"helicopter-medium":[1,1,1],"helicopter-heavy":[1,1,1],"military-jet":[1,1,1]};static lampsOn(t,e){if(P.NONE.has(t))return{navigation:!1,beacon:!1,strobes:!1};if(P.ALWAYS.has(t))return{navigation:!0,beacon:!0,strobes:!0};const a=e<P.DUSK_SUN_ELEVATION_DEG;return t==="unmanned"?{navigation:!1,beacon:!1,strobes:a}:{navigation:a,beacon:a,strobes:a}}static lights(t,e){const a=P.lampsOn(t.kind,e),n=t.kind.startsWith("helicopter"),i=dt.find(u=>u.id===(n?"helicopter":"airliner")).create(),[o,s]=n?[5,7]:[17,18],r=t.spanM/2/o,h=t.lengthM/2/s,[c,d,l]=P.BRIGHTNESS[t.kind]??[1,1,1];return i.filter(u=>u.id.startsWith("nav")?a.navigation:u.id.startsWith("strobe")?a.strobes:u.id.startsWith("beacon")?a.beacon:!0).filter(u=>!(u.id.startsWith("beacon")&&!a.beacon)).map(u=>{const p=u.id.startsWith("nav")?c:u.id.startsWith("strobe")?d:l;return{...u,offsetM:{x:u.offsetM.x*r,y:u.offsetM.y,z:u.offsetM.z*h},intensity:(u.intensity??1)*p}}).filter(u=>(u.intensity??1)>0)}static bodyColor(t){return t.kind==="military-jet"?"#8a8e94":t.kind.startsWith("helicopter")?"#c8ccd1":t.kind==="unmanned"?"#2c2e33":"#dde0e4"}}class U{static FAMILIES={"amvlab-a320":["A318","A319","A320","A321","A19N","A20N","A21N"],"amvlab-b737":["B732","B733","B734","B735","B736","B737","B738","B739","B37M","B38M","B39M","B3XM"],"amvlab-a350":["A359","A35K"],"amvlab-a380":["A388"],"amvlab-b787":["B788","B789","B78X"]};static BY_TYPE=new Map(Object.entries(U.FAMILIES).flatMap(([t,e])=>e.map(a=>[a,t])));static idOf(t){return t?U.BY_TYPE.get(t.toUpperCase()):void 0}}class D{static ID_PREFIX=z.ID_PREFIX;static MAX_OBJECTS=40;static FT_TO_M=.3048;static DEG=Math.PI/180;static from(t,e,a,n=D.MAX_OBJECTS,i={}){return new wt(t,e,a,n,i).build()}static idOf(t,e){return z.idOf(t,e)}static keyOf(t){return z.keyOf(t)}static HEIGHT_OVER_LENGTH=.29;static sizeOf(t){return{widthM:t.spanM,lengthM:t.lengthM,heightM:t.lengthM*D.HEIGHT_OVER_LENGTH}}static offsetOf(t,e){const a=L.seenFrom(t,{lat:e.lat,lng:e.lng,heightM:e.altitudeFt*D.FT_TO_M}),n=a.distanceKm*1e3,i=n*Math.cos(a.altitudeDeg*D.DEG);return{eastM:i*Math.sin(a.azimuthDeg*D.DEG),northM:i*Math.cos(a.azimuthDeg*D.DEG),upM:n*Math.sin(a.altitudeDeg*D.DEG),altitudeDeg:a.altitudeDeg,distanceKm:a.distanceKm}}static segments(t){const e=[];let a=[];for(const n of t.points){const i=a[a.length-1];i&&n.t-i.t>F.MAX_GAP_S*1e3&&(e.push(a),a=[]),a.push(n)}return e.push(a),e.filter(n=>n.length>=2)}static bearingDeg(t,e){return(Math.atan2(e.eastM-t.eastM,e.northM-t.northM)/D.DEG+360)%360}}class wt{constructor(t,e,a,n,i){this.tracks=t,this.observer=e,this.startMs=a,this.maxObjects=n,this.options=i}build(){const t=[];for(const a of this.tracks){const n=D.keyOf(a),i=this.options.models?.get(n)??y.of(void 0);D.segments(a).forEach((o,s)=>{const r=o.map(u=>({point:u,at:D.offsetOf(this.observer,u)}));if(!r.some(u=>u.at.altitudeDeg>=0))return;const h=r.map((u,p)=>({t:u.point.t-this.startMs,eastM:u.at.eastM,northM:u.at.northM,altitudeM:u.at.upM,headingDeg:u.point.trackDeg??(p+1<r.length?D.bearingDeg(u.at,r[p+1].at):D.bearingDeg(r[p-1].at,u.at))})),c=D.idOf(a,s),d=r[Math.floor(r.length/2)].point,l=this.options.sunElevationAt?.(d)??90;t.push({object:{id:c,kind:"aircraft",eastM:h[0].eastM,northM:h[0].northM,headingDeg:h[0].headingDeg,sizeM:D.sizeOf(i),model:U.idOf(i.code)?{id:U.idOf(i.code)}:void 0,color:P.bodyColor(i),lights:P.lights(i,l),track:h},presence:{fromMs:h[0].t,untilMs:h[h.length-1].t},flight:{icao:a.icao,nonIcao:a.nonIcao,points:o},closestKm:Math.min(...r.map(u=>u.at.distanceKm))})})}t.sort((a,n)=>a.closestKm-n.closestKm);const e=t.slice(0,this.maxObjects);return{objects:e.map(a=>a.object),presence:new Map(e.map(a=>[a.object.id,a.presence])),flights:new Map(e.map(a=>[a.object.id,a.flight])),total:t.length,shown:e.length}}}const ht=[{id:"turbofan-narrow-body",name:"Turbofan airliner, narrow-body",kinds:["airliner-narrow"],totalDbA:148,shapeDb:[-32,-17,-9,-6,-5,-7,-12,-22],character:{toneHz:1800,toneShare:.3,humHz:90,humShare:.7}},{id:"turbofan-wide-body",name:"Turbofan airliner, wide-body",kinds:["airliner-wide"],totalDbA:151,shapeDb:[-28,-14,-7,-4,-3,-6,-12,-22],character:{toneHz:1200,toneShare:.3,humHz:70,humShare:.7}},{id:"regional-jet",name:"Regional jet",kinds:["regional-jet"],totalDbA:144,shapeDb:[-32,-17,-9,-5,-4,-6,-11,-21],character:{toneHz:1900,toneShare:.3,humHz:95,humShare:.7}},{id:"business-jet",name:"Business jet",kinds:["business-jet"],totalDbA:141,shapeDb:[-30,-15,-8,-4,-3,-4,-9,-19],character:{toneHz:2500,toneShare:.25,humHz:110,humShare:.7}},{id:"turboprop",name:"Turboprop",kinds:["regional-turboprop","turboprop-light"],totalDbA:138,shapeDb:[-14,-9,-8,-6,-8,-13,-20,-28],character:{toneHz:80,toneShare:.5}},{id:"light-piston",name:"Light piston aircraft",kinds:["light-piston"],totalDbA:130,shapeDb:[-18,-9,-5,-4,-8,-14,-22,-30],character:{toneHz:80,toneShare:.4}},{id:"ultralight",name:"Ultralight",kinds:["ultralight"],totalDbA:124,shapeDb:[-16,-8,-5,-4,-9,-15,-23,-31],character:{toneHz:140,toneShare:.4}},{id:"helicopter-light",name:"Light helicopter",kinds:["helicopter-light"],totalDbA:134,shapeDb:[-15,-8,-4,-3,-6,-10,-16,-24],character:{modulationHz:20,modulationDepth:.5}},{id:"helicopter-medium",name:"Medium helicopter",kinds:["helicopter-medium"],totalDbA:138,shapeDb:[-14,-7,-4,-3,-6,-10,-16,-24],character:{modulationHz:22,modulationDepth:.5}},{id:"helicopter-heavy",name:"Heavy helicopter",kinds:["helicopter-heavy"],totalDbA:144,shapeDb:[-12,-6,-4,-4,-7,-11,-17,-25],character:{modulationHz:17,modulationDepth:.5}},{id:"military-jet",name:"Military jet",kinds:["military-jet"],totalDbA:152,shapeDb:[-26,-12,-6,-3,-2,-3,-7,-15]},{id:"glider",name:"Glider",kinds:["glider"],totalDbA:85,shapeDb:[-30,-22,-15,-10,-8,-8,-14,-22]},{id:"balloon",name:"Hot-air balloon",kinds:["balloon"],totalDbA:100,shapeDb:[-25,-15,-9,-5,-3,-6,-12,-20]},{id:"unmanned",name:"Unmanned aircraft",kinds:["unmanned"],totalDbA:88,shapeDb:[-40,-30,-20,-12,-6,-3,-3,-8],character:{toneHz:450,toneShare:1}}],ot=ht.map(C=>({id:C.id,name:C.name,soundPowerA:C.shapeDb.map(t=>t+C.totalDbA-E.sumDb(C.shapeDb)),character:C.character}));class g{static DEFAULT_AMBIENT_DB_A=35;static DETECTION_MARGIN_DB=3;static AMBIENT_SHAPE_DB=[-12,-7,-5,-5,-7,-11,-17,-25];static HEARING_FLOOR_DB_A=0;static ITERATIONS=30;static CONVERGED_MS=.5;static VELOCITY_STEP_MS=500;static noiseOfKind(t){const e=ht.find(a=>a.kinds.includes(t));return ot.find(a=>a.id===(e?.id??"turbofan-narrow-body"))}static bandsAt(t,e,a=E.STANDARD){const n=20*Math.log10(Math.max(e*1e3,1))+11;return E.OCTAVES.map((i,o)=>t.soundPowerA[o]-n-E.absorptionDbPerKm(i,a)*e)}static couldBeHeard(t,e,a=g.DEFAULT_AMBIENT_DB_A,n=E.STANDARD){const i=g.ambientBands(a);return g.bandsAt(t,e,n).some((o,s)=>o>=Math.max(i[s]+g.DETECTION_MARGIN_DB,g.HEARING_FLOOR_DB_A))}static ambientBands(t){const e=g.AMBIENT_SHAPE_DB,a=E.sumDb(e);return e.map(n=>t+n-a)}static heardAt(t,e,a,n={}){const i=n.air??E.STANDARD,o=E.speedOfSound(i.temperatureC),s=t.points[t.points.length-1]?.t;if(s===void 0)return;let r=Math.min(a,s),h=F.positionAt(t,r);if(!h)return;let c=L.seenFrom(e,h.geo);for(let f=0;f<g.ITERATIONS;f++){const B=a-c.distanceKm*1e3*1e3/o,j=Math.abs(B-r);if(r=B,h=F.positionAt(t,r),!h)return;if(c=L.seenFrom(e,h.geo),j<g.CONVERGED_MS)break}const d=F.positionAt(t,a),l=d?L.seenFrom(e,d.geo):c,u=n.noise??ot[0],p=n.ambientDbA??g.DEFAULT_AMBIENT_DB_A,m=g.ambientBands(p),A=g.bandsAt(u,c.distanceKm,i),b=A.map((f,B)=>f>=Math.max(m[B]+g.DETECTION_MARGIN_DB,g.HEARING_FLOOR_DB_A)),R=A.indexOf(Math.max(...A)),S=b.lastIndexOf(!0);return{track:t,audible:b.some(Boolean),levelDbA:E.sumDb(A),bandsDbA:A,ambientDbA:p,delayS:(a-r)/1e3,emittedAtMs:r,sound:c,seen:l,lagDeg:g.angleBetween(c,l),dopplerRatio:g.doppler(t,e,r,o),dominantHz:E.OCTAVES[R],cutoffHz:S<0?void 0:E.OCTAVES[S]}}static profile(t,e,a,n,i=2e3,o={}){const s=[];let r,h,c=a;for(let d=a;d<=n;d+=i){const l=g.heardAt(t,e,d,o);l&&(!h||l.levelDbA>h.levelDbA)&&(h=l,c=d),l?.audible?r?r.untilMs=d:s.push(r={fromMs:d,untilMs:d}):r=void 0}return{track:t,audible:s,peakDbA:h?.levelDbA??-1/0,peakAtMs:c,peakDelayS:h?.delayS??0}}static angleBetween(t,e){const a=c=>{const d=c.altitudeDeg*Math.PI/180,l=c.azimuthDeg*Math.PI/180;return[Math.cos(d)*Math.sin(l),Math.cos(d)*Math.cos(l),Math.sin(d)]},[n,i,o]=a(t),[s,r,h]=a(e);return Math.acos(Math.min(1,Math.max(-1,n*s+i*r+o*h)))*180/Math.PI}static doppler(t,e,a,n){const i=g.VELOCITY_STEP_MS,o=F.positionAt(t,a-i),s=F.positionAt(t,a+i);if(!o||!s)return 1;const r=L.seenFrom(e,o.geo).distanceKm*1e3,h=L.seenFrom(e,s.geo).distanceKm*1e3;return 1/(1-(r-h)/(2*i/1e3)/n)}}class Ft{static at(t,e,a,n,i={}){const o=F.seenFrom(t,a,n);if(!o)return;const s=y.of(e),r=g.heardAt(t,a,n,{noise:g.noiseOfKind(s.kind),...i});return{hex:`${t.nonIcao?"~":""}${t.icao.toString(16).padStart(6,"0")}`,registration:e?.registration,typeCode:s.code??e?.type,name:s.basis==="nothing"?void 0:s.name,kind:s.kind,basis:s.basis,military:e?.military===!0,restricted:e?.restricted===!0,altitudeFt:o.altitudeFt,groundSpeedKt:o.groundSpeedKt,trackDeg:o.trackDeg,sky:o.sky,angularRateDegPerS:o.angularRateDegPerS,hearing:r&&{audible:r.audible,levelDbA:r.levelDbA,ambientDbA:r.ambientDbA,delayS:r.delayS,lagDeg:r.lagDeg,dopplerRatio:r.dopplerRatio,cutoffHz:r.cutoffHz,dominantHz:r.dominantHz}}}}class O{static REFERENCE_AMPLITUDE=.02;static MASKING_RANGE_DB=6;static KNEE_DB=20;static COMPRESSION_RATIO=1.5;static EXPANSION_RATIO=1.8;static DEFAULT_MAX_VOICES=4;static candidates(t,e,a,n,i={}){const o=new Set;for(const[s,r]of t){const h=g.noiseOfKind(y.of(e.get(a(r))).kind);let c=1/0;for(const d of r.points)c=Math.min(c,L.seenFrom(n,{lat:d.lat,lng:d.lng,heightM:d.altitudeFt*.3048}).distanceKm);g.couldBeHeard(h,c,i.ambientDbA,i.air)&&o.add(s)}return o}static voices(t,e,a,n,i,o,s={}){const r=[];for(const h of t){const c=e.get(h);if(!c||s.only?.(h)===!1)continue;const d=s.kindOf?.(h)??y.of(a.get(n(c))).kind,l=s.noiseOf?.(h)??g.noiseOfKind(d),u=g.heardAt(c,i,o,{...s,noise:l});u?.audible&&r.push({id:h,kind:d,bandAmplitudes:O.bandAmplitudes(u.bandsDbA,u.ambientDbA,s.referenceAmplitude),levelDbA:u.levelDbA,distanceKm:u.sound.distanceKm,dopplerRatio:u.dopplerRatio,azimuthDeg:u.sound.azimuthDeg,elevationDeg:u.sound.altitudeDeg,character:l.character})}return r.sort((h,c)=>c.levelDbA-h.levelDbA).slice(0,s.maxVoices??O.DEFAULT_MAX_VOICES)}static bandAmplitudes(t,e,a=O.REFERENCE_AMPLITUDE){const n=g.ambientBands(e),i=g.DETECTION_MARGIN_DB,o=E.sumDb(t),s=o-e,r=s>=O.KNEE_DB?O.KNEE_DB+(s-O.KNEE_DB)/O.COMPRESSION_RATIO:O.KNEE_DB-(O.KNEE_DB-s)*O.EXPANSION_RATIO,h=a*10**(r/20);return t.map((c,d)=>{const l=Math.min(1,Math.max(0,(c-n[d]-i+O.MASKING_RANGE_DB)/(2*O.MASKING_RANGE_DB)));return l*l*(3-2*l)*h*10**((c-o)/20)})}static BANDS_HZ=E.OCTAVES}class W{static ENGLISH={unnamed:"Aircraft {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"heading {value}°",position:"{distance} km away, {elevation}° above the horizon, {bearing}",heard:"Heard at {level} dB(A), left the aircraft {delay} s ago, {lag}° behind it: {character}{pitch}",rumble:"a low rumble, nothing above {cutoff} Hz",muffled:"a dull noise, nothing above {cutoff} Hz",broad:"a broad roar",pitchHigher:", pitch {percent} % higher",pitchLower:", pitch {percent} % lower",inaudible:"Not audible here: {level} dB(A) against {ambient} dB(A) of ambient noise",soundUnknown:"Its sound cannot be worked out: the aircraft was not recorded yet when it left",contrailPersistent:"Leaves a trail that lasts: the air is supersaturated over ice ({rhi} % over ice)",contrailShort:"Leaves a short-lived trail: the air is dry over ice ({rhi} % over ice)",military:"military",restricted:"identity withheld by its owner",candidate:"A compatible candidate, not an identification"};static RUMBLE_BELOW_HZ=500;static DULL_BELOW_HZ=2e3;static PITCH_NOTICED=.03;static text(t,e,a,n){const i=(l,u=0)=>l.toLocaleString(n,{maximumFractionDigits:u}),o=(l,u)=>l.replace(/\{(\w+)\}/g,(p,m)=>u[m]??`{${m}}`),s=[],r=[t.registration,t.name].filter(Boolean).join(" · ");s.push(r||o(e.unnamed,{hex:t.hex}));const h=[o(e.altitude,{value:i(Math.round(t.altitudeFt/100)*100)}),t.groundSpeedKt===void 0?void 0:o(e.speed,{value:i(Math.round(t.groundSpeedKt))}),t.trackDeg===void 0?void 0:o(e.heading,{value:i(Math.round(t.trackDeg))})].filter(Boolean);s.push(h.join(" · ")),s.push(o(e.position,{distance:i(t.sky.distanceKm,t.sky.distanceKm<10?1:0),elevation:i(Math.round(t.sky.altitudeDeg)),bearing:a(t.sky.azimuthDeg)}));const c=t.hearing;if(!c)s.push(e.soundUnknown);else if(!c.audible)s.push(o(e.inaudible,{level:i(Math.round(c.levelDbA)),ambient:i(Math.round(c.ambientDbA))}));else{const l=c.cutoffHz??0,u=l<=W.RUMBLE_BELOW_HZ?e.rumble:l<=W.DULL_BELOW_HZ?e.muffled:e.broad,p=c.dopplerRatio-1,m=Math.abs(p)<W.PITCH_NOTICED?"":o(p>0?e.pitchHigher:e.pitchLower,{percent:i(Math.round(Math.abs(p)*100))});s.push(o(e.heard,{level:i(Math.round(c.levelDbA)),delay:i(Math.round(c.delayS)),lag:i(Math.round(c.lagDeg)),character:o(u,{cutoff:i(l)}),pitch:m}))}t.contrail&&s.push(o(t.contrail.persistent?e.contrailPersistent:e.contrailShort,{rhi:i(Math.round(t.contrail.iceRelativeHumidity*100))}));const d=[t.military?e.military:void 0,t.restricted?e.restricted:void 0].filter(Boolean);return d.length>0&&s.push(d.join(" · ")),s.push(e.candidate),s.join(`
|
|
2
|
+
`)}}class Y{static EFFICIENCY={"airliner-narrow":.34,"airliner-wide":.38,"regional-jet":.32,"business-jet":.3,"military-jet":.22,unknown:.34};static efficiencyOf(t){return Y.EFFICIENCY[t]}}class M{static EMISSION_INDEX_WATER=1.25;static COMBUSTION_HEAT=432e5;static AIR_HEAT_CAPACITY=1004;static MOLAR_MASS_RATIO=.622;static FT_TO_M=.3048;static TROPOPAUSE_M=11e3;static TROPOPAUSE_HPA=226.32;static ISOTHERMAL_SCALE_HEIGHT_M=6341.62;static pressureAtAltitudeFt(t){const e=t*M.FT_TO_M;return e<=M.TROPOPAUSE_M?1013.25*(1-225577e-10*e)**5.25588:M.TROPOPAUSE_HPA*Math.exp(-(e-M.TROPOPAUSE_M)/M.ISOTHERMAL_SCALE_HEIGHT_M)}static saturationOverWaterPa(t){const e=t+273.15;return Math.exp(54.842763-6763.22/e-4.21*Math.log(e)+367e-6*e+Math.tanh(.0415*(e-218.8))*(53.878-1331.22/e-9.44523*Math.log(e)+.014025*e))}static saturationOverIcePa(t){const e=t+273.15;return Math.exp(9.550426-5723.265/e+3.53068*Math.log(e)-.00728332*e)}static iceRelativeHumidity(t,e){return e*M.saturationOverWaterPa(t)/M.saturationOverIcePa(t)}static mixingSlope(t,e){return M.EMISSION_INDEX_WATER*M.AIR_HEAT_CAPACITY*t*100/(M.MOLAR_MASS_RATIO*M.COMBUSTION_HEAT*(1-e))}static criticalTemperatureC(t,e){const a=Math.log(M.mixingSlope(t,e)-.053);return-46.46+9.43*a+.72*a*a}static requiredHumidity(t,e,a){const n=M.criticalTemperatureC(t,e);return(M.mixingSlope(t,e)*(a-n)+M.saturationOverWaterPa(n))/M.saturationOverWaterPa(a)}static evaluate(t,e){const a=M.criticalTemperatureC(t.pressureHpa,e),n=M.requiredHumidity(t.pressureHpa,e,t.temperatureC),i=M.iceRelativeHumidity(t.temperatureC,t.relativeHumidity),o=t.temperatureC<a&&t.relativeHumidity>=n;return{forms:o,persistent:o&&i>=1,criticalTemperatureC:a,requiredHumidity:n,iceRelativeHumidity:i}}}class w{static HOLD_MS=36e5;static DEG=Math.PI/180;static GAS_CONSTANT_OVER_GRAVITY=287.05/9.80665;static at(t,e,a){if(t.length===0)return;const n=t[0],i=t[t.length-1];if(e<n.t-w.HOLD_MS||e>i.t+w.HOLD_MS)return;const o=t.findIndex(u=>u.t>e),s=o===0?t[0]:t[(o===-1?t.length:o)-1],r=o===-1||o===0?s:t[o],h=w.atLevel(s,a),c=w.atLevel(r,a);if(!h||!c)return;const d=r.t>s.t?Math.min(1,Math.max(0,(e-s.t)/(r.t-s.t))):0,l=(u,p)=>u+(p-u)*d;return{pressureHpa:a,temperatureC:l(h.temperatureC,c.temperatureC),relativeHumidity:l(h.relativeHumidity,c.relativeHumidity),driftEastMs:l(h.driftEastMs,c.driftEastMs),driftNorthMs:l(h.driftNorthMs,c.driftNorthMs),shearPerS:l(h.shearPerS,c.shearPerS)}}static atLevel(t,e){const a=t.levels;for(let n=0;n+1<a.length;n++){const i=a[n],o=a[n+1];if(e>i.pressureHpa||e<o.pressureHpa)continue;const s=(Math.log(i.pressureHpa)-Math.log(e))/(Math.log(i.pressureHpa)-Math.log(o.pressureHpa)),r=(u,p)=>u+(p-u)*s,h=u=>{const p=u.windFromDeg*w.DEG;return{east:-u.windSpeedMs*Math.sin(p),north:-u.windSpeedMs*Math.cos(p)}},c=h(i),d=h(o),l=w.GAS_CONSTANT_OVER_GRAVITY*((i.temperatureC+o.temperatureC)/2+273.15)*Math.log(i.pressureHpa/o.pressureHpa);return{pressureHpa:e,temperatureC:r(i.temperatureC,o.temperatureC),relativeHumidity:r(i.relativeHumidity,o.relativeHumidity),driftEastMs:r(c.east,d.east),driftNorthMs:r(c.north,d.north),shearPerS:Math.hypot(d.east-c.east,d.north-c.north)/l}}}}class H{static MIN_ALTITUDE_FT=2e4;static DENSE_MS=3e5;static SPARSE_STEP_MS=6e4;static SATURATION_HORIZON_MS=3*36e5;static SATURATION_STEP_MS=6e5;static PRESSURE_STEP_HPA=5;static plan(t,e,a,n){if(a.length===0)return[];const i=[],o=new Map,s=(r,h,c)=>{const d=Math.round(h/H.PRESSURE_STEP_HPA)*H.PRESSURE_STEP_HPA,l=H.SATURATION_STEP_MS,u=Math.floor(r/l)*l,p=`${d}|${u}`,m=o.get(p);if(m!==void 0)return m+(u-r)/1e3;let A=1/0;for(let b=l;b<=H.SATURATION_HORIZON_MS;b+=l){const R=w.at(a,u+b,d);if(!R)break;if(M.evaluate(R,c).iceRelativeHumidity<1){A=b/1e3;break}}return o.set(p,A),A+(u-r)/1e3};for(const r of t.objects){const h=t.flights.get(r.id),c=r.track;if(!h||!c||c.length!==h.points.length)continue;const d=e?.get(z.keyOf(h))??y.of(void 0),l=Y.efficiencyOf(d.kind);if(l===void 0)continue;const u=[];let p=-1/0;c.forEach((m,A)=>{if(m.t<-H.DENSE_MS&&A+1<c.length&&m.t-p<H.SPARSE_STEP_MS)return;p=m.t;const b=h.points[A],R=M.pressureAtAltitudeFt(b.altitudeFt),S=w.at(a,n+m.t,R),f=S&&M.evaluate(S,l);u.push({tMs:m.t,eastM:m.eastM,northM:m.northM,upM:m.altitudeM??0,forms:f?.forms??!1,persistent:f?.persistent??!1,lifetimeS:f?Z.lifetimeS(f.iceRelativeHumidity):0,driftEastMs:S?.driftEastMs??0,driftNorthMs:S?.driftNorthMs??0,shearPerS:S?.shearPerS??Z.TYPICAL_SHEAR_PER_S,iceRelativeHumidity:f?.iceRelativeHumidity??0,saturatedForS:f?.persistent?s(n+m.t,R,l):0})}),u.some((m,A)=>m.forms&&u[A+1]?.forms)&&i.push({id:r.id,spanM:d.spanM,points:u})}return i}}const ct=[500,400,300,250,200,150],yt=["temperature","relative_humidity","wind_speed","wind_direction"],kt="2022-01-01",lt=.25;class Pt{fetchImpl;baseUrl;cache=new Map;constructor(t={}){this.fetchImpl=t.fetchImpl??fetch.bind(globalThis),this.baseUrl=t.baseUrl??"https://historical-forecast-api.open-meteo.com/v1/forecast"}between(t,e,a){const n=new Date(e).toISOString().slice(0,10);if(n<kt)return Promise.resolve({status:"outside"});const i=new Date(a).toISOString().slice(0,10),s=`${`${Math.round(t.lat/lt)},${Math.round(t.lng/lt)}`}|${n}|${i}`;let r=this.cache.get(s);return r||(r=this.read(t,n,i),this.cache.set(s,r),r.then(h=>{h.status==="failed"&&this.cache.delete(s)})),r}async read(t,e,a){const n=ct.flatMap(s=>yt.map(r=>`${r}_${s}hPa`)),i=new URLSearchParams({latitude:String(t.lat),longitude:String(t.lng),start_date:e,end_date:a,hourly:n.join(","),wind_speed_unit:"ms",timezone:"UTC"}),o=`${this.baseUrl}?${i}`;try{const s=await this.fetchImpl(o);if(!s.ok)return{status:"failed"};const r=await s.json();return this.decode(r,{id:"open-meteo-forecast",name:"Open-Meteo (historical forecast)",url:o})}catch{return{status:"failed"}}}decode(t,e){const a=t.hourly;if(!a?.time)return{status:"outside"};const n=[];return a.time.forEach((i,o)=>{const s=[];for(const r of ct){const h=p=>a[`${p}_${r}hPa`]?.[o],c=h("temperature"),d=h("relative_humidity"),l=h("wind_speed"),u=h("wind_direction");if([c,d,l,u].some(p=>p==null))return;s.push({pressureHpa:r,temperatureC:c,relativeHumidity:d/100,windSpeedMs:l,windFromDeg:u})}n.push({t:Date.parse(`${i}Z`),levels:s})}),n.length>0?{status:"found",samples:n,source:e}:{status:"outside"}}}const Gt=[{id:"open-meteo-forecast",name:"Open-Meteo (historical forecast)",credit:"Weather data by Open-Meteo.com, CC BY 4.0",creditUrl:"https://open-meteo.com/en/docs/historical-forecast-api",create:()=>new Pt}];class I{static DEFAULT_KIND="airliner-narrow";static STEP_MS=1e3;static LEAD_MS=12e4;static FT_PER_M=1/.3048;static ID_PREFIX="decor:";tracks=new Map;static kindOf(t,e){if(t.kind!=="aircraft"||!I.flies(t))return;const a=t.aircraftSound??e??I.DEFAULT_KIND;return a==="silent"?void 0:a}static flies(t){return(t.track??[]).some(e=>(e.altitudeM??0)>0)}voices(t,e,a,n={},i=()=>{}){const o=t.event.place?.[0];if(!o)return[];const s=new Map,r=new Map,h=Math.max(t.observerTrack.duration,(t.event.durationSeconds??0)*1e3);for(const c of t.decor){const d=I.kindOf(c,i(c));if(!d)continue;const l=`${I.ID_PREFIX}${c.id}`;s.set(l,this.trackOf(c,l,o,h)),r.set(l,d)}for(const c of this.tracks.keys())s.has(c)||this.tracks.delete(c);return s.size===0?[]:O.voices(new Set(s.keys()),s,new Map,c=>String(c.icao),a,e,{...n,kindOf:c=>r.get(c)})}trackOf(t,e,a,n){const i=JSON.stringify([t.track,t.eastM,t.northM,t.headingDeg,a.lat,a.lng,n]),o=this.tracks.get(e);if(o?.key===i)return o.track;const s=[];for(let l=0;l<=n;l+=I.STEP_MS)s.push(I.pointAt(t,l,a));(s.length===0||s[s.length-1].t<n)&&s.push(I.pointAt(t,n,a));const r=s[0],h=s[1]??r,c=l=>(h[l]-r[l])/(h.t-r.t||1);for(let l=I.STEP_MS*10;l<=I.LEAD_MS;l+=I.STEP_MS*10)s.unshift({t:-l,lat:r.lat-c("lat")*l,lng:r.lng-c("lng")*l,altitudeFt:Math.max(0,r.altitudeFt-c("altitudeFt")*l)});const d={icao:I.hash(e),nonIcao:!0,points:s};return this.tracks.set(e,{key:i,track:d}),d}static pointAt(t,e,a){const n=pt(t,e),i=$(n.eastM,-n.northM,a.lat,a.lng);return{t:e,lat:i.lat,lng:i.lng,altitudeFt:n.altitudeM*I.FT_PER_M}}static hash(t){let e=0;for(let a=0;a<t.length;a++)e=e*31+t.charCodeAt(a)>>>0;return e}}class G{static STEP_MS=250;static FT_PER_M=1/.3048;static ID_PREFIX="body:";tracks=new Map;static noiseOf(t){const e=g.noiseOfKind(t.kind),a=t.quieterDb??0;return a===0?e:{...e,id:`${e.id}-${a}dB`,soundPowerA:e.soundPowerA.map(n=>n-a)}}voices(t,e,a,n,i,o,s={}){const r=new Map,h=new Map,c=new Map;for(const l of t){if(!l.sound)continue;const u=`${G.ID_PREFIX}${l.id}`,p=this.trackOf(l,u,e,n,o);p&&(r.set(u,p),h.set(u,l.sound.kind),c.set(u,G.noiseOf(l.sound)))}for(const l of this.tracks.keys())r.has(l)||this.tracks.delete(l);if(r.size===0)return[];const d=$(a.eastM,-a.northM,n.lat,n.lng);return O.voices(new Set(r.keys()),r,new Map,l=>String(l.icao),{lat:d.lat,lng:d.lng,heightM:a.upM},i,{...s,kindOf:l=>h.get(l),noiseOf:l=>c.get(l)})}trackOf(t,e,a,n,i){const o=`${n.lat},${n.lng},${i}`,s=this.tracks.get(e);if(s&&s.body===t&&s.origin===o)return s.track;const r=[];for(let c=-12e4;c<=i;c+=G.STEP_MS){const d=a(t,c);if(!d)continue;const l=$(d.eastM,-d.northM,n.lat,n.lng);r.push({t:c,lat:l.lat,lng:l.lng,altitudeFt:d.upM*G.FT_PER_M})}if(r.length<2)return;const h={icao:G.hash(e),nonIcao:!0,points:r};return this.tracks.set(e,{body:t,origin:o,track:h}),h}static hash(t){let e=0;for(let a=0;a<t.length;a++)e=e*31+t.charCodeAt(a)>>>0;return e}}export{q as AircraftAudio,H as AircraftContrails,y as AircraftModels,_ as AmbientNoise,G as BodyHearing,I as DecorAircraftHearing,D as TrafficDecor,Ft as TrafficInfos,O as TrafficSound,W as TrafficTooltip,Gt as UPPER_AIR_SOURCES};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{R as v,Q as C,X as L,G as X,B as m,h as H,b as U,N as F,O as Y,Y as k}from"./rr0-sighting.mjs";class p{static DEFAULT_DIVERGENCE_MRAD=.1;static DEFAULT_APERTURE_M=.01;static AEROSOL_SINGLE_SCATTERING_ALBEDO=.9;static AEROSOL_ASYMMETRY=.7;static STEP_M=25;static MAX_SAMPLES=2e3;static viewsAt(s,t,e,i){return p.onAt(s,t).map(o=>({id:o.id,wavelengthNm:o.wavelengthNm,samples:p.samplesOf(o,e,i)}))}static onAt(s,t){return s.filter(e=>e.path.length>=2&&(e.fromT===void 0||t>=e.fromT)&&(e.untilT===void 0||t<=e.untilT))}static samplesOf(s,t,e){const i=v.ecef({lat:t.lat,lng:t.lng,heightM:0}),o=t.lat*Math.PI/180,c=t.lng*Math.PI/180,h=E=>{const x=E[0]-i[0],d=E[1]-i[1],r=E[2]-i[2];return[-Math.sin(c)*x+Math.cos(c)*d,-Math.sin(o)*Math.cos(c)*x-Math.sin(o)*Math.sin(c)*d+Math.cos(o)*r,Math.cos(o)*Math.cos(c)*x+Math.cos(o)*Math.sin(c)*d+Math.sin(o)*r]},M=(s.divergenceMrad??p.DEFAULT_DIVERGENCE_MRAD)/1e3,a=s.apertureM??p.DEFAULT_APERTURE_M,u=[];let f=0,S=s.powerW,G=0;for(let E=0;E+1<s.path.length;E++){const x=s.path[E],d=s.path[E+1],r=v.ecef({lat:x.lat,lng:x.lng,heightM:x.altitudeM}),A=v.ecef({lat:d.lat,lng:d.lng,heightM:d.altitudeM}),O=Math.hypot(A[0]-r[0],A[1]-r[1],A[2]-r[2]),I=Math.max(1,Math.min(p.MAX_SAMPLES,Math.ceil(O/p.STEP_M)));for(let n=E===0?0:1;n<=I;n++){const y=n/I,w=[0,1,2].map(P=>r[P]+(A[P]-r[P])*y),z=y*O,l=x.altitudeM+(d.altitudeM-x.altitudeM)*y+p.bulgeM(z,O);if(n>0){const P=u[u.length-1],_=z+f-P.fromSourceM,D=p.extinctionAt(e,s.wavelengthNm,(P.altitudeM+l)/2);G+=D*_,S=s.powerW*Math.exp(-G)}const[T,R,N]=h(w);u.push({eastM:T,northM:R,upM:N,altitudeM:l,fromSourceM:f+z,widthM:a+M*(f+z),powerW:S})}f+=O}return u}static bulgeM(s,t){return s*(t-s)/(2*6371e3)}static extinctionAt(s,t,e){const{rayleighPerM:i,aerosolPerM:o}=p.coefficientsAt(s,t,e);return i+o}static coefficientsAt(s,t,e){const i=C.rayleighAt(t)*C.rayleighDensity(e),o=s.aerosol[1]*(t/550)**-1.3*C.aerosolDensity(e);return{rayleighPerM:i,aerosolPerM:o}}static phasedScattering(s,t){const e=3/(16*Math.PI)*(1+t*t),i=p.AEROSOL_ASYMMETRY,o=(1-i*i)/(4*Math.PI*(1+i*i-2*i*t)**1.5);return s.rayleighPerM*e+s.aerosolPerM*p.AEROSOL_SINGLE_SCATTERING_ALBEDO*o}static efficacy(s){return 683*Math.max(0,L.colourMatching(s)[1])}static colourOf(s){const[t,e,i]=L.colourMatching(s);if(e<=0)return[0,0,0];const o=L.linearSrgbOf([t/e,1,i/e]).map(h=>Math.max(0,h)),c=.2126*o[0]+.7152*o[1]+.0722*o[2];return o.map(h=>h/c)}static luminanceCdM2(s,t,e,i,o){return p.efficacy(t)*s*e/(i*Math.max(o,.001))}}class g{static MAX_SEGMENTS=12e3;static MIN_PIXELS=2;static VERTICES_PER_SEGMENT=24;static HALO_RAD=.002;static HALO_SHARE=.15;static BRIGHTEST_RELATIVE=6e4;group=new X;mesh;positions=new Float32Array(g.MAX_SEGMENTS*g.VERTICES_PER_SEGMENT*3);colors=new Float32Array(g.MAX_SEGMENTS*g.VERTICES_PER_SEGMENT*3);segments=0;drawn=[];cut;constructor(){const s=new m;s.setAttribute("position",new H(this.positions,3)),s.setAttribute("color",new H(this.colors,3)),s.setDrawRange(0,0),this.mesh=new U(s,new F({vertexColors:!0,transparent:!0,blending:k,depthWrite:!1,fog:!1,side:Y})),this.mesh.frustumCulled=!1,this.mesh.renderOrder=8,this.mesh.name="beams",this.group.name="beams",this.group.add(this.mesh)}get segmentCount(){return this.segments}update(s,t,e){const i=this.viewsOf(s,t,e);let o=0;this.segments=0,this.drawn=[];for(const h of i){const M=p.colourOf(h.wavelengthNm),a=this.place(h,e);this.drawn.push({id:h.id,points:a});for(let u=0;u+1<a.length&&!(this.segments>=g.MAX_SEGMENTS);u++){const f=this.pushSegment(o,a[u],a[u+1],h.wavelengthNm,M,e);f>o&&this.segments++,o=f}}const c=this.mesh.geometry;c.setDrawRange(0,o);for(const h of["position","color"]){const M=c.getAttribute(h);M.clearUpdateRanges(),o>0&&M.addUpdateRange(0,o*3),M.needsUpdate=!0}}viewsOf(s,t,e){const{lat:i,lng:o}=e.reference;(!this.cut||this.cut.lat!==i||this.cut.lng!==o||this.cut.air!==e.air)&&(this.cut={lat:i,lng:o,air:e.air,views:new Map});const c=this.cut.views;return p.onAt(s,t).map(h=>{let M=c.get(h);return M||c.set(h,M={id:h.id,wavelengthNm:h.wavelengthNm,samples:p.samplesOf(h,e.reference,e.air)}),M})}place(s,t){const e=[];for(const i of s.samples){const o=t.origin.x+i.eastM*t.eastScale,c=t.origin.z-i.northM,h=i.upM-t.siteElevationM;if(e.length>0&&h<t.groundYAt(o,c))break;e.push({x:o,y:h,z:c,altitudeM:i.altitudeM,widthM:i.widthM,powerW:i.powerW})}return e}static SMOOTH_RATIO=1.08;static MAX_HALVINGS=6;pushSegment(s,t,e,i,o,c,h=0){const M={x:e.x-t.x,y:e.y-t.y,z:e.z-t.z},a=Math.hypot(M.x,M.y,M.z);if(a<1e-6)return s;const u={x:M.x/a,y:M.y/a,z:M.z/a};if(Math.hypot((t.x+e.x)/2-c.eye.x,(t.y+e.y)/2-c.eye.y,(t.z+e.z)/2-c.eye.z)<.001)return s;const f=n=>{const y={x:c.eye.x-n.x,y:c.eye.y-n.y,z:c.eye.z-n.z},w=Math.hypot(y.x,y.y,y.z)||.001,z=(u.x*y.x+u.y*y.y+u.z*y.z)/w,l=Math.sqrt(Math.max(0,1-z*z)),T=p.phasedScattering(p.coefficientsAt(c.air,i,n.altitudeM),z);return{sinTurn:l,scattered:T,through:c.transmittanceTo(n.x,n.y,n.z)}},S=n=>g.MIN_PIXELS*c.pixelRad*Math.hypot(n.x-c.eye.x,n.y-c.eye.y,n.z-c.eye.z),G=n=>Math.hypot(n.x-c.eye.x,n.y-c.eye.y,n.z-c.eye.z),E=n=>Math.max(n.widthM,g.HALO_RAD*G(n)),x=n=>{const y=E(n)/S(n),w=Math.min(1,Math.max(0,y-1));return g.HALO_SHARE*w*w*(3-2*w)},d=new Map([t,e].map(n=>[n,f(n)])),r=(n,y,w)=>{const z=Math.max(y,S(n)),{sinTurn:l,scattered:T,through:R}=d.get(n),N=2*w*p.luminanceCdM2(n.powerW,i,T,z,l),P=o.map((V,W)=>Math.min(g.BRIGHTEST_RELATIVE,N*c.relativeScale*V*R[W])),_={x:c.eye.x-n.x,y:c.eye.y-n.y,z:c.eye.z-n.z},D=this.normalise(this.cross(u,_));return{point:n,half:z/2,level:P,across:D}},A=[[r(t,t.widthM,1-x(t)),r(e,e.widthM,1-x(e))],[r(t,E(t),x(t)),r(e,E(e),x(e))]],[O,I]=A[0].map(n=>Math.max(...n.level));if(h<g.MAX_HALVINGS&&Math.max(O,I)>g.SMOOTH_RATIO*Math.max(Math.min(O,I),1e-12)){const n={x:(t.x+e.x)/2,y:(t.y+e.y)/2,z:(t.z+e.z)/2,altitudeM:(t.altitudeM+e.altitudeM)/2,widthM:(t.widthM+e.widthM)/2,powerW:Math.sqrt(t.powerW*e.powerW)};return this.pushSegment(this.pushSegment(s,t,n,i,o,c,h+1),n,e,i,o,c,h+1)}if((s+g.VERTICES_PER_SEGMENT)*3>this.positions.length)return s;for(const n of A){if(n.every(l=>Math.max(...l.level)<=0))continue;const y=(l,T)=>{const R=s*3;this.positions[R]=l.point.x+l.across.x*l.half*T,this.positions[R+1]=l.point.y+l.across.y*l.half*T,this.positions[R+2]=l.point.z+l.across.z*l.half*T;const N=T===0?1:0;this.colors[R]=l.level[0]*N,this.colors[R+1]=l.level[1]*N,this.colors[R+2]=l.level[2]*N,s++},[w,z]=n;for(const l of[-1,1])y(w,l),y(w,0),y(z,l),y(w,0),y(z,0),y(z,l)}return s}pickAt(s,t,e){let i;for(const o of this.drawn)for(let c=0;c+1<o.points.length;c++){const h=o.points[c],M=o.points[c+1],a={x:M.x-h.x,y:M.y-h.y,z:M.z-h.z},u={x:h.x-s.x,y:h.y-s.y,z:h.z-s.z},f=a.x*a.x+a.y*a.y+a.z*a.z,S=a.x*t.x+a.y*t.y+a.z*t.z,G=a.x*u.x+a.y*u.y+a.z*u.z,E=t.x*u.x+t.y*u.y+t.z*u.z,x=f-S*S,d=x>1e-9?Math.min(1,Math.max(0,(S*E-G)/x)):0,r={x:h.x+a.x*d,y:h.y+a.y*d,z:h.z+a.z*d},A=(r.x-s.x)*t.x+(r.y-s.y)*t.y+(r.z-s.z)*t.z;if(A<=0)continue;const O=Math.hypot(r.x-s.x-t.x*A,r.y-s.y-t.y*A,r.z-s.z-t.z*A),I=Math.atan2(O,A);I<=e&&(!i||I<i.angle)&&(i={id:o.id,distanceM:Math.hypot(r.x-s.x,r.y-s.y,r.z-s.z),angle:I})}return i&&{id:i.id,distanceM:i.distanceM}}cross(s,t){return{x:s.y*t.z-s.z*t.y,y:s.z*t.x-s.x*t.z,z:s.x*t.y-s.y*t.x}}normalise(s){const t=Math.hypot(s.x,s.y,s.z)||1;return{x:s.x/t,y:s.y/t,z:s.z/t}}dispose(){this.mesh.geometry.dispose(),this.mesh.material.dispose(),this.group.removeFromParent()}}export{g as BeamSystem};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class t{static FORMATION_S=.3;static VORTEX_SPREAD=2;static VORTEX_S=150;static RICHARDSON_M_PER_S15=800/3600**1.5;static DIFFUSING_S=600;static TYPICAL_SHEAR_PER_S=.003;static INITIAL_DEPTH_M=150;static DEEPENING_M_PER_S=.1;static YOUNG_OPTICAL_DEPTH=.5;static DILUTION_EXPONENT=.5;static SUBLIMATION_S=600;static INVISIBLE=.006;static MIN_LIFETIME_S=15;static LIFETIME_SPAN_S=120;static widthM(I,s,_=t.TYPICAL_SHEAR_PER_S){const E=Math.max(0,s),S=I*(1+(t.VORTEX_SPREAD-1)*(1-Math.exp(-((E/t.VORTEX_S)**2)))),c=_*(t.INITIAL_DEPTH_M*E+t.DEEPENING_M_PER_S*E*E/2),e=t.RICHARDSON_M_PER_S15*E**1.5;return Math.hypot(S+c,e)}static profileExponent(I){return 2+6*Math.exp(-((Math.max(0,I)/t.DIFFUSING_S)**2))}static lifetimeS(I){const s=Math.min(1,Math.max(0,I));return t.MIN_LIFETIME_S+t.LIFETIME_SPAN_S*s*s}static opacity(I,s){if(I<t.FORMATION_S)return 0;const _=s.spanM*t.VORTEX_SPREAD,E=e=>Math.max(_,t.widthM(s.spanM,e,s.shearPerS));let S;if(s.persistent){const e=Math.min(I,s.saturatedForS??1/0);S=t.YOUNG_OPTICAL_DEPTH*(_/E(e))**t.DILUTION_EXPONENT;const M=I-e;M>0&&(S*=E(e)/E(I)*Math.max(0,1-M/t.SUBLIMATION_S)**2)}else{if(I>=s.lifetimeS)return 0;S=t.YOUNG_OPTICAL_DEPTH*(_/E(I))*(1-I/s.lifetimeS)**2}const c=1-Math.exp(-S);return c<t.INVISIBLE?0:c}}export{t as C};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{G as F,B as m,h as I,b as X,N as B,O as D}from"./rr0-sighting.mjs";import{C as x}from"./ContrailGrowth-DwHS8If9.js";class h{static MAX_SEGMENTS=8e3;static MIN_PIXELS=2;static UNRESOLVED_CONTRAST=.5;static STATIONS=[0,.5,1,1.5,2.25];static VERTICES_PER_SEGMENT=12*(h.STATIONS.length-1);static ICE_ASYMMETRY=.75;static phase(t){const s=h.ICE_ASYMMETRY;return(1-s*s)/(1+s*s-2*s*t)**1.5}object;group=new F;trails=[];positions=new Float32Array(h.MAX_SEGMENTS*h.VERTICES_PER_SEGMENT*3);colors=new Float32Array(h.MAX_SEGMENTS*h.VERTICES_PER_SEGMENT*4);segments=0;constructor(){const t=new m;t.setAttribute("position",new I(this.positions,3)),t.setAttribute("color",new I(this.colors,4)),t.setDrawRange(0,0),this.object=new X(t,new B({vertexColors:!0,transparent:!0,depthWrite:!1,side:D})),this.object.frustumCulled=!1,this.object.name="contrails",this.group.name="contrails",this.group.add(this.object)}get segmentCount(){return this.segments}set(t){this.trails=t}update(t,s,c){let p=0;this.segments=0;for(const o of this.trails){const u=this.samplesOf(o,t,s),i=c(o.id);for(let a=0;a+1<u.length;a++){const n=u[a],M=u[a+1];if(!n.forms||!M.forms)continue;if(this.segments>=h.MAX_SEGMENTS)break;const d=this.pushSegment(p,n,M,o.spanM,i,s);d>p&&this.segments++,p=d}}const y=this.object.geometry;y.setDrawRange(0,p);for(const[o,u]of[["position",3],["color",4]]){const i=y.getAttribute(o);i.clearUpdateRanges(),p>0&&i.addUpdateRange(0,p*u),i.needsUpdate=!0}}samplesOf(t,s,c){const p=s-x.FORMATION_S*1e3,y=[],o=(n,M,d,T,l,N)=>({x:M+n.driftEastMs*l+c.origin.x,y:T,z:-(d+n.driftNorthMs*l)+c.origin.z,age:l,forms:N,point:n});let u=-1;t.points.forEach((n,M)=>{n.tMs>p||(u=M,y.push(o(n,n.eastM,n.northM,n.upM,(s-n.tMs)/1e3,n.forms)))});const i=t.points[u],a=t.points[u+1];if(i&&a){const n=(p-i.tMs)/(a.tMs-i.tMs),M=(d,T)=>d+(T-d)*n;y.push(o(i,M(i.eastM,a.eastM),M(i.northM,a.northM),M(i.upM,a.upM),x.FORMATION_S,i.forms&&a.forms))}return y}pushSegment(t,s,c,p,y,o){const u=e=>({persistent:e.point.persistent,lifetimeS:e.point.lifetimeS,spanM:p,shearPerS:e.point.shearPerS,saturatedForS:e.point.saturatedForS}),i=x.opacity(s.age,u(s)),a=x.opacity(c.age,u(c));if(i<=0&&a<=0)return t;const n={x:c.x-s.x,y:c.y-s.y,z:c.z-s.z};if(Math.hypot(n.x,n.y,n.z)<1e-6)return t;const M={x:(s.x+c.x)/2-o.eye.x,y:(s.y+c.y)/2-o.eye.y,z:(s.z+c.z)/2-o.eye.z},d=this.normalise(this.cross(n,M)),T=e=>{if(!o.sun)return y;const r={x:e.x-o.eye.x,y:e.y-o.eye.y,z:e.z-o.eye.z},E=h.phase((o.sun.x*r.x+o.sun.y*r.y+o.sun.z*r.z)/(Math.hypot(r.x,r.y,r.z)||1));return[y[0]*E,y[1]*E,y[2]*E]},l=(e,r)=>{const E=Math.hypot(e.x-o.eye.x,e.y-o.eye.y,e.z-o.eye.z),A=x.widthM(p,e.age,e.point.shearPerS),g=Math.max(A,h.MIN_PIXELS*o.pixelRad*E),z=r*(A/g)**h.UNRESOLVED_CONTRAST,S=x.profileExponent(e.age),G=h.STATIONS.map((j,P)=>P===h.STATIONS.length-1?0:z*Math.exp(-Math.LN2*j**S));return{half:g/2,profile:G,scattered:T(e)}},N=[{sample:s,...l(s,i)},{sample:c,...l(c,a)}],w=h.STATIONS.length-1,f=(e,r,E)=>{const A=h.STATIONS[r],g=e.half*A*E,z=t*3;this.positions[z]=e.sample.x+d.x*g,this.positions[z+1]=e.sample.y+d.y*g,this.positions[z+2]=e.sample.z+d.z*g;const S=t*4;this.colors[S]=e.scattered[0],this.colors[S+1]=e.scattered[1],this.colors[S+2]=e.scattered[2],this.colors[S+3]=e.profile[r],t++},[O,R]=N;for(const e of[-1,1])for(let r=0;r<w;r++)f(O,r+1,e),f(O,r,e),f(R,r+1,e),f(O,r,e),f(R,r,e),f(R,r+1,e);return t}cross(t,s){return{x:t.y*s.z-t.z*s.y,y:t.z*s.x-t.x*s.z,z:t.x*s.y-t.y*s.x}}normalise(t){const s=Math.hypot(t.x,t.y,t.z)||1;return{x:t.x/s,y:t.y/s,z:t.z/s}}dispose(){this.object.geometry.dispose(),this.object.material.dispose(),this.group.removeFromParent()}}export{h as ContrailSystem};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as a,D as o}from"./rr0-sighting.mjs";const l={bodies:{sun:"Sol",moon:"Luna",Venus:"Venus",Mars:"Marte",Jupiter:"Júpiter",Saturn:"Saturno"},stars:{Sirius:"Sirio",Canopus:"Canopo",Arcturus:"Arturo",Capella:"Capela",Procyon:"Proción",Aldebaran:"Aldebarán",Spica:"Espiga",Pollux:"Pólux",Castor:"Cástor",Regulus:"Régulo"},comets:{"halley-1910":"cometa Halley","brooks-1911":"cometa Brooks","skjellerup-maristany-1927":"cometa Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"cometa de Kock-Paraskevopoulos","southern-1947":"cometa austral","eclipse-1948":"cometa del eclipse","arend-roland-1957":"cometa Arend-Roland","mrkos-1957":"cometa Mrkos","seki-lines-1962":"cometa Seki-Lines","ikeya-seki-1965":"cometa Ikeya-Seki","bennett-1970":"cometa Bennett","white-ortiz-bolelli-1970":"cometa White-Ortiz-Bolelli","kohoutek-1973":"cometa Kohoutek","west-1976":"cometa West","iras-araki-alcock-1983":"cometa IRAS-Araki-Alcock","halley-1986":"cometa Halley","hyakutake-1996":"cometa Hyakutake","hale-bopp-1997":"cometa Hale-Bopp","mcnaught-2007":"cometa McNaught","lovejoy-2011":"cometa Lovejoy","panstarrs-2013":"cometa PANSTARRS","neowise-2020":"cometa NEOWISE","tsuchinshan-atlas-2024":"cometa Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova de 1006","sn-1054":"supernova de 1054","sn-1181":"supernova de 1181","sn-1572":"supernova de Tycho","sn-1604":"supernova de Kepler","t-crb-1866":"nova de la Corona Boreal 1866","t-aur-1891":"nova de Auriga 1891","gk-per-1901":"nova de Perseo 1901","dn-gem-1912":"nova de Géminis 1912","v603-aql-1918":"nova del Águila 1918","v476-cyg-1920":"nova del Cisne 1920","rr-pic-1925":"nova del Pintor 1925","dq-her-1934":"nova de Hércules 1934","cp-lac-1936":"nova del Lagarto 1936","cp-pup-1942":"nova de la Popa 1942","t-crb-1946":"nova de la Corona Boreal 1946","v446-her-1960":"nova de Hércules 1960","v533-her-1963":"nova de Hércules 1963","hr-del-1967":"nova del Delfín 1967","lv-vul-1968":"nova de la Zorra 1968","fh-ser-1970":"nova de la Serpiente 1970","v1500-cyg-1975":"nova del Cisne 1975","v842-cen-1986":"nova del Centauro 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova del Cisne 1992","v382-vel-1999":"nova de las Velas 1999","v1494-aql-1999":"nova del Águila 1999","v4743-sgr-2002":"nova de Sagitario 2002","rs-oph-2006":"nova de Ofiuco 2006","v1280-sco-2007":"nova de Escorpio 2007","v339-del-2013":"nova del Delfín 2013","v1369-cen-2013":"nova del Centauro 2013","rs-oph-2021":"nova de Ofiuco 2021"},satelliteClasses:{echo:"los globos Echo","iridium-flares":"los destellos de los Iridium",iss:"la Estación Espacial Internacional","starlink-trains":"los trenes de Starlink"},showers:{quadrantids:"Cuadrántidas",lyrids:"Líridas de abril","eta-aquariids":"Eta Acuáridas","alpha-capricornids":"Alfa Capricórnidas","southern-delta-aquariids":"Delta Acuáridas del Sur",perseids:"Perseidas","southern-taurids":"Táuridas del Sur",draconids:"Dracónidas de octubre",orionids:"Oriónidas","northern-taurids":"Táuridas del Norte",leonids:"Leónidas",geminids:"Gemínidas",ursids:"Úrsidas"},lightRigs:{airliner:"Avión de pasajeros",helicopter:"Helicóptero","car-headlights":"Coche, faros encendidos","car-hazards":"Coche, luces de emergencia","emergency-beacons":"Rotativos de vehículo de emergencia","traffic-signal":"Semáforo","pedestrian-signal":"Semáforo peatonal",streetlamp:"Farola"},instruments:{eye:"A simple vista","rectilinear-lens":"Cámara, modelo desconocido","roamer-1-120":"Roamer 1, película 120","instamatic-126":"Instamatic, película 126","slr-35mm-50":"Réflex 35 mm, objetivo 50 mm","slr-35mm-zoom":"Réflex 35 mm, zoom 70-210 mm","phone-landscape":"Teléfono, en horizontal","phone-portrait":"Teléfono, en vertical",...o.names(),...a.names()},decorKinds:{building:"Edificio",tree:"Árbol",shrub:"Arbusto",bridge:"Puente",wire:"Línea aérea",crop:"Hilera de cultivo",terrace:"Bancal (terraza)",mound:"Montón de piedras",wall:"Muro de piedra seca",streetlight:"Farola",trafficlight:"Semáforo",crossing:"Paso de peatones",roadsign:"Señal de tráfico",vehicle:"Vehículo",observer:"Observador",aircraft:"Aeronave",entity:"Ser"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:e=>`al ${e}`,starTooltip:"{name} — mag {mag}, {alt}° sobre el horizonte",starTooltipBelow:"{name} — mag {mag}, {alt}° bajo la horizontal",decorTooltip:"{name} — {size}, a {distance}",satelliteTooltip:"{name} — satélite, mag {mag}, a {height} km de altitud",opticsTooltips:{halo22:"Halo de 22° — un anillo alrededor del Sol, por luz desviada en cristales de hielo hexagonales de los cirros; su borde interior es rojo, a 21,7°",halo46:"Halo de 46° — un anillo más raro y débil: la luz entra por una cara lateral del cristal y sale por una cara del extremo",oddRadius:"Halo de {angle}° — un anillo de radio impar, raro y débil, hecho por cristales de hielo con extremos piramidales",parhelion:"Parhelio — una mancha brillante de colores junto al Sol, a su altura, por placas de hielo que caen planas; rojo hacia el Sol",parhelion120:"Parhelio de 120° — una mancha blanca débil a 120° del Sol, por luz reflejada dentro de placas planas",upperTangentArc:"Arco tangente superior — un arco brillante apoyado sobre el halo de 22°, por columnas tumbadas en horizontal",lowerTangentArc:"Arco tangente inferior — un arco que toca la base del halo de 22°, por columnas tumbadas en horizontal",circumzenithal:"Arco circuncenital — una banda de colores vivos cerca del cenit, por luz que entra por la cara superior de placas planas (solo con el Sol bajo 32°)",circumhorizontal:"Arco circunhorizontal — una banda de colores baja en el cielo, por luz que entra por la cara lateral de placas planas (solo con el Sol sobre 58°)",parhelicCircle:"Círculo parhélico — un círculo blanco alrededor de todo el cielo a la altura del Sol, por reflejos en las caras verticales de placas planas",pillar:"Pilar de luz — una columna de luz sobre el Sol, por reflejos en placas planas ligeramente inclinadas",subsun:"Subsol — una imagen del Sol bajo el horizonte, por reflejos en las caras planas de las placas"},trafficTooltip:{unnamed:"Aeronave {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"rumbo {value}°",position:"a {distance} km, {elevation}° sobre el horizonte, {bearing}",heard:"Se oye a {level} dB(A), salió del avión hace {delay} s, {lag}° detrás de él: {character}{pitch}",rumble:"un rumor grave, nada por encima de {cutoff} Hz",muffled:"un ruido sordo, nada por encima de {cutoff} Hz",broad:"un rugido ancho",pitchHigher:", sonido {percent} % más agudo",pitchLower:", sonido {percent} % más grave",inaudible:"Inaudible aquí: {level} dB(A) frente a {ambient} dB(A) de ruido ambiente",soundUnknown:"Sonido no calculable: el avión aún no estaba registrado cuando salió",contrailPersistent:"Deja una estela que dura: el aire está sobresaturado respecto al hielo ({rhi} % respecto al hielo)",contrailShort:"Deja una estela breve: el aire está seco respecto al hielo ({rhi} % respecto al hielo)",military:"militar",restricted:"identidad oculta por su propietario",candidate:"Un candidato compatible, no una identificación"},railwayTooltip:{kinds:{rail:"Vía férrea",light_rail:"Metro ligero",tram:"Tranvía",subway:"Metro",funicular:"Funicular"},highSpeed:"Línea de alta velocidad",service:"Vía de servicio",singleTrack:"vía única",tracks:"{count} vías",overhead:"catenaria, hilo de contacto a {height} m sobre el carril",overheadVoltage:"catenaria a {voltage}, hilo de contacto a {height} m sobre el carril",thirdRail:"tercer carril",thirdRailVoltage:"tercer carril a {voltage}",notElectrified:"sin electrificar",gauge:"ancho de {mm} mm",metreGauge:"vía métrica",distance:"a {distance}"},credits:"Créditos",notAVideo:"Esto no es un vídeo",isASimulation:"Es una simulación en tiempo real."};export{l as sceneNames_es};
|
|
1
|
+
import{V as a,D as o}from"./rr0-sighting.mjs";const l={bodies:{sun:"Sol",moon:"Luna",Venus:"Venus",Mars:"Marte",Jupiter:"Júpiter",Saturn:"Saturno"},stars:{Sirius:"Sirio",Canopus:"Canopo",Arcturus:"Arturo",Capella:"Capela",Procyon:"Proción",Aldebaran:"Aldebarán",Spica:"Espiga",Pollux:"Pólux",Castor:"Cástor",Regulus:"Régulo"},comets:{"halley-1910":"cometa Halley","brooks-1911":"cometa Brooks","skjellerup-maristany-1927":"cometa Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"cometa de Kock-Paraskevopoulos","southern-1947":"cometa austral","eclipse-1948":"cometa del eclipse","arend-roland-1957":"cometa Arend-Roland","mrkos-1957":"cometa Mrkos","seki-lines-1962":"cometa Seki-Lines","ikeya-seki-1965":"cometa Ikeya-Seki","bennett-1970":"cometa Bennett","white-ortiz-bolelli-1970":"cometa White-Ortiz-Bolelli","kohoutek-1973":"cometa Kohoutek","west-1976":"cometa West","iras-araki-alcock-1983":"cometa IRAS-Araki-Alcock","halley-1986":"cometa Halley","hyakutake-1996":"cometa Hyakutake","hale-bopp-1997":"cometa Hale-Bopp","mcnaught-2007":"cometa McNaught","lovejoy-2011":"cometa Lovejoy","panstarrs-2013":"cometa PANSTARRS","neowise-2020":"cometa NEOWISE","tsuchinshan-atlas-2024":"cometa Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova de 1006","sn-1054":"supernova de 1054","sn-1181":"supernova de 1181","sn-1572":"supernova de Tycho","sn-1604":"supernova de Kepler","t-crb-1866":"nova de la Corona Boreal 1866","t-aur-1891":"nova de Auriga 1891","gk-per-1901":"nova de Perseo 1901","dn-gem-1912":"nova de Géminis 1912","v603-aql-1918":"nova del Águila 1918","v476-cyg-1920":"nova del Cisne 1920","rr-pic-1925":"nova del Pintor 1925","dq-her-1934":"nova de Hércules 1934","cp-lac-1936":"nova del Lagarto 1936","cp-pup-1942":"nova de la Popa 1942","t-crb-1946":"nova de la Corona Boreal 1946","v446-her-1960":"nova de Hércules 1960","v533-her-1963":"nova de Hércules 1963","hr-del-1967":"nova del Delfín 1967","lv-vul-1968":"nova de la Zorra 1968","fh-ser-1970":"nova de la Serpiente 1970","v1500-cyg-1975":"nova del Cisne 1975","v842-cen-1986":"nova del Centauro 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova del Cisne 1992","v382-vel-1999":"nova de las Velas 1999","v1494-aql-1999":"nova del Águila 1999","v4743-sgr-2002":"nova de Sagitario 2002","rs-oph-2006":"nova de Ofiuco 2006","v1280-sco-2007":"nova de Escorpio 2007","v339-del-2013":"nova del Delfín 2013","v1369-cen-2013":"nova del Centauro 2013","rs-oph-2021":"nova de Ofiuco 2021"},satelliteClasses:{echo:"los globos Echo","iridium-flares":"los destellos de los Iridium",iss:"la Estación Espacial Internacional","starlink-trains":"los trenes de Starlink"},showers:{quadrantids:"Cuadrántidas",lyrids:"Líridas de abril","eta-aquariids":"Eta Acuáridas","alpha-capricornids":"Alfa Capricórnidas","southern-delta-aquariids":"Delta Acuáridas del Sur",perseids:"Perseidas","southern-taurids":"Táuridas del Sur",draconids:"Dracónidas de octubre",orionids:"Oriónidas","northern-taurids":"Táuridas del Norte",leonids:"Leónidas",geminids:"Gemínidas",ursids:"Úrsidas"},lightRigs:{airliner:"Avión de pasajeros",helicopter:"Helicóptero","car-headlights":"Coche, faros encendidos","car-hazards":"Coche, luces de emergencia","emergency-beacons":"Rotativos de vehículo de emergencia","traffic-signal":"Semáforo","pedestrian-signal":"Semáforo peatonal",streetlamp:"Farola"},instruments:{eye:"A simple vista","rectilinear-lens":"Cámara, modelo desconocido","roamer-1-120":"Roamer 1, película 120","instamatic-126":"Instamatic, película 126","slr-35mm-50":"Réflex 35 mm, objetivo 50 mm","slr-35mm-zoom":"Réflex 35 mm, zoom 70-210 mm","phone-landscape":"Teléfono, en horizontal","phone-portrait":"Teléfono, en vertical",...o.names(),...a.names()},decorKinds:{building:"Edificio",tree:"Árbol",shrub:"Arbusto",bridge:"Puente",wire:"Línea aérea",crop:"Hilera de cultivo",terrace:"Bancal (terraza)",mound:"Montón de piedras",wall:"Muro de piedra seca",streetlight:"Farola",trafficlight:"Semáforo",crossing:"Paso de peatones",roadsign:"Señal de tráfico",vehicle:"Vehículo",observer:"Observador",aircraft:"Aeronave",entity:"Ser"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:e=>`al ${e}`,starTooltip:"{name} — mag {mag}, {alt}° sobre el horizonte",starTooltipBelow:"{name} — mag {mag}, {alt}° bajo la horizontal",decorTooltip:"{name} — {size}, a {distance}",satelliteTooltip:"{name} — satélite, mag {mag}, a {height} km de altitud",plumeTooltip:{name:"Estela de cohete",detail:"{name} — {part}, a {distance}, a {height} km de altitud",ascent:"escape del ascenso",burn:"escape de un encendido",vent:"propelentes purgados"},opticsTooltips:{halo22:"Halo de 22° — un anillo alrededor del Sol, por luz desviada en cristales de hielo hexagonales de los cirros; su borde interior es rojo, a 21,7°",halo46:"Halo de 46° — un anillo más raro y débil: la luz entra por una cara lateral del cristal y sale por una cara del extremo",oddRadius:"Halo de {angle}° — un anillo de radio impar, raro y débil, hecho por cristales de hielo con extremos piramidales",parhelion:"Parhelio — una mancha brillante de colores junto al Sol, a su altura, por placas de hielo que caen planas; rojo hacia el Sol",parhelion120:"Parhelio de 120° — una mancha blanca débil a 120° del Sol, por luz reflejada dentro de placas planas",upperTangentArc:"Arco tangente superior — un arco brillante apoyado sobre el halo de 22°, por columnas tumbadas en horizontal",lowerTangentArc:"Arco tangente inferior — un arco que toca la base del halo de 22°, por columnas tumbadas en horizontal",circumzenithal:"Arco circuncenital — una banda de colores vivos cerca del cenit, por luz que entra por la cara superior de placas planas (solo con el Sol bajo 32°)",circumhorizontal:"Arco circunhorizontal — una banda de colores baja en el cielo, por luz que entra por la cara lateral de placas planas (solo con el Sol sobre 58°)",parhelicCircle:"Círculo parhélico — un círculo blanco alrededor de todo el cielo a la altura del Sol, por reflejos en las caras verticales de placas planas",pillar:"Pilar de luz — una columna de luz sobre el Sol, por reflejos en placas planas ligeramente inclinadas",subsun:"Subsol — una imagen del Sol bajo el horizonte, por reflejos en las caras planas de las placas"},trafficTooltip:{unnamed:"Aeronave {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"rumbo {value}°",position:"a {distance} km, {elevation}° sobre el horizonte, {bearing}",heard:"Se oye a {level} dB(A), salió del avión hace {delay} s, {lag}° detrás de él: {character}{pitch}",rumble:"un rumor grave, nada por encima de {cutoff} Hz",muffled:"un ruido sordo, nada por encima de {cutoff} Hz",broad:"un rugido ancho",pitchHigher:", sonido {percent} % más agudo",pitchLower:", sonido {percent} % más grave",inaudible:"Inaudible aquí: {level} dB(A) frente a {ambient} dB(A) de ruido ambiente",soundUnknown:"Sonido no calculable: el avión aún no estaba registrado cuando salió",contrailPersistent:"Deja una estela que dura: el aire está sobresaturado respecto al hielo ({rhi} % respecto al hielo)",contrailShort:"Deja una estela breve: el aire está seco respecto al hielo ({rhi} % respecto al hielo)",military:"militar",restricted:"identidad oculta por su propietario",candidate:"Un candidato compatible, no una identificación"},railwayTooltip:{kinds:{rail:"Vía férrea",light_rail:"Metro ligero",tram:"Tranvía",subway:"Metro",funicular:"Funicular"},highSpeed:"Línea de alta velocidad",service:"Vía de servicio",singleTrack:"vía única",tracks:"{count} vías",overhead:"catenaria, hilo de contacto a {height} m sobre el carril",overheadVoltage:"catenaria a {voltage}, hilo de contacto a {height} m sobre el carril",thirdRail:"tercer carril",thirdRailVoltage:"tercer carril a {voltage}",notElectrified:"sin electrificar",gauge:"ancho de {mm} mm",metreGauge:"vía métrica",distance:"a {distance}"},credits:"Créditos",notAVideo:"Esto no es un vídeo",isASimulation:"Es una simulación en tiempo real."};export{l as sceneNames_es};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as a,D as r}from"./rr0-sighting.mjs";const
|
|
1
|
+
import{V as a,D as r}from"./rr0-sighting.mjs";const t={bodies:{sun:"Soleil",moon:"Lune",Venus:"Vénus",Saturn:"Saturne"},stars:{Betelgeuse:"Bételgeuse",Vega:"Véga",Altair:"Altaïr",Aldebaran:"Aldébaran",Regulus:"Régulus",Antares:"Antarès"},comets:{"halley-1910":"comète de Halley","brooks-1911":"comète Brooks","skjellerup-maristany-1927":"comète Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"comète de Kock-Paraskevopoulos","southern-1947":"comète australe","eclipse-1948":"comète de l'éclipse","arend-roland-1957":"comète Arend-Roland","mrkos-1957":"comète Mrkos","seki-lines-1962":"comète Seki-Lines","ikeya-seki-1965":"comète Ikeya-Seki","bennett-1970":"comète Bennett","white-ortiz-bolelli-1970":"comète White-Ortiz-Bolelli","kohoutek-1973":"comète Kohoutek","west-1976":"comète West","iras-araki-alcock-1983":"comète IRAS-Araki-Alcock","halley-1986":"comète de Halley","hyakutake-1996":"comète Hyakutake","hale-bopp-1997":"comète Hale-Bopp","mcnaught-2007":"comète McNaught","lovejoy-2011":"comète Lovejoy","panstarrs-2013":"comète PANSTARRS","neowise-2020":"comète NEOWISE","tsuchinshan-atlas-2024":"comète Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova de 1006","sn-1054":"supernova de 1054","sn-1181":"supernova de 1181","sn-1572":"supernova de Tycho","sn-1604":"supernova de Kepler","t-crb-1866":"nova de la Couronne boréale 1866","t-aur-1891":"nova du Cocher 1891","gk-per-1901":"nova de Persée 1901","dn-gem-1912":"nova des Gémeaux 1912","v603-aql-1918":"nova de l'Aigle 1918","v476-cyg-1920":"nova du Cygne 1920","rr-pic-1925":"nova du Peintre 1925","dq-her-1934":"nova d'Hercule 1934","cp-lac-1936":"nova du Lézard 1936","cp-pup-1942":"nova de la Poupe 1942","t-crb-1946":"nova de la Couronne boréale 1946","v446-her-1960":"nova d'Hercule 1960","v533-her-1963":"nova d'Hercule 1963","hr-del-1967":"nova du Dauphin 1967","lv-vul-1968":"nova du Petit Renard 1968","fh-ser-1970":"nova du Serpent 1970","v1500-cyg-1975":"nova du Cygne 1975","v842-cen-1986":"nova du Centaure 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova du Cygne 1992","v382-vel-1999":"nova des Voiles 1999","v1494-aql-1999":"nova de l'Aigle 1999","v4743-sgr-2002":"nova du Sagittaire 2002","rs-oph-2006":"nova d'Ophiuchus 2006","v1280-sco-2007":"nova du Scorpion 2007","v339-del-2013":"nova du Dauphin 2013","v1369-cen-2013":"nova du Centaure 2013","rs-oph-2021":"nova d'Ophiuchus 2021"},satelliteClasses:{echo:"les ballons Echo","iridium-flares":"les flashes d'Iridium",iss:"la Station spatiale internationale","starlink-trains":"les trains de Starlink"},showers:{quadrantids:"Quadrantides",lyrids:"Lyrides d'avril","eta-aquariids":"Êta Aquarides","alpha-capricornids":"Alpha Capricornides","southern-delta-aquariids":"Delta Aquarides du Sud",perseids:"Perséides","southern-taurids":"Taurides du Sud",draconids:"Draconides d'octobre",orionids:"Orionides","northern-taurids":"Taurides du Nord",leonids:"Léonides",geminids:"Géminides",ursids:"Ursides"},lightRigs:{airliner:"Avion de ligne",helicopter:"Hélicoptère","car-headlights":"Voiture, phares allumés","car-hazards":"Voiture, feux de détresse","emergency-beacons":"Gyrophares de véhicule d'urgence","traffic-signal":"Feu de circulation","pedestrian-signal":"Feu piéton",streetlamp:"Lampadaire"},instruments:{eye:"Œil nu","rectilinear-lens":"Appareil, modèle inconnu","roamer-1-120":"Roamer 1, film 120","instamatic-126":"Instamatic, film 126","slr-35mm-50":"Reflex 35 mm, objectif 50 mm","slr-35mm-zoom":"Reflex 35 mm, zoom 70-210 mm","phone-landscape":"Téléphone, tenu couché","phone-portrait":"Téléphone, tenu debout",...r.names(),...a.names()},decorKinds:{building:"Bâtiment",tree:"Arbre",shrub:"Buisson",bridge:"Pont",wire:"Ligne aérienne",crop:"Rang de culture",terrace:"Restanque (terrasse)",mound:"Tas de pierres",wall:"Muret de pierres sèches",streetlight:"Lampadaire",trafficlight:"Feu de circulation",crossing:"Passage piéton",roadsign:"Panneau de signalisation",vehicle:"Véhicule",observer:"Observateur",aircraft:"Aéronef",entity:"Être"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:e=>/^[EO]/.test(e)?`à l'${e}`:`au ${e}`,starTooltip:"{name} — mag {mag}, {alt}° au-dessus de l'horizon",starTooltipBelow:"{name} — mag {mag}, {alt}° sous l'horizontale",decorTooltip:"{name} — {size}, à {distance}",satelliteTooltip:"{name} — satellite, mag {mag}, à {height} km d'altitude",plumeTooltip:{name:"Panache de fusée",detail:"{name} — {part}, à {distance}, à {height} km d'altitude",ascent:"échappement de la montée",burn:"échappement d'un allumage",vent:"ergols vidangés"},opticsTooltips:{halo22:"Halo de 22° — un anneau autour du Soleil, dû à la lumière déviée par des cristaux de glace hexagonaux dans les cirrus ; son bord interne est rouge, à 21,7°",halo46:"Halo de 46° — un anneau plus rare et plus faible : la lumière entre par une face latérale d'un cristal et sort par une face de bout",oddRadius:"Halo de {angle}° — un anneau à rayon impair, rare et faible, dû à des cristaux de glace à bouts pyramidaux",parhelion:"Parhélie — une tache brillante colorée à côté du Soleil, à sa hauteur, due à des plaquettes de glace tombant à plat ; rouge côté Soleil",parhelion120:"Parhélie à 120° — une faible tache blanche à 120° du Soleil, due à la lumière réfléchie à l'intérieur de plaquettes à plat",upperTangentArc:"Arc tangent supérieur — un arc brillant posé sur le haut du halo de 22°, dû à des colonnes couchées à l'horizontale",lowerTangentArc:"Arc tangent inférieur — un arc touchant le bas du halo de 22°, dû à des colonnes couchées à l'horizontale",circumzenithal:"Arc circumzénithal — une bande vivement colorée près du zénith, due à la lumière entrant par la face du dessus de plaquettes à plat (seulement Soleil sous 32°)",circumhorizontal:"Arc circumhorizontal — une bande colorée basse dans le ciel, due à la lumière entrant par la face latérale de plaquettes à plat (seulement Soleil au-dessus de 58°)",parhelicCircle:"Cercle parhélique — un cercle blanc faisant tout le tour du ciel à la hauteur du Soleil, dû aux reflets sur les faces verticales de plaquettes à plat",pillar:"Pilier de lumière — une colonne de lumière dressée au-dessus du Soleil, due aux reflets sur des plaquettes à plat légèrement inclinées",subsun:"Sous-soleil — une image du Soleil sous l'horizon, due aux reflets sur les faces plates de plaquettes"},trafficTooltip:{unnamed:"Aéronef {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"cap {value}°",position:"à {distance} km, {elevation}° au-dessus de l'horizon, {bearing}",heard:"Entendu à {level} dB(A), parti de l'avion il y a {delay} s, {lag}° derrière lui : {character}{pitch}",rumble:"un grondement grave, rien au-delà de {cutoff} Hz",muffled:"un bruit sourd, rien au-delà de {cutoff} Hz",broad:"un souffle large",pitchHigher:", son plus aigu de {percent} %",pitchLower:", son plus grave de {percent} %",inaudible:"Inaudible ici : {level} dB(A) contre {ambient} dB(A) de bruit ambiant",soundUnknown:"Son non calculable : l'avion n'était pas encore enregistré quand il est parti",contrailPersistent:"Laisse une traînée qui dure : l'air est sursaturé en glace ({rhi} % par rapport à la glace)",contrailShort:"Laisse une traînée brève : l'air est sec par rapport à la glace ({rhi} % par rapport à la glace)",military:"militaire",restricted:"identité masquée par son propriétaire",candidate:"Un candidat compatible, pas une identification"},railwayTooltip:{kinds:{rail:"Voie ferrée",light_rail:"Métro léger",tram:"Tramway",subway:"Métro",funicular:"Funiculaire"},highSpeed:"Ligne à grande vitesse",service:"Voie de service",singleTrack:"voie unique",tracks:"{count} voies",overhead:"caténaire, fil de contact à {height} m au-dessus du rail",overheadVoltage:"caténaire en {voltage}, fil de contact à {height} m au-dessus du rail",thirdRail:"troisième rail",thirdRailVoltage:"troisième rail en {voltage}",notElectrified:"non électrifiée",gauge:"écartement de {mm} mm",metreGauge:"voie métrique",distance:"à {distance}"},credits:"Crédits",notAVideo:"Ceci n'est pas une vidéo",isASimulation:"C'est une simulation en temps réel."};export{t as sceneNames_fr};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as e,D as o}from"./rr0-sighting.mjs";const l={bodies:{sun:"Sole",moon:"Luna",Venus:"Venere",Mars:"Marte",Jupiter:"Giove",Saturn:"Saturno"},stars:{Sirius:"Sirio",Canopus:"Canopo",Arcturus:"Arturo",Procyon:"Procione",Pollux:"Polluce",Castor:"Castore",Regulus:"Regolo"},comets:{"halley-1910":"cometa di Halley","brooks-1911":"cometa Brooks","skjellerup-maristany-1927":"cometa Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"cometa de Kock-Paraskevopoulos","southern-1947":"cometa australe","eclipse-1948":"cometa dell'eclisse","arend-roland-1957":"cometa Arend-Roland","mrkos-1957":"cometa Mrkos","seki-lines-1962":"cometa Seki-Lines","ikeya-seki-1965":"cometa Ikeya-Seki","bennett-1970":"cometa Bennett","white-ortiz-bolelli-1970":"cometa White-Ortiz-Bolelli","kohoutek-1973":"cometa Kohoutek","west-1976":"cometa West","iras-araki-alcock-1983":"cometa IRAS-Araki-Alcock","halley-1986":"cometa di Halley","hyakutake-1996":"cometa Hyakutake","hale-bopp-1997":"cometa Hale-Bopp","mcnaught-2007":"cometa McNaught","lovejoy-2011":"cometa Lovejoy","panstarrs-2013":"cometa PANSTARRS","neowise-2020":"cometa NEOWISE","tsuchinshan-atlas-2024":"cometa Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova del 1006","sn-1054":"supernova del 1054","sn-1181":"supernova del 1181","sn-1572":"supernova di Tycho","sn-1604":"supernova di Keplero","t-crb-1866":"nova della Corona Boreale 1866","t-aur-1891":"nova dell'Auriga 1891","gk-per-1901":"nova di Perseo 1901","dn-gem-1912":"nova dei Gemelli 1912","v603-aql-1918":"nova dell'Aquila 1918","v476-cyg-1920":"nova del Cigno 1920","rr-pic-1925":"nova del Pittore 1925","dq-her-1934":"nova di Ercole 1934","cp-lac-1936":"nova della Lucertola 1936","cp-pup-1942":"nova della Poppa 1942","t-crb-1946":"nova della Corona Boreale 1946","v446-her-1960":"nova di Ercole 1960","v533-her-1963":"nova di Ercole 1963","hr-del-1967":"nova del Delfino 1967","lv-vul-1968":"nova della Volpetta 1968","fh-ser-1970":"nova del Serpente 1970","v1500-cyg-1975":"nova del Cigno 1975","v842-cen-1986":"nova del Centauro 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova del Cigno 1992","v382-vel-1999":"nova delle Vele 1999","v1494-aql-1999":"nova dell'Aquila 1999","v4743-sgr-2002":"nova del Sagittario 2002","rs-oph-2006":"nova di Ofiuco 2006","v1280-sco-2007":"nova dello Scorpione 2007","v339-del-2013":"nova del Delfino 2013","v1369-cen-2013":"nova del Centauro 2013","rs-oph-2021":"nova di Ofiuco 2021"},satelliteClasses:{echo:"i palloni Echo","iridium-flares":"i lampi degli Iridium",iss:"la Stazione Spaziale Internazionale","starlink-trains":"i treni di Starlink"},showers:{quadrantids:"Quadrantidi",lyrids:"Liridi di aprile","eta-aquariids":"Eta Aquaridi","alpha-capricornids":"Alfa Capricornidi","southern-delta-aquariids":"Delta Aquaridi australi",perseids:"Perseidi","southern-taurids":"Tauridi australi",draconids:"Draconidi di ottobre",orionids:"Orionidi","northern-taurids":"Tauridi boreali",leonids:"Leonidi",geminids:"Geminidi",ursids:"Ursidi"},lightRigs:{airliner:"Aereo di linea",helicopter:"Elicottero","car-headlights":"Auto, fari accesi","car-hazards":"Auto, luci di emergenza","emergency-beacons":"Lampeggianti di veicolo di soccorso","traffic-signal":"Semaforo","pedestrian-signal":"Semaforo pedonale",streetlamp:"Lampione"},instruments:{eye:"Occhio nudo","rectilinear-lens":"Fotocamera, modello sconosciuto","roamer-1-120":"Roamer 1, pellicola 120","instamatic-126":"Instamatic, pellicola 126","slr-35mm-50":"Reflex 35 mm, obiettivo 50 mm","slr-35mm-zoom":"Reflex 35 mm, zoom 70-210 mm","phone-landscape":"Telefono, in orizzontale","phone-portrait":"Telefono, in verticale",...o.names(),...e.names()},decorKinds:{building:"Edificio",tree:"Albero",shrub:"Arbusto",bridge:"Ponte",wire:"Linea aerea",crop:"Filare di coltura",terrace:"Terrazzamento",mound:"Mucchio di pietre",wall:"Muretto a secco",streetlight:"Lampione",trafficlight:"Semaforo",crossing:"Attraversamento pedonale",roadsign:"Segnale stradale",vehicle:"Veicolo",observer:"Osservatore",aircraft:"Aeromobile",entity:"Essere"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:a=>`verso ${a}`,starTooltip:"{name} — mag {mag}, {alt}° sopra l'orizzonte",starTooltipBelow:"{name} — mag {mag}, {alt}° sotto l'orizzontale",decorTooltip:"{name} — {size}, a {distance}",satelliteTooltip:"{name} — satellite, mag {mag}, a {height} km di quota",opticsTooltips:{halo22:"Alone di 22° — un anello attorno al Sole, dovuto alla luce deviata da cristalli di ghiaccio esagonali nei cirri; il bordo interno è rosso, a 21,7°",halo46:"Alone di 46° — un anello più raro e debole: la luce entra da una faccia laterale del cristallo ed esce da una faccia di estremità",oddRadius:"Alone di {angle}° — un anello a raggio dispari, raro e debole, prodotto da cristalli di ghiaccio con estremità piramidali",parhelion:"Parelio — una macchia luminosa colorata accanto al Sole, alla sua altezza, da lastrine di ghiaccio che cadono piatte; rosso verso il Sole",parhelion120:"Parelio di 120° — una debole macchia bianca a 120° dal Sole, da luce riflessa dentro lastrine piatte",upperTangentArc:"Arco tangente superiore — un arco luminoso appoggiato sull'alone di 22°, da colonne coricate in orizzontale",lowerTangentArc:"Arco tangente inferiore — un arco che tocca la base dell'alone di 22°, da colonne coricate in orizzontale",circumzenithal:"Arco circumzenitale — una banda di colori vivi vicino allo zenit, da luce che entra dalla faccia superiore di lastrine piatte (solo con il Sole sotto i 32°)",circumhorizontal:"Arco circumorizzontale — una banda colorata bassa nel cielo, da luce che entra dalla faccia laterale di lastrine piatte (solo con il Sole sopra i 58°)",parhelicCircle:"Cerchio parelico — un cerchio bianco attorno a tutto il cielo all'altezza del Sole, da riflessi sulle facce verticali di lastrine piatte",pillar:"Colonna di luce — un fascio di luce sopra il Sole, da riflessi su lastrine piatte leggermente inclinate",subsun:"Sotto-sole — un'immagine del Sole sotto l'orizzonte, da riflessi sulle facce piatte delle lastrine"},trafficTooltip:{unnamed:"Aeromobile {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"prua {value}°",position:"a {distance} km, {elevation}° sopra l'orizzonte, {bearing}",heard:"Si sente a {level} dB(A), partito dall'aereo {delay} s fa, {lag}° dietro di esso: {character}{pitch}",rumble:"un rombo grave, nulla oltre {cutoff} Hz",muffled:"un rumore sordo, nulla oltre {cutoff} Hz",broad:"un fragore ampio",pitchHigher:", suono più acuto del {percent} %",pitchLower:", suono più grave del {percent} %",inaudible:"Non si sente qui: {level} dB(A) contro {ambient} dB(A) di rumore ambientale",soundUnknown:"Suono non calcolabile: l'aereo non era ancora registrato quando è partito",contrailPersistent:"Lascia una scia che dura: l'aria è sovrasatura rispetto al ghiaccio ({rhi} % rispetto al ghiaccio)",contrailShort:"Lascia una scia breve: l'aria è secca rispetto al ghiaccio ({rhi} % rispetto al ghiaccio)",military:"militare",restricted:"identità nascosta dal proprietario",candidate:"Un candidato compatibile, non un'identificazione"},railwayTooltip:{kinds:{rail:"Ferrovia",light_rail:"Metropolitana leggera",tram:"Tranvia",subway:"Metropolitana",funicular:"Funicolare"},highSpeed:"Linea ad alta velocità",service:"Binario di servizio",singleTrack:"binario unico",tracks:"{count} binari",overhead:"linea aerea, filo di contatto a {height} m sopra la rotaia",overheadVoltage:"linea aerea a {voltage}, filo di contatto a {height} m sopra la rotaia",thirdRail:"terza rotaia",thirdRailVoltage:"terza rotaia a {voltage}",notElectrified:"non elettrificata",gauge:"scartamento di {mm} mm",metreGauge:"scartamento metrico",distance:"a {distance}"},credits:"Crediti",notAVideo:"Questo non è un video",isASimulation:"È una simulazione in tempo reale."};export{l as sceneNames_it};
|
|
1
|
+
import{V as e,D as o}from"./rr0-sighting.mjs";const l={bodies:{sun:"Sole",moon:"Luna",Venus:"Venere",Mars:"Marte",Jupiter:"Giove",Saturn:"Saturno"},stars:{Sirius:"Sirio",Canopus:"Canopo",Arcturus:"Arturo",Procyon:"Procione",Pollux:"Polluce",Castor:"Castore",Regulus:"Regolo"},comets:{"halley-1910":"cometa di Halley","brooks-1911":"cometa Brooks","skjellerup-maristany-1927":"cometa Skjellerup-Maristany","de-kock-paraskevopoulos-1941":"cometa de Kock-Paraskevopoulos","southern-1947":"cometa australe","eclipse-1948":"cometa dell'eclisse","arend-roland-1957":"cometa Arend-Roland","mrkos-1957":"cometa Mrkos","seki-lines-1962":"cometa Seki-Lines","ikeya-seki-1965":"cometa Ikeya-Seki","bennett-1970":"cometa Bennett","white-ortiz-bolelli-1970":"cometa White-Ortiz-Bolelli","kohoutek-1973":"cometa Kohoutek","west-1976":"cometa West","iras-araki-alcock-1983":"cometa IRAS-Araki-Alcock","halley-1986":"cometa di Halley","hyakutake-1996":"cometa Hyakutake","hale-bopp-1997":"cometa Hale-Bopp","mcnaught-2007":"cometa McNaught","lovejoy-2011":"cometa Lovejoy","panstarrs-2013":"cometa PANSTARRS","neowise-2020":"cometa NEOWISE","tsuchinshan-atlas-2024":"cometa Tsuchinshan-ATLAS"},novae:{"sn-1006":"supernova del 1006","sn-1054":"supernova del 1054","sn-1181":"supernova del 1181","sn-1572":"supernova di Tycho","sn-1604":"supernova di Keplero","t-crb-1866":"nova della Corona Boreale 1866","t-aur-1891":"nova dell'Auriga 1891","gk-per-1901":"nova di Perseo 1901","dn-gem-1912":"nova dei Gemelli 1912","v603-aql-1918":"nova dell'Aquila 1918","v476-cyg-1920":"nova del Cigno 1920","rr-pic-1925":"nova del Pittore 1925","dq-her-1934":"nova di Ercole 1934","cp-lac-1936":"nova della Lucertola 1936","cp-pup-1942":"nova della Poppa 1942","t-crb-1946":"nova della Corona Boreale 1946","v446-her-1960":"nova di Ercole 1960","v533-her-1963":"nova di Ercole 1963","hr-del-1967":"nova del Delfino 1967","lv-vul-1968":"nova della Volpetta 1968","fh-ser-1970":"nova del Serpente 1970","v1500-cyg-1975":"nova del Cigno 1975","v842-cen-1986":"nova del Centauro 1986","sn-1987a":"supernova 1987A","v1974-cyg-1992":"nova del Cigno 1992","v382-vel-1999":"nova delle Vele 1999","v1494-aql-1999":"nova dell'Aquila 1999","v4743-sgr-2002":"nova del Sagittario 2002","rs-oph-2006":"nova di Ofiuco 2006","v1280-sco-2007":"nova dello Scorpione 2007","v339-del-2013":"nova del Delfino 2013","v1369-cen-2013":"nova del Centauro 2013","rs-oph-2021":"nova di Ofiuco 2021"},satelliteClasses:{echo:"i palloni Echo","iridium-flares":"i lampi degli Iridium",iss:"la Stazione Spaziale Internazionale","starlink-trains":"i treni di Starlink"},showers:{quadrantids:"Quadrantidi",lyrids:"Liridi di aprile","eta-aquariids":"Eta Aquaridi","alpha-capricornids":"Alfa Capricornidi","southern-delta-aquariids":"Delta Aquaridi australi",perseids:"Perseidi","southern-taurids":"Tauridi australi",draconids:"Draconidi di ottobre",orionids:"Orionidi","northern-taurids":"Tauridi boreali",leonids:"Leonidi",geminids:"Geminidi",ursids:"Ursidi"},lightRigs:{airliner:"Aereo di linea",helicopter:"Elicottero","car-headlights":"Auto, fari accesi","car-hazards":"Auto, luci di emergenza","emergency-beacons":"Lampeggianti di veicolo di soccorso","traffic-signal":"Semaforo","pedestrian-signal":"Semaforo pedonale",streetlamp:"Lampione"},instruments:{eye:"Occhio nudo","rectilinear-lens":"Fotocamera, modello sconosciuto","roamer-1-120":"Roamer 1, pellicola 120","instamatic-126":"Instamatic, pellicola 126","slr-35mm-50":"Reflex 35 mm, obiettivo 50 mm","slr-35mm-zoom":"Reflex 35 mm, zoom 70-210 mm","phone-landscape":"Telefono, in orizzontale","phone-portrait":"Telefono, in verticale",...o.names(),...e.names()},decorKinds:{building:"Edificio",tree:"Albero",shrub:"Arbusto",bridge:"Ponte",wire:"Linea aerea",crop:"Filare di coltura",terrace:"Terrazzamento",mound:"Mucchio di pietre",wall:"Muretto a secco",streetlight:"Lampione",trafficlight:"Semaforo",crossing:"Attraversamento pedonale",roadsign:"Segnale stradale",vehicle:"Veicolo",observer:"Osservatore",aircraft:"Aeromobile",entity:"Essere"},compassPoints:["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO"],towards:a=>`verso ${a}`,starTooltip:"{name} — mag {mag}, {alt}° sopra l'orizzonte",starTooltipBelow:"{name} — mag {mag}, {alt}° sotto l'orizzontale",decorTooltip:"{name} — {size}, a {distance}",satelliteTooltip:"{name} — satellite, mag {mag}, a {height} km di quota",plumeTooltip:{name:"Scia di razzo",detail:"{name} — {part}, a {distance}, a {height} km di quota",ascent:"scarico dell'ascesa",burn:"scarico di un'accensione",vent:"propellenti scaricati"},opticsTooltips:{halo22:"Alone di 22° — un anello attorno al Sole, dovuto alla luce deviata da cristalli di ghiaccio esagonali nei cirri; il bordo interno è rosso, a 21,7°",halo46:"Alone di 46° — un anello più raro e debole: la luce entra da una faccia laterale del cristallo ed esce da una faccia di estremità",oddRadius:"Alone di {angle}° — un anello a raggio dispari, raro e debole, prodotto da cristalli di ghiaccio con estremità piramidali",parhelion:"Parelio — una macchia luminosa colorata accanto al Sole, alla sua altezza, da lastrine di ghiaccio che cadono piatte; rosso verso il Sole",parhelion120:"Parelio di 120° — una debole macchia bianca a 120° dal Sole, da luce riflessa dentro lastrine piatte",upperTangentArc:"Arco tangente superiore — un arco luminoso appoggiato sull'alone di 22°, da colonne coricate in orizzontale",lowerTangentArc:"Arco tangente inferiore — un arco che tocca la base dell'alone di 22°, da colonne coricate in orizzontale",circumzenithal:"Arco circumzenitale — una banda di colori vivi vicino allo zenit, da luce che entra dalla faccia superiore di lastrine piatte (solo con il Sole sotto i 32°)",circumhorizontal:"Arco circumorizzontale — una banda colorata bassa nel cielo, da luce che entra dalla faccia laterale di lastrine piatte (solo con il Sole sopra i 58°)",parhelicCircle:"Cerchio parelico — un cerchio bianco attorno a tutto il cielo all'altezza del Sole, da riflessi sulle facce verticali di lastrine piatte",pillar:"Colonna di luce — un fascio di luce sopra il Sole, da riflessi su lastrine piatte leggermente inclinate",subsun:"Sotto-sole — un'immagine del Sole sotto l'orizzonte, da riflessi sulle facce piatte delle lastrine"},trafficTooltip:{unnamed:"Aeromobile {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"prua {value}°",position:"a {distance} km, {elevation}° sopra l'orizzonte, {bearing}",heard:"Si sente a {level} dB(A), partito dall'aereo {delay} s fa, {lag}° dietro di esso: {character}{pitch}",rumble:"un rombo grave, nulla oltre {cutoff} Hz",muffled:"un rumore sordo, nulla oltre {cutoff} Hz",broad:"un fragore ampio",pitchHigher:", suono più acuto del {percent} %",pitchLower:", suono più grave del {percent} %",inaudible:"Non si sente qui: {level} dB(A) contro {ambient} dB(A) di rumore ambientale",soundUnknown:"Suono non calcolabile: l'aereo non era ancora registrato quando è partito",contrailPersistent:"Lascia una scia che dura: l'aria è sovrasatura rispetto al ghiaccio ({rhi} % rispetto al ghiaccio)",contrailShort:"Lascia una scia breve: l'aria è secca rispetto al ghiaccio ({rhi} % rispetto al ghiaccio)",military:"militare",restricted:"identità nascosta dal proprietario",candidate:"Un candidato compatibile, non un'identificazione"},railwayTooltip:{kinds:{rail:"Ferrovia",light_rail:"Metropolitana leggera",tram:"Tranvia",subway:"Metropolitana",funicular:"Funicolare"},highSpeed:"Linea ad alta velocità",service:"Binario di servizio",singleTrack:"binario unico",tracks:"{count} binari",overhead:"linea aerea, filo di contatto a {height} m sopra la rotaia",overheadVoltage:"linea aerea a {voltage}, filo di contatto a {height} m sopra la rotaia",thirdRail:"terza rotaia",thirdRailVoltage:"terza rotaia a {voltage}",notElectrified:"non elettrificata",gauge:"scartamento di {mm} mm",metreGauge:"scartamento metrico",distance:"a {distance}"},credits:"Crediti",notAVideo:"Questo non è un video",isASimulation:"È una simulazione in tempo reale."};export{l as sceneNames_it};
|