/* The Orrery Index — preditor da hipótese H3 (Node). Uso: node h3.js > H3_preditor.csv */ /* Motor astrológico extraído do B2inUs (v100, 2026-10-03). Fórmulas de Schlyter (domínio público), casas Placidus, progressões secundárias. */ var YEAR_MS = 365.242199 * 86400000; function E_sin(d){ return Math.sin(d*Math.PI/180); } function E_cos(d){ return Math.cos(d*Math.PI/180); } function E_atan2(y,x){ return Math.atan2(y,x)*180/Math.PI; } function E_norm360(x){ var r = x % 360; if(r<0) r+=360; return r; } function E_solveKepler(M, e){ M = E_norm360(M); var E = M + (e*180/Math.PI)*E_sin(M)*(1+e*E_cos(M)); for(var i=0;i<8;i++){ var dM = M - (E - (e*180/Math.PI)*E_sin(E)); var dE = dM/(1-e*E_cos(E)); E += dE; if(Math.abs(dE) < 1e-9) break; } return E; } function E_julianDay(dateUTC){ return dateUTC.getTime()/86400000 + 2440587.5; } function E_dFromJD(jd){ return jd - 2451543.5; } /* Orbital elements (Schlyter, public-domain low-precision formulas). */ var E_ELEMENTS = { sun: function(d){ return { N:0, i:0, w:282.9404+4.70935e-5*d, a:1.0, e:0.016709-1.151e-9*d, M:356.0470+0.9856002585*d }; }, moon: function(d){ return { N:125.1228-0.0529538083*d, i:5.1454, w:318.0634+0.1643573223*d, a:60.2666, e:0.054900, M:115.3654+13.0649929509*d }; }, mercury: function(d){ return { N:48.3313+3.24587e-5*d, i:7.0047+5.00e-8*d, w:29.1241+1.01444e-5*d, a:0.387098, e:0.205635+5.59e-10*d, M:168.6562+4.0923344368*d }; }, venus: function(d){ return { N:76.6799+2.46590e-5*d, i:3.3946+2.75e-8*d, w:54.8910+1.38374e-5*d, a:0.723330, e:0.006773-1.302e-9*d, M:48.0052+1.6021302244*d }; }, mars: function(d){ return { N:49.5574+2.11081e-5*d, i:1.8497-1.78e-8*d, w:286.5016+2.92961e-5*d, a:1.523688, e:0.093405+2.516e-9*d, M:18.6021+0.5240207766*d }; }, /* v58 (2026-10-02): outer planets, same source (Schlyter), with the main mutual perturbations below. */ jupiter: function(d){ return { N:100.4542+2.76854e-5*d, i:1.3030-1.557e-7*d, w:273.8777+1.64505e-5*d, a:5.20256, e:0.048498+4.469e-9*d, M:19.8950+0.0830853001*d }; }, saturn: function(d){ return { N:113.6634+2.38980e-5*d, i:2.4886-1.081e-7*d, w:339.3939+2.97661e-5*d, a:9.55475, e:0.055546-9.499e-9*d, M:316.9670+0.0334442282*d }; }, uranus: function(d){ return { N:74.0005+1.3978e-5*d, i:0.7733+1.9e-8*d, w:96.6612+3.0565e-5*d, a:19.18171-1.55e-8*d, e:0.047318+7.45e-9*d, M:142.5905+0.011725806*d }; }, neptune: function(d){ return { N:131.7806+3.0173e-5*d, i:1.7700-2.55e-7*d, w:272.8461-6.027e-6*d, a:30.05826+3.313e-8*d, e:0.008606+2.15e-9*d, M:260.2471+0.005995147*d }; } }; var E_SLOW = ['jupiter','saturn','uranus','neptune','pluto']; /* Heliocentric ecliptic (of date) position with latitude: {lon, lat, r}. */ function E_helioFull(elFn, d){ var el = elFn(d), N=el.N,i=el.i,w=el.w,a=el.a,e=el.e,M=el.M; var E = E_solveKepler(M, e); var xv = a*(E_cos(E)-e), yv = a*(Math.sqrt(1-e*e)*E_sin(E)); var v = E_atan2(yv,xv), r = Math.sqrt(xv*xv+yv*yv); var xh = r*(E_cos(N)*E_cos(v+w) - E_sin(N)*E_sin(v+w)*E_cos(i)); var yh = r*(E_sin(N)*E_cos(v+w) + E_cos(N)*E_sin(v+w)*E_cos(i)); var zh = r*(E_sin(v+w)*E_sin(i)); return { lon: E_norm360(E_atan2(yh,xh)), lat: Math.atan2(zh, Math.sqrt(xh*xh+yh*yh))*180/Math.PI, r:r }; } function E_slowHelio(name, d){ if(name === 'pluto'){ var S = 50.03 + 0.033459652*d, P = 238.95 + 0.003968789*d; var lon = 238.9508 + 0.00400703*d - 19.799*E_sin(P) + 19.848*E_cos(P) + 0.897*E_sin(2*P) - 4.956*E_cos(2*P) + 0.610*E_sin(3*P) + 1.211*E_cos(3*P) - 0.341*E_sin(4*P) - 0.190*E_cos(4*P) + 0.128*E_sin(5*P) - 0.034*E_cos(5*P) - 0.038*E_sin(6*P) + 0.031*E_cos(6*P) + 0.020*E_sin(S-P) - 0.010*E_cos(S-P); var lat = -3.9082 - 5.453*E_sin(P) - 14.975*E_cos(P) + 3.527*E_sin(2*P) + 1.673*E_cos(2*P) - 1.051*E_sin(3*P) + 0.328*E_cos(3*P) + 0.179*E_sin(4*P) - 0.292*E_cos(4*P) + 0.019*E_sin(5*P) + 0.100*E_cos(5*P) - 0.031*E_sin(6*P) - 0.026*E_cos(6*P) + 0.011*E_cos(S-P); var r = 40.72 + 6.68*E_sin(P) + 6.90*E_cos(P) - 1.18*E_sin(2*P) - 0.03*E_cos(2*P) + 0.15*E_sin(3*P) - 0.14*E_cos(3*P); return { lon: E_norm360(lon), lat: lat, r: r }; // already referred to the equinox of date } var h = E_helioFull(E_ELEMENTS[name], d); var Mj = E_ELEMENTS.jupiter(d).M, Ms = E_ELEMENTS.saturn(d).M, Mu = E_ELEMENTS.uranus(d).M; if(name === 'jupiter') h.lon += -0.332*E_sin(2*Mj-5*Ms-67.6) - 0.056*E_sin(2*Mj-2*Ms+21) + 0.042*E_sin(3*Mj-5*Ms+21) - 0.036*E_sin(Mj-2*Ms) + 0.022*E_cos(Mj-Ms) + 0.023*E_sin(2*Mj-3*Ms+52) - 0.016*E_sin(Mj-5*Ms-69); if(name === 'saturn'){ h.lon += 0.812*E_sin(2*Mj-5*Ms-67.6) - 0.229*E_cos(2*Mj-4*Ms-2) + 0.119*E_sin(Mj-2*Ms-3) + 0.046*E_sin(2*Mj-6*Ms-69) + 0.014*E_sin(Mj-3*Ms+32); h.lat += -0.020*E_cos(2*Mj-4*Ms-2) + 0.018*E_sin(2*Mj-6*Ms-49); } if(name === 'uranus') h.lon += 0.040*E_sin(Ms-2*Mu+6) + 0.035*E_sin(Ms-3*Mu+33) - 0.015*E_sin(Mj-Mu+20); h.lon = E_norm360(h.lon); return h; } function E_slowGeocentric(name, d, sunHelio){ var h = E_slowHelio(name, d), cl = E_cos(h.lat); var xh = h.r*cl*E_cos(h.lon), yh = h.r*cl*E_sin(h.lon); var xs = sunHelio.r*E_cos(sunHelio.lon), ys = sunHelio.r*E_sin(sunHelio.lon); return { lon: E_norm360(E_atan2(yh+ys, xh+xs)) }; } /** Jupiter … Pluto for a JS Date (slow movers: computed only where needed). */ function E_slowBodies(dateUTC){ var d = E_dFromJD(E_julianDay(dateUTC)), sunHelio = E_heliocentric(E_ELEMENTS.sun, d), out = {}; E_SLOW.forEach(function(n){ out[n] = E_slowGeocentric(n, d, sunHelio).lon; }); return out; } /** All ten bodies. */ function E_allBodies(dateUTC){ return Object.assign(E_fastBodies(dateUTC), E_slowBodies(dateUTC)); } /* ---------- v75 (2026-10-02): motion — retrogrades and stations ---------- */ var E_MOVERS = ['mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto','chiron']; function E_wrap180(x){ x = ((x % 360) + 540) % 360 - 180; return x; } /** Daily motion (degrees/day) of every body around a moment; negative = retrograde. */ function E_speeds(dateUTC){ var t = dateUTC.getTime(), a = new Date(t - 43200000), b = new Date(t + 43200000); var A = E_allBodies(a), B = E_allBodies(b), out = {}; Object.keys(A).forEach(function(k){ out[k] = E_wrap180(B[k] - A[k]); }); out.chiron = E_wrap180(E_chiron(b) - E_chiron(a)); return out; } function E_retroFlags(dateUTC){ var sp = E_speeds(dateUTC), r = {}; E_MOVERS.forEach(function(k){ if(sp[k] < 0) r[k] = true; }); return r; } function E_speedOf(k, t){ var a = new Date(t - 43200000), b = new Date(t + 43200000); if(k === 'chiron') return E_wrap180(E_chiron(b) - E_chiron(a)); var A = (CH_FASTSET[k] ? E_fastBodies(a) : E_slowBodies(a))[k], B = (CH_FASTSET[k] ? E_fastBodies(b) : E_slowBodies(b))[k]; return E_wrap180(B - A); } var CH_FASTSET = { sun:1, moon:1, mercury:1, venus:1, mars:1 }; /** Stations (direction changes) of one body between two dates: [{t:Date, to:'retro'|'direct'}] */ function E_stations(k, from, to){ var out = [], step = 86400000, t0 = from.getTime(), s0 = E_speedOf(k, t0); for(var t = t0 + step; t <= to.getTime(); t += step){ var s1 = E_speedOf(k, t); if((s0 < 0) !== (s1 < 0)){ var lo = t - step, hi = t, slo = s0; for(var i = 0; i < 30; i++){ var mid = (lo + hi) / 2, sm = E_speedOf(k, mid); if((sm < 0) === (slo < 0)){ lo = mid; slo = sm; } else hi = mid; } out.push({ t: new Date((lo + hi) / 2), to: s1 < 0 ? 'retro' : 'direct' }); } s0 = s1; } return out; } /** Current retrograde period of a body (if it is retrograde now): {from, to} */ function E_retroPeriod(k, now){ if(E_speedOf(k, now.getTime()) >= 0) return null; var back = E_stations(k, new Date(now.getTime() - 200*86400000), now).filter(function(x){ return x.to === 'retro'; }).pop(); var fwd = E_stations(k, now, new Date(now.getTime() + 200*86400000)).filter(function(x){ return x.to === 'direct'; })[0]; return { from: back ? back.t : null, to: fwd ? fwd.t : null }; } function E_heliocentric(elFn, d){ var el = elFn(d), N=el.N,i=el.i,w=el.w,a=el.a,e=el.e,M=el.M; var E = E_solveKepler(M, e); var xv = a*(E_cos(E)-e), yv = a*(Math.sqrt(1-e*e)*E_sin(E)); var v = E_atan2(yv,xv), r = Math.sqrt(xv*xv+yv*yv); var xh = r*(E_cos(N)*E_cos(v+w) - E_sin(N)*E_sin(v+w)*E_cos(i)); var yh = r*(E_sin(N)*E_cos(v+w) + E_cos(N)*E_sin(v+w)*E_cos(i)); return { lon: E_norm360(E_atan2(yh,xh)), r:r }; } function E_moonPosition(d, sunEl){ var el = E_ELEMENTS.moon(d); var base = E_heliocentric(E_ELEMENTS.moon, d); var lon = base.lon; var Lm = E_norm360(el.N+el.w+el.M), Ls = E_norm360(sunEl.w+sunEl.M); var Mm = el.M, Ms = sunEl.M, D = E_norm360(Lm-Ls); lon += -1.274*E_sin(Mm-2*D) + 0.658*E_sin(2*D) - 0.186*E_sin(Ms) - 0.059*E_sin(2*Mm-2*D) - 0.057*E_sin(Mm-2*D+Ms) + 0.053*E_sin(Mm+2*D) + 0.046*E_sin(2*D-Ms) + 0.041*E_sin(Mm-Ms) - 0.035*E_sin(D) - 0.031*E_sin(Mm+Ms) + 0.011*E_sin(Mm-4*D); return { lon: E_norm360(lon) }; } function E_planetGeocentric(name, d, sunHelio){ var p = E_heliocentric(E_ELEMENTS[name], d); var xs = sunHelio.r*E_cos(sunHelio.lon), ys = sunHelio.r*E_sin(sunHelio.lon); var xh = p.r*E_cos(p.lon), yh = p.r*E_sin(p.lon); return { lon: E_norm360(E_atan2(yh+ys, xh+xs)) }; } /** Sun/Moon/Mercury/Venus/Mars ecliptic longitudes (degrees) for a JS Date. */ function E_fastBodies(dateUTC){ var jd = E_julianDay(dateUTC), d = E_dFromJD(jd); var sunHelio = E_heliocentric(E_ELEMENTS.sun, d); var out = { sun: sunHelio.lon, moon: E_moonPosition(d, E_ELEMENTS.sun(d)).lon }; ['mercury','venus','mars'].forEach(function(name){ out[name] = E_planetGeocentric(name, d, sunHelio).lon; }); return out; } /* Aspects/orbs (Metodologia — Astrologia v1.0). Used for natal and synastry aspects, where the wider documented orb is correct. */ var E_ASPECTS = [ {name:'conjunction',angle:0,orb:8}, {name:'sextile',angle:60,orb:6}, {name:'square',angle:90,orb:7}, {name:'trine',angle:120,orb:8}, {name:'opposition',angle:180,orb:8} ]; function E_aspect(lonA, lonB){ var sep = Math.abs(lonA-lonB); if(sep>180) sep = 360-sep; var best = null; E_ASPECTS.forEach(function(a){ var delta = Math.abs(sep-a.angle); if(delta <= a.orb && (!best || delta < best.delta)) best = {name:a.name, delta:delta}; }); return best; } /* Tighter orb for "is this transit active today" checks in Relationship Today: the wider natal orb is right for a standing compatibility trait, but would make a single transit read as "active" for months at a time, which is not how a daily reading should feel. 3° keeps each transiting hit closer to its astronomically exact day while still deterministic. */ var E_TRANSIT_ORB = 3; /* Mars moves only ~0.5°/day, so a 3° orb would keep one Mars hit "active" for ~12 days in a row — too long for a daily reading and it made Relationship Week/Calendar look monotonous. Mars transits use a 1.5° orb (~6 days); faster bodies keep the 3° orb. */ var E_MARS_TRANSIT_ORB = 1.5; function E_transitAspect(lonA, lonB, orb){ var lim = orb || E_TRANSIT_ORB; var sep = Math.abs(lonA-lonB); if(sep>180) sep = 360-sep; var best = null; E_ASPECTS.forEach(function(a){ var delta = Math.abs(sep-a.angle); if(delta <= lim && (!best || delta < best.delta)) best = {name:a.name, delta:delta}; }); return best; } /* Kabbalah — Anjo da Data (72 Anjos do Shemhamphorash, Burkle/SRICF) + Regra da Sombra B2inUs v1.0 (excesso em elementos ativos, carência em passivos). Traditional angel names are transliterated Hebrew and are not translated — same across languages. Virtues are translated. Shown to the user in Behind the scenes (Sun/Moon/Venus of each person) as of the "technical basis" feature; also still flavours the Connection word. */ function E_obliquity(d){ return 23.4393 - 3.563e-7*d; } function E_lst(dateUTC, lonEast){ var jd = E_julianDay(dateUTC), T = (jd-2451545)/36525; var gmst = 280.46061837 + 360.98564736629*(jd-2451545) + 0.000387933*T*T - T*T*T/38710000; return E_norm360(gmst + lonEast); } // Horizon vector of an ecliptic longitude (latitude 0): {east, north, up} function E_horizon(lon, ramc, eps, lat){ var ra = E_atan2(E_sin(lon)*E_cos(eps), E_cos(lon)); var dec = Math.asin(E_sin(eps)*E_sin(lon))*180/Math.PI; var H = ramc - ra; return { east: -E_cos(dec)*E_sin(H), north: E_cos(lat)*E_sin(dec) - E_sin(lat)*E_cos(dec)*E_cos(H), up: E_sin(lat)*E_sin(dec) + E_cos(lat)*E_cos(dec)*E_cos(H), ha: ((H%360)+540)%360-180, dec: dec }; } function E_findRoot(fn, a, b){ // scan the arc a→b (counter-clockwise) for a sign change, then bisect var span = E_norm360(b-a) || 360, steps = 360, prev = a, fp = fn(a); for(var i=1;i<=steps;i++){ var x = a + span*i/steps, fx = fn(x); if(fp === 0) return E_norm360(prev); if(fp*fx < 0){ var lo = prev, hi = x, flo = fp; for(var k=0;k<50;k++){ var mid=(lo+hi)/2, fm=fn(mid); if(flo*fm<=0){ hi=mid; } else { lo=mid; flo=fm; } } return E_norm360((lo+hi)/2); } prev = x; fp = fx; } return null; } function E_houses(dateUTC, lat, lonEast){ var d = E_dFromJD(E_julianDay(dateUTC)), eps = E_obliquity(d); var ramc = E_lst(dateUTC, lonEast); var mc = E_norm360(E_atan2(E_sin(ramc), E_cos(ramc)*E_cos(eps))); var asc = E_norm360(E_atan2(E_cos(ramc), -(E_sin(ramc)*E_cos(eps) + Math.tan(lat*Math.PI/180)*E_sin(eps)))); // Vertex: western intersection of the ecliptic with the prime vertical var vx = E_findRoot(function(l){ return E_horizon(l, ramc, eps, lat).north; }, asc+90, asc+270); var cusps = null, system = 'Placidus'; if(Math.abs(lat) < 66){ var sda = function(dec){ var x = -Math.tan(lat*Math.PI/180)*Math.tan(dec*Math.PI/180); return Math.acos(Math.max(-1,Math.min(1,x)))*180/Math.PI; }; var cusp = function(frac, below, from, to){ return E_findRoot(function(l){ var h = E_horizon(l, ramc, eps, lat), s = sda(h.dec); var target = below ? -(s + frac*(180-s)) : -frac*s; var diff = h.ha - target; return ((diff%360)+540)%360-180; }, from, to); }; var ic = E_norm360(mc+180); var c11 = cusp(1/3,false,mc,asc), c12 = cusp(2/3,false,mc,asc), c2 = cusp(1/3,true,asc,ic), c3 = cusp(2/3,true,asc,ic); if([c11,c12,c2,c3].every(function(v){ return v !== null; })){ cusps = [asc, c2, c3, ic, E_norm360(c11+180), E_norm360(c12+180), E_norm360(asc+180), E_norm360(c2+180), E_norm360(c3+180), mc, c11, c12]; } } if(!cusps){ // Porphyry fallback for polar latitudes system = 'Porphyry'; cusps = []; var q1 = E_norm360(mc+180-asc) || 180, q2 = E_norm360(asc+180-(mc+180)) || 180; var ic2 = E_norm360(mc+180); cusps = [asc, asc+q1/3, asc+2*q1/3, ic2, ic2+q2/3, ic2+2*q2/3].map(E_norm360); cusps = cusps.concat(cusps.map(function(c){ return E_norm360(c+180); })); } return { asc:asc, mc:mc, dsc:E_norm360(asc+180), ic:E_norm360(mc+180), vertex:vx, cusps:cusps, system:system, ramc:ramc, eps:eps }; } function E_houseOf(lon, cusps){ for(var i=0;i<12;i++){ var a = cusps[i], b = cusps[(i+1)%12]; if(E_norm360(lon-a) < E_norm360(b-a)) return i+1; } return 1; } // Mean lunar node (Meeus). South Node is always the opposite point. function E_meanNode(dateUTC){ var T = (E_julianDay(dateUTC)-2451545)/36525; return E_norm360(125.0445479 - 1934.1362891*T + 0.0020754*T*T + T*T*T/467441 - T*T*T*T/60616000); } // Mean Black Moon Lilith = mean lunar apogee (Meeus, perigee + 180°) function E_lilith(dateUTC){ var T = (E_julianDay(dateUTC)-2451545)/36525; return E_norm360(83.3532465 + 4069.0137287*T - 0.01032*T*T - T*T*T/80053 + T*T*T*T/18999000 + 180); } // Chiron from osculating elements around its 1996 perihelion (Kepler only, // no perturbations) — approximate, drifts by a degree or more far from 1996. function E_chiron(dateUTC){ var jd = E_julianDay(dateUTC), a = 13.648, e = 0.3831, i = 6.935, w = 339.25; var N = 209.37 + 0.013969*(jd-2451545)/365.25; // J2000 node, precessed to date var tp = 2450128.0; // 1996-02-14 var n = 0.9856076686/Math.pow(a,1.5); var M = E_norm360(n*(jd - tp)); var E = E_solveKepler(M, e); var xv = a*(E_cos(E) - e), yv = a*Math.sqrt(1-e*e)*E_sin(E); var v = E_atan2(yv, xv), r = Math.sqrt(xv*xv+yv*yv); var xh = r*(E_cos(N)*E_cos(v+w) - E_sin(N)*E_sin(v+w)*E_cos(i)); var yh = r*(E_sin(N)*E_cos(v+w) + E_cos(N)*E_sin(v+w)*E_cos(i)); var sun = E_heliocentric(E_ELEMENTS.sun, E_dFromJD(jd)); // geocentric Sun (lon, r) var xs = sun.r*E_cos(sun.lon), ys = sun.r*E_sin(sun.lon); return E_norm360(E_atan2(yh+ys, xh+xs)); } function E_progUTC(F, t){ return new Date(F.utc.getTime() + ((t - F.utc.getTime()) / YEAR_MS) * 86400000); } function E_progressed(F, at){ at = at || new Date(); var pUTC = E_progUTC(F, at.getTime()); var P = { bodies: E_allBodies(pUTC), utc: pUTC, age: (at.getTime() - F.utc.getTime()) / YEAR_MS, at: at }; P.bodies.chiron = E_chiron(pUTC); P.bodies.lilith = E_lilith(pUTC); P.bodies.nnode = E_meanNode(pUTC); P.bodies.snode = E_norm360(P.bodies.nnode + 180); P.retro = E_retroFlags(pUTC); if(F.houses && F.city){ var arc = E_norm360(P.bodies.sun - F.bodies.sun), eps = F.houses.eps, lat = F.city.lat; var mc = E_norm360(F.houses.mc + arc); var ramc = E_norm360(E_atan2(E_sin(mc) * E_cos(eps), E_cos(mc))); var asc = E_norm360(E_atan2(E_cos(ramc), -(E_sin(ramc) * E_cos(eps) + Math.tan(lat * Math.PI / 180) * E_sin(eps)))); P.angles = { asc: asc, mc: mc, dsc: E_norm360(asc + 180), ic: E_norm360(mc + 180) }; P.arc = arc; } return P; } function E_progMoon(F, t){ return E_fastBodies(E_progUTC(F, t)).moon; } /* Camada de negócio: cotação energética de empresas + clima geopolítico. Depende do motor E_* (engine.js). Determinístico: mesma entrada, mesmo resultado. */ var BZ = (function(){ var PL = ['sun','moon','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto']; var NATURE = { sun:.3, moon:.1, mercury:0, venus:.8, mars:-.8, jupiter:1, saturn:-1, uranus:-.6, neptune:-.5, pluto:-.9 }; var TW = { sun:.8, moon:.45, mercury:.7, venus:.8, mars:1, jupiter:1.2, saturn:1.3, uranus:1.2, neptune:1, pluto:1.3 }; var TORB = { sun:2, moon:3, mercury:2, venus:2, mars:1.5, jupiter:2, saturn:2, uranus:1.5, neptune:1.5, pluto:1.5 }; var NW = { sun:1.3, moon:1, mercury:.9, venus:.9, mars:.9, jupiter:.9, saturn:.9, uranus:.5, neptune:.5, pluto:.5, asc:1.2, mc:1.3, h2:1 }; /* v2: Úrano, Neptuno e Plutão natais entram com meio peso — são partilhados por quem nasceu nos mesmos anos. */ var GEN = { uranus:1, neptune:1, pluto:1 }; var ASP = [ {n:'conjunção',a:0,q:0}, {n:'sextil',a:60,q:.7}, {n:'quadratura',a:90,q:-1}, {n:'trígono',a:120,q:1}, {n:'oposição',a:180,q:-.8} ]; var AFF = { growth: { jupiter:1, sun:.8, mars:.7, mc:1, pluto:.4 }, comm: { mercury:1, moon:.6, asc:.8, venus:.3, uranus:.5 }, money: { venus:1, jupiter:.7, saturn:.7, moon:.3, h2:1, pluto:.4 } }; var DIMS = ['growth','comm','money','risk']; var DIM_PT = { growth:'Crescimento', comm:'Comunicação', money:'Finanças', risk:'Risco' }; function sep(a,b){ var s = Math.abs(a-b) % 360; return s > 180 ? 360 - s : s; } function asp(a, b, orb){ var s = sep(a,b), best = null; ASP.forEach(function(x){ var d = Math.abs(s - x.a); if(d <= orb && (!best || d < best.d)) best = { n:x.n, q:x.q, d:d }; }); return best; } function tone(q, conj, nat){ return conj ? nat : q + .5 * nat; } function riskOf(q, conj, nat){ return conj ? Math.max(-nat,0) : (q < 0 ? -q * (1 + Math.max(-nat,0)) : 0); } /* ---------- Mapa ---------- */ function utcFrom(dateISO, time, tz){ var naive = Date.parse(dateISO + 'T' + (time || '12:00') + ':00Z'); if(!tz) return new Date(naive); var off = tzOff(naive, tz), utc = naive - off, off2 = tzOff(utc, tz); return new Date(naive - off2); } function tzOff(ms, tz){ var p = new Intl.DateTimeFormat('en-US',{timeZone:tz,hourCycle:'h23',year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit'}).formatToParts(new Date(ms)), v = {}; p.forEach(function(x){ v[x.type] = +x.value; }); return Date.UTC(v.year, v.month-1, v.day, v.hour % 24, v.minute, v.second) - Math.floor(ms/1000)*1000; } /** e = {date, time, lat, lon, tz, angles:bool} */ function chart(e){ var utc = e.lmt ? new Date(Date.parse(e.date + 'T' + (e.time || '12:00') + ':00Z') - e.lon / 15 * 3600e3) : utcFrom(e.date, e.time, e.tz), b = E_allBodies(utc), F = { utc:utc, bodies:b, hasTime: !!e.time && e.angles !== false }; F.retro = E_retroFlags(utc); if(F.hasTime){ F.houses = E_houses(utc, e.lat, e.lon); } F.pts = ['sun','moon','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto'].map(function(k){ return { k:k, lon:b[k] }; }); if(F.houses){ F.pts.push({ k:'asc', lon:F.houses.asc }, { k:'mc', lon:F.houses.mc }); if(F.houses.cusps) F.pts.push({ k:'h2', lon:F.houses.cusps[1] }); } return F; } /* ---------- Empresa: avaliação num instante ---------- */ function feed(sc, hits, tk, nk, a, s, src){ var conj = a.q === 0 && a.n === 'conjunção', nat = NATURE[tk] || 0; var h = tone(a.q, conj, nat), r = riskOf(a.q, conj, nat); ['growth','comm','money'].forEach(function(d){ var w = Math.max(AFF[d][tk] || 0, AFF[d][nk] || 0); if(w) sc[d] += s * w * h; }); sc.risk += s * r; if(hits) hits.push({ src:src, t:tk, n:nk, asp:a.n, orb:a.d, s:s, h:h, r:r }); } function evalAt(F, t, hits){ var at = new Date(t), b = E_allBodies(at), sc = { growth:0, comm:0, money:0, risk:0 }; PL.forEach(function(tk){ F.pts.forEach(function(p){ var a = asp(b[tk], p.lon, TORB[tk]); if(!a) return; var s = (1 - a.d / TORB[tk]) * TW[tk] * (NW[p.k] || 1); feed(sc, hits, tk, p.k, a, s, 'trânsito'); }); }); var P = E_progressed(F, at); ['sun','moon','mercury','venus','mars'].forEach(function(tk){ F.pts.forEach(function(p){ if(tk === p.k && tk !== 'moon') return; var a = asp(P.bodies[tk], p.lon, 1); if(!a) return; var s = (1 - a.d) * 1.1 * (NW[p.k] || 1); feed(sc, hits, tk, p.k, a, s, 'progressão'); }); }); sc.H = sc.growth + sc.comm + sc.money - 1.3 * sc.risk; return sc; } /* Percentil a meio-posto: empates contam metade, para que 50 seja mesmo o normal. */ function pct(arr, v){ var lt = 0, eq = 0; for(var i = 0; i < arr.length; i++){ if(arr[i] < v) lt++; else if(arr[i] === v) eq++; } return Math.round(100 * (lt + eq / 2) / arr.length); } /** Escala própria: 241 momentos em ±30 dias (de 6 em 6 horas). */ function baseline(F, t){ var out = { H:[], growth:[], comm:[], money:[], risk:[] }, step = 6 * 3600e3; for(var i = -120; i <= 120; i++){ var sc = evalAt(F, t + i * step); out.H.push(sc.H); DIMS.forEach(function(d){ out[d].push(sc[d]); }); } return out; } function quote(F, base, t, hits){ var sc = evalAt(F, t, hits), q = { t:t, raw:sc, value: pct(base.H, sc.H) }; DIMS.forEach(function(d){ q[d] = pct(base[d], sc[d]); }); q.states = states(q); return q; } function states(q){ function lab(v){ return v >= 70 ? 'Forte' : v <= 30 ? 'Frágil' : 'Estável'; } return { growth:lab(q.growth), comm:lab(q.comm), money:lab(q.money), risk: q.risk >= 70 ? 'Elevado' : q.risk >= 40 ? 'Moderado' : 'Baixo' }; } function stKey(s){ return DIMS.map(function(d){ return s[d]; }).join('|'); } function nextTurn(F, base, t){ var s0 = quote(F, base, t).states, k0 = stKey(s0), step = 600e3, prev = t; for(var x = t + step; x <= t + 72 * 3600e3; x += step){ var s = quote(F, base, x).states; if(stKey(s) !== k0){ var lo = prev, hi = x, sh = s; while(hi - lo > 60e3){ var mid = lo + Math.floor((hi - lo) / 120e3) * 60e3; if(mid <= lo) mid = lo + 60e3; var sm = quote(F, base, mid).states; if(stKey(sm) !== k0){ hi = mid; sh = sm; } else lo = mid; } return { at:hi, from:s0, to:sh, dims: DIMS.filter(function(d){ return sh[d] !== s0[d]; }) }; } prev = x; } return null; } /** Velas diárias: 12 amostras por dia (de 2 em 2 h), dia civil no fuso dado. */ function candles(F, base, t, back, fwd, tz){ var out = [], day0 = dayStart(t, tz); for(var i = -back; i <= fwd; i++){ var d0 = day0 + i * 864e5, vals = []; for(var h = 0; h < 12; h++) vals.push(quote(F, base, d0 + (h * 2 + 1) * 3600e3).value); out.push({ day:d0, o:vals[0], c:vals[11], hi:Math.max.apply(null, vals), lo:Math.min.apply(null, vals), future: i > 0, today: i === 0 }); } return out; } function dayStart(t, tz){ var p = new Intl.DateTimeFormat('en-CA',{timeZone:tz||undefined,year:'numeric',month:'2-digit',day:'2-digit'}).format(new Date(t)); return utcFrom(p, '00:00', tz).getTime(); } /** Janelas de 2 horas nos próximos 7 dias, com a finalidade que mais favorecem. */ function windows(F, base, t, tz){ var start = dayStart(t, tz) + 864e5 * 0, out = []; for(var i = 0; i < 84; i++){ var a = start + i * 2 * 3600e3; if(a + 2 * 3600e3 < t) continue; var q = quote(F, base, a + 3600e3); var merc = E_retroFlags(new Date(a)).mercury; var uses = []; if(q.money >= 60 && q.risk < 50 && !merc) uses.push('assinar contratos'); if(q.comm >= 65 && !merc) uses.push('lançar e comunicar'); if(q.growth >= 65 && q.risk < 55) uses.push('expandir e investir'); if(q.money >= 55 && q.comm >= 55) uses.push('negociar'); if(!uses.length) uses.push('trabalho de rotina'); out.push({ at:a, q:q, uses:uses, merc:merc, score: q.value - (merc ? 8 : 0) }); } return out.sort(function(x,y){ return y.score - x.score; }).slice(0, 6).sort(function(x,y){ return x.at - y.at; }); } /* ---------- ADN (elementos v2 do B2inUs) ---------- */ var ELW = { sun:3, moon:3, asc:3, venus:2, mars:2, mercury:1, jupiter:1, saturn:1 }; var EL = ['fire','earth','air','water']; function dna(F){ var o = { fire:0, earth:0, air:0, water:0 }, tot = 0; Object.keys(ELW).forEach(function(k){ var lon = k === 'asc' ? (F.houses && F.houses.asc) : F.bodies[k]; if(lon == null) return; o[EL[Math.floor(lon / 30) % 4]] += ELW[k]; tot += ELW[k]; }); EL.forEach(function(e){ o[e] = Math.round(100 * o[e] / tot); }); var s = EL.reduce(function(a, e){ return a + o[e]; }, 0); o[EL.sort(function(a,b){ return o[b]-o[a]; })[0]] += 100 - s; return o; } /* ---------- Líderes ---------- */ var LTR = ['sun','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto']; function leaderEval(L, t){ var b = E_allBodies(new Date(t)), P = 0, X = 0, M = 0, hits = []; LTR.forEach(function(tk){ L.F.pts.forEach(function(p){ if(p.k === 'h2') return; var a = asp(b[tk], p.lon, TORB[tk]); if(!a) return; var conj = a.n === 'conjunção', nat = NATURE[tk], s = (1 - a.d / TORB[tk]) * TW[tk] * (NW[p.k] || 1); var r = riskOf(a.q, conj, nat), h = tone(a.q, conj, nat); P += s * r; if(h > 0) X += s * h; if(tk === 'mars' || p.k === 'mars') M += s * (r + .3); hits.push({ t:tk, n:p.k, asp:a.n, orb:a.d, s:s, r:r, h:h }); }); }); return { P:P, X:X, M:M, hits:hits }; } function leaderBase(L, t){ var o = { P:[], X:[] }; for(var i = -90; i <= 90; i++){ var e = leaderEval(L, t + i * 2 * 864e5); o.P.push(e.P); o.X.push(e.X); } return o; } function leaderNow(L, t){ var e = leaderEval(L, t), p = pct(L.base.P, e.P), x = pct(L.base.X, e.X); var st = p >= 75 && e.M > 1 ? 'Ofensiva' : p >= 70 ? 'Sob pressão' : x >= 70 ? 'Em expansão' : p <= 30 && x <= 40 ? 'Recolhido' : 'Estável'; e.hits.sort(function(a, b){ return (b.s * (b.r + Math.max(b.h,0))) - (a.s * (a.r + Math.max(a.h,0))); }); return { pressure:p, expansion:x, state:st, top:e.hits.slice(0, 3) }; } /* Céu mundial: aspetos entre planetas lentos (sem mapas pessoais). */ var SLOW = ['mars','jupiter','saturn','uranus','neptune','pluto']; function worldSky(t){ var b = E_allBodies(new Date(t)), out = [], T = 0; for(var i = 0; i < SLOW.length; i++) for(var j = i + 1; j < SLOW.length; j++){ var a = asp(b[SLOW[i]], b[SLOW[j]], SLOW[i] === 'mars' ? 3 : 4); if(!a) continue; var nat = (NATURE[SLOW[i]] + NATURE[SLOW[j]]) / 2, conj = a.n === 'conjunção'; var r = riskOf(a.q, conj, nat), w = (1 - a.d / (SLOW[i] === 'mars' ? 3 : 4)); T += w * r; out.push({ a:SLOW[i], b:SLOW[j], asp:a.n, orb:a.d, r:r, w:w }); } return { T:T, list:out.sort(function(x,y){ return y.w*y.r - x.w*x.r; }), retro: E_retroFlags(new Date(t)) }; } /** Sinastria empresa × líder: quanto o mapa do líder toca o da empresa. */ var SYN_C = ['sun','moon','venus','jupiter','saturn','uranus','neptune','pluto','mc','asc'], SYN_L = ['sun','moon','mars','jupiter','saturn','uranus','neptune','pluto']; function exposure(F, L){ var s = 0, tone_ = 0, hits = []; F.pts.forEach(function(p){ if(SYN_C.indexOf(p.k) < 0) return; SYN_L.forEach(function(k){ if(GEN[k] && GEN[p.k]) return; var a = asp(L.F.bodies[k], p.lon, 4); if(!a) return; var conj = a.n === 'conjunção', w = (1 - a.d / 4) * (NW[p.k] || 1) * (GEN[k] ? .5 : 1); s += w; tone_ += w * tone(a.q, conj, NATURE[k]); hits.push({ l:k, c:p.k, asp:a.n, orb:a.d }); }); }); return { s:s, tone: s ? tone_ / s : 0, hits:hits }; } /* ---------- v2: relações entre entidades (líder × líder, líder × país) ---------- */ var RPTS = ['sun','moon','mercury','venus','mars','jupiter','saturn','uranus','neptune','pluto','asc','mc']; /** Contactos de sinastria entre dois mapas (sem geracional × geracional). */ function contacts(A, B){ var out = []; A.pts.forEach(function(p){ if(RPTS.indexOf(p.k) < 0) return; B.pts.forEach(function(q){ if(RPTS.indexOf(q.k) < 0) return; if(GEN[p.k] && GEN[q.k]) return; var a = asp(p.lon, q.lon, 4); if(!a) return; var conj = a.n === 'conjunção', nat = ((NATURE[p.k] || 0) + (NATURE[q.k] || 0)) / 2; var w = (1 - a.d / 4) * (NW[p.k] || 1) * (NW[q.k] || 1); out.push({ a:p.k, b:q.k, la:p.lon, lb:q.lon, asp:a.n, orb:a.d, w:w, hard: riskOf(a.q, conj, nat), soft: Math.max(tone(a.q, conj, nat), 0) }); }); }); return out; } var ACT = ['mars','jupiter','saturn','uranus','neptune','pluto']; /** Quanto os trânsitos lentos ativam agora os contactos de uma relação. tension = fricção ativada; bond = harmonia ativada. */ function relationAt(C, b){ var T = 0, Bd = 0; C.forEach(function(c){ var act = 0; ACT.forEach(function(tk){ var a1 = asp(b[tk], c.la, TORB[tk] + .5), a2 = asp(b[tk], c.lb, TORB[tk] + .5); if(a1) act += (1 - a1.d / (TORB[tk] + .5)) * TW[tk]; if(a2) act += (1 - a2.d / (TORB[tk] + .5)) * TW[tk]; }); T += c.w * c.hard * (.25 + act); Bd += c.w * c.soft * (.25 + act); }); return { T:T, B:Bd }; } /** Detalhe de relationAt: que trânsito ativa que contacto (para explicar picos). Não altera o cálculo. */ function relDetail(C, b){ var out = []; C.forEach(function(c){ ACT.forEach(function(tk){ [['a', c.la], ['b', c.lb]].forEach(function(s){ var o = TORB[tk] + .5, a = asp(b[tk], s[1], o); if(!a) return; var act = (1 - a.d / o) * TW[tk]; out.push({ tk:tk, side:s[0], c:c, asp:a.n, orb:a.d, T: c.w * c.hard * act, B: c.w * c.soft * act }); }); }); }); return out; } function staticRel(C){ var h = 0, s = 0; C.forEach(function(c){ h += c.w * c.hard; s += c.w * c.soft; }); return { hard:h, soft:s, tone: (s - h) / Math.max(1e-6, s + h) }; } return { contacts:contacts, relationAt:relationAt, relDetail:relDetail, staticRel:staticRel, leaderEval:leaderEval, chart:chart, evalAt:evalAt, baseline:baseline, quote:quote, nextTurn:nextTurn, candles:candles, windows:windows, dna:dna, leaderBase:leaderBase, leaderNow:leaderNow, worldSky:worldSky, exposure:exposure, utcFrom:utcFrom, dayStart:dayStart, DIMS:DIMS, DIM_PT:DIM_PT, pct:pct }; })(); var LEADERS = [ { id:'trump', name:'Donald Trump', role:'Presidente dos EUA', mk:['US'], w:1, date:'1946-06-14', time:'10:54', lat:40.6915, lon:-73.8057, tz:'America/New_York', place:'Jamaica, Nova Iorque', rr:'AA', src:'https://www.astrotheme.com/astrology/Donald_Trump' }, { id:'xi', short:'Xi', name:'Xi Jinping', role:'Presidente da China', mk:['CN'], w:.9, date:'1953-06-15', time:'', lat:39.9042, lon:116.4074, tz:'Asia/Shanghai', place:'Pequim', rr:'X', src:'https://www.astrotheme.com/astrology/Xi_Jinping' }, { id:'putin', name:'Vladimir Putin', role:'Presidente da Rússia', mk:['RU'], w:.8, date:'1952-10-07', time:'09:30', lat:59.9311, lon:30.3609, tz:'Europe/Moscow', place:'Leninegrado', rr:'DD', src:'https://www.astrotheme.com/astrology/Vladimir_Putin' }, { id:'modi', name:'Narendra Modi', role:'Primeiro-ministro da Índia', mk:['IN'], w:.6, date:'1950-09-17', time:'11:00', lat:23.7859, lon:72.6380, tz:'Asia/Kolkata', place:'Vadnagar', rr:'DD', src:'https://www.astrotheme.com/astrology/Narendra_Modi' }, { id:'vdl', short:'Von der Leyen', name:'Ursula von der Leyen', role:'Presidente da Comissão Europeia', mk:['EU'], w:.6, date:'1958-10-08', time:'', lat:50.8333, lon:4.3667, tz:'Europe/Brussels', place:'Ixelles', rr:'X', src:'https://www.astrotheme.com/astrology/Ursula_von_der_Leyen' }, { id:'merz', name:'Friedrich Merz', role:'Chanceler da Alemanha', mk:['EU'], w:.45, date:'1955-11-11', time:'', lat:51.3967, lon:8.5700, tz:'Europe/Berlin', place:'Brilon', rr:'X', src:'https://www.astrotheme.com/astrology/Friedrich_Merz' }, { id:'macron', name:'Emmanuel Macron', role:'Presidente de França', mk:['EU'], w:.45, date:'1977-12-21', time:'10:40', lat:49.8941, lon:2.2958, tz:'Europe/Paris', place:'Amiens', rr:'AA', src:'https://www.astrotheme.com/astrology/Emmanuel_Macron' }, { id:'takaichi', name:'Sanae Takaichi', role:'Primeira-ministra do Japão', mk:['JP'], w:.45, date:'1961-03-07', time:'', lat:34.6851, lon:135.8048, tz:'Asia/Tokyo', place:'Nara', rr:'X', src:'https://www.astrotheme.com/astrology/Sanae_Takaichi' }, { id:'mbs', short:'MBS', name:'Mohammed bin Salman', role:'Príncipe herdeiro e PM da Arábia Saudita', mk:['ME'], w:.45, date:'1985-08-31', time:'', lat:24.7136, lon:46.6753, tz:'Asia/Riyadh', place:'Riade', rr:'X', src:'https://www.astrotheme.com/astrology/Mohammed_bin_Salman' }, { id:'erdogan', name:'Recep Tayyip Erdoğan', role:'Presidente da Turquia', mk:['TR','ME'], w:.4, date:'1954-02-26', time:'04:25', lat:41.0082, lon:28.9784, tz:'Europe/Istanbul', place:'Istambul', rr:'DD', src:'https://www.astrotheme.com/astrology/Recep_Tayyip_Erdogan' } ]; var COUNTRIES = [ { id:'us', name:'Estados Unidos', ev:'Declaração de Independência', date:'1776-07-04', time:'16:50', lat:39.9526, lon:-75.1652, tz:'America/New_York', lmt:true, place:'Filadélfia', rr:'A', w:1, leaders:['trump'], mk:['US'], src:'https://www.astrotheme.com/astrology/United_States_Declaration_of_Independence' }, { id:'cn', name:'China', ev:'Proclamação da República Popular', date:'1949-10-01', time:'15:01', lat:39.9042, lon:116.4074, tz:'Asia/Shanghai', place:'Pequim', rr:'B', w:.9, leaders:['xi'], mk:['CN'], src:'https://astrologyarchive.wordpress.com/horoscopes-of-countries/china/' }, { id:'ru', name:'Rússia', ev:'Declaração de soberania da Federação', date:'1990-06-12', time:'09:45', lat:55.7558, lon:37.6173, tz:'Europe/Moscow', place:'Moscovo', rr:'C', w:.8, leaders:['putin'], mk:['RU'], src:'https://zvezdochet.guru/en/event/58009/rossiya' }, { id:'in', name:'Índia', ev:'Independência', date:'1947-08-15', time:'00:01', lat:28.6139, lon:77.209, tz:'Asia/Kolkata', place:'Nova Deli', rr:'A', w:.6, leaders:['modi'], mk:['IN'], src:'https://www.astrotheme.com/astrology/India' }, { id:'eu', name:'União Europeia', ev:'Tratado de Maastricht em vigor', date:'1993-11-01', time:'00:00', lat:50.8503, lon:4.3517, tz:'Europe/Brussels', place:'Bruxelas', rr:'B', w:.6, leaders:['vdl','merz','macron'], mk:['EU'], src:'https://astrologicalworldmap.com/2013/03/20/european-union-in-political-astrology/' }, { id:'de', name:'Alemanha', ev:'Reunificação', date:'1990-10-03', time:'00:00', lat:52.52, lon:13.405, tz:'Europe/Berlin', place:'Berlim', rr:'AA', w:.45, leaders:['merz'], mk:['EU'], src:'https://www.astrotheme.com/astrology/German_reunification_(1990)' }, { id:'fr', name:'França', ev:'Referendo da V República', date:'1958-09-28', time:'18:00', lat:48.8566, lon:2.3522, tz:'Europe/Paris', place:'Paris', rr:'A', w:.45, leaders:['macron'], mk:['EU'], src:'https://www.astrotheme.com/astrology/French_Fifth_Republic' }, { id:'jp', name:'Japão', ev:'Constituição Meiji (hora retificada)', date:'1889-02-11', time:'10:44', lat:35.6762, lon:139.6503, tz:'Asia/Tokyo', place:'Tóquio', rr:'C', w:.45, leaders:['takaichi'], mk:['JP'], src:'https://www.heavenschild.com.au/j-astrology/japan-astrology-chart.html' }, { id:'sa', name:'Arábia Saudita', ev:'Unificação do reino', date:'1932-09-23', time:'', lat:24.7136, lon:46.6753, tz:'Asia/Riyadh', place:'Riade', rr:'X', w:.45, leaders:['mbs'], mk:['ME'], src:'https://www.astrotheme.com/astrology/Saudi_Arabia' }, { id:'tr', name:'Turquia', ev:'Proclamação da República', date:'1923-10-29', time:'20:30', lat:39.9334, lon:32.8597, tz:'Europe/Istanbul', place:'Ancara', rr:'C', w:.4, leaders:['erdogan'], mk:['TR','ME'], src:'https://www.astrotheme.com/astrology/Turkey' }, { id:'pt', name:'Portugal', ev:'Implantação da República', date:'1910-10-05', time:'09:00', lat:38.7223, lon:-9.1393, tz:'Europe/Lisbon', place:'Lisboa', rr:'C', w:.3, leaders:[], mk:['EU'], src:'https://www.astrotheme.com/astrology/Portuguese_First_Republic' } ]; /* ---------- H3: preditor de fricção por par (registado a 8 out 2026) ---------- */ var PAIRS = [ ['trump','xi','EUA–China'], ['trump','putin','EUA–Rússia'], ['putin','vdl','Rússia–UE'], ['xi','modi','China–Índia'], ['xi','takaichi','China–Japão'], ['trump','vdl','EUA–UE'], ['putin','erdogan','Rússia–Turquia'], ['trump','mbs','EUA–Arábia Saudita'] ]; var BYID = {}; LEADERS.forEach(function(L){ L.F = BZ.chart({ date:L.date, time:L.time, lat:L.lat, lon:L.lon, tz:L.tz, lmt:L.lmt, angles: L.rr === 'AA' || L.rr === 'A' || L.rr === 'B' || L.rr === 'C' }); BYID[L.id] = L; }); var start = Date.UTC(2026, 9, 10, 12), N = 365, rows = ['day,pair,friction_T']; PAIRS.forEach(function(p){ if(!BYID[p[0]] || !BYID[p[1]]) throw new Error('líder em falta: ' + p); }); var CS = PAIRS.map(function(p){ return BZ.contacts(BYID[p[0]].F, BYID[p[1]].F); }); for(var i = 0; i < N; i++){ var t = start + i * 864e5, b = E_allBodies(new Date(t)), day = new Date(t).toISOString().slice(0, 10); PAIRS.forEach(function(p, k){ rows.push(day + ',' + p[0] + '_' + p[1] + ',' + BZ.relationAt(CS[k], b).T.toFixed(6)); }); } if(typeof module !== 'undefined' && require.main === module) process.stdout.write(rows.join('\n') + '\n');