1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3990],{17481:(e,t,a)=>{a.d(t,{E_:()=>p,Et:()=>r,JX:()=>o,RR:()=>c,Vn:()=>n,Zn:()=>u,pV:()=>m,u8:()=>i,w6:()=>l,yq:()=>d});let r=a(65364).env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN||"pk.eyJ1IjoicnlkZXJ0cmFpbnNmeWkiLCJhIjoiY211MGF4a3hrMTAzYjJ4b3Z6NTE5ZjQ3dyJ9.BwPXdK6lL6I8ggX9TlBw_Q",i=[{id:"light",label:"Light",description:"Clean and bright"},{id:"dark",label:"Dark",description:"Easy on the eyes"},{id:"satellite",label:"Satellite",description:"Aerial imagery",premium:!0,mapboxStyle:"satellite-v9"},{id:"hybrid",label:"Hybrid",description:"Imagery with labels",premium:!0,mapboxStyle:"satellite-streets-v12"},{id:"terrain",label:"Terrain",description:"Contours and trails",premium:!0,mapboxStyle:"outdoors-v12"}],n=(e,t)=>{let a=i.find(t=>t.id===e);return!!a&&(!a.premium||!0===t)},s="trainsfyi:world-map-style:v1";function o(){try{let e=localStorage.getItem(s);return i.some(t=>t.id===e)?e:"light"}catch{return"light"}}function l(e){if(i.some(t=>t.id===e))try{localStorage.setItem(s,e)}catch{}}let u=e=>{let t=i.find(t=>t.id===e);if(!t)throw Error("Unknown map style");return t.mapboxStyle?`https://api.mapbox.com/styles/v1/mapbox/${t.mapboxStyle}?access_token=${r}`:`https://tiles.openfreemap.org/styles/${"dark"===e?"dark":"positron"}`},c=(e,t="/")=>e?{href:"/pro/",label:"Upgrade to Pro"}:{href:`/login/?returnUrl=${encodeURIComponent(t)}`,label:"Create an account"},d="https://storage.googleapis.com/trainsfyi-vector-tiles-central/manifest.json";function m(e){let t=e?.combined_raster;if(!t?.tile_url_template)throw Error("Train routes are unavailable. Please try again.");return{type:"raster",tiles:[t.tile_url_template],tileSize:512,minzoom:t.min_zoom,maxzoom:t.max_zoom,attribution:"TrainsFYI network routes"}}async function p(e,t){return(async e=>{let a=await fetch(e,{signal:t});if(!a.ok)throw Error("Map style unavailable");return a.json()})(u(e))}},19533:(e,t,a)=>{a.d(t,{_:()=>o});var r=a(48166),i=a(25620),n=a(21081),s=a(19701);function o(){let{trainColorMode:e}=(0,r.t)(),{user:t,loading:a}=(0,i.A)(),{isPremium:o,entitlementLoading:l}=(0,n.x)();return(0,s.kr)(e,!!t&&!a&&!l&&o)}},28766:(e,t,a)=>{a.d(t,{A:()=>r});let r={src:"/_next/static/media/tfyi_logo_transparent.51e951f5.png",height:703,width:699,blurDataURL:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAaVBMVEVMaXE2YKM+YH34+v8ABwciLTSbpKz4+fj8/f38/PwTJjMSIigbNlAtXI////////8qSmo2S13///+Ei45Ne6guUHSiq61VbINfclo3U2DEzvFEccIdPmBIa5Tj5eSqsGypuM2Wont1iJdIl2hLAAAAG3RSTlMA/PysEj38PFakKFK76hXWzfP9/Pz9dP78+PZiTpkcAAAACXBIWXMAAAsSAAALEgHS3X78AAAAQklEQVQImRXLxRHAMBAAsTWeHWZyuP8iM9FfAMFEAZi8SpuA87Ne3wjNMVzLE7FlUqO+A7bY2/40kOVOurr6FwSBD2PoArv8Sj+dAAAAAElFTkSuQmCC",blurWidth:8,blurHeight:8}},36122:(e,t,a)=>{a.d(t,{x:()=>r});function r(e,t=Date.now()){return e.isGhost||"ghost"===e.position_source?"schedule"===e.freshness_basis&&Number.isFinite(Date.parse(e.valid_until))&&Date.parse(e.valid_until)>t:function(e,t=Date.now()){if(e.isGhost||"ghost"===e.position_source)return!1;if("community"===e.position_source){let a=Date.parse(e.valid_until);return Number.isFinite(a)&&a>t}let a=e.valid_until?Date.parse(e.valid_until):Date.parse(e.source_observed_at||e.vehicle_timestamp||e.updated)+6e5;return Number.isFinite(a)&&a>t}(e,t)}},42644:(e,t,a)=>{a.d(t,{A:()=>f});var r=a(37876),i=a(48230),n=a.n(i),s=a(89099),o=a(50417),l=a(48166),u=a(25620),c=a(21081),d=a(19701),m=a(19533),p=a(17481);function f(){let{setTrainColorMode:e}=(0,l.t)(),t=(0,m._)(),{user:a,loading:i}=(0,u.A)(),{isPremium:f,entitlementLoading:v}=(0,c.x)(),g=(0,s.useRouter)(),_=i||v,h=!!a&&!_&&f,y=(0,p.RR)(!!a,g.asPath);return(0,r.jsxs)("fieldset",{children:[(0,r.jsx)("legend",{className:"mb-2 text-sm font-semibold text-gray-700",children:"Train colours"}),(0,r.jsx)("div",{className:"space-y-2",children:d.sM.map(({id:a,label:i,description:s,premium:l})=>{let u=l&&!h,c=u&&!_?n():"button",d=u&&!_?{href:y.href,title:`${y.label} to use ${i}`}:{type:"button",disabled:l&&_,"aria-pressed":t===a,onClick:()=>e(a)};return(0,r.jsxs)(c,{"aria-label":i,...d,className:`block w-full rounded-lg border px-3 py-2 text-left focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 disabled:opacity-50 ${t===a?"border-blue-600 bg-blue-50":"border-gray-200 hover:bg-gray-50"}`,children:[(0,r.jsxs)("span",{className:"flex items-center justify-between gap-2 text-sm font-medium text-gray-800",children:[i,l&&(0,r.jsxs)("span",{className:"flex items-center gap-1 rounded bg-amber-50 px-1 text-[10px] text-amber-800",children:[u&&(0,r.jsx)(o.A,{className:"h-3 w-3","aria-hidden":"true"}),"PRO"]})]}),(0,r.jsx)("span",{className:"mt-1 block text-xs text-gray-500",children:s})]},a)})})]})}},48564:(e,t,a)=>{a.d(t,{M5:()=>o,_f:()=>n,l4:()=>r,tW:()=>s});let r={slug:"freight",name:"Freight trains",color:"#b45309",darkerColor:"#78350f",vehicleClassificationOverride:"freight"},i=e=>e.valid_until?Date.parse(e.valid_until):Date.parse(e.last_seen)+108e5,n=(e,t=Date.now())=>"active"===e.status&&Number.isFinite(e.current_lat)&&Number.isFinite(e.current_lon)&&Date.parse(e.last_seen)<=t&&i(e)>t,s=e=>/^(?:\d+|(?:fi|no)-\d{4}-\d{2}-\d{2}-\d+|gb-[A-Za-z0-9]{10})$/.test(String(e));function o(e,t=Date.now()){return Array.isArray(e)?e.filter(e=>n(e,t)).map(e=>({agency:"freight",vid:String(e.id),name:e.name||("unknown"===e.train_type?`Unclassified train ${e.id}`:`Freight train ${e.id}`),vt:"freight",lat:e.current_lat,lng:e.current_lon,dir:e.current_bearing??e.last_bearing,updated:e.source?e.last_seen:e.predicted_at||new Date(t).toISOString(),source_observed_at:e.last_seen,valid_until:new Date(i(e)).toISOString(),position_source:e.position_source||"sighting_prediction",normalized:{speed:{has_speed:Number.isFinite(e.effective_speed_kmh??e.last_speed_kmh),kph:e.effective_speed_kmh??e.last_speed_kmh,value:e.effective_speed_kmh??e.last_speed_kmh,unit:"km/h"}},lookahead_path:e.lookahead_path,freight:e})):[]}},77604:(e,t,a)=>{a.d(t,{Pq:()=>r,Ym:()=>s,Zn:()=>i,ak:()=>n});let r=e=>{if(!e)return{time:null,dayLabel:null};let t=e.split(":"),a=parseInt(t[0],10),r=t[1]||"00";if(isNaN(a))return{time:e,dayLabel:null};let i=Math.floor(a/24);return a%=24,{time:`${a}:${r}`,dayLabel:i>0?`+${i}d`:null}},i=e=>{if(e<60)return`${e}m`;let t=Math.floor(e/60),a=e%60;return a>0?`${t}h ${a}m`:`${t}h`},n=e=>{let t=new Date(e),a=Math.floor((new Date-t)/1e3);if(a<60)return`${a} second${1!==a?"s":""} ago`;if(a<3600){let e=Math.floor(a/60);return`${e} minute${1!==e?"s":""} ago`}if(a<86400){let e=Math.floor(a/3600);return`${e} hour${1!==e?"s":""} ago`}let r=Math.floor(a/86400);return`${r} day${1!==r?"s":""} ago`},s=e=>{if(!e||!Array.isArray(e))return[];let t={},a={};
1return e.forEach(e=>{e.route_short_name&&(t[e.route_short_name]=(t[e.route_short_name]||0)+1),e.route_long_name&&(a[e.route_long_name]=(a[e.route_long_name]||0)+1)}),e.map(e=>{if(!e.route_short_name)return{primary:e.route_long_name,secondary:null};if(!e.route_long_name)return{primary:e.route_short_name,secondary:null};let r=t[e.route_short_name],i=a[e.route_long_name];if(r<i);else if(i<r)return{primary:e.route_long_name,secondary:e.route_short_name};return{primary:e.route_short_name,secondary:e.route_long_name}})}},78240:(e,t,a)=>{a.d(t,{QU:()=>v,od:()=>V,Ve:()=>P,bO:()=>E,s1:()=>$,xM:()=>S,L6:()=>N,qe:()=>x,kO:()=>C,p0:()=>L,lf:()=>M,a2:()=>T,AJ:()=>G,b1:()=>O,kU:()=>F,X5:()=>D,nC:()=>b,_I:()=>k,jC:()=>I,Gn:()=>B,wF:()=>z,Vb:()=>R,_i:()=>X,o8:()=>U,e9:()=>w});var r=a(60371),i=a(14232),n=a(36122),s=a(75656),o=a(48564);a(99904);var l=a(74880),u=a(95389);let c=(e,t)=>{if(!e||null===e.spd||void 0===e.spd)return null;let a=Math.round(Number(e.spd));return t?.metric?a:Math.round(.621371*a)},d=(e,t)=>t?.metric===void 0||t.metric?"kph":"mph";var m=a(77604);let p=a(65364).env.NEXT_PUBLIC_API_HOST,f=!!p&&/(localhost|127\.0\.0\.1)/i.test(p),v=p&&!f?p:"https://api.trains.fyi",g=e=>r.A.get(e).then(e=>e.data);function _(e){let[t,a]=(0,i.useState)(()=>Date.now());(0,i.useEffect)(()=>{let e=()=>a(Date.now()),t=setInterval(e,1e3);return document.addEventListener("visibilitychange",e),()=>{clearInterval(t),document.removeEventListener("visibilitychange",e)}},[]);let r=e.map(e=>(0,n.x)(e,t)?"1":"0").join("");return(0,i.useMemo)(()=>e.filter((e,t)=>"1"===r[t]),[e,r])}let h=e=>{let t=l.Y.getNetwork(e.agency);return{...e,dst:"Unknown"===e.dst?null:e.dst,org:"Unknown"===e.org?null:e.org,spd:{unit:d(e,t),value:c(e,t)},updated_ago:(0,m.ak)(e.updated),normalized:{speed:{has_speed:null!==e.spd,kph:e.spd,unit:d(e,t),value:c(e,t)},network:t,vehicle:{type:{name:e?.vt&&u.L[e.vt]?u.L[e.vt].name:"Train",icon:e?.vt&&u.L[e.vt]?u.L[e.vt].icon:"train"}}}}},y=e=>r.A.get(e).then(e=>{let t=e.data,a=Array.isArray(t?.trains)?t.trains.map(h):[],r=new Map;return a.forEach(e=>{let t=e.agency?.toLowerCase();if(!t)return;let a=r.get(t);a?a.push(e):r.set(t,[e])}),{...t,trains:a,byAgency:r}}),b=(e=!0)=>{let{data:t,error:a,mutate:r,isValidating:n}=(0,s.Ay)(e?`${v}/api/trains/`:null,y,{refreshInterval:3e4,revalidateOnFocus:!1,dedupingInterval:5e3,keepPreviousData:!0}),o=(0,i.useMemo)(()=>t||{trains:[],routes:[],byAgency:new Map},[t]);return(0,i.useMemo)(()=>({trains:o,isLoading:!a&&!o,isUpdating:n,isError:a,mutate:r}),[o,a,n,r])},A=async e=>{let t=await Promise.all(e.map(g));return{metadata:t[0]?.metadata,trains:t.flatMap(e=>e.positions)}},w=(e=!1,t=null)=>{let a=`${v}/api/v5/positions/${e?"preview/":""}`,{data:r,error:n,mutate:l,isValidating:u}=(0,s.Ay)(a,g,{revalidateOnFocus:!1,dedupingInterval:5e3,keepPreviousData:!0}),{data:c}=(0,s.Ay)(e||r||!t?null:t.map(e=>`${v}/api/v5/viewport/positions/?bbox=${e.join(",")}`),A,{revalidateOnFocus:!1,dedupingInterval:5e3,refreshInterval:3e4,keepPreviousData:!0}),d=r||c;(0,i.useEffect)(()=>{let e=setInterval(()=>{l()},3e4);return()=>clearInterval(e)},[l]);let m=(0,s.Ay)(e?null:"/api/freight/trains",g,{refreshInterval:3e4,revalidateOnFocus:!0,dedupingInterval:5e3}),p=(0,i.useMemo)(()=>(0,o.M5)(m.data),[m.data]),f=(0,i.useMemo)(()=>d&&d.trains?{metadata:d.metadata,trains:d.trains.map(h)}:{trains:[],metadata:null},[d]),y=_((0,i.useMemo)(()=>[...f.trains,...p],[f.trains,p]));return(0,i.useMemo)(()=>({trains:{...f,trains:y},isLoading:!n&&!d,isUpdating:u,isError:n,mutate:l}),[f,y,d,n,u,l])},I=(e,t)=>{let{data:a,error:r,mutate:n,isValidating:o}=(0,s.Ay)(`${v}/api/v4/${e}/vehicles/${t}/`,g,{refreshInterval:3e4,revalidateOnFocus:!0,dedupingInterval:5e3,keepPreviousData:!0}),l=(0,i.useMemo)(()=>a?"vehicle"in a?{vehicle:a.vehicle,positions:a.positions.map(h)}:{positions:a.positions.map(h)}:null,[a]);return{positions:l,isLoading:!r&&!l,isUpdating:o,isError:r,mutate:n}},$=()=>{let{data:e,error:t,mutate:a,isValidating:r}=(0,s.Ay)(`${v}/api/ghost/`,g,{refreshInterval:3e4,revalidateOnFocus:!1,dedupingInterval:5e3,keepPreviousData:!0}),n=(0,i.useMemo)(()=>e?{...e,trains:e.trains.map(h)}:null,[e]);return{trains:n,isLoading:!t&&!n,isUpdating:r,isError:t,mutate:a}},k=e=>{let t=e?.toLowerCase(),{data:a,error:r,mutate:n,isValidating:o}=(0,s.Ay)(t?`${v}/api/v5/${encodeURIComponent(t)}/positions/`:null,g,{revalidateOnFocus:!1,dedupingInterval:5e3});(0,i.useEffect)(()=>
1{if(!t)return;let e=setInterval(()=>n(),3e4);return()=>clearInterval(e)},[t,n]);let l=_((0,i.useMemo)(()=>(a?.trains??[]).map(h),[a]));return{trains:l,isLoading:!!t&&!r&&!a,isUpdating:o,isError:r,mutate:n,hasGhostTrains:l.some(e=>"ghost"===e.position_source||e.isGhost)}},E=()=>{let{data:e,error:t,isLoading:a}=(0,s.Ay)(`${v}/api/v5/announcement/`,g,{dedupingInterval:6e4,revalidateOnFocus:!1});return{announcement:e?.announcement??null,isLoading:a,isError:t}},S=()=>{let{data:e,error:t,isLoading:a}=(0,s.Ay)(`${v}/api/network-catalog/v1/networks/`,g,{revalidateOnFocus:!1,dedupingInterval:6e4});return{networks:Array.isArray(e?.networks)?e.networks:[],isLoading:a,isError:t}},T=()=>{let{data:e,error:t,isLoading:a}=(0,s.Ay)(`${v}/api/v5/networks/train-counts/`,g,{refreshInterval:15e3,revalidateOnFocus:!1,dedupingInterval:1e4,keepPreviousData:!0});return{counts:e?.counts||{},isLoading:a,isError:t}},L=(e,t={})=>{let{hours:a,granularity:r,includeRoutes:n}=t,o=(0,i.useMemo)(()=>{if(!e)return null;let t=new URLSearchParams;null!=a&&t.set("hours",String(a)),r&&t.set("granularity",String(r)),null!=n&&t.set("include_routes",n?"1":"0");let i=t.toString();return`${v}/api/v3/${e}/statistics/${i?`?${i}`:""}`},[e,a,r,n]),{data:l,error:u}=(0,s.Ay)(o,g,{refreshInterval:3e5,revalidateOnFocus:!1,dedupingInterval:3e5});return{data:l?.statistics||[],networkName:l?.network||"",isLoading:!u&&!l,error:u}},M=e=>{let{data:t,error:a}=(0,s.Ay)(`${v}/api/v3/${e}/stops/`,e=>r.A.get(e).then(e=>e.data),{dedupingInterval:864e5});return{stops:t,isLoading:!a&&!t,isError:a}},x=e=>{let{data:t,error:a}=(0,s.Ay)(`${v}/api/v3/${e}/routes/`,e=>r.A.get(e).then(e=>e.data),{dedupingInterval:864e5});return{routes:t?.routes||[],isLoading:!a&&!t,isError:a}},D=e=>{let{data:t,error:a}=(0,s.Ay)(`${v}/api/v3/${e}/stops/`,g,{dedupingInterval:432e5});return{stops:t,isLoading:!a&&!t,isError:a}},F=(e,t)=>{let{data:a,error:r}=(0,s.Ay)(`${v}/api/v3/${e}/stops/${t}/`,g,{dedupingInterval:6e4});return{stopDetails:a,isLoading:!r&&!a,isError:r}},C=(e,t)=>{let{routes:a,isLoading:r,isError:i}=x(e);return e&&t?{routeDetails:a.find(e=>e.route_id===t),isLoading:r,isError:i}:{routeDetails:null,isLoading:!0,isError:!1}},N=(e,t)=>{let{data:a,error:i}=(0,s.Ay)(`${v}/api/v3/${e}/routes/${t}/details/`,e=>r.A.get(e).then(e=>e.data),{dedupingInterval:864e5});return{routes:a,isLoading:!i&&!a,isError:i}},P=(e,{withShapes:t=!0}={})=>{let a=e?`${v}/api/v3/${e}/routes/all/${t?"":"?shapes=exclude"}`:null,{data:r,error:i}=(0,s.Ay)(a,g,{dedupingInterval:864e5,revalidateOnFocus:!1,revalidateOnReconnect:!1,revalidateIfStale:!1});return{allRoutes:r||[],isLoading:!i&&!r&&void 0!==e,isError:i}},U=()=>{let{data:e,error:t}=(0,s.Ay)("https://storage.googleapis.com/trainsfyi-vector-tiles-central/manifest.json",g,{dedupingInterval:3e5,revalidateOnFocus:!1,revalidateOnReconnect:!1});return{networksBySlug:(0,i.useMemo)(()=>{let t={};return(e?.networks||[]).forEach(e=>{t[e.network]=e}),t},[e]),layerName:e?.layer_name||"shapes",isLoading:!t&&!e,isError:t}},O=(e,t)=>{let{trains:a}=b();return a?.trains&&e&&t?a.trains.filter(a=>a.agency===e&&a.gtfs?.route_id===t):[]},j=["go","go-transit","mta","marta"],R=e=>{let{data:t,error:a}=(0,s.Ay)(e?`${v}/api/v5/${e}/positions/`:null,g,{refreshInterval:3e4,dedupingInterval:5e3});return{trains:t?.trains??[],isLoading:!a&&!t&&!!e}},z=(e,t)=>{let{data:a,error:r,mutate:i,isValidating:n}=(0,s.Ay)(e&&t&&j.includes(e?.toLowerCase())?`${v}/api/v5/${e}/stops/${encodeURIComponent(t)}/departures/`:null,g,{refreshInterval:6e4,dedupingInterval:3e4});return{departures:a?.departures??[],stop:a?.stop,localTime:a?.local_time,timezone:a?.timezone,isLoading:!r&&!a&&!!(e&&t),isError:r,mutate:i,isValidating:n}},X=(e,t)=>{let{data:a,error:r,mutate:i,isValidating:n}=(0,s.Ay)(e&&t?`${v}/api/v5/${e}/trips/${encodeURIComponent(t)}/stop_times/`:null,g,{refreshInterval:3e4,dedupingInterval:15e3});return{stopTimes:a?.stop_times??null,tripDelay:a?.delay_seconds??null,tripStatus:a?.status??null,scheduleRelationship:a?.schedule_relationship??null,isLoading:!r&&!a&&!!(e&&t),isError:r,mutate:i,isValidating:n}},B=e=>{let{data:t,error:a,mutate:r,isValidating:i}=(0,s.Ay)(e?`${v}/api/v5/${e}/alerts/`:null,g,{refreshInterval:12e4,dedupingInterval:6e4});return{alerts:t?.alerts??[],isLoading:!a&&!t&&!!e,isError:a,mutate:r,isValidating:i}},V=e=>e&&j.includes(String(e).toLowerCase()),G=(e,t,a)=>{let{data:r,error:i,mutate:n,isValidating:o}=(0,s.Ay)(e&&t&&a?`${v}/api/v5/${e}/od/${encodeURIComponent(t)}/${encodeURIComponent(a)}/`:null,g,{refreshInterval:3e4,dedupingInterval:1e4,keepPreviousData:!0});return{odData:r,trips:r?.trips??[],origin:r?.origin,destination:r?.destination,segmentShape:r?.segment_shape,localTime:r?.local_time,timezone:r?.timezone,isLoading:!i&&!r&&!!(e&&t&&a),isError:i,mutate:n,isValidating:o}}},95389:(e,t,a)=>{a.d(t,{L:()=>r});let r={0:{classification:"streetcar",name:"Streetcar",icon:"streetcar"},1:{classification:"subway_default",name:"Subway",icon:"subway"},2:{classification:"heavy_rail_default",name:"Train",icon:"train"},5:{classification:"cable_car",name:"Cable Car",icon:"train"},12:{classification:"monorail",name:"Monorail",icon:"train"},100:{classification:"heavy_rail_default",name:"Train",icon:"train"}
1,101:{classification:"high_speed_rail",name:"High-Speed Train",icon:"train"},102:{classification:"intercity_rail",name:"Intercity Train",icon:"train"},103:{classification:"intercity_rail",name:"Intercity Train",icon:"train"},104:{classification:"heavy_rail_default",name:"Train",icon:"train"},105:{classification:"intercity_rail",name:"Intercity Train",icon:"train"},106:{classification:"commuter_rail",name:"Commuter Train",icon:"train"},107:{classification:"heavy_rail_default",name:"Train",icon:"train"},108:{classification:"people_mover",name:"People Mover",icon:"train"},109:{classification:"commuter_rail",name:"Commuter Train",icon:"train"},110:{classification:"heavy_rail_default",name:"Train",icon:"train"},111:{classification:"heavy_rail_default",name:"Train",icon:"train"},112:{classification:"heavy_rail_default",name:"Train",icon:"train"},113:{classification:"heavy_rail_default",name:"Train",icon:"train"},114:{classification:"intercity_rail",name:"Intercity Train",icon:"train"},115:{classification:"heavy_rail_default",name:"Train",icon:"train"},116:{classification:"funicular",name:"Funicular",icon:"train"},117:{classification:"heavy_rail_default",name:"Train",icon:"train"},400:{classification:"subway_default",name:"Subway",icon:"subway"},401:{classification:"subway_default",name:"Subway",icon:"subway"},402:{classification:"subway_underground",name:"Underground Subway",icon:"subway"},403:{classification:"subway_elevated",name:"Elevated Subway",icon:"subway"},404:{classification:"subway_default",name:"Subway",icon:"subway"},405:{classification:"monorail",name:"Monorail",icon:"train"},900:{classification:"streetcar",name:"Streetcar",icon:"streetcar"},901:{classification:"tram",name:"Tram",icon:"streetcar"},902:{classification:"tram",name:"Tram",icon:"streetcar"},903:{classification:"tram",name:"Tram",icon:"streetcar"},904:{classification:"tram",name:"Tram",icon:"streetcar"},905:{classification:"tram",name:"Tram",icon:"streetcar"},906:{classification:"tram",name:"Tram",icon:"streetcar"},lr:{classification:"tram",name:"Tram",icon:"streetcar"},hr:{classification:"heavy_rail_default",name:"Train",icon:"train"}}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.