minotor 7.0.2 → 9.0.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.
Files changed (60) hide show
  1. package/.cspell.json +11 -1
  2. package/CHANGELOG.md +8 -3
  3. package/README.md +26 -24
  4. package/dist/cli.mjs +1786 -791
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/gtfs/transfers.d.ts +29 -5
  7. package/dist/gtfs/trips.d.ts +10 -5
  8. package/dist/parser.cjs.js +972 -525
  9. package/dist/parser.cjs.js.map +1 -1
  10. package/dist/parser.esm.js +972 -525
  11. package/dist/parser.esm.js.map +1 -1
  12. package/dist/router.cjs.js +1 -1
  13. package/dist/router.cjs.js.map +1 -1
  14. package/dist/router.d.ts +2 -2
  15. package/dist/router.esm.js +1 -1
  16. package/dist/router.esm.js.map +1 -1
  17. package/dist/router.umd.js +1 -1
  18. package/dist/router.umd.js.map +1 -1
  19. package/dist/routing/__tests__/plotter.test.d.ts +1 -0
  20. package/dist/routing/plotter.d.ts +42 -3
  21. package/dist/routing/result.d.ts +23 -7
  22. package/dist/routing/route.d.ts +2 -0
  23. package/dist/routing/router.d.ts +78 -19
  24. package/dist/timetable/__tests__/tripBoardingId.test.d.ts +1 -0
  25. package/dist/timetable/io.d.ts +4 -2
  26. package/dist/timetable/proto/timetable.d.ts +15 -1
  27. package/dist/timetable/route.d.ts +48 -23
  28. package/dist/timetable/timetable.d.ts +24 -7
  29. package/dist/timetable/tripBoardingId.d.ts +34 -0
  30. package/package.json +1 -1
  31. package/src/__e2e__/router.test.ts +114 -105
  32. package/src/__e2e__/timetable/stops.bin +2 -2
  33. package/src/__e2e__/timetable/timetable.bin +2 -2
  34. package/src/cli/repl.ts +245 -1
  35. package/src/gtfs/__tests__/parser.test.ts +19 -4
  36. package/src/gtfs/__tests__/transfers.test.ts +773 -37
  37. package/src/gtfs/__tests__/trips.test.ts +308 -27
  38. package/src/gtfs/parser.ts +36 -6
  39. package/src/gtfs/transfers.ts +193 -19
  40. package/src/gtfs/trips.ts +58 -21
  41. package/src/router.ts +2 -2
  42. package/src/routing/__tests__/plotter.test.ts +230 -0
  43. package/src/routing/__tests__/result.test.ts +486 -125
  44. package/src/routing/__tests__/route.test.ts +7 -3
  45. package/src/routing/__tests__/router.test.ts +380 -172
  46. package/src/routing/plotter.ts +279 -48
  47. package/src/routing/result.ts +114 -34
  48. package/src/routing/route.ts +0 -3
  49. package/src/routing/router.ts +344 -211
  50. package/src/timetable/__tests__/io.test.ts +34 -1
  51. package/src/timetable/__tests__/route.test.ts +74 -81
  52. package/src/timetable/__tests__/timetable.test.ts +232 -61
  53. package/src/timetable/__tests__/tripBoardingId.test.ts +57 -0
  54. package/src/timetable/io.ts +72 -10
  55. package/src/timetable/proto/timetable.proto +16 -2
  56. package/src/timetable/proto/timetable.ts +256 -22
  57. package/src/timetable/route.ts +174 -58
  58. package/src/timetable/timetable.ts +66 -16
  59. package/src/timetable/tripBoardingId.ts +94 -0
  60. package/tsconfig.json +2 -2
package/dist/router.d.ts CHANGED
@@ -3,7 +3,7 @@ import { Query } from './routing/query.js';
3
3
  import { Result } from './routing/result.js';
4
4
  import type { Leg, Transfer, VehicleLeg } from './routing/route.js';
5
5
  import { Route } from './routing/route.js';
6
- import type { ReachingTime } from './routing/router.js';
6
+ import type { Arrival } from './routing/router.js';
7
7
  import { Router } from './routing/router.js';
8
8
  import type { LocationType, SourceStopId, StopId } from './stops/stops.js';
9
9
  import type { Stop } from './stops/stops.js';
@@ -13,4 +13,4 @@ import { Time } from './timetable/time.js';
13
13
  import type { RouteType, ServiceRouteInfo, TransferType } from './timetable/timetable.js';
14
14
  import { Timetable } from './timetable/timetable.js';
15
15
  export { Duration, Plotter, Query, Result, Route, Router, StopsIndex, Time, Timetable, };
16
- export type { Leg, LocationType, ReachingTime, RouteType, ServiceRouteInfo, SourceStopId, Stop, StopId, Transfer, TransferType, VehicleLeg, };
16
+ export type { Arrival, Leg, LocationType, RouteType, ServiceRouteInfo, SourceStopId, Stop, StopId, Transfer, TransferType, VehicleLeg, };
@@ -1,2 +1,2 @@
1
- class t{constructor(t){this.result=t}plotDotGraph(){const t=this.result.earliestArrivalsPerRound,e=["digraph PathTree {"," graph [overlap=false];"," node [shape=ellipse style=filled fillcolor=lightgrey];"];return t.forEach(((t,r)=>{t.forEach((t=>{const{origin:n,leg:s}=t;if(!s)return;const i=this.result.stopsIndex.findStopById(s.from.id),o=this.result.stopsIndex.findStopById(s.to.id),a=this.result.stopsIndex.findStopById(n);if(i&&o&&a){const t=i.platform?`${i.name} (Pl. ${i.platform})`:i.name,n=o.platform?`${o.name} (Pl. ${o.platform})`:o.name,u=a.platform?`${a.name} (Pl. ${a.platform})`:a.name,c="route"in s,h=c?`${s.route.name}\n${s.departureTime.toString()} - ${s.arrivalTime.toString()}`:s.minTransferTime?s.minTransferTime.toString():"",l=`IntermediateNode${i.id}_${o.id}`,f=c?"":', color="red", fontcolor="red"',d=c?"":' fontcolor="red"';e.push(` "${t} (Origin: ${u}) [R${r}]\n(${i.id})" -> "${l}" [shape=point${f}];`),e.push(` "${l}" [label="${h}" shape=rect style=filled fillcolor=white${d} border=0];`),e.push(` "${l}" -> "${n} (Origin: ${u}) [R${r}]\n(${o.id})" [${f.replace(", ","")}];`)}}))})),e.push("}"),e.join("\n")}}class e{constructor(t){this.totalSeconds=t}static fromSeconds(t){return new e(t)}static fromMinutes(t){return new e(60*t)}static zero(){return new e(0)}toString(){const t=Math.floor(this.totalSeconds/3600),e=Math.floor(this.totalSeconds%3600/60),r=this.totalSeconds%60;return t>0?`${t.toString().padStart(2,"0")}:${e.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`:`${e.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`}toSeconds(){return this.totalSeconds}add(t){const r=this.totalSeconds+t.toSeconds();return new e(r)}subtract(t){const r=Math.max(0,this.totalSeconds-t.toSeconds());return new e(r)}}function r(){let t=0,e=0;for(let r=0;r<28;r+=7){let n=this.buf[this.pos++];if(t|=(127&n)<<r,!(128&n))return this.assertBounds(),[t,e]}let r=this.buf[this.pos++];if(t|=(15&r)<<28,e=(112&r)>>4,!(128&r))return this.assertBounds(),[t,e];for(let r=3;r<=31;r+=7){let n=this.buf[this.pos++];if(e|=(127&n)<<r,!(128&n))return this.assertBounds(),[t,e]}throw new Error("invalid varint")}function n(t,e,r){for(let n=0;n<28;n+=7){const s=t>>>n,i=!(s>>>7==0&&0==e),o=255&(i?128|s:s);if(r.push(o),!i)return}const n=t>>>28&15|(7&e)<<4,s=!!(e>>3);if(r.push(255&(s?128|n:n)),s){for(let t=3;t<31;t+=7){const n=e>>>t,s=!(n>>>7==0),i=255&(s?128|n:n);if(r.push(i),!s)return}r.push(e>>>31&1)}}const s=4294967296;function i(t){const e="-"===t[0];e&&(t=t.slice(1));const r=1e6;let n=0,i=0;function o(e,o){const a=Number(t.slice(e,o));i*=r,n=n*r+a,n>=s&&(i+=n/s|0,n%=s)}return o(-24,-18),o(-18,-12),o(-12,-6),o(-6),e?u(n,i):a(n,i)}function o(t,e){if(({lo:t,hi:e}=function(t,e){return{lo:t>>>0,hi:e>>>0}}(t,e)),e<=2097151)return String(s*e+t);const r=16777215&(t>>>24|e<<8),n=e>>16&65535;let i=(16777215&t)+6777216*r+6710656*n,o=r+8147497*n,a=2*n;const u=1e7;return i>=u&&(o+=Math.floor(i/u),i%=u),o>=u&&(a+=Math.floor(o/u),o%=u),a.toString()+c(o)+c(i)}function a(t,e){return{lo:0|t,hi:0|e}}function u(t,e){return e=~e,t?t=1+~t:e+=1,a(t,e)}const c=t=>{const e=String(t);return"0000000".slice(e.length)+e};function h(t,e){if(t>=0){for(;t>127;)e.push(127&t|128),t>>>=7;e.push(t)}else{for(let r=0;r<9;r++)e.push(127&t|128),t>>=7;e.push(1)}}function l(){let t=this.buf[this.pos++],e=127&t;if(!(128&t))return this.assertBounds(),e;if(t=this.buf[this.pos++],e|=(127&t)<<7,!(128&t))return this.assertBounds(),e;if(t=this.buf[this.pos++],e|=(127&t)<<14,!(128&t))return this.assertBounds(),e;if(t=this.buf[this.pos++],e|=(127&t)<<21,!(128&t))return this.assertBounds(),e;t=this.buf[this.pos++],e|=(15&t)<<28;for(let e=5;128&t&&e<10;e++)t=this.buf[this.pos++];if(128&t)throw new Error("invalid varint");return this.assertBounds(),e>>>0}const f=d();function d(){const t=new DataView(new ArrayBuffer(8));if("function"==typeof BigInt&&"function"==typeof t.getBigInt64&&"function"==typeof t.getBigUint64&&"function"==typeof t.setBigInt64&&"function"==typeof t.setBigUint64&&("object"!=typeof process||"object"!=typeof process.env||"1"!==process.env.BUF_BIGINT_DISABLE)){const e=BigInt("-9223372036854775808"),r=BigInt("9223372036854775807"),n=BigInt("0"),s=BigInt("18446744073709551615");return{zero:BigInt(0),supported:!0,parse(t){const n="bigint"==typeof t?t:BigInt(t);if(n>r||n<e)throw new Error(`invalid int64: ${t}`);return n},uParse(t){const e="bigint"==typeof t?t:BigInt(t);if(e>s||e<n)throw new Error(`invalid uint64: ${t}`);return e},enc(e){return t.setBigInt64(0,this.parse(e),!0),{lo:t.getInt32(0,!0),hi:t.getInt32(4,!0)}},uEnc(e){return t.setBigInt64(0,this.uParse(e),!0),{lo:t.getInt32(0,!0),hi:t.getInt32(4,!0)}},dec:(e,r)=>(t.setInt32(0,e,!0),t.setInt32(4,r,!0),t.getBigInt64(0,!0)),uDec:(e,r)=>(t.setInt32(0,e,!0),t.setInt32(4,r,!0),t.getBigUint64(0,!0))}}return{zero:"0",supported:!1,parse:t=>("string"!=typeof t&&(t=t.toString()),p(t),t),uParse:t=>("string"!=typeof t&&(t=t.toString()),m(t),t),enc:t=>("string"!=typeof t&&(t=t.toString()),p(t),i(t)),uEnc:t=>("string"!=typeof t&&(t=t.toString()),m(t),i(t)),dec:(t,e)=>function(t,e){let r=a(t,e);const n=2147483648&r.hi;n&&(r=u(r.lo,r.hi));const s=o(r.lo,r.hi);return n?"-"+s:s}(t,e),uDec:(t,e)=>o(t,e)}}function p(t){if(!/^-?[0-9]+$/.test(t))throw new Error("invalid int64: "+t)}function m(t){if(!/^[0-9]+$/.test(t))throw new Error("invalid uint64: "+t)}const g=Symbol.for("@bufbuild/protobuf/text-encoding");function T(){if(null==globalThis[g]){const t=new globalThis.TextEncoder,e=new globalThis.TextDecoder;globalThis[g]={encodeUtf8:e=>t.encode(e),decodeUtf8:t=>e.decode(t),checkUtf8(t){try{return encodeURIComponent(t),!0}catch(t){return!1}}}}return globalThis[g]}var v;!function(t){t[t.Varint=0]="Varint",t[t.Bit64=1]="Bit64",t[t.LengthDelimited=2]="LengthDelimited",t[t.StartGroup=3]="StartGroup",t[t.EndGroup=4]="EndGroup",t[t.Bit32=5]="Bit32"}(v||(v={}));const I=34028234663852886e22,A=-34028234663852886e22;class y{constructor(t=T().encodeUtf8){this.encodeUtf8=t,this.stack=[],this.chunks=[],this.buf=[]}finish(){this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]);let t=0;for(let e=0;e<this.chunks.length;e++)t+=this.chunks[e].length;let e=new Uint8Array(t),r=0;for(let t=0;t<this.chunks.length;t++)e.set(this.chunks[t],r),r+=this.chunks[t].length;return this.chunks=[],e}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let t=this.finish(),e=this.stack.pop();if(!e)throw new Error("invalid state, fork stack empty");return this.chunks=e.chunks,this.buf=e.buf,this.uint32(t.byteLength),this.raw(t)}tag(t,e){return this.uint32((t<<3|e)>>>0)}raw(t){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(t),this}uint32(t){for(S(t);t>127;)this.buf.push(127&t|128),t>>>=7;return this.buf.push(t),this}int32(t){return R(t),h(t,this.buf),this}bool(t){return this.buf.push(t?1:0),this}bytes(t){return this.uint32(t.byteLength),this.raw(t)}string(t){let e=this.encodeUtf8(t);return this.uint32(e.byteLength),this.raw(e)}float(t){!function(t){if("string"==typeof t){const e=t;if(t=Number(t),Number.isNaN(t)&&"NaN"!==e)throw new Error("invalid float32: "+e)}else if("number"!=typeof t)throw new Error("invalid float32: "+typeof t);if(Number.isFinite(t)&&(t>I||t<A))throw new Error("invalid float32: "+t)}(t);let e=new Uint8Array(4);return new DataView(e.buffer).setFloat32(0,t,!0),this.raw(e)}double(t){let e=new Uint8Array(8);return new DataView(e.buffer).setFloat64(0,t,!0),this.raw(e)}fixed32(t){S(t);let e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,t,!0),this.raw(e)}sfixed32(t){R(t);let e=new Uint8Array(4);return new DataView(e.buffer).setInt32(0,t,!0),this.raw(e)}sint32(t){return R(t),h(t=(t<<1^t>>31)>>>0,this.buf),this}sfixed64(t){let e=new Uint8Array(8),r=new DataView(e.buffer),n=f.enc(t);return r.setInt32(0,n.lo,!0),r.setInt32(4,n.hi,!0),this.raw(e)}fixed64(t){let e=new Uint8Array(8),r=new DataView(e.buffer),n=f.uEnc(t);return r.setInt32(0,n.lo,!0),r.setInt32(4,n.hi,!0),this.raw(e)}int64(t){let e=f.enc(t);return n(e.lo,e.hi,this.buf),this}sint64(t){const e=f.enc(t),r=e.hi>>31;return n(e.lo<<1^r,(e.hi<<1|e.lo>>>31)^r,this.buf),this}uint64(t){const e=f.uEnc(t);return n(e.lo,e.hi,this.buf),this}}class E{constructor(t,e=T().decodeUtf8){this.decodeUtf8=e,this.varint64=r,this.uint32=l,this.buf=t,this.len=t.length,this.pos=0,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength)}tag(){let t=this.uint32(),e=t>>>3,r=7&t;if(e<=0||r<0||r>5)throw new Error("illegal tag: field no "+e+" wire type "+r);return[e,r]}skip(t,e){let r=this.pos;switch(t){case v.Varint:for(;128&this.buf[this.pos++];);break;case v.Bit64:this.pos+=4;case v.Bit32:this.pos+=4;break;case v.LengthDelimited:let r=this.uint32();this.pos+=r;break;case v.StartGroup:for(;;){const[t,r]=this.tag();if(r===v.EndGroup){if(void 0!==e&&t!==e)throw new Error("invalid end group tag");break}this.skip(r,t)}break;default:throw new Error("cant skip wire type "+t)}return this.assertBounds(),this.buf.subarray(r,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return 0|this.uint32()}sint32(){let t=this.uint32();return t>>>1^-(1&t)}int64(){return f.dec(...this.varint64())}uint64(){return f.uDec(...this.varint64())}sint64(){let[t,e]=this.varint64(),r=-(1&t);return t=(t>>>1|(1&e)<<31)^r,e=e>>>1^r,f.dec(t,e)}bool(){let[t,e]=this.varint64();return 0!==t||0!==e}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return f.uDec(this.sfixed32(),this.sfixed32())}sfixed64(){return f.dec(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let t=this.uint32(),e=this.pos;return this.pos+=t,this.assertBounds(),this.buf.subarray(e,e+t)}string(){return this.decodeUtf8(this.bytes())}}function R(t){if("string"==typeof t)t=Number(t);else if("number"!=typeof t)throw new Error("invalid int32: "+typeof t);if(!Number.isInteger(t)||t>2147483647||t<-2147483648)throw new Error("invalid int32: "+t)}function S(t){if("string"==typeof t)t=Number(t);else if("number"!=typeof t)throw new Error("invalid uint32: "+typeof t);if(!Number.isInteger(t)||t>4294967295||t<0)throw new Error("invalid uint32: "+t)}var w,_;function b(t){switch(t){case 0:case"RECOMMENDED_TRANSFER_POINT":return w.RECOMMENDED_TRANSFER_POINT;case 1:case"TIMED_TRANSFER":return w.TIMED_TRANSFER;case 2:case"REQUIRES_MINIMAL_TIME":return w.REQUIRES_MINIMAL_TIME;case 3:case"IN_SEAT_TRANSFER":return w.IN_SEAT_TRANSFER;default:return w.UNRECOGNIZED}}function N(t){switch(t){case 0:case"TRAM":return _.TRAM;case 1:case"SUBWAY":return _.SUBWAY;case 2:case"RAIL":return _.RAIL;case 3:case"BUS":return _.BUS;case 4:case"FERRY":return _.FERRY;case 5:case"CABLE_TRAM":return _.CABLE_TRAM;case 6:case"AERIAL_LIFT":return _.AERIAL_LIFT;case 7:case"FUNICULAR":return _.FUNICULAR;case 8:case"TROLLEYBUS":return _.TROLLEYBUS;case 9:case"MONORAIL":return _.MONORAIL;default:return _.UNRECOGNIZED}}function M(){return{stopTimes:new Uint8Array(0),pickUpDropOffTypes:new Uint8Array(0),stops:new Uint8Array(0),serviceRouteId:0}}!function(t){t[t.RECOMMENDED_TRANSFER_POINT=0]="RECOMMENDED_TRANSFER_POINT",t[t.TIMED_TRANSFER=1]="TIMED_TRANSFER",t[t.REQUIRES_MINIMAL_TIME=2]="REQUIRES_MINIMAL_TIME",t[t.IN_SEAT_TRANSFER=3]="IN_SEAT_TRANSFER",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(w||(w={})),function(t){t[t.TRAM=0]="TRAM",t[t.SUBWAY=1]="SUBWAY",t[t.RAIL=2]="RAIL",t[t.BUS=3]="BUS",t[t.FERRY=4]="FERRY",t[t.CABLE_TRAM=5]="CABLE_TRAM",t[t.AERIAL_LIFT=6]="AERIAL_LIFT",t[t.FUNICULAR=7]="FUNICULAR",t[t.TROLLEYBUS=8]="TROLLEYBUS",t[t.MONORAIL=9]="MONORAIL",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(_||(_={}));const O={encode:(t,e=new y)=>(0!==t.stopTimes.length&&e.uint32(10).bytes(t.stopTimes),0!==t.pickUpDropOffTypes.length&&e.uint32(18).bytes(t.pickUpDropOffTypes),0!==t.stops.length&&e.uint32(26).bytes(t.stops),0!==t.serviceRouteId&&e.uint32(32).uint32(t.serviceRouteId),e),decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s=M();for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(10!==t)break;s.stopTimes=r.bytes();continue;case 2:if(18!==t)break;s.pickUpDropOffTypes=r.bytes();continue;case 3:if(26!==t)break;s.stops=r.bytes();continue;case 4:if(32!==t)break;s.serviceRouteId=r.uint32();continue}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({stopTimes:F(t.stopTimes)?B(t.stopTimes):new Uint8Array(0),pickUpDropOffTypes:F(t.pickUpDropOffTypes)?B(t.pickUpDropOffTypes):new Uint8Array(0),stops:F(t.stops)?B(t.stops):new Uint8Array(0),serviceRouteId:F(t.serviceRouteId)?globalThis.Number(t.serviceRouteId):0}),toJSON(t){const e={};return 0!==t.stopTimes.length&&(e.stopTimes=D(t.stopTimes)),0!==t.pickUpDropOffTypes.length&&(e.pickUpDropOffTypes=D(t.pickUpDropOffTypes)),0!==t.stops.length&&(e.stops=D(t.stops)),0!==t.serviceRouteId&&(e.serviceRouteId=Math.round(t.serviceRouteId)),e},create:t=>O.fromPartial(null!=t?t:{}),fromPartial(t){var e,r,n,s;const i=M();return i.stopTimes=null!==(e=t.stopTimes)&&void 0!==e?e:new Uint8Array(0),i.pickUpDropOffTypes=null!==(r=t.pickUpDropOffTypes)&&void 0!==r?r:new Uint8Array(0),i.stops=null!==(n=t.stops)&&void 0!==n?n:new Uint8Array(0),i.serviceRouteId=null!==(s=t.serviceRouteId)&&void 0!==s?s:0,i}};const L={encode:(t,e=new y)=>(0!==t.destination&&e.uint32(8).uint32(t.destination),0!==t.type&&e.uint32(16).int32(t.type),void 0!==t.minTransferTime&&e.uint32(24).uint32(t.minTransferTime),e),decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s={destination:0,type:0,minTransferTime:void 0};for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(8!==t)break;s.destination=r.uint32();continue;case 2:if(16!==t)break;s.type=r.int32();continue;case 3:if(24!==t)break;s.minTransferTime=r.uint32();continue}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({destination:F(t.destination)?globalThis.Number(t.destination):0,type:F(t.type)?b(t.type):0,minTransferTime:F(t.minTransferTime)?globalThis.Number(t.minTransferTime):void 0}),toJSON(t){const e={};return 0!==t.destination&&(e.destination=Math.round(t.destination)),0!==t.type&&(e.type=function(t){switch(t){case w.RECOMMENDED_TRANSFER_POINT:return"RECOMMENDED_TRANSFER_POINT";case w.TIMED_TRANSFER:return"TIMED_TRANSFER";case w.REQUIRES_MINIMAL_TIME:return"REQUIRES_MINIMAL_TIME";case w.IN_SEAT_TRANSFER:return"IN_SEAT_TRANSFER";case w.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.type)),void 0!==t.minTransferTime&&(e.minTransferTime=Math.round(t.minTransferTime)),e},create:t=>L.fromPartial(null!=t?t:{}),fromPartial(t){var e,r,n;const s={destination:0,type:0,minTransferTime:void 0};return s.destination=null!==(e=t.destination)&&void 0!==e?e:0,s.type=null!==(r=t.type)&&void 0!==r?r:0,s.minTransferTime=null!==(n=t.minTransferTime)&&void 0!==n?n:void 0,s}};const U={encode(t,e=new y){for(const r of t.transfers)L.encode(r,e.uint32(10).fork()).join();e.uint32(18).fork();for(const r of t.routes)e.uint32(r);return e.join(),e},decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s={transfers:[],routes:[]};for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(10!==t)break;s.transfers.push(L.decode(r,r.uint32()));continue;case 2:if(16===t){s.routes.push(r.uint32());continue}if(18===t){const t=r.uint32()+r.pos;for(;r.pos<t;)s.routes.push(r.uint32());continue}}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({transfers:globalThis.Array.isArray(null==t?void 0:t.transfers)?t.transfers.map((t=>L.fromJSON(t))):[],routes:globalThis.Array.isArray(null==t?void 0:t.routes)?t.routes.map((t=>globalThis.Number(t))):[]}),toJSON(t){var e,r;const n={};return(null===(e=t.transfers)||void 0===e?void 0:e.length)&&(n.transfers=t.transfers.map((t=>L.toJSON(t)))),(null===(r=t.routes)||void 0===r?void 0:r.length)&&(n.routes=t.routes.map((t=>Math.round(t)))),n},create:t=>U.fromPartial(null!=t?t:{}),fromPartial(t){var e,r;const n={transfers:[],routes:[]};return n.transfers=(null===(e=t.transfers)||void 0===e?void 0:e.map((t=>L.fromPartial(t))))||[],n.routes=(null===(r=t.routes)||void 0===r?void 0:r.map((t=>t)))||[],n}};const x={encode(t,e=new y){0!==t.type&&e.uint32(8).int32(t.type),""!==t.name&&e.uint32(18).string(t.name),e.uint32(26).fork();for(const r of t.routes)e.uint32(r);return e.join(),e},decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s={type:0,name:"",routes:[]};for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(8!==t)break;s.type=r.int32();continue;case 2:if(18!==t)break;s.name=r.string();continue;case 3:if(24===t){s.routes.push(r.uint32());continue}if(26===t){const t=r.uint32()+r.pos;for(;r.pos<t;)s.routes.push(r.uint32());continue}}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({type:F(t.type)?N(t.type):0,name:F(t.name)?globalThis.String(t.name):"",routes:globalThis.Array.isArray(null==t?void 0:t.routes)?t.routes.map((t=>globalThis.Number(t))):[]}),toJSON(t){var e;const r={};return 0!==t.type&&(r.type=function(t){switch(t){case _.TRAM:return"TRAM";case _.SUBWAY:return"SUBWAY";case _.RAIL:return"RAIL";case _.BUS:return"BUS";case _.FERRY:return"FERRY";case _.CABLE_TRAM:return"CABLE_TRAM";case _.AERIAL_LIFT:return"AERIAL_LIFT";case _.FUNICULAR:return"FUNICULAR";case _.TROLLEYBUS:return"TROLLEYBUS";case _.MONORAIL:return"MONORAIL";case _.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.type)),""!==t.name&&(r.name=t.name),(null===(e=t.routes)||void 0===e?void 0:e.length)&&(r.routes=t.routes.map((t=>Math.round(t)))),r},create:t=>x.fromPartial(null!=t?t:{}),fromPartial(t){var e,r,n;const s={type:0,name:"",routes:[]};return s.type=null!==(e=t.type)&&void 0!==e?e:0,s.name=null!==(r=t.name)&&void 0!==r?r:"",s.routes=(null===(n=t.routes)||void 0===n?void 0:n.map((t=>t)))||[],s}};const k={encode(t,e=new y){""!==t.version&&e.uint32(10).string(t.version);for(const r of t.stopsAdjacency)U.encode(r,e.uint32(18).fork()).join();for(const r of t.routesAdjacency)O.encode(r,e.uint32(26).fork()).join();for(const r of t.serviceRoutes)x.encode(r,e.uint32(34).fork()).join();return e},decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s={version:"",stopsAdjacency:[],routesAdjacency:[],serviceRoutes:[]};for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(10!==t)break;s.version=r.string();continue;case 2:if(18!==t)break;s.stopsAdjacency.push(U.decode(r,r.uint32()));continue;case 3:if(26!==t)break;s.routesAdjacency.push(O.decode(r,r.uint32()));continue;case 4:if(34!==t)break;s.serviceRoutes.push(x.decode(r,r.uint32()));continue}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({version:F(t.version)?globalThis.String(t.version):"",stopsAdjacency:globalThis.Array.isArray(null==t?void 0:t.stopsAdjacency)?t.stopsAdjacency.map((t=>U.fromJSON(t))):[],routesAdjacency:globalThis.Array.isArray(null==t?void 0:t.routesAdjacency)?t.routesAdjacency.map((t=>O.fromJSON(t))):[],serviceRoutes:globalThis.Array.isArray(null==t?void 0:t.serviceRoutes)?t.serviceRoutes.map((t=>x.fromJSON(t))):[]}),toJSON(t){var e,r,n;const s={};return""!==t.version&&(s.version=t.version),(null===(e=t.stopsAdjacency)||void 0===e?void 0:e.length)&&(s.stopsAdjacency=t.stopsAdjacency.map((t=>U.toJSON(t)))),(null===(r=t.routesAdjacency)||void 0===r?void 0:r.length)&&(s.routesAdjacency=t.routesAdjacency.map((t=>O.toJSON(t)))),(null===(n=t.serviceRoutes)||void 0===n?void 0:n.length)&&(s.serviceRoutes=t.serviceRoutes.map((t=>x.toJSON(t)))),s},create:t=>k.fromPartial(null!=t?t:{}),fromPartial(t){var e,r,n,s;const i={version:"",stopsAdjacency:[],routesAdjacency:[],serviceRoutes:[]};return i.version=null!==(e=t.version)&&void 0!==e?e:"",i.stopsAdjacency=(null===(r=t.stopsAdjacency)||void 0===r?void 0:r.map((t=>U.fromPartial(t))))||[],i.routesAdjacency=(null===(n=t.routesAdjacency)||void 0===n?void 0:n.map((t=>O.fromPartial(t))))||[],i.serviceRoutes=(null===(s=t.serviceRoutes)||void 0===s?void 0:s.map((t=>x.fromPartial(t))))||[],i}};function B(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),r=new Uint8Array(e.length);for(let t=0;t<e.length;++t)r[t]=e.charCodeAt(t);return r}}function D(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}function F(t){return null!=t}class C{static infinity(){return new C(Number.MAX_SAFE_INTEGER)}static origin(){return new C(0)}constructor(t){this.minutesSinceMidnight=t}static fromMinutes(t){return new C(t)}static fromHMS(t,e,r){if(t<0||e<0||r<0||e>=60||r>=60)throw new Error("Invalid time. Ensure hours, minutes, and seconds are valid values.");const n=r+60*e+3600*t,s=Math.round(n/60);return new C(s)}static fromHM(t,e){if(t<0||e<0||e>=60)throw new Error("Invalid time. Ensure hours and minutes are valid values.");return new C(e+60*t)}static fromDate(t){const e=t.getHours(),r=t.getMinutes(),n=t.getSeconds();return C.fromHMS(e,r,n)}static fromString(t){const[e,r,n]=t.split(":");if(void 0===e||void 0===r||""===e.trim()||""===r.trim()||isNaN(Number(e))||isNaN(Number(r))||void 0!==n&&(""===n.trim()||isNaN(Number(n))))throw new Error('Input string must be in the format "HH:MM:SS" or "HH:MM".');const s=parseInt(e,10),i=parseInt(r,10),o=void 0!==n?parseInt(n,10):0;return C.fromHMS(s,i,o)}toString(){let t=Math.floor(this.minutesSinceMidnight/60);const e=Math.floor(this.minutesSinceMidnight%60);return t>=24&&(t%=24),`${t.toString().padStart(2,"0")}:${e.toString().padStart(2,"0")}`}toMinutes(){return this.minutesSinceMidnight}plus(t){const e=60*this.minutesSinceMidnight+t.toSeconds();return new C(Math.round(e/60))}minus(t){let e=60*this.minutesSinceMidnight-t.toSeconds();return e<0&&(e+=86400),new C(Math.round(e/60))}diff(t){const r=this.minutesSinceMidnight-t.toMinutes();return e.fromSeconds(Math.abs(60*r))}static max(...t){if(0===t.length)throw new Error("At least one Time instance is required.");let e=t[0];for(let r=1;r<t.length;r++)t[r].minutesSinceMidnight>e.minutesSinceMidnight&&(e=t[r]);return e}static min(...t){if(0===t.length)throw new Error("At least one Time instance is required.");let e=t[0];for(let r=1;r<t.length;r++)t[r].minutesSinceMidnight<e.minutesSinceMidnight&&(e=t[r]);return e}isAfter(t){return this.minutesSinceMidnight>t.minutesSinceMidnight}isBefore(t){return this.minutesSinceMidnight<t.minutesSinceMidnight}equals(t){return this.minutesSinceMidnight===t.minutesSinceMidnight}}const $=["REGULAR","NOT_AVAILABLE","MUST_PHONE_AGENCY","MUST_COORDINATE_WITH_DRIVER"],P=t=>{const e=$[t];if(!e)throw new Error(`Invalid pickup/drop-off type ${t}`);return e};let z=class{constructor(t,e,r,n){this.stopTimes=t,this.pickUpDropOffTypes=e,this.stops=r,this.serviceRouteId=n,this.nbStops=r.length,this.nbTrips=this.stopTimes.length/(2*this.stops.length),this.stopIndices=new Map;for(let t=0;t<r.length;t++)this.stopIndices.set(r[t],t)}serialize(){return{stopTimes:this.stopTimes,pickUpDropOffTypes:this.pickUpDropOffTypes,stops:this.stops,serviceRouteId:this.serviceRouteId}}isBefore(t,e){const r=this.stopIndices.get(t);if(void 0===r)throw new Error(`Stop index ${r} not found in route ${this.serviceRouteId}`);const n=this.stopIndices.get(e);if(void 0===n)throw new Error(`Stop index ${n} not found in route ${this.serviceRouteId}`);return r<n}getNbStops(){return this.nbStops}serviceRoute(){return this.serviceRouteId}arrivalAt(t,e){const r=2*(e*this.stops.length+this.stopIndex(t)),n=this.stopTimes[r];if(void 0===n)throw new Error(`Arrival time not found for stop ${t} at trip index ${e} in route ${this.serviceRouteId}`);return C.fromMinutes(n)}departureFrom(t,e){const r=2*(e*this.stops.length+this.stopIndex(t))+1,n=this.stopTimes[r];if(void 0===n)throw new Error(`Departure time not found for stop ${t} at trip index ${e} in route ${this.serviceRouteId}`);return C.fromMinutes(n)}pickUpTypeFrom(t,e){const r=e*this.stops.length+this.stopIndex(t),n=Math.floor(r/2),s=r%2==1,i=this.pickUpDropOffTypes[n];if(void 0===i)throw new Error(`Pick up type not found for stop ${t} at trip index ${e} in route ${this.serviceRouteId}`);return P(s?i>>6&3:i>>2&3)}dropOffTypeAt(t,e){const r=e*this.stops.length+this.stopIndex(t),n=Math.floor(r/2),s=r%2==1,i=this.pickUpDropOffTypes[n];if(void 0===i)throw new Error(`Drop off type not found for stop ${t} at trip index ${e} in route ${this.serviceRouteId}`);return P(s?i>>4&3:3&i)}findEarliestTrip(t,e=C.origin(),r){if(this.nbTrips<=0)return;let n=this.nbTrips-1;if(void 0!==r&&(n=Math.min(n,r-1)),n<0)return;let s=0,i=-1;for(;s<=n;){const r=s+n>>>1;this.departureFrom(t,r).isBefore(e)?s=r+1:(i=r,n=r-1)}if(-1!==i)for(let e=i;e<(null!=r?r:this.nbTrips);e++){if("NOT_AVAILABLE"!==this.pickUpTypeFrom(t,e))return e}}stopIndex(t){const e=this.stopIndices.get(t);if(void 0===e)throw new Error(`Stop index for ${t} not found in route ${this.serviceRouteId}`);return e}};const j=(()=>{const t=new ArrayBuffer(4);return new DataView(t).setUint32(0,305419896),120===new Uint8Array(t)[0]})(),G=!0,V=t=>{if(j===G)return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);const e=new Uint8Array(4*t.length),r=new DataView(e.buffer);for(let e=0;e<t.length;e++)r.setUint32(4*e,t[e],G);return e},Y=t=>{if(t.byteLength%4!=0)throw new Error("Byte array length must be a multiple of 4 to convert to Uint32Array");if(j===G)return new Uint32Array(t.buffer,t.byteOffset,t.byteLength/4);const e=new Uint32Array(t.byteLength/4),r=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let t=0;t<e.length;t++)e[t]=r.getUint32(4*t,G);return e},J=t=>{if(j===G)return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);const e=new Uint8Array(2*t.length),r=new DataView(e.buffer);for(let e=0;e<t.length;e++)r.setUint16(2*e,t[e],G);return e},W=t=>{if(t.byteLength%2!=0)throw new Error("Byte array length must be a multiple of 2 to convert to Uint16Array");if(j===G)return new Uint16Array(t.buffer,t.byteOffset,t.byteLength/2);const e=new Uint16Array(t.byteLength/2),r=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let t=0;t<e.length;t++)e[t]=r.getUint16(2*t,G);return e},q=t=>{const e=[];return t.forEach((t=>{const r=t.serialize();e.push({stopTimes:J(r.stopTimes),pickUpDropOffTypes:r.pickUpDropOffTypes,stops:V(r.stops),serviceRouteId:r.serviceRouteId})})),e},Z=t=>{switch(t){case w.RECOMMENDED_TRANSFER_POINT:return"RECOMMENDED";case w.TIMED_TRANSFER:return"GUARANTEED";case w.REQUIRES_MINIMAL_TIME:return"REQUIRES_MINIMAL_TIME";case w.IN_SEAT_TRANSFER:return"IN_SEAT";case w.UNRECOGNIZED:throw new Error("Unrecognized protobuf transfer type.")}},H=t=>{switch(t){case"RECOMMENDED":return w.RECOMMENDED_TRANSFER_POINT;case"GUARANTEED":return w.TIMED_TRANSFER;case"REQUIRES_MINIMAL_TIME":return w.REQUIRES_MINIMAL_TIME;case"IN_SEAT":return w.IN_SEAT_TRANSFER}},X=t=>{switch(t){case _.TRAM:return"TRAM";case _.SUBWAY:return"SUBWAY";case _.RAIL:return"RAIL";case _.BUS:return"BUS";case _.FERRY:return"FERRY";case _.CABLE_TRAM:return"CABLE_TRAM";case _.AERIAL_LIFT:return"AERIAL_LIFT";case _.FUNICULAR:return"FUNICULAR";case _.TROLLEYBUS:return"TROLLEYBUS";case _.MONORAIL:return"MONORAIL";case _.UNRECOGNIZED:default:throw new Error("Unrecognized protobuf route type.")}},Q=t=>{switch(t){case"TRAM":return _.TRAM;case"SUBWAY":return _.SUBWAY;case"RAIL":return _.RAIL;case"BUS":return _.BUS;case"FERRY":return _.FERRY;case"CABLE_TRAM":return _.CABLE_TRAM;case"AERIAL_LIFT":return _.AERIAL_LIFT;case"FUNICULAR":return _.FUNICULAR;case"TROLLEYBUS":return _.TROLLEYBUS;case"MONORAIL":return _.MONORAIL}},K=new Set(["TRAM","SUBWAY","RAIL","BUS","FERRY","CABLE_TRAM","AERIAL_LIFT","FUNICULAR","TROLLEYBUS","MONORAIL"]),tt="0.0.7";class et{constructor(t,e,r){this.stopsAdjacency=t,this.routesAdjacency=e,this.serviceRoutes=r,this.activeStops=new Set;for(let e=0;e<t.length;e++){const r=t[e];(r.routes.length>0||r.transfers.length>0)&&this.activeStops.add(e)}}serialize(){const t={version:tt,stopsAdjacency:(r=this.stopsAdjacency,r.map((t=>({transfers:t.transfers.map((t=>Object.assign({destination:t.destination,type:H(t.type)},void 0!==t.minTransferTime&&{minTransferTime:t.minTransferTime.toSeconds()}))),routes:t.routes})))),routesAdjacency:q(this.routesAdjacency),serviceRoutes:(e=this.serviceRoutes,e.map((t=>({type:Q(t.type),name:t.name,routes:t.routes}))))};var e,r;const n=new y;return k.encode(t,n),n.finish()}static fromData(t){const r=new E(t),n=k.decode(r);if(n.version!==tt)throw new Error(`Unsupported timetable version ${n.version}`);return new et((t=>{const r=[];for(let n=0;n<t.length;n++){const s=t[n],i=[];for(let t=0;t<s.transfers.length;t++){const r=s.transfers[t],n=Object.assign({destination:r.destination,type:Z(r.type)},void 0!==r.minTransferTime&&{minTransferTime:e.fromSeconds(r.minTransferTime)});i.push(n)}r.push({transfers:i,routes:s.routes})}return r})(n.stopsAdjacency),(t=>{const e=[];for(let r=0;r<t.length;r++){const n=t[r],s=Y(n.stops);e.push(new z(W(n.stopTimes),n.pickUpDropOffTypes,s,n.serviceRouteId))}return e})(n.routesAdjacency),(t=>{const e=[];for(let r=0;r<t.length;r++){const n=t[r];e.push({type:X(n.type),name:n.name,routes:n.routes})}return e})(n.serviceRoutes))}isActive(t){return this.activeStops.has(t)}getRoute(t){return this.routesAdjacency[t]}getTransfers(t){var e,r;return null!==(r=null===(e=this.stopsAdjacency[t])||void 0===e?void 0:e.transfers)&&void 0!==r?r:[]}getServiceRouteInfo(t){const e=this.serviceRoutes[t.serviceRoute()];if(!e)throw new Error(`Service route not found for route ID: ${t.serviceRoute()}`);return{type:e.type,name:e.name}}routesPassingThrough(t){const e=this.stopsAdjacency[t];if(!e)return[];const r=[];for(let t=0;t<e.routes.length;t++){const n=e.routes[t],s=this.routesAdjacency[n];s&&r.push(s)}return r}findReachableRoutes(t,e=K){const r=new Map,n=Array.from(t);for(let t=0;t<n.length;t++){const s=n[t],i=this.routesPassingThrough(s).filter((t=>{const r=this.getServiceRouteInfo(t);return e.has(r.type)}));for(let t=0;t<i.length;t++){const e=i[t],n=r.get(e);n?e.isBefore(s,n)&&r.set(e,s):r.set(e,s)}}return r}}class rt{constructor(t){this.from=t.fromValue,this.to=t.toValue,this.departureTime=t.departureTimeValue,this.options=t.optionsValue}}rt.Builder=class{constructor(){this.toValue=new Set,this.optionsValue={maxTransfers:5,minTransferTime:e.fromSeconds(120),transportModes:K}}from(t){return this.fromValue=t,this}to(t){return this.toValue=t instanceof Set?t:new Set([t]),this}departureTime(t){return this.departureTimeValue=t,this}maxTransfers(t){return this.optionsValue.maxTransfers=t,this}minTransferTime(t){return this.optionsValue.minTransferTime=t,this}transportModes(t){return this.optionsValue.transportModes=t,this}build(){return new rt(this)}};class nt{constructor(t){this.legs=t}departureTime(){const t=e.zero();for(let e=0;e<this.legs.length;e++){const r=this.legs[e];if("departureTime"in r)return r.departureTime.minus(t);"minTransferTime"in r&&r.minTransferTime&&t.add(r.minTransferTime)}throw new Error("No vehicle leg found in route")}arrivalTime(){let t=C.origin();const r=e.zero();let n=!1;for(let e=this.legs.length-1;e>=0;e--){const s=this.legs[e];"arrivalTime"in s&&!n?(t=s.arrivalTime,n=!0):"minTransferTime"in s&&s.minTransferTime&&n&&r.add(s.minTransferTime)}if(!n)throw new Error("No vehicle leg found in route");return t.plus(r)}totalDuration(){return 0===this.legs.length?e.zero():this.arrivalTime().diff(this.departureTime())}toString(){return this.legs.map(((t,e)=>{var r;const n=`From: ${t.from.name}${t.from.platform?` (Pl. ${t.from.platform})`:""}`,s=`To: ${t.to.name}${t.to.platform?` (Pl. ${t.to.platform})`:""}`,i="minTransferTime"in t?`Minimum Transfer Time: ${null===(r=t.minTransferTime)||void 0===r?void 0:r.toString()}`:"",o="route"in t&&"departureTime"in t&&"arrivalTime"in t?`Route: ${t.route.type} ${t.route.name}, Departure: ${t.departureTime.toString()}, Arrival: ${t.arrivalTime.toString()}`:"";return[`Leg ${e+1}:`,` ${n}`,` ${s}`,i?` ${i}`:"",o?` ${o}`:""].filter((t=>""!==t.trim())).join("\n")})).join("\n")}asJson(){return this.legs.map((t=>"route"in t?{from:t.from.sourceStopId,to:t.to.sourceStopId,departure:t.departureTime.toString(),arrival:t.arrivalTime.toString(),route:t.route}:Object.assign({from:t.from.sourceStopId,to:t.to.sourceStopId,type:t.type},void 0!==t.minTransferTime&&{minTransferTime:t.minTransferTime.toString()})))}}class st{constructor(t,e,r,n){this.query=t,this.earliestArrivals=e,this.earliestArrivalsPerRound=r,this.stopsIndex=n}bestRoute(t){var e,r,n;const s=(t instanceof Set?Array.from(t):t?[t]:Array.from(this.query.to)).flatMap((t=>this.stopsIndex.equivalentStops(t)));let i,o;for(const t of s){const e=this.earliestArrivals.get(t.id);void 0!==e&&(void 0===o||e.arrival.isBefore(o.arrival))&&(i=t.id,o=e)}if(!i||!o)return;const a=[];let u=i,c=o.legNumber;for(;o.origin!==u;){const t=null===(e=this.earliestArrivalsPerRound[c])||void 0===e?void 0:e.get(u);if(!(null==t?void 0:t.leg))throw new Error(`No leg found for a trip leg: start stop=${null!==(n=null===(r=null==t?void 0:t.leg)||void 0===r?void 0:r.from.id)&&void 0!==n?n:"unknown"}, end stop=${u}, round=${c}, origin=${o.origin}`);a.unshift(t.leg),u=t.leg.from.id,"route"in t.leg&&(c-=1)}return new nt(a)}arrivalAt(t,e){const r=this.stopsIndex.equivalentStops(t);let n;const s=void 0!==e?this.earliestArrivalsPerRound[e+1]:this.earliestArrivals;for(const t of r){const e=s.get(t.id);void 0!==e&&(void 0===n||e.arrival.isBefore(n.arrival))&&(n=e)}return n}}const it=C.infinity();class ot{constructor(t,e){this.timetable=t,this.stopsIndex=e}considerTransfers(t,r,n,s,i){var o,a;const{options:u}=t,c=new Set,h=Array.from(r);for(let t=0;t<h.length;t++){const r=h[t],l=n.get(r);if(!l)continue;const f=l.leg;if(f&&!("route"in f))continue;const d=this.timetable.getTransfers(r);for(let t=0;t<d.length;t++){const h=d[t];let f;f=h.minTransferTime?h.minTransferTime:"IN_SEAT"===h.type?e.zero():u.minTransferTime;const p=l.arrival.plus(f),m=null!==(a=null===(o=n.get(h.destination))||void 0===o?void 0:o.arrival)&&void 0!==a?a:it;if(p.isBefore(m)){const t=l.origin;n.set(h.destination,{arrival:p,legNumber:i,origin:t,leg:{from:this.stopsIndex.findStopById(r),to:this.stopsIndex.findStopById(h.destination),minTransferTime:h.minTransferTime,type:h.type}}),s.set(h.destination,{arrival:p,legNumber:i,origin:t}),c.add(h.destination)}}}const l=Array.from(c);for(let t=0;t<l.length;t++){const e=l[t];r.add(e)}}earliestArrivalAtAnyStop(t,e){var r,n;let s=it;for(let i=0;i<e.length;i++){const o=e[i],a=null!==(n=null===(r=t.get(o.id))||void 0===r?void 0:r.arrival)&&void 0!==n?n:it;s=C.min(s,a)}return s}route(t){var e,r,n,s,i;const{from:o,to:a,departureTime:u,options:c}=t,h=this.stopsIndex.equivalentStops(o),l=Array.from(a).flatMap((t=>this.stopsIndex.equivalentStops(t))),f=new Map,d=new Map,p=[d],m=new Set;for(let t=0;t<h.length;t++){const e=h[t];m.add(e.id),f.set(e.id,{arrival:u,legNumber:0,origin:e.id}),d.set(e.id,{arrival:u,legNumber:0,origin:e.id})}this.considerTransfers(t,m,d,f,0);for(let o=1;o<=c.maxTransfers+1;o++){const a=new Map;p.push(a);const u=p[o-1],h=this.timetable.findReachableRoutes(m,c.transportModes);m.clear();const d=this.earliestArrivalAtAnyStop(f,l),g=Array.from(h.entries());for(let t=0;t<g.length;t++){const[c,h]=g[t];let l;for(let t=c.stopIndex(h);t<c.getNbStops();t++){const h=c.stops[t];if(void 0!==l){const t=c.arrivalAt(h,l.tripIndex),n=c.dropOffTypeAt(h,l.tripIndex),s=null!==(r=null===(e=f.get(h))||void 0===e?void 0:e.arrival)&&void 0!==r?r:it;if("NOT_AVAILABLE"!==n&&t.isBefore(s)&&t.isBefore(d)){const e=c.departureFrom(l.bestHopOnStop,l.tripIndex);a.set(h,{arrival:t,legNumber:o,origin:l.origin,leg:{from:this.stopsIndex.findStopById(l.bestHopOnStop),to:this.stopsIndex.findStopById(h),departureTime:e,arrivalTime:t,route:this.timetable.getServiceRouteInfo(c)}}),f.set(h,{arrival:t,legNumber:o,origin:l.origin}),m.add(h)}}const p=null===(n=u.get(h))||void 0===n?void 0:n.arrival;if(void 0!==p&&(void 0===l||p.isBefore(c.departureFrom(h,l.tripIndex))||p.equals(c.departureFrom(h,l.tripIndex)))){const t=c.findEarliestTrip(h,p,null==l?void 0:l.tripIndex);void 0!==t&&(l={tripIndex:t,bestHopOnStop:h,origin:null!==(i=null===(s=u.get(h))||void 0===s?void 0:s.origin)&&void 0!==i?i:h})}}}if(this.considerTransfers(t,m,a,f,o),0===m.size)break}return new st(t,f,p,this.stopsIndex)}}class at{constructor(t=[],e=ut){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:r}=this,n=e[t];for(;t>0;){const s=t-1>>1,i=e[s];if(r(n,i)>=0)break;e[t]=i,t=s}e[t]=n}_down(t){const{data:e,compare:r}=this,n=this.length>>1,s=e[t];for(;t<n;){let n=1+(t<<1),i=e[n];const o=n+1;if(o<this.length&&r(e[o],i)<0&&(n=o,i=e[o]),r(i,s)>=0)break;e[t]=i,t=n}e[t]=s}}function ut(t,e){return t<e?-1:t>e?1:0}const ct=Math.PI/180;function ht(t,e,r,n){const s=n.minLng,i=n.maxLng,o=n.minLat,a=n.maxLat;if(t>=s&&t<=i)return e<o?ft((e-o)*ct):e>a?ft((e-a)*ct):0;const u=Math.min(ft((t-s)*ct),ft((t-i)*ct)),c=function(t,e){const r=1-2*e;return r<=0?t>0?90:-90:Math.atan(Math.tan(t*ct)/r)/ct}(e,u);return c>o&&c<a?dt(u,r,e,c):Math.min(dt(u,r,e,o),dt(u,r,e,a))}function lt(t,e){return t.dist-e.dist}function ft(t){const e=Math.sin(t/2);return e*e}function dt(t,e,r,n){return e*Math.cos(n*ct)*t+ft((r-n)*ct)}function pt(t,e,r,n,s){return dt(ft((t-r)*ct),s,e,n)}const mt=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class gt{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[e,r]=new Uint8Array(t,0,2);if(219!==e)throw new Error("Data does not appear to be in a KDBush format.");const n=r>>4;if(1!==n)throw new Error(`Got v${n} data when expected v1.`);const s=mt[15&r];if(!s)throw new Error("Unrecognized array type.");const[i]=new Uint16Array(t,2,1),[o]=new Uint32Array(t,4,1);return new gt(o,i,s,t)}constructor(t,e=64,r=Float64Array,n){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=r,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const s=mt.indexOf(this.ArrayType),i=2*t*this.ArrayType.BYTES_PER_ELEMENT,o=t*this.IndexArrayType.BYTES_PER_ELEMENT,a=(8-o%8)%8;if(s<0)throw new Error(`Unexpected typed array class: ${r}.`);n&&n instanceof ArrayBuffer?(this.data=n,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+o+a,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+i+o+a),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+o+a,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+s]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t)}add(t,e){const r=this._pos>>1;return this.ids[r]=r,this.coords[this._pos++]=t,this.coords[this._pos++]=e,r}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return Tt(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,r,n){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:s,coords:i,nodeSize:o}=this,a=[0,s.length-1,0],u=[];for(;a.length;){const c=a.pop()||0,h=a.pop()||0,l=a.pop()||0;if(h-l<=o){for(let o=l;o<=h;o++){const a=i[2*o],c=i[2*o+1];a>=t&&a<=r&&c>=e&&c<=n&&u.push(s[o])}continue}const f=l+h>>1,d=i[2*f],p=i[2*f+1];d>=t&&d<=r&&p>=e&&p<=n&&u.push(s[f]),(0===c?t<=d:e<=p)&&(a.push(l),a.push(f-1),a.push(1-c)),(0===c?r>=d:n>=p)&&(a.push(f+1),a.push(h),a.push(1-c))}return u}within(t,e,r){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:n,coords:s,nodeSize:i}=this,o=[0,n.length-1,0],a=[],u=r*r;for(;o.length;){const c=o.pop()||0,h=o.pop()||0,l=o.pop()||0;if(h-l<=i){for(let r=l;r<=h;r++)yt(s[2*r],s[2*r+1],t,e)<=u&&a.push(n[r]);continue}const f=l+h>>1,d=s[2*f],p=s[2*f+1];yt(d,p,t,e)<=u&&a.push(n[f]),(0===c?t-r<=d:e-r<=p)&&(o.push(l),o.push(f-1),o.push(1-c)),(0===c?t+r>=d:e+r>=p)&&(o.push(f+1),o.push(h),o.push(1-c))}return a}}function Tt(t,e,r,n,s,i){if(s-n<=r)return;const o=n+s>>1;vt(t,e,o,n,s,i),Tt(t,e,r,n,o-1,1-i),Tt(t,e,r,o+1,s,1-i)}function vt(t,e,r,n,s,i){for(;s>n;){if(s-n>600){const o=s-n+1,a=r-n+1,u=Math.log(o),c=.5*Math.exp(2*u/3),h=.5*Math.sqrt(u*c*(o-c)/o)*(a-o/2<0?-1:1);vt(t,e,r,Math.max(n,Math.floor(r-a*c/o+h)),Math.min(s,Math.floor(r+(o-a)*c/o+h)),i)}const o=e[2*r+i];let a=n,u=s;for(It(t,e,n,r),e[2*s+i]>o&&It(t,e,n,s);a<u;){for(It(t,e,a,u),a++,u--;e[2*a+i]<o;)a++;for(;e[2*u+i]>o;)u--}e[2*n+i]===o?It(t,e,n,u):(u++,It(t,e,u,s)),u<=r&&(n=u+1),r<=u&&(s=u-1)}}function It(t,e,r,n){At(t,r,n),At(e,2*r,2*n),At(e,2*r+1,2*n+1)}function At(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function yt(t,e,r,n){const s=t-r,i=e-n;return s*s+i*i}const Et="KEYS",Rt="VALUES",St="";class wt{set;_type;_path;constructor(t,e){const r=t._tree,n=Array.from(r.keys());this.set=t,this._type=e,this._path=n.length>0?[{node:r,keys:n}]:[]}next(){const t=this.dive();return this.backtrack(),t}dive(){if(0===this._path.length)return{done:!0,value:void 0};const{node:t,keys:e}=_t(this._path);if(_t(e)===St)return{done:!1,value:this.result()};const r=t.get(_t(e));return this._path.push({node:r,keys:Array.from(r.keys())}),this.dive()}backtrack(){if(0===this._path.length)return;const t=_t(this._path).keys;t.pop(),!(t.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map((({keys:t})=>_t(t))).filter((t=>t!==St)).join("")}value(){return _t(this._path).node.get(St)}result(){switch(this._type){case Rt:return this.value();case Et:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const _t=t=>t[t.length-1],bt=(t,e,r,n,s,i,o,a)=>{const u=i*o;t:for(const c of t.keys())if(c===St){const e=s[u-1];e<=r&&n.set(a,[t.get(c),e])}else{let u=i;for(let t=0;t<c.length;++t,++u){const n=c[t],i=o*u,a=i-o;let h=s[i];const l=Math.max(0,u-r-1),f=Math.min(o-1,u+r);for(let t=l;t<f;++t){const r=n!==e[t],o=s[a+t]+ +r,u=s[a+t+1]+1,c=s[i+t]+1,l=s[i+t+1]=Math.min(o,u,c);l<h&&(h=l)}if(h>r)continue t}bt(t.get(c),e,r,n,s,u,o,a+c)}};class Nt{_tree;_prefix;_size=void 0;constructor(t=new Map,e=""){this._tree=t,this._prefix=e}atPrefix(t){if(!t.startsWith(this._prefix))throw new Error("Mismatched prefix");const[e,r]=Mt(this._tree,t.slice(this._prefix.length));if(void 0===e){const[e,n]=Bt(r);for(const r of e.keys())if(r!==St&&r.startsWith(n)){const s=new Map;return s.set(r.slice(n.length),e.get(r)),new Nt(s,t)}}return new Nt(e,t)}clear(){this._size=void 0,this._tree.clear()}delete(t){return this._size=void 0,Ut(this._tree,t)}entries(){return new wt(this,"ENTRIES")}forEach(t){for(const[e,r]of this)t(e,r,this)}fuzzyGet(t,e){return((t,e,r)=>{const n=new Map;if("string"!=typeof e)return n;const s=e.length+1,i=s+r,o=new Uint8Array(i*s).fill(r+1);for(let t=0;t<s;++t)o[t]=t;for(let t=1;t<i;++t)o[t*s]=t;return bt(t,e,r,n,o,1,s,""),n})(this._tree,t,e)}get(t){const e=Ot(this._tree,t);return void 0!==e?e.get(St):void 0}has(t){return Ot(this._tree,t)?.has(St)??!1}keys(){return new wt(this,Et)}set(t,e){if("string"!=typeof t)throw new Error("key must be a string");return this._size=void 0,Lt(this._tree,t).set(St,e),this}get size(){if(this._size)return this._size;this._size=0;const t=this.entries();for(;!t.next().done;)this._size+=1;return this._size}update(t,e){if("string"!=typeof t)throw new Error("key must be a string");this._size=void 0;const r=Lt(this._tree,t);return r.set(St,e(r.get(St))),this}fetch(t,e){if("string"!=typeof t)throw new Error("key must be a string");this._size=void 0;const r=Lt(this._tree,t);let n=r.get(St);return void 0===n&&r.set(St,n=e()),n}values(){return new wt(this,Rt)}[Symbol.iterator](){return this.entries()}static from(t){const e=new Nt;for(const[r,n]of t)e.set(r,n);return e}static fromObject(t){return Nt.from(Object.entries(t))}}const Mt=(t,e,r=[])=>{if(0===e.length||null==t)return[t,r];for(const n of t.keys())if(n!==St&&e.startsWith(n))return r.push([t,n]),Mt(t.get(n),e.slice(n.length),r);return r.push([t,e]),Mt(void 0,"",r)},Ot=(t,e)=>{if(0===e.length||!t)return t;for(const r of t.keys())if(r!==St&&e.startsWith(r))return Ot(t.get(r),e.slice(r.length))},Lt=(t,e)=>{const r=e.length;t:for(let n=0;t&&n<r;){for(const s of t.keys())if(s!==St&&e[n]===s[0]){const i=Math.min(r-n,s.length);let o=1;for(;o<i&&e[n+o]===s[o];)++o;const a=t.get(s);if(o===s.length)t=a;else{const r=new Map;r.set(s.slice(o),a),t.set(e.slice(n,n+o),r),t.delete(s),t=r}n+=o;continue t}const s=new Map;return t.set(e.slice(n),s),s}return t},Ut=(t,e)=>{const[r,n]=Mt(t,e);if(void 0!==r)if(r.delete(St),0===r.size)xt(n);else if(1===r.size){const[t,e]=r.entries().next().value;kt(n,t,e)}},xt=t=>{if(0===t.length)return;const[e,r]=Bt(t);if(e.delete(r),0===e.size)xt(t.slice(0,-1));else if(1===e.size){const[r,n]=e.entries().next().value;r!==St&&kt(t.slice(0,-1),r,n)}},kt=(t,e,r)=>{if(0===t.length)return;const[n,s]=Bt(t);n.set(s+e,r),n.delete(s)},Bt=t=>t[t.length-1],Dt=/[\n\r\p{Z}\p{P}]+/u,Ft="or",Ct="and",$t="and_not",Pt=(t,e)=>{t.includes(e)||t.push(e)},zt=(t,e)=>{for(const r of e)t.includes(r)||t.push(r)},jt=({score:t},{score:e})=>e-t,Gt=()=>new Map,Vt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0,Yt={[Ft]:(t,e)=>{for(const r of e.keys()){const n=t.get(r);if(null==n)t.set(r,e.get(r));else{const{score:t,terms:s,match:i}=e.get(r);n.score=n.score+t,n.match=Object.assign(n.match,i),zt(n.terms,s)}}return t},[Ct]:(t,e)=>{const r=new Map;for(const n of e.keys()){const s=t.get(n);if(null==s)continue;const{score:i,terms:o,match:a}=e.get(n);zt(s.terms,o),r.set(n,{score:s.score+i,terms:s.terms,match:Object.assign(s.match,a)})}return r},[$t]:(t,e)=>{for(const r of e.keys())t.delete(r);return t}},Jt=(t,e,r,n,s,i)=>{const{k:o,b:a,d:u}=i;return Math.log(1+(r-e+.5)/(e+.5))*(u+t*(o+1)/(t+o*(1-a+a*n/s)))},Wt=(t,e,r,n)=>{for(const s of Object.keys(t._fieldIds))if(t._fieldIds[s]===r)return void t._options.logger("warn",`SlimSearch: document with ID ${t._documentIds.get(e)} has changed before removal: term "${n}" was not present in field "${s}". Removing a document after it has changed can corrupt the index!`,"version_conflict")},qt=(t,e,r,n)=>{const s=t._index.fetch(n,Gt);let i=s.get(e);if(null==i)i=new Map,i.set(r,1),s.set(e,i);else{const t=i.get(r);i.set(r,(t??0)+1)}},Zt=(t,e,r,n)=>{if(!t._index.has(n))return void Wt(t,r,e,n);const s=t._index.fetch(n,Gt),i=s.get(e),o=i?.get(r);!i||typeof o>"u"?Wt(t,r,e,n):o<=1?i.size<=1?s.delete(e):i.delete(r):i.set(r,o-1),0===t._index.get(n).size&&t._index.delete(n)},Ht=(t,e,r,n,s)=>{let i=t._fieldLength.get(e);null==i&&t._fieldLength.set(e,i=[]),i[r]=s;const o=(t._avgFieldLength[r]||0)*n+s;t._avgFieldLength[r]=o/(n+1)},Xt=(t,e)=>{const{extractField:r,tokenize:n,processTerm:s,fields:i,idField:o}=t._options,a=r(e,o);if(null==a)throw new Error(`SlimSearch: document does not have ID field "${o}"`);if(((t,e)=>t._idToShortId.has(e))(t,a))throw new Error(`SlimSearch: duplicate ID ${a}`);const u=((t,e)=>{const r=t._nextId;return t._idToShortId.set(e,r),t._documentIds.set(r,e),t._documentCount+=1,t._nextId+=1,r})(t,a);((t,e,r)=>{const{storeFields:n,extractField:s}=t._options;if(0===n?.length)return;let i=t._storedFields.get(e);void 0===i&&t._storedFields.set(e,i={});for(const t of n){const e=s(r,t);null!=e&&(i[t]=e)}})(t,u,e);for(const o of i){const i=r(e,o);if(null==i)continue;const a=n(i.toString(),o),c=t._fieldIds[o],h=new Set(a).size;Ht(t,u,c,t._documentCount-1,h);for(const e of a){const r=s(e,o);if(Array.isArray(r))for(const e of r)qt(t,c,u,e);else r&&qt(t,c,u,r)}}},Qt={idField:"id",extractField:(t,e)=>t[e],tokenize:t=>t.split(Dt),processTerm:t=>t.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(t,e)=>{console?.[t]?.(e)},autoVacuum:!0},Kt={combineWith:Ft,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:{k:1.2,b:.7,d:.5}},te={combineWith:"and",prefix:(t,e,r)=>e===r.length-1},ee={minDirtFactor:.1,minDirtCount:20},re={batchSize:1e3,batchWait:10,...ee},ne=Symbol("*"),se=(t,e=Ft)=>{if(0===t.length)return new Map;const r=e.toLowerCase();if(!(r in Yt))throw new Error(`Invalid combination operator: ${e}`);return t.reduce(Yt[r])},ie=(t,e,r,n,s,i,o,a,u,c=new Map)=>{if(null==i)return c;for(const h of Object.keys(o)){const l=o[h],f=t._fieldIds[h],d=i.get(f);if(null==d)continue;let p=d.size;const m=t._avgFieldLength[f];for(const i of d.keys()){if(!t._documentIds.has(i)){Zt(t,f,i,r),p-=1;continue}const o=a?a(t._documentIds.get(i),r,t._storedFields.get(i)):1;if(!o)continue;const g=d.get(i),T=t._fieldLength.get(i)[f],v=n*s*l*o*Jt(g,p,t._documentCount,T,m,u),I=c.get(i);if(I){I.score+=v,Pt(I.terms,e);const t=Vt(I.match,r);t?t.push(h):I.match[r]=[h]}else c.set(i,{score:v,terms:[e],match:{[r]:[h]}})}}return c},oe=(t,e,r={})=>{if(e===ne)return((t,e)=>{const r=new Map,n={...t._options.searchOptions,...e};for(const[e,s]of t._documentIds){const i=n.boostDocument?n.boostDocument(s,"",t._storedFields.get(e)):1;r.set(e,{score:i,terms:[],match:{}})}return r})(t,r);if("string"!=typeof e){const n={...r,...e,queries:void 0},s=e.queries.map((e=>oe(t,e,n)));return se(s,n.combineWith)}const{tokenize:n,processTerm:s,searchOptions:i}=t._options,o={tokenize:n,processTerm:s,...i,...r},{tokenize:a,processTerm:u}=o,c=a(e).flatMap((t=>u(t))).filter((t=>!!t)).map((t=>(e,r,n)=>({term:e,fuzzy:"function"==typeof t.fuzzy?t.fuzzy(e,r,n):t.fuzzy??!1,prefix:"function"==typeof t.prefix?t.prefix(e,r,n):!0===t.prefix,termBoost:"function"==typeof t.boostTerm?t.boostTerm(e,r,n):1}))(o)).map((e=>((t,e,r)=>{const n={...t._options.searchOptions,...r},s=(n.fields??t._options.fields).reduce(((t,e)=>({...t,[e]:Vt(n.boost,e)||1})),{}),{boostDocument:i,weights:o,maxFuzzy:a,bm25:u}=n,{fuzzy:c,prefix:h}={...Kt.weights,...o},l=t._index.get(e.term),f=ie(t,e.term,e.term,1,e.termBoost,l,s,i,u);let d,p;if(e.prefix&&(d=t._index.atPrefix(e.term)),e.fuzzy){const r=!0===e.fuzzy?.2:e.fuzzy,n=r<1?Math.min(a,Math.round(e.term.length*r)):r;n&&(p=t._index.fuzzyGet(e.term,n))}if(d)for(const[r,n]of d){const o=r.length-e.term.length;if(!o)continue;p?.delete(r);const a=h*r.length/(r.length+.3*o);ie(t,e.term,r,a,e.termBoost,n,s,i,u,f)}if(p)for(const r of p.keys()){const[n,o]=p.get(r);if(!o)continue;const a=c*r.length/(r.length+o);ie(t,e.term,r,a,e.termBoost,n,s,i,u,f)}return f})(t,e,o)));return se(c,o.combineWith)};class ae{_options;_index;_documentCount;_documentIds;_idToShortId;_fieldIds;_fieldLength;_avgFieldLength;_nextId;_storedFields;_dirtCount;_currentVacuum;_enqueuedVacuum;_enqueuedVacuumConditions;constructor(t){if(!t?.fields)throw new Error('SlimSearch: option "fields" must be provided');const e=null==t.autoVacuum||!0===t.autoVacuum?re:t.autoVacuum;this._options={...Qt,...t,autoVacuum:e,searchOptions:{...Kt,...t.searchOptions},autoSuggestOptions:{...te,...t.autoSuggestOptions}},this._index=new Nt,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=ee,this.addFields(this._options.fields)}get isVacuuming(){return null!=this._currentVacuum}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}get documentCount(){return this._documentCount}get termCount(){return this._index.size}toJSON(){const t=[];for(const[e,r]of this._index){const n={};for(const[t,e]of r)n[t]=Object.fromEntries(e);t.push([e,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:t,version:2}}addFields(t){for(let e=0;e<t.length;e++)this._fieldIds[t[e]]=e}}const ue=t=>{const e=t.toLowerCase(),r=new Set([e]),n={a:["à","â","ä"],c:["ç"],e:["é","è","ê","ë"],i:["î","ï"],o:["ô","ö"],u:["ù","û","ü"],ae:["ä"],oe:["ö"],ue:["ü"]};for(const[t,s]of Object.entries(n))e.includes(t)&&s.forEach((n=>{r.add(e.replace(t,n))})),s.forEach((n=>{e.includes(n)&&r.add(e.replace(n,t))}));return Array.from(r)};var ce;function he(t){switch(t){case 0:case"SIMPLE_STOP_OR_PLATFORM":return ce.SIMPLE_STOP_OR_PLATFORM;case 1:case"STATION":return ce.STATION;case 2:case"ENTRANCE_EXIT":return ce.ENTRANCE_EXIT;case 3:case"GENERIC_NODE":return ce.GENERIC_NODE;case 4:case"BOARDING_AREA":return ce.BOARDING_AREA;default:return ce.UNRECOGNIZED}}!function(t){t[t.SIMPLE_STOP_OR_PLATFORM=0]="SIMPLE_STOP_OR_PLATFORM",t[t.STATION=1]="STATION",t[t.ENTRANCE_EXIT=2]="ENTRANCE_EXIT",t[t.GENERIC_NODE=3]="GENERIC_NODE",t[t.BOARDING_AREA=4]="BOARDING_AREA",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(ce||(ce={}));const le={encode(t,e=new y){""!==t.name&&e.uint32(10).string(t.name),""!==t.sourceStopId&&e.uint32(18).string(t.sourceStopId),void 0!==t.lat&&e.uint32(29).float(t.lat),void 0!==t.lon&&e.uint32(37).float(t.lon),e.uint32(42).fork();for(const r of t.children)e.uint32(r);return e.join(),void 0!==t.parent&&e.uint32(48).uint32(t.parent),0!==t.locationType&&e.uint32(56).int32(t.locationType),void 0!==t.platform&&e.uint32(66).string(t.platform),e},decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s={name:"",sourceStopId:"",lat:void 0,lon:void 0,children:[],parent:void 0,locationType:0,platform:void 0};for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(10!==t)break;s.name=r.string();continue;case 2:if(18!==t)break;s.sourceStopId=r.string();continue;case 3:if(29!==t)break;s.lat=r.float();continue;case 4:if(37!==t)break;s.lon=r.float();continue;case 5:if(40===t){s.children.push(r.uint32());continue}if(42===t){const t=r.uint32()+r.pos;for(;r.pos<t;)s.children.push(r.uint32());continue}break;case 6:if(48!==t)break;s.parent=r.uint32();continue;case 7:if(56!==t)break;s.locationType=r.int32();continue;case 8:if(66!==t)break;s.platform=r.string();continue}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({name:de(t.name)?globalThis.String(t.name):"",sourceStopId:de(t.sourceStopId)?globalThis.String(t.sourceStopId):"",lat:de(t.lat)?globalThis.Number(t.lat):void 0,lon:de(t.lon)?globalThis.Number(t.lon):void 0,children:globalThis.Array.isArray(null==t?void 0:t.children)?t.children.map((t=>globalThis.Number(t))):[],parent:de(t.parent)?globalThis.Number(t.parent):void 0,locationType:de(t.locationType)?he(t.locationType):0,platform:de(t.platform)?globalThis.String(t.platform):void 0}),toJSON(t){var e;const r={};return""!==t.name&&(r.name=t.name),""!==t.sourceStopId&&(r.sourceStopId=t.sourceStopId),void 0!==t.lat&&(r.lat=t.lat),void 0!==t.lon&&(r.lon=t.lon),(null===(e=t.children)||void 0===e?void 0:e.length)&&(r.children=t.children.map((t=>Math.round(t)))),void 0!==t.parent&&(r.parent=Math.round(t.parent)),0!==t.locationType&&(r.locationType=function(t){switch(t){case ce.SIMPLE_STOP_OR_PLATFORM:return"SIMPLE_STOP_OR_PLATFORM";case ce.STATION:return"STATION";case ce.ENTRANCE_EXIT:return"ENTRANCE_EXIT";case ce.GENERIC_NODE:return"GENERIC_NODE";case ce.BOARDING_AREA:return"BOARDING_AREA";case ce.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.locationType)),void 0!==t.platform&&(r.platform=t.platform),r},create:t=>le.fromPartial(null!=t?t:{}),fromPartial(t){var e,r,n,s,i,o,a,u;const c={name:"",sourceStopId:"",lat:void 0,lon:void 0,children:[],parent:void 0,locationType:0,platform:void 0};return c.name=null!==(e=t.name)&&void 0!==e?e:"",c.sourceStopId=null!==(r=t.sourceStopId)&&void 0!==r?r:"",c.lat=null!==(n=t.lat)&&void 0!==n?n:void 0,c.lon=null!==(s=t.lon)&&void 0!==s?s:void 0,c.children=(null===(i=t.children)||void 0===i?void 0:i.map((t=>t)))||[],c.parent=null!==(o=t.parent)&&void 0!==o?o:void 0,c.locationType=null!==(a=t.locationType)&&void 0!==a?a:0,c.platform=null!==(u=t.platform)&&void 0!==u?u:void 0,c}};const fe={encode(t,e=new y){""!==t.version&&e.uint32(10).string(t.version);for(const r of t.stops)le.encode(r,e.uint32(18).fork()).join();return e},decode(t,e){const r=t instanceof E?t:new E(t),n=void 0===e?r.len:r.pos+e,s={version:"",stops:[]};for(;r.pos<n;){const t=r.uint32();switch(t>>>3){case 1:if(10!==t)break;s.version=r.string();continue;case 2:if(18!==t)break;s.stops.push(le.decode(r,r.uint32()));continue}if(4==(7&t)||0===t)break;r.skip(7&t)}return s},fromJSON:t=>({version:de(t.version)?globalThis.String(t.version):"",stops:globalThis.Array.isArray(null==t?void 0:t.stops)?t.stops.map((t=>le.fromJSON(t))):[]}),toJSON(t){var e;const r={};return""!==t.version&&(r.version=t.version),(null===(e=t.stops)||void 0===e?void 0:e.length)&&(r.stops=t.stops.map((t=>le.toJSON(t)))),r},create:t=>fe.fromPartial(null!=t?t:{}),fromPartial(t){var e,r;const n={version:"",stops:[]};return n.version=null!==(e=t.version)&&void 0!==e?e:"",n.stops=(null===(r=t.stops)||void 0===r?void 0:r.map((t=>le.fromPartial(t))))||[],n}};function de(t){return null!=t}const pe="0.0.3",me=t=>({version:pe,stops:t.map((t=>{return{name:(e=t).name,sourceStopId:e.sourceStopId,lat:e.lat,lon:e.lon,children:e.children,parent:e.parent,locationType:ve(e.locationType),platform:e.platform};var e}))}),ge=t=>{if(t.version!==pe)throw new Error(`Unsupported stopMap version ${t.version}`);return t.stops.map(((t,e)=>{return{id:e,sourceStopId:(r=t).sourceStopId,name:r.name,lat:r.lat,lon:r.lon,children:r.children,parent:r.parent,locationType:Te(r.locationType),platform:r.platform};var r}))},Te=t=>{switch(t){case ce.SIMPLE_STOP_OR_PLATFORM:return"SIMPLE_STOP_OR_PLATFORM";case ce.STATION:return"STATION";case ce.ENTRANCE_EXIT:return"ENTRANCE_EXIT";case ce.GENERIC_NODE:return"GENERIC_NODE";case ce.BOARDING_AREA:return"BOARDING_AREA";case ce.UNRECOGNIZED:throw new Error("Unrecognized protobuf location type.")}},ve=t=>{switch(t){case"SIMPLE_STOP_OR_PLATFORM":return ce.SIMPLE_STOP_OR_PLATFORM;case"STATION":return ce.STATION;case"ENTRANCE_EXIT":return ce.ENTRANCE_EXIT;case"GENERIC_NODE":return ce.GENERIC_NODE;case"BOARDING_AREA":return ce.BOARDING_AREA}};class Ie{constructor(t){var e;this.stops=t,this.sourceStopsMap=new Map;const r=new Map;this.stopPoints=[];for(let n=0;n<t.length;n++){const s=t[n];this.sourceStopsMap.set(s.sourceStopId,n);const i=null!==(e=s.parent)&&void 0!==e?e:n;r.has(i)||r.set(i,{id:i,name:s.parent?this.stops[s.parent].name:s.name}),s.lat&&s.lon&&this.stopPoints.push({id:n,lat:s.lat,lon:s.lon})}this.textIndex=new ae({fields:["name"],storeFields:["id"],searchOptions:{prefix:!0,fuzzy:.2},processTerm:ue});const n=Array.from(r.values());((t,e)=>{for(const r of e)Xt(t,r)})(this.textIndex,n),this.geoIndex=new gt(this.stopPoints.length);for(let t=0;t<this.stopPoints.length;t++){const{lat:e,lon:r}=this.stopPoints[t];this.geoIndex.add(r,e)}this.geoIndex.finish()}static fromData(t){const e=new E(t),r=fe.decode(e);return new Ie(ge(r))}serialize(){const t=me(this.stops),e=new y;return fe.encode(t,e),e.finish()}size(){return this.stops.length}findStopsByName(t,e=5){return((t,e,r={})=>{const{searchOptions:n}=t._options,s={...n,...r},i=oe(t,e,r),o=[];for(const[e,{score:r,terms:n,match:a}]of i){const i=n.length||1,u={id:t._documentIds.get(e),score:r*i,terms:Object.keys(a),queryTerms:n,match:a};Object.assign(u,t._storedFields.get(e)),(null==s.filter||s.filter(u))&&o.push(u)}return e===ne&&null==s.boostDocument||o.sort(jt),o})(this.textIndex,t).map((t=>this.stops[t.id])).slice(0,e)}findStopsByLocation(t,e,r=5,n=.5){const s=function(t,e,r,n=1/0,s=1/0){let i=1;const o=[];void 0===n&&(n=1/0),void 0!==s&&(i=ft(s/6371));const a=new at([],lt);let u={left:0,right:t.ids.length-1,axis:0,minLng:-180,minLat:-90,maxLng:180,maxLat:90};const c=Math.cos(r*ct);for(;u;){const s=u.right,h=u.left;if(s-h<=t.nodeSize)for(let n=h;n<=s;n++){const s=t.ids[n];{const i=pt(e,r,t.coords[2*n],t.coords[2*n+1],c);a.push({id:s,dist:i})}}else{const n=h+s>>1,i=t.coords[2*n],o=t.coords[2*n+1],l=t.ids[n];{const t=pt(e,r,i,o,c);a.push({id:l,dist:t})}const f=(u.axis+1)%2,d={left:h,right:n-1,axis:f,minLng:u.minLng,minLat:u.minLat,maxLng:0===u.axis?i:u.maxLng,maxLat:1===u.axis?o:u.maxLat,dist:0},p={left:n+1,right:s,axis:f,minLng:0===u.axis?i:u.minLng,minLat:1===u.axis?o:u.minLat,maxLng:u.maxLng,maxLat:u.maxLat,dist:0};d.dist=ht(e,r,c,d),p.dist=ht(e,r,c,p),a.push(d),a.push(p)}for(;a.length&&null!=a.peek().id;){const t=a.pop();if(t.dist>i)return o;if(o.push(t.id),o.length===n)return o}u=a.pop()}return o}(this.geoIndex,e,t,r,n).map((t=>{const e=this.stopPoints[t];return this.stops[e.id]}));return s}findStopById(t){return this.stops[t]}findStopBySourceStopId(t){const e=this.sourceStopsMap.get(t);if(void 0!==e)return this.findStopById(e)}equivalentStops(t){var e,r;const n=this.sourceStopsMap.get(t);if(void 0===n)return[];const s=this.stops[n];if(!s)return[];const i=s.parent?null!==(r=null===(e=this.stops[s.parent])||void 0===e?void 0:e.children)&&void 0!==r?r:[]:s.children;return Array.from(new Set([n,...i])).map((t=>this.stops[t]))}}export{e as Duration,t as Plotter,rt as Query,st as Result,nt as Route,ot as Router,Ie as StopsIndex,C as Time,et as Timetable};
1
+ class t{result;ROUND_COLORS=["#60a5fa","#ff9800","#14b8a6","#fb7185","#ffdf00","#b600ff","#ee82ee"];constructor(t){this.result=t}getRoundColor(t){if(0===t)return"#888888";const e=Math.min(t-1,this.ROUND_COLORS.length-1);return this.ROUND_COLORS[e]??"#ee82ee"}escapeDotString(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}getStationInfo(t){return{isOrigin:this.result.routingState.graph[0]?.has(t)??!1,isDestination:this.result.routingState.destinations.includes(t)}}formatStopName(t){const e=this.result.stopsIndex.findStopById(t);if(!e)return`Unknown Stop (${t})`;const n=this.escapeDotString(e.name),r=e.platform?this.escapeDotString(e.platform):"";return r?`${n}\\nPl. ${r}`:n}getStationFillColor(t,e){return t?"#60a5fa":e?"#ee82ee":"white"}createStationNode(t){if(!this.result.stopsIndex.findStopById(t))return"";const e=this.formatStopName(t),n=this.escapeDotString(String(t)),r=`s_${t}`,i=this.getStationInfo(t);return` "${r}" [label="${e}\\n${n}" shape=box style=filled fillcolor="${this.getStationFillColor(i.isOrigin,i.isDestination)}"];`}createVehicleEdge(t,e){const n=`s_${t.from}`,r=`s_${t.to}`,i=this.getRoundColor(e),o=`e_${t.from}_${t.to}_${t.routeId}_${e}`,s=this.result.timetable.getRoute(t.routeId),a=s?this.result.timetable.getServiceRouteInfo(s):null,u=a?.name??`Route ${String(t.routeId)}`,c=a?.type||"UNKNOWN",h=s?s.departureFrom(t.from,t.tripIndex).toString():"N/A",f=t.arrival.toString(),p=this.escapeDotString(u);return[` "${o}" [label="${`${this.escapeDotString(c)} ${p}\\n${`${t.routeId}:${t.tripIndex}`}\\n${h} → ${f}`}" shape=oval style=filled fillcolor="white" color="${i}"];`,` "${n}" -> "${o}" [color="${i}"];`,` "${o}" -> "${r}" [color="${i}"];`]}createTransferEdge(t,e){const n=`s_${t.from}`,r=`s_${t.to}`,i=this.getRoundColor(e),o=`e_${t.from}_${t.to}_${e}`,s=t.minTransferTime?.toString()||"N/A";return[` "${o}" [label="${`Transfer\\n${this.escapeDotString(s)}`}" shape=oval style="dashed,filled" fillcolor="white" color="${i}"];`,` "${n}" -> "${o}" [color="${i}" style="dashed"];`,` "${o}" -> "${r}" [color="${i}" style="dashed"];`]}createContinuationEdge(t,e,n){const r=`s_${t.to}`,i=`s_${e.from}`,o=this.getRoundColor(n),s=`continuation_${t.to}_${e.from}_${n}`,a=this.result.timetable.getRoute(t.routeId),u=this.result.timetable.getRoute(e.routeId),c=a?this.result.timetable.getServiceRouteInfo(a):null,h=u?this.result.timetable.getServiceRouteInfo(u):null,f=c?.name??`Route ${String(t.routeId)}`,p=h?.name??`Route ${String(e.routeId)}`,d=c?.type||"UNKNOWN",l=h?.type||"UNKNOWN",m=t.arrival.toString(),g=u?u.departureFrom(e.from,e.tripIndex).toString():"N/A",I=this.escapeDotString(f),T=this.escapeDotString(p),S=this.escapeDotString(d),y=this.escapeDotString(l);return[` "${s}" [label="${`${S} ${I} (${`${t.routeId}:${t.tripIndex}`}) ${m}\\n↓\\n${y} ${T} (${`${e.routeId}:${e.tripIndex}`}) ${g}`}" shape=oval style="filled,bold" fillcolor="#ffffcc" color="${o}" penwidth="2"];`,` "${r}" -> "${s}" [color="${o}" style="bold" penwidth="3"];`,` "${s}" -> "${i}" [color="${o}" style="bold" penwidth="3"];`]}collectGraphData(){const t=new Set,e=[],n=[],r=this.result.routingState.graph;return r.forEach((e=>{e.forEach(((e,n)=>{t.add(n),"from"in e&&"to"in e&&(t.add(e.from),t.add(e.to))}))})),r.forEach(((t,r)=>{0!==r&&t.forEach((t=>{if("from"in t&&"to"in t)if("routeId"in t){const i=this.createVehicleEdge(t,r);if(e.push(...i),t.continuationOf){let e=t,i=t.continuationOf;for(;i;){const t=this.createContinuationEdge(i,e,r);n.push(...t),e=i,i=i.continuationOf}}}else{const n=this.createTransferEdge(t,r);e.push(...n)}}))})),e.push(...n),{stations:t,edges:e}}plotDotGraph(){const{stations:t,edges:e}=this.collectGraphData(),n=["digraph RoutingGraph {"," graph [overlap=false, splines=true, rankdir=TB, bgcolor=white, nodesep=0.8, ranksep=1.2, concentrate=true];",' node [fontname="Arial" margin=0.1];',' edge [fontname="Arial" fontsize=10];',""," // Stations"];return t.forEach((t=>{const e=this.createStationNode(t);e&&n.push(e)})),n.push(""," // Edges"),n.push(...e),n.push("}"),n.join("\n")}}class e{totalSeconds;constructor(t){this.totalSeconds=t}static fromSeconds(t){return new e(t)}static fromMinutes(t){return new e(60*t)}static zero(){return new e(0)}toString(){const t=Math.floor(this.totalSeconds/3600),e=Math.floor(this.totalSeconds%3600/60),n=this.totalSeconds%60;return t>0?`${t.toString().padStart(2,"0")}:${e.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}`:`${e.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}`}toSeconds(){return this.totalSeconds}add(t){const n=this.totalSeconds+t.toSeconds();return new e(n)}subtract(t){const n=Math.max(0,this.totalSeconds-t.toSeconds());return new e(n)}}function n(){let t=0,e=0;for(let n=0;n<28;n+=7){let r=this.buf[this.pos++];if(t|=(127&r)<<n,!(128&r))return this.assertBounds(),[t,e]}let n=this.buf[this.pos++];if(t|=(15&n)<<28,e=(112&n)>>4,!(128&n))return this.assertBounds(),[t,e];for(let n=3;n<=31;n+=7){let r=this.buf[this.pos++];if(e|=(127&r)<<n,!(128&r))return this.assertBounds(),[t,e]}throw new Error("invalid varint")}function r(t,e,n){for(let r=0;r<28;r+=7){const i=t>>>r,o=!(i>>>7==0&&0==e),s=255&(o?128|i:i);if(n.push(s),!o)return}const r=t>>>28&15|(7&e)<<4,i=!!(e>>3);if(n.push(255&(i?128|r:r)),i){for(let t=3;t<31;t+=7){const r=e>>>t,i=!(r>>>7==0),o=255&(i?128|r:r);if(n.push(o),!i)return}n.push(e>>>31&1)}}const i=4294967296;function o(t){const e="-"===t[0];e&&(t=t.slice(1));const n=1e6;let r=0,o=0;function s(e,s){const a=Number(t.slice(e,s));o*=n,r=r*n+a,r>=i&&(o+=r/i|0,r%=i)}return s(-24,-18),s(-18,-12),s(-12,-6),s(-6),e?u(r,o):a(r,o)}function s(t,e){if(({lo:t,hi:e}=function(t,e){return{lo:t>>>0,hi:e>>>0}}(t,e)),e<=2097151)return String(i*e+t);const n=16777215&(t>>>24|e<<8),r=e>>16&65535;let o=(16777215&t)+6777216*n+6710656*r,s=n+8147497*r,a=2*r;const u=1e7;return o>=u&&(s+=Math.floor(o/u),o%=u),s>=u&&(a+=Math.floor(s/u),s%=u),a.toString()+c(s)+c(o)}function a(t,e){return{lo:0|t,hi:0|e}}function u(t,e){return e=~e,t?t=1+~t:e+=1,a(t,e)}const c=t=>{const e=String(t);return"0000000".slice(e.length)+e};function h(t,e){if(t>=0){for(;t>127;)e.push(127&t|128),t>>>=7;e.push(t)}else{for(let n=0;n<9;n++)e.push(127&t|128),t>>=7;e.push(1)}}function f(){let t=this.buf[this.pos++],e=127&t;if(!(128&t))return this.assertBounds(),e;if(t=this.buf[this.pos++],e|=(127&t)<<7,!(128&t))return this.assertBounds(),e;if(t=this.buf[this.pos++],e|=(127&t)<<14,!(128&t))return this.assertBounds(),e;if(t=this.buf[this.pos++],e|=(127&t)<<21,!(128&t))return this.assertBounds(),e;t=this.buf[this.pos++],e|=(15&t)<<28;for(let e=5;128&t&&e<10;e++)t=this.buf[this.pos++];if(128&t)throw new Error("invalid varint");return this.assertBounds(),e>>>0}const p=d();function d(){const t=new DataView(new ArrayBuffer(8));if("function"==typeof BigInt&&"function"==typeof t.getBigInt64&&"function"==typeof t.getBigUint64&&"function"==typeof t.setBigInt64&&"function"==typeof t.setBigUint64&&("object"!=typeof process||"object"!=typeof process.env||"1"!==process.env.BUF_BIGINT_DISABLE)){const e=BigInt("-9223372036854775808"),n=BigInt("9223372036854775807"),r=BigInt("0"),i=BigInt("18446744073709551615");return{zero:BigInt(0),supported:!0,parse(t){const r="bigint"==typeof t?t:BigInt(t);if(r>n||r<e)throw new Error(`invalid int64: ${t}`);return r},uParse(t){const e="bigint"==typeof t?t:BigInt(t);if(e>i||e<r)throw new Error(`invalid uint64: ${t}`);return e},enc(e){return t.setBigInt64(0,this.parse(e),!0),{lo:t.getInt32(0,!0),hi:t.getInt32(4,!0)}},uEnc(e){return t.setBigInt64(0,this.uParse(e),!0),{lo:t.getInt32(0,!0),hi:t.getInt32(4,!0)}},dec:(e,n)=>(t.setInt32(0,e,!0),t.setInt32(4,n,!0),t.getBigInt64(0,!0)),uDec:(e,n)=>(t.setInt32(0,e,!0),t.setInt32(4,n,!0),t.getBigUint64(0,!0))}}return{zero:"0",supported:!1,parse:t=>("string"!=typeof t&&(t=t.toString()),l(t),t),uParse:t=>("string"!=typeof t&&(t=t.toString()),m(t),t),enc:t=>("string"!=typeof t&&(t=t.toString()),l(t),o(t)),uEnc:t=>("string"!=typeof t&&(t=t.toString()),m(t),o(t)),dec:(t,e)=>function(t,e){let n=a(t,e);const r=2147483648&n.hi;r&&(n=u(n.lo,n.hi));const i=s(n.lo,n.hi);return r?"-"+i:i}(t,e),uDec:(t,e)=>s(t,e)}}function l(t){if(!/^-?[0-9]+$/.test(t))throw new Error("invalid int64: "+t)}function m(t){if(!/^[0-9]+$/.test(t))throw new Error("invalid uint64: "+t)}const g=Symbol.for("@bufbuild/protobuf/text-encoding");function I(){if(null==globalThis[g]){const t=new globalThis.TextEncoder,e=new globalThis.TextDecoder;globalThis[g]={encodeUtf8:e=>t.encode(e),decodeUtf8:t=>e.decode(t),checkUtf8(t){try{return encodeURIComponent(t),!0}catch(t){return!1}}}}return globalThis[g]}var T;!function(t){t[t.Varint=0]="Varint",t[t.Bit64=1]="Bit64",t[t.LengthDelimited=2]="LengthDelimited",t[t.StartGroup=3]="StartGroup",t[t.EndGroup=4]="EndGroup",t[t.Bit32=5]="Bit32"}(T||(T={}));const S=34028234663852886e22,y=-34028234663852886e22;class A{constructor(t=I().encodeUtf8){this.encodeUtf8=t,this.stack=[],this.chunks=[],this.buf=[]}finish(){this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]);let t=0;for(let e=0;e<this.chunks.length;e++)t+=this.chunks[e].length;let e=new Uint8Array(t),n=0;for(let t=0;t<this.chunks.length;t++)e.set(this.chunks[t],n),n+=this.chunks[t].length;return this.chunks=[],e}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let t=this.finish(),e=this.stack.pop();if(!e)throw new Error("invalid state, fork stack empty");return this.chunks=e.chunks,this.buf=e.buf,this.uint32(t.byteLength),this.raw(t)}tag(t,e){return this.uint32((t<<3|e)>>>0)}raw(t){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(t),this}uint32(t){for(w(t);t>127;)this.buf.push(127&t|128),t>>>=7;return this.buf.push(t),this}int32(t){return R(t),h(t,this.buf),this}bool(t){return this.buf.push(t?1:0),this}bytes(t){return this.uint32(t.byteLength),this.raw(t)}string(t){let e=this.encodeUtf8(t);return this.uint32(e.byteLength),this.raw(e)}float(t){!function(t){if("string"==typeof t){const e=t;if(t=Number(t),Number.isNaN(t)&&"NaN"!==e)throw new Error("invalid float32: "+e)}else if("number"!=typeof t)throw new Error("invalid float32: "+typeof t);if(Number.isFinite(t)&&(t>S||t<y))throw new Error("invalid float32: "+t)}(t);let e=new Uint8Array(4);return new DataView(e.buffer).setFloat32(0,t,!0),this.raw(e)}double(t){let e=new Uint8Array(8);return new DataView(e.buffer).setFloat64(0,t,!0),this.raw(e)}fixed32(t){w(t);let e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,t,!0),this.raw(e)}sfixed32(t){R(t);let e=new Uint8Array(4);return new DataView(e.buffer).setInt32(0,t,!0),this.raw(e)}sint32(t){return R(t),h(t=(t<<1^t>>31)>>>0,this.buf),this}sfixed64(t){let e=new Uint8Array(8),n=new DataView(e.buffer),r=p.enc(t);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(e)}fixed64(t){let e=new Uint8Array(8),n=new DataView(e.buffer),r=p.uEnc(t);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(e)}int64(t){let e=p.enc(t);return r(e.lo,e.hi,this.buf),this}sint64(t){const e=p.enc(t),n=e.hi>>31;return r(e.lo<<1^n,(e.hi<<1|e.lo>>>31)^n,this.buf),this}uint64(t){const e=p.uEnc(t);return r(e.lo,e.hi,this.buf),this}}class E{constructor(t,e=I().decodeUtf8){this.decodeUtf8=e,this.varint64=n,this.uint32=f,this.buf=t,this.len=t.length,this.pos=0,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength)}tag(){let t=this.uint32(),e=t>>>3,n=7&t;if(e<=0||n<0||n>5)throw new Error("illegal tag: field no "+e+" wire type "+n);return[e,n]}skip(t,e){let n=this.pos;switch(t){case T.Varint:for(;128&this.buf[this.pos++];);break;case T.Bit64:this.pos+=4;case T.Bit32:this.pos+=4;break;case T.LengthDelimited:let n=this.uint32();this.pos+=n;break;case T.StartGroup:for(;;){const[t,n]=this.tag();if(n===T.EndGroup){if(void 0!==e&&t!==e)throw new Error("invalid end group tag");break}this.skip(n,t)}break;default:throw new Error("cant skip wire type "+t)}return this.assertBounds(),this.buf.subarray(n,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return 0|this.uint32()}sint32(){let t=this.uint32();return t>>>1^-(1&t)}int64(){return p.dec(...this.varint64())}uint64(){return p.uDec(...this.varint64())}sint64(){let[t,e]=this.varint64(),n=-(1&t);return t=(t>>>1|(1&e)<<31)^n,e=e>>>1^n,p.dec(t,e)}bool(){let[t,e]=this.varint64();return 0!==t||0!==e}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return p.uDec(this.sfixed32(),this.sfixed32())}sfixed64(){return p.dec(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let t=this.uint32(),e=this.pos;return this.pos+=t,this.assertBounds(),this.buf.subarray(e,e+t)}string(){return this.decodeUtf8(this.bytes())}}function R(t){if("string"==typeof t)t=Number(t);else if("number"!=typeof t)throw new Error("invalid int32: "+typeof t);if(!Number.isInteger(t)||t>2147483647||t<-2147483648)throw new Error("invalid int32: "+t)}function w(t){if("string"==typeof t)t=Number(t);else if("number"!=typeof t)throw new Error("invalid uint32: "+typeof t);if(!Number.isInteger(t)||t>4294967295||t<0)throw new Error("invalid uint32: "+t)}var b,_;function v(t){switch(t){case 0:case"RECOMMENDED_TRANSFER_POINT":return b.RECOMMENDED_TRANSFER_POINT;case 1:case"TIMED_TRANSFER":return b.TIMED_TRANSFER;case 2:case"REQUIRES_MINIMAL_TIME":return b.REQUIRES_MINIMAL_TIME;case 3:case"IN_SEAT_TRANSFER":return b.IN_SEAT_TRANSFER;default:return b.UNRECOGNIZED}}function N(t){switch(t){case 0:case"TRAM":return _.TRAM;case 1:case"SUBWAY":return _.SUBWAY;case 2:case"RAIL":return _.RAIL;case 3:case"BUS":return _.BUS;case 4:case"FERRY":return _.FERRY;case 5:case"CABLE_TRAM":return _.CABLE_TRAM;case 6:case"AERIAL_LIFT":return _.AERIAL_LIFT;case 7:case"FUNICULAR":return _.FUNICULAR;case 8:case"TROLLEYBUS":return _.TROLLEYBUS;case 9:case"MONORAIL":return _.MONORAIL;default:return _.UNRECOGNIZED}}function O(){return{stopTimes:new Uint8Array(0),pickUpDropOffTypes:new Uint8Array(0),stops:new Uint8Array(0),serviceRouteId:0}}!function(t){t[t.RECOMMENDED_TRANSFER_POINT=0]="RECOMMENDED_TRANSFER_POINT",t[t.TIMED_TRANSFER=1]="TIMED_TRANSFER",t[t.REQUIRES_MINIMAL_TIME=2]="REQUIRES_MINIMAL_TIME",t[t.IN_SEAT_TRANSFER=3]="IN_SEAT_TRANSFER",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(b||(b={})),function(t){t[t.TRAM=0]="TRAM",t[t.SUBWAY=1]="SUBWAY",t[t.RAIL=2]="RAIL",t[t.BUS=3]="BUS",t[t.FERRY=4]="FERRY",t[t.CABLE_TRAM=5]="CABLE_TRAM",t[t.AERIAL_LIFT=6]="AERIAL_LIFT",t[t.FUNICULAR=7]="FUNICULAR",t[t.TROLLEYBUS=8]="TROLLEYBUS",t[t.MONORAIL=9]="MONORAIL",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(_||(_={}));const M={encode:(t,e=new A)=>(0!==t.stopTimes.length&&e.uint32(10).bytes(t.stopTimes),0!==t.pickUpDropOffTypes.length&&e.uint32(18).bytes(t.pickUpDropOffTypes),0!==t.stops.length&&e.uint32(26).bytes(t.stops),0!==t.serviceRouteId&&e.uint32(32).uint32(t.serviceRouteId),e),decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i=O();for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(10!==t)break;i.stopTimes=n.bytes();continue;case 2:if(18!==t)break;i.pickUpDropOffTypes=n.bytes();continue;case 3:if(26!==t)break;i.stops=n.bytes();continue;case 4:if(32!==t)break;i.serviceRouteId=n.uint32();continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({stopTimes:F(t.stopTimes)?C(t.stopTimes):new Uint8Array(0),pickUpDropOffTypes:F(t.pickUpDropOffTypes)?C(t.pickUpDropOffTypes):new Uint8Array(0),stops:F(t.stops)?C(t.stops):new Uint8Array(0),serviceRouteId:F(t.serviceRouteId)?globalThis.Number(t.serviceRouteId):0}),toJSON(t){const e={};return 0!==t.stopTimes.length&&(e.stopTimes=B(t.stopTimes)),0!==t.pickUpDropOffTypes.length&&(e.pickUpDropOffTypes=B(t.pickUpDropOffTypes)),0!==t.stops.length&&(e.stops=B(t.stops)),0!==t.serviceRouteId&&(e.serviceRouteId=Math.round(t.serviceRouteId)),e},create:t=>M.fromPartial(t??{}),fromPartial(t){const e=O();return e.stopTimes=t.stopTimes??new Uint8Array(0),e.pickUpDropOffTypes=t.pickUpDropOffTypes??new Uint8Array(0),e.stops=t.stops??new Uint8Array(0),e.serviceRouteId=t.serviceRouteId??0,e}};const x={encode:(t,e=new A)=>(0!==t.destination&&e.uint32(8).uint32(t.destination),0!==t.type&&e.uint32(16).int32(t.type),void 0!==t.minTransferTime&&e.uint32(24).uint32(t.minTransferTime),e),decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={destination:0,type:0,minTransferTime:void 0};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(8!==t)break;i.destination=n.uint32();continue;case 2:if(16!==t)break;i.type=n.int32();continue;case 3:if(24!==t)break;i.minTransferTime=n.uint32();continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({destination:F(t.destination)?globalThis.Number(t.destination):0,type:F(t.type)?v(t.type):0,minTransferTime:F(t.minTransferTime)?globalThis.Number(t.minTransferTime):void 0}),toJSON(t){const e={};return 0!==t.destination&&(e.destination=Math.round(t.destination)),0!==t.type&&(e.type=function(t){switch(t){case b.RECOMMENDED_TRANSFER_POINT:return"RECOMMENDED_TRANSFER_POINT";case b.TIMED_TRANSFER:return"TIMED_TRANSFER";case b.REQUIRES_MINIMAL_TIME:return"REQUIRES_MINIMAL_TIME";case b.IN_SEAT_TRANSFER:return"IN_SEAT_TRANSFER";case b.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.type)),void 0!==t.minTransferTime&&(e.minTransferTime=Math.round(t.minTransferTime)),e},create:t=>x.fromPartial(t??{}),fromPartial(t){const e={destination:0,type:0,minTransferTime:void 0};return e.destination=t.destination??0,e.type=t.type??0,e.minTransferTime=t.minTransferTime??void 0,e}};const U={encode:(t,e=new A)=>(0!==t.hopOnStopIndex&&e.uint32(8).uint32(t.hopOnStopIndex),0!==t.routeId&&e.uint32(16).uint32(t.routeId),0!==t.tripIndex&&e.uint32(24).uint32(t.tripIndex),e),decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={hopOnStopIndex:0,routeId:0,tripIndex:0};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(8!==t)break;i.hopOnStopIndex=n.uint32();continue;case 2:if(16!==t)break;i.routeId=n.uint32();continue;case 3:if(24!==t)break;i.tripIndex=n.uint32();continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({hopOnStopIndex:F(t.hopOnStopIndex)?globalThis.Number(t.hopOnStopIndex):0,routeId:F(t.routeId)?globalThis.Number(t.routeId):0,tripIndex:F(t.tripIndex)?globalThis.Number(t.tripIndex):0}),toJSON(t){const e={};return 0!==t.hopOnStopIndex&&(e.hopOnStopIndex=Math.round(t.hopOnStopIndex)),0!==t.routeId&&(e.routeId=Math.round(t.routeId)),0!==t.tripIndex&&(e.tripIndex=Math.round(t.tripIndex)),e},create:t=>U.fromPartial(t??{}),fromPartial(t){const e={hopOnStopIndex:0,routeId:0,tripIndex:0};return e.hopOnStopIndex=t.hopOnStopIndex??0,e.routeId=t.routeId??0,e.tripIndex=t.tripIndex??0,e}};const L={encode(t,e=new A){0!==t.originStopIndex&&e.uint32(8).uint32(t.originStopIndex),0!==t.originRouteId&&e.uint32(16).uint32(t.originRouteId),0!==t.originTripIndex&&e.uint32(24).uint32(t.originTripIndex);for(const n of t.continuations)U.encode(n,e.uint32(34).fork()).join();return e},decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={originStopIndex:0,originRouteId:0,originTripIndex:0,continuations:[]};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(8!==t)break;i.originStopIndex=n.uint32();continue;case 2:if(16!==t)break;i.originRouteId=n.uint32();continue;case 3:if(24!==t)break;i.originTripIndex=n.uint32();continue;case 4:if(34!==t)break;i.continuations.push(U.decode(n,n.uint32()));continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({originStopIndex:F(t.originStopIndex)?globalThis.Number(t.originStopIndex):0,originRouteId:F(t.originRouteId)?globalThis.Number(t.originRouteId):0,originTripIndex:F(t.originTripIndex)?globalThis.Number(t.originTripIndex):0,continuations:globalThis.Array.isArray(t?.continuations)?t.continuations.map((t=>U.fromJSON(t))):[]}),toJSON(t){const e={};return 0!==t.originStopIndex&&(e.originStopIndex=Math.round(t.originStopIndex)),0!==t.originRouteId&&(e.originRouteId=Math.round(t.originRouteId)),0!==t.originTripIndex&&(e.originTripIndex=Math.round(t.originTripIndex)),t.continuations?.length&&(e.continuations=t.continuations.map((t=>U.toJSON(t)))),e},create:t=>L.fromPartial(t??{}),fromPartial(t){const e={originStopIndex:0,originRouteId:0,originTripIndex:0,continuations:[]};return e.originStopIndex=t.originStopIndex??0,e.originRouteId=t.originRouteId??0,e.originTripIndex=t.originTripIndex??0,e.continuations=t.continuations?.map((t=>U.fromPartial(t)))||[],e}};const k={encode(t,e=new A){e.uint32(10).fork();for(const n of t.routes)e.uint32(n);e.join();for(const n of t.transfers)x.encode(n,e.uint32(18).fork()).join();return e},decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={routes:[],transfers:[]};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(8===t){i.routes.push(n.uint32());continue}if(10===t){const t=n.uint32()+n.pos;for(;n.pos<t;)i.routes.push(n.uint32());continue}break;case 2:if(18!==t)break;i.transfers.push(x.decode(n,n.uint32()));continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({routes:globalThis.Array.isArray(t?.routes)?t.routes.map((t=>globalThis.Number(t))):[],transfers:globalThis.Array.isArray(t?.transfers)?t.transfers.map((t=>x.fromJSON(t))):[]}),toJSON(t){const e={};return t.routes?.length&&(e.routes=t.routes.map((t=>Math.round(t)))),t.transfers?.length&&(e.transfers=t.transfers.map((t=>x.toJSON(t)))),e},create:t=>k.fromPartial(t??{}),fromPartial(t){const e={routes:[],transfers:[]};return e.routes=t.routes?.map((t=>t))||[],e.transfers=t.transfers?.map((t=>x.fromPartial(t)))||[],e}};const D={encode(t,e=new A){0!==t.type&&e.uint32(8).int32(t.type),""!==t.name&&e.uint32(18).string(t.name),e.uint32(26).fork();for(const n of t.routes)e.uint32(n);return e.join(),e},decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={type:0,name:"",routes:[]};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(8!==t)break;i.type=n.int32();continue;case 2:if(18!==t)break;i.name=n.string();continue;case 3:if(24===t){i.routes.push(n.uint32());continue}if(26===t){const t=n.uint32()+n.pos;for(;n.pos<t;)i.routes.push(n.uint32());continue}}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({type:F(t.type)?N(t.type):0,name:F(t.name)?globalThis.String(t.name):"",routes:globalThis.Array.isArray(t?.routes)?t.routes.map((t=>globalThis.Number(t))):[]}),toJSON(t){const e={};return 0!==t.type&&(e.type=function(t){switch(t){case _.TRAM:return"TRAM";case _.SUBWAY:return"SUBWAY";case _.RAIL:return"RAIL";case _.BUS:return"BUS";case _.FERRY:return"FERRY";case _.CABLE_TRAM:return"CABLE_TRAM";case _.AERIAL_LIFT:return"AERIAL_LIFT";case _.FUNICULAR:return"FUNICULAR";case _.TROLLEYBUS:return"TROLLEYBUS";case _.MONORAIL:return"MONORAIL";case _.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.type)),""!==t.name&&(e.name=t.name),t.routes?.length&&(e.routes=t.routes.map((t=>Math.round(t)))),e},create:t=>D.fromPartial(t??{}),fromPartial(t){const e={type:0,name:"",routes:[]};return e.type=t.type??0,e.name=t.name??"",e.routes=t.routes?.map((t=>t))||[],e}};const $={encode(t,e=new A){""!==t.version&&e.uint32(10).string(t.version);for(const n of t.stopsAdjacency)k.encode(n,e.uint32(18).fork()).join();for(const n of t.routesAdjacency)M.encode(n,e.uint32(26).fork()).join();for(const n of t.serviceRoutes)D.encode(n,e.uint32(34).fork()).join();for(const n of t.tripContinuations)L.encode(n,e.uint32(42).fork()).join();return e},decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={version:"",stopsAdjacency:[],routesAdjacency:[],serviceRoutes:[],tripContinuations:[]};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(10!==t)break;i.version=n.string();continue;case 2:if(18!==t)break;i.stopsAdjacency.push(k.decode(n,n.uint32()));continue;case 3:if(26!==t)break;i.routesAdjacency.push(M.decode(n,n.uint32()));continue;case 4:if(34!==t)break;i.serviceRoutes.push(D.decode(n,n.uint32()));continue;case 5:if(42!==t)break;i.tripContinuations.push(L.decode(n,n.uint32()));continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({version:F(t.version)?globalThis.String(t.version):"",stopsAdjacency:globalThis.Array.isArray(t?.stopsAdjacency)?t.stopsAdjacency.map((t=>k.fromJSON(t))):[],routesAdjacency:globalThis.Array.isArray(t?.routesAdjacency)?t.routesAdjacency.map((t=>M.fromJSON(t))):[],serviceRoutes:globalThis.Array.isArray(t?.serviceRoutes)?t.serviceRoutes.map((t=>D.fromJSON(t))):[],tripContinuations:globalThis.Array.isArray(t?.tripContinuations)?t.tripContinuations.map((t=>L.fromJSON(t))):[]}),toJSON(t){const e={};return""!==t.version&&(e.version=t.version),t.stopsAdjacency?.length&&(e.stopsAdjacency=t.stopsAdjacency.map((t=>k.toJSON(t)))),t.routesAdjacency?.length&&(e.routesAdjacency=t.routesAdjacency.map((t=>M.toJSON(t)))),t.serviceRoutes?.length&&(e.serviceRoutes=t.serviceRoutes.map((t=>D.toJSON(t)))),t.tripContinuations?.length&&(e.tripContinuations=t.tripContinuations.map((t=>L.toJSON(t)))),e},create:t=>$.fromPartial(t??{}),fromPartial(t){const e={version:"",stopsAdjacency:[],routesAdjacency:[],serviceRoutes:[],tripContinuations:[]};return e.version=t.version??"",e.stopsAdjacency=t.stopsAdjacency?.map((t=>k.fromPartial(t)))||[],e.routesAdjacency=t.routesAdjacency?.map((t=>M.fromPartial(t)))||[],e.serviceRoutes=t.serviceRoutes?.map((t=>D.fromPartial(t)))||[],e.tripContinuations=t.tripContinuations?.map((t=>L.fromPartial(t)))||[],e}};function C(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),n=new Uint8Array(e.length);for(let t=0;t<e.length;++t)n[t]=e.charCodeAt(t);return n}}function B(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}function F(t){return null!=t}class P{minutesSinceMidnight;static infinity(){return new P(Number.MAX_SAFE_INTEGER)}static origin(){return new P(0)}constructor(t){this.minutesSinceMidnight=t}static fromMinutes(t){return new P(t)}static fromHMS(t,e,n){if(t<0||e<0||n<0||e>=60||n>=60)throw new Error("Invalid time. Ensure hours, minutes, and seconds are valid values.");const r=n+60*e+3600*t,i=Math.round(r/60);return new P(i)}static fromHM(t,e){if(t<0||e<0||e>=60)throw new Error("Invalid time. Ensure hours and minutes are valid values.");return new P(e+60*t)}static fromDate(t){const e=t.getHours(),n=t.getMinutes(),r=t.getSeconds();return P.fromHMS(e,n,r)}static fromString(t){const[e,n,r]=t.split(":");if(void 0===e||void 0===n||""===e.trim()||""===n.trim()||isNaN(Number(e))||isNaN(Number(n))||void 0!==r&&(""===r.trim()||isNaN(Number(r))))throw new Error('Input string must be in the format "HH:MM:SS" or "HH:MM".');const i=parseInt(e,10),o=parseInt(n,10),s=void 0!==r?parseInt(r,10):0;return P.fromHMS(i,o,s)}toString(){let t=Math.floor(this.minutesSinceMidnight/60);const e=Math.floor(this.minutesSinceMidnight%60);return t>=24&&(t%=24),`${t.toString().padStart(2,"0")}:${e.toString().padStart(2,"0")}`}toMinutes(){return this.minutesSinceMidnight}plus(t){const e=60*this.minutesSinceMidnight+t.toSeconds();return new P(Math.round(e/60))}minus(t){let e=60*this.minutesSinceMidnight-t.toSeconds();return e<0&&(e+=86400),new P(Math.round(e/60))}diff(t){const n=this.minutesSinceMidnight-t.toMinutes();return e.fromSeconds(Math.abs(60*n))}static max(...t){if(0===t.length)throw new Error("At least one Time instance is required.");let e=t[0];for(let n=1;n<t.length;n++)t[n].minutesSinceMidnight>e.minutesSinceMidnight&&(e=t[n]);return e}static min(...t){if(0===t.length)throw new Error("At least one Time instance is required.");let e=t[0];for(let n=1;n<t.length;n++)t[n].minutesSinceMidnight<e.minutesSinceMidnight&&(e=t[n]);return e}isAfter(t){return this.minutesSinceMidnight>t.minutesSinceMidnight}isBefore(t){return this.minutesSinceMidnight<t.minutesSinceMidnight}equals(t){return this.minutesSinceMidnight===t.minutesSinceMidnight}}const z=["REGULAR","NOT_AVAILABLE","MUST_PHONE_AGENCY","MUST_COORDINATE_WITH_DRIVER"],j=t=>{const e=z[t];if(!e)throw new Error(`Invalid pickup/drop-off type ${t}`);return e};let G=class t{id;stopTimes;pickUpDropOffTypes;stops;stopIndices;serviceRouteId;nbStops;nbTrips;constructor(t,e,n,r,i){this.id=t,this.stopTimes=e,this.pickUpDropOffTypes=n,this.stops=r,this.serviceRouteId=i,this.nbStops=r.length,this.nbTrips=this.stopTimes.length/(2*this.stops.length),this.stopIndices=new Map;for(let t=0;t<r.length;t++){const e=r[t],n=this.stopIndices.get(e);n?n.push(t):this.stopIndices.set(e,[t])}}static of(e){const{id:n,serviceRouteId:r,trips:i}=e;if(0===i.length)throw new Error("At least one trip must be provided");const o=i[0],s=new Uint32Array(o.stops.map((t=>t.id))),a=s.length;for(let t=1;t<i.length;t++){const e=i[t];if(e.stops.length!==a)throw new Error(`Trip ${t} has ${e.stops.length} stops, expected ${a}`);for(let n=0;n<a;n++)if(e.stops[n].id!==s[n])throw new Error(`Trip ${t} has different stop at index ${n}`)}const u=new Uint16Array(i.length*a*2);for(let t=0;t<i.length;t++){const e=i[t];for(let n=0;n<a;n++){const r=e.stops[n],i=2*(t*a+n);u[i]=r.arrivalTime.toMinutes(),u[i+1]=r.departureTime.toMinutes()}}const c=i.length*a,h=new Uint8Array(Math.ceil(c/2));for(let t=0;t<i.length;t++){const e=i[t];for(let n=0;n<a;n++){const r=e.stops[n],i=t*a+n,o=r.pickUpType??0,s=r.dropOffType??0,u=Math.floor(i/2),c=i%2==1;h[u]|=c?o<<6|s<<4:o<<2|s}}return new t(n,u,h,s,r)}serialize(){return{stopTimes:this.stopTimes,pickUpDropOffTypes:this.pickUpDropOffTypes,stops:this.stops,serviceRouteId:this.serviceRouteId}}getNbStops(){return this.nbStops}getNbTrips(){return this.nbTrips}serviceRoute(){return this.serviceRouteId}arrivalAt(t,e){const n=2*(e*this.stops.length+t),r=this.stopTimes[n];if(void 0===r)throw new Error(`Arrival time not found for stop ${this.stopId(t)} (${t}) at trip index ${e} in route ${this.serviceRouteId}`);return P.fromMinutes(r)}departureFrom(t,e){const n=2*(e*this.stops.length+t)+1,r=this.stopTimes[n];if(void 0===r)throw new Error(`Departure time not found for stop ${this.stopId(t)} (${t}) at trip index ${e} in route ${this.serviceRouteId}`);return P.fromMinutes(r)}pickUpTypeFrom(t,e){const n=e*this.stops.length+t,r=Math.floor(n/2),i=n%2==1,o=this.pickUpDropOffTypes[r];if(void 0===o)throw new Error(`Pick up type not found for stop ${this.stopId(t)} (${t}) at trip index ${e} in route ${this.serviceRouteId}`);return j(i?o>>6&3:o>>2&3)}dropOffTypeAt(t,e){const n=e*this.stops.length+t,r=Math.floor(n/2),i=n%2==1,o=this.pickUpDropOffTypes[r];if(void 0===o)throw new Error(`Drop off type not found for stop ${this.stopId(t)} (${t}) at trip index ${e} in route ${this.serviceRouteId}`);return j(i?o>>4&3:3&o)}findEarliestTrip(t,e=P.origin(),n){if(this.nbTrips<=0)return;let r=this.nbTrips-1;if(void 0!==n&&(r=Math.min(r,n-1)),r<0)return;let i=0,o=-1;for(;i<=r;){const n=i+r>>>1;this.departureFrom(t,n).isBefore(e)?i=n+1:(o=n,r=n-1)}if(-1!==o)for(let e=o;e<(n??this.nbTrips);e++){if("NOT_AVAILABLE"!==this.pickUpTypeFrom(t,e))return e}}stopRouteIndices(t){const e=this.stopIndices.get(t);return void 0===e?[]:e}stopId(t){const e=this.stops[t];if(void 0===e)throw new Error(`StopId for stop at index ${t} not found in route ${this.serviceRouteId}`);return e}};const V=1048575n,Y=1048575,J=(t,e)=>{if(t<0||t>Y)throw new Error(`${e} must be between 0 and 1048575, got ${t}`)},W=(t,e,n)=>(J(t,"stopIndex"),J(e,"routeId"),J(n,"tripIndex"),BigInt(t)<<40n|BigInt(e)<<20n|BigInt(n)<<0n),q=t=>[Number(t>>40n&V),Number(t>>20n&V),Number(t>>0n&V)],Z=(()=>{const t=new ArrayBuffer(4);return new DataView(t).setUint32(0,305419896),120===new Uint8Array(t)[0]})(),H=!0,X=t=>{if(Z===H)return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);const e=new Uint8Array(4*t.length),n=new DataView(e.buffer);for(let e=0;e<t.length;e++)n.setUint32(4*e,t[e],H);return e},Q=t=>{if(t.byteLength%4!=0)throw new Error("Byte array length must be a multiple of 4 to convert to Uint32Array");if(Z===H)return new Uint32Array(t.buffer,t.byteOffset,t.byteLength/4);const e=new Uint32Array(t.byteLength/4),n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let t=0;t<e.length;t++)e[t]=n.getUint32(4*t,H);return e},K=t=>{if(Z===H)return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);const e=new Uint8Array(2*t.length),n=new DataView(e.buffer);for(let e=0;e<t.length;e++)n.setUint16(2*e,t[e],H);return e},tt=t=>{if(t.byteLength%2!=0)throw new Error("Byte array length must be a multiple of 2 to convert to Uint16Array");if(Z===H)return new Uint16Array(t.buffer,t.byteOffset,t.byteLength/2);const e=new Uint16Array(t.byteLength/2),n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let t=0;t<e.length;t++)e[t]=n.getUint16(2*t,H);return e},et=t=>{const e=[];return t.forEach((t=>{const n=t.serialize();e.push({stopTimes:K(n.stopTimes),pickUpDropOffTypes:n.pickUpDropOffTypes,stops:X(n.stops),serviceRouteId:n.serviceRouteId})})),e},nt=t=>{switch(t){case b.RECOMMENDED_TRANSFER_POINT:return"RECOMMENDED";case b.TIMED_TRANSFER:return"GUARANTEED";case b.REQUIRES_MINIMAL_TIME:return"REQUIRES_MINIMAL_TIME";case b.IN_SEAT_TRANSFER:return"IN_SEAT";case b.UNRECOGNIZED:throw new Error("Unrecognized protobuf transfer type.")}},rt=t=>{switch(t){case"RECOMMENDED":return b.RECOMMENDED_TRANSFER_POINT;case"GUARANTEED":return b.TIMED_TRANSFER;case"REQUIRES_MINIMAL_TIME":return b.REQUIRES_MINIMAL_TIME;case"IN_SEAT":return b.IN_SEAT_TRANSFER}},it=t=>{switch(t){case _.TRAM:return"TRAM";case _.SUBWAY:return"SUBWAY";case _.RAIL:return"RAIL";case _.BUS:return"BUS";case _.FERRY:return"FERRY";case _.CABLE_TRAM:return"CABLE_TRAM";case _.AERIAL_LIFT:return"AERIAL_LIFT";case _.FUNICULAR:return"FUNICULAR";case _.TROLLEYBUS:return"TROLLEYBUS";case _.MONORAIL:return"MONORAIL";case _.UNRECOGNIZED:default:throw new Error("Unrecognized protobuf route type.")}},ot=t=>{switch(t){case"TRAM":return _.TRAM;case"SUBWAY":return _.SUBWAY;case"RAIL":return _.RAIL;case"BUS":return _.BUS;case"FERRY":return _.FERRY;case"CABLE_TRAM":return _.CABLE_TRAM;case"AERIAL_LIFT":return _.AERIAL_LIFT;case"FUNICULAR":return _.FUNICULAR;case"TROLLEYBUS":return _.TROLLEYBUS;case"MONORAIL":return _.MONORAIL}},st=t=>{const e=[];for(const[n,r]of t.entries()){const[t,i,o]=q(n);e.push({originStopIndex:t,originRouteId:i,originTripIndex:o,continuations:r.map((t=>({hopOnStopIndex:t.hopOnStopIndex,routeId:t.routeId,tripIndex:t.tripIndex})))})}return e},at=new Set(["TRAM","SUBWAY","RAIL","BUS","FERRY","CABLE_TRAM","AERIAL_LIFT","FUNICULAR","TROLLEYBUS","MONORAIL"]),ut=[],ct="0.0.9";class ht{stopsAdjacency;routesAdjacency;serviceRoutes;tripContinuations;activeStops;constructor(t,e,n,r){this.stopsAdjacency=t,this.routesAdjacency=e,this.serviceRoutes=n,this.tripContinuations=r,this.activeStops=new Set;for(let e=0;e<t.length;e++){const n=t[e];(n.routes.length>0||n.transfers&&n.transfers.length>0)&&this.activeStops.add(e)}}serialize(){const t={version:ct,stopsAdjacency:(n=this.stopsAdjacency,n.map((t=>({transfers:t.transfers?t.transfers.map((t=>({destination:t.destination,type:rt(t.type),...void 0!==t.minTransferTime&&{minTransferTime:t.minTransferTime.toSeconds()}}))):[],routes:t.routes})))),routesAdjacency:et(this.routesAdjacency),serviceRoutes:(e=this.serviceRoutes,e.map((t=>({type:ot(t.type),name:t.name,routes:t.routes})))),tripContinuations:st(this.tripContinuations||new Map)};var e,n;const r=new A;return $.encode(t,r),r.finish()}static fromData(t){const n=new E(t),r=$.decode(n);if(r.version!==ct)throw new Error(`Unsupported timetable version ${r.version}`);return new ht((t=>{const n=[];for(let r=0;r<t.length;r++){const i=t[r],o=[];for(let t=0;t<i.transfers.length;t++){const n=i.transfers[t],r={destination:n.destination,type:nt(n.type),...void 0!==n.minTransferTime&&{minTransferTime:e.fromSeconds(n.minTransferTime)}};o.push(r)}const s={routes:i.routes};o.length>0&&(s.transfers=o),n.push(s)}return n})(r.stopsAdjacency),(t=>{const e=[];for(let n=0;n<t.length;n++){const r=t[n],i=Q(r.stops);e.push(new G(n,tt(r.stopTimes),r.pickUpDropOffTypes,i,r.serviceRouteId))}return e})(r.routesAdjacency),(t=>{const e=[];for(let n=0;n<t.length;n++){const r=t[n];e.push({type:it(r.type),name:r.name,routes:r.routes})}return e})(r.serviceRoutes),(t=>{const e=new Map;for(let n=0;n<t.length;n++){const r=t[n],i=W(r.originStopIndex,r.originRouteId,r.originTripIndex),o=r.continuations.map((t=>({hopOnStopIndex:t.hopOnStopIndex,routeId:t.routeId,tripIndex:t.tripIndex})));e.set(i,o)}return e})(r.tripContinuations))}isActive(t){return this.activeStops.has(t)}getRoute(t){return this.routesAdjacency[t]}getTransfers(t){const e=this.stopsAdjacency[t];if(!e)throw new Error(`Stop ID ${t} not found`);return e.transfers||[]}getContinuousTrips(t,e,n){const r=this.tripContinuations?.get(W(t,e,n));return r||ut}getServiceRouteInfo(t){const e=this.serviceRoutes[t.serviceRoute()];if(!e)throw new Error(`Service route not found for route ID: ${t.serviceRoute()}`);return{type:e.type,name:e.name}}routesPassingThrough(t){const e=this.stopsAdjacency[t];if(!e)return[];const n=[];for(let t=0;t<e.routes.length;t++){const r=e.routes[t],i=this.routesAdjacency[r];i&&n.push(i)}return n}findReachableRoutes(t,e=at){const n=new Map,r=Array.from(t);for(let t=0;t<r.length;t++){const i=r[t],o=this.routesPassingThrough(i).filter((t=>{const n=this.getServiceRouteInfo(t);return e.has(n.type)}));for(let t=0;t<o.length;t++){const e=o[t],r=e.stopRouteIndices(i)[0],s=n.get(e);void 0!==s?r<s&&n.set(e,r):n.set(e,r)}}return n}}class ft{from;to;departureTime;lastDepartureTime;options;constructor(t){this.from=t.fromValue,this.to=t.toValue,this.departureTime=t.departureTimeValue,this.options=t.optionsValue}static Builder=class{fromValue;toValue=new Set;departureTimeValue;optionsValue={maxTransfers:5,minTransferTime:e.fromSeconds(120),transportModes:at};from(t){return this.fromValue=t,this}to(t){return this.toValue=t instanceof Set?t:new Set([t]),this}departureTime(t){return this.departureTimeValue=t,this}maxTransfers(t){return this.optionsValue.maxTransfers=t,this}minTransferTime(t){return this.optionsValue.minTransferTime=t,this}transportModes(t){return this.optionsValue.transportModes=t,this}build(){return new ft(this)}}}class pt{legs;constructor(t){this.legs=t}departureTime(){const t=e.zero();for(let e=0;e<this.legs.length;e++){const n=this.legs[e];if("departureTime"in n)return n.departureTime.minus(t);"minTransferTime"in n&&n.minTransferTime&&t.add(n.minTransferTime)}throw new Error("No vehicle leg found in route")}arrivalTime(){let t=P.origin();const n=e.zero();let r=!1;for(let e=this.legs.length-1;e>=0;e--){const i=this.legs[e];"arrivalTime"in i&&!r?(t=i.arrivalTime,r=!0):"minTransferTime"in i&&i.minTransferTime&&r&&n.add(i.minTransferTime)}if(!r)throw new Error("No vehicle leg found in route");return t.plus(n)}totalDuration(){return 0===this.legs.length?e.zero():this.arrivalTime().diff(this.departureTime())}toString(){return this.legs.map(((t,e)=>{const n=`From: ${t.from.name}${t.from.platform?` (Pl. ${t.from.platform})`:""}`,r=`To: ${t.to.name}${t.to.platform?` (Pl. ${t.to.platform})`:""}`,i="minTransferTime"in t?`Minimum Transfer Time: ${t.minTransferTime?.toString()}`:"",o="route"in t&&"departureTime"in t&&"arrivalTime"in t?`Route: ${t.route.type} ${t.route.name}, Departure: ${t.departureTime.toString()}, Arrival: ${t.arrivalTime.toString()}`:"";return[`Leg ${e+1}:`,` ${n}`,` ${r}`,i?` ${i}`:"",o?` ${o}`:""].filter((t=>""!==t.trim())).join("\n")})).join("\n")}asJson(){return this.legs.map((t=>"route"in t?{from:t.from.sourceStopId,to:t.to.sourceStopId,departure:t.departureTime.toString(),arrival:t.arrivalTime.toString(),route:t.route}:{from:t.from.sourceStopId,to:t.to.sourceStopId,type:t.type,...void 0!==t.minTransferTime&&{minTransferTime:t.minTransferTime.toString()}}))}}class dt{query;routingState;stopsIndex;timetable;constructor(t,e,n,r){this.query=t,this.routingState=e,this.stopsIndex=n,this.timetable=r}bestRoute(t){const e=(t instanceof Set?Array.from(t):t?[t]:Array.from(this.query.to)).flatMap((t=>this.stopsIndex.equivalentStops(t)));let n,r;for(const t of e){const e=this.routingState.earliestArrivals.get(t.id);void 0!==e&&(void 0===r||e.arrival.isBefore(r.arrival))&&(n=t.id,r=e)}if(!n||!r)return;const i=[];let o=n,s=r.legNumber;for(;s>0;){const t=this.routingState.graph[s]?.get(o);if(!t)throw new Error(`No edge arriving at stop ${o} at round ${s}`);let e;if("routeId"in t){let n=t;const r=[n];for(;"routeId"in n&&n.continuationOf;)r.push(n.continuationOf),n=n.continuationOf;e=this.buildVehicleLeg(r)}else{if(!("type"in t))break;e=this.buildTransferLeg(t)}i.unshift(e),o=e.from.id,"routeId"in t&&(s-=1)}return new pt(i)}buildVehicleLeg(t){if(0===t.length)throw new Error("Cannot build vehicle leg from empty edges");const e=t[t.length-1],n=t[0],r=this.timetable.getRoute(e.routeId),i=this.timetable.getRoute(n.routeId);return{from:this.stopsIndex.findStopById(r.stopId(e.from)),to:this.stopsIndex.findStopById(i.stopId(n.to)),route:this.timetable.getServiceRouteInfo(r),departureTime:r.departureFrom(e.from,e.tripIndex),arrivalTime:n.arrival,pickUpType:r.pickUpTypeFrom(e.from,e.tripIndex),dropOffType:i.dropOffTypeAt(n.to,n.tripIndex)}}buildTransferLeg(t){return{from:this.stopsIndex.findStopById(t.from),to:this.stopsIndex.findStopById(t.to),minTransferTime:t.minTransferTime,type:t.type}}arrivalAt(t,e){const n=this.stopsIndex.equivalentStops(t);let r;for(const t of n){let n;if(void 0===e)n=this.routingState.earliestArrivals.get(t.id);else for(let r=e+1;r>=0;r--){const e=this.routingState.graph[r]?.get(t.id);if(void 0!==e){n={arrival:e.arrival,legNumber:r};break}}void 0!==n&&(void 0===r||n.arrival.isBefore(r.arrival))&&(r=n)}return r}}const lt=P.infinity();class mt{timetable;stopsIndex;constructor(t,e){this.timetable=t,this.stopsIndex=e}route(t){const e=this.initRoutingState(t),n=new Set;for(const t of e.graph[0].keys())n.add(t);const r=this.considerTransfers(t,0,n,e);for(const t of r)n.add(t);for(let r=1;r<=t.options.maxTransfers+1;r++){const i=new Map;e.graph.push(i);const o=this.timetable.findReachableRoutes(n,t.options.transportModes);n.clear();for(const[t,i]of o){const o=this.scanRoute(t,i,r,e);for(const t of o)n.add(t)}let s=this.findTripContinuations(n,i);for(;s.length>0;){const t=new Set;for(const n of s){const i=this.timetable.getRoute(n.routeId),o=this.scanRoute(i,n.hopOnStopIndex,r,e,n);for(const e of o)t.add(e)}for(const e of t)n.add(e);s=this.findTripContinuations(t,i)}const a=this.considerTransfers(t,r,n,e);for(const t of a)n.add(t);if(0===n.size)break}return new dt(t,e,this.stopsIndex,this.timetable)}findTripContinuations(t,e){const n=[];for(const r of t){const t=e.get(r);if(!t||!("routeId"in t))continue;const i=this.timetable.getContinuousTrips(t.to,t.routeId,t.tripIndex);for(let e=0;e<i.length;e++){const r=i[e];n.push({routeId:r.routeId,hopOnStopIndex:r.hopOnStopIndex,tripIndex:r.tripIndex,previousEdge:t})}}return n}initRoutingState(t){const{from:e,to:n,departureTime:r}=t,i=this.stopsIndex.equivalentStops(e).map((t=>t.id)),o=Array.from(n).flatMap((t=>this.stopsIndex.equivalentStops(t))).map((t=>t.id)),s=new Map,a=new Map,u=[a],c={arrival:r,legNumber:0};for(const t of i)s.set(t,c),a.set(t,c);return{destinations:o,earliestArrivals:s,graph:u}}scanRoute(t,e,n,r,i){const o=new Set;let s=i?{routeId:t.id,hopOnStopIndex:e,tripIndex:i.tripIndex}:void 0;const a=r.graph[n],u=r.graph[n-1],c=this.earliestArrivalAtAnyStop(r.earliestArrivals,r.destinations);for(let h=e;h<t.getNbStops();h++){const e=t.stops[h];if(void 0!==s){const u=t.arrivalAt(h,s.tripIndex),f=t.dropOffTypeAt(h,s.tripIndex),p=r.earliestArrivals.get(e)?.arrival??lt;if("NOT_AVAILABLE"!==f&&u.isBefore(p)&&u.isBefore(c)){const c={arrival:u,routeId:t.id,tripIndex:s.tripIndex,from:s.hopOnStopIndex,to:h};i&&(c.continuationOf=i.previousEdge),a.set(e,c),r.earliestArrivals.set(e,{arrival:u,legNumber:n}),o.add(e)}}if(i)continue;const f=u.get(e)?.arrival;if(void 0!==f&&(void 0===s||f.isBefore(t.departureFrom(h,s.tripIndex))||f.equals(t.departureFrom(h,s.tripIndex)))){const e=t.findEarliestTrip(h,f,s?.tripIndex);void 0!==e&&(s={routeId:t.id,tripIndex:e,hopOnStopIndex:h})}}return o}considerTransfers(t,n,r,i){const{options:o}=t,s=i.graph[n],a=new Set;for(const t of r){const r=s.get(t);if(!r||"type"in r)continue;const u=this.timetable.getTransfers(t);for(let c=0;c<u.length;c++){const h=u[c];let f;f=h.minTransferTime?h.minTransferTime:"IN_SEAT"===h.type?e.zero():o.minTransferTime;const p=r.arrival.plus(f),d=s.get(h.destination)?.arrival??lt;p.isBefore(d)&&(s.set(h.destination,{arrival:p,from:t,to:h.destination,minTransferTime:h.minTransferTime,type:h.type}),i.earliestArrivals.set(h.destination,{arrival:p,legNumber:n}),a.add(h.destination))}}return a}earliestArrivalAtAnyStop(t,e){let n=lt;for(let r=0;r<e.length;r++){const i=e[r],o=t.get(i)?.arrival??lt;n=P.min(n,o)}return n}}class gt{constructor(t=[],e=It){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}peek(){return this.data[0]}_up(t){const{data:e,compare:n}=this,r=e[t];for(;t>0;){const i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r}_down(t){const{data:e,compare:n}=this,r=this.length>>1,i=e[t];for(;t<r;){let r=1+(t<<1),o=e[r];const s=r+1;if(s<this.length&&n(e[s],o)<0&&(r=s,o=e[s]),n(o,i)>=0)break;e[t]=o,t=r}e[t]=i}}function It(t,e){return t<e?-1:t>e?1:0}const Tt=Math.PI/180;function St(t,e,n,r){const i=r.minLng,o=r.maxLng,s=r.minLat,a=r.maxLat;if(t>=i&&t<=o)return e<s?At((e-s)*Tt):e>a?At((e-a)*Tt):0;const u=Math.min(At((t-i)*Tt),At((t-o)*Tt)),c=function(t,e){const n=1-2*e;return n<=0?t>0?90:-90:Math.atan(Math.tan(t*Tt)/n)/Tt}(e,u);return c>s&&c<a?Et(u,n,e,c):Math.min(Et(u,n,e,s),Et(u,n,e,a))}function yt(t,e){return t.dist-e.dist}function At(t){const e=Math.sin(t/2);return e*e}function Et(t,e,n,r){return e*Math.cos(r*Tt)*t+At((n-r)*Tt)}function Rt(t,e,n,r,i){return Et(At((t-n)*Tt),i,e,r)}const wt=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class bt{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[e,n]=new Uint8Array(t,0,2);if(219!==e)throw new Error("Data does not appear to be in a KDBush format.");const r=n>>4;if(1!==r)throw new Error(`Got v${r} data when expected v1.`);const i=wt[15&n];if(!i)throw new Error("Unrecognized array type.");const[o]=new Uint16Array(t,2,1),[s]=new Uint32Array(t,4,1);return new bt(s,o,i,t)}constructor(t,e=64,n=Float64Array,r){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=n,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const i=wt.indexOf(this.ArrayType),o=2*t*this.ArrayType.BYTES_PER_ELEMENT,s=t*this.IndexArrayType.BYTES_PER_ELEMENT,a=(8-s%8)%8;if(i<0)throw new Error(`Unexpected typed array class: ${n}.`);r&&r instanceof ArrayBuffer?(this.data=r,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+s+a,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+o+s+a),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+s+a,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+i]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t)}add(t,e){const n=this._pos>>1;return this.ids[n]=n,this.coords[this._pos++]=t,this.coords[this._pos++]=e,n}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return _t(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,n,r){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:i,coords:o,nodeSize:s}=this,a=[0,i.length-1,0],u=[];for(;a.length;){const c=a.pop()||0,h=a.pop()||0,f=a.pop()||0;if(h-f<=s){for(let s=f;s<=h;s++){const a=o[2*s],c=o[2*s+1];a>=t&&a<=n&&c>=e&&c<=r&&u.push(i[s])}continue}const p=f+h>>1,d=o[2*p],l=o[2*p+1];d>=t&&d<=n&&l>=e&&l<=r&&u.push(i[p]),(0===c?t<=d:e<=l)&&(a.push(f),a.push(p-1),a.push(1-c)),(0===c?n>=d:r>=l)&&(a.push(p+1),a.push(h),a.push(1-c))}return u}within(t,e,n){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:r,coords:i,nodeSize:o}=this,s=[0,r.length-1,0],a=[],u=n*n;for(;s.length;){const c=s.pop()||0,h=s.pop()||0,f=s.pop()||0;if(h-f<=o){for(let n=f;n<=h;n++)Mt(i[2*n],i[2*n+1],t,e)<=u&&a.push(r[n]);continue}const p=f+h>>1,d=i[2*p],l=i[2*p+1];Mt(d,l,t,e)<=u&&a.push(r[p]),(0===c?t-n<=d:e-n<=l)&&(s.push(f),s.push(p-1),s.push(1-c)),(0===c?t+n>=d:e+n>=l)&&(s.push(p+1),s.push(h),s.push(1-c))}return a}}function _t(t,e,n,r,i,o){if(i-r<=n)return;const s=r+i>>1;vt(t,e,s,r,i,o),_t(t,e,n,r,s-1,1-o),_t(t,e,n,s+1,i,1-o)}function vt(t,e,n,r,i,o){for(;i>r;){if(i-r>600){const s=i-r+1,a=n-r+1,u=Math.log(s),c=.5*Math.exp(2*u/3),h=.5*Math.sqrt(u*c*(s-c)/s)*(a-s/2<0?-1:1);vt(t,e,n,Math.max(r,Math.floor(n-a*c/s+h)),Math.min(i,Math.floor(n+(s-a)*c/s+h)),o)}const s=e[2*n+o];let a=r,u=i;for(Nt(t,e,r,n),e[2*i+o]>s&&Nt(t,e,r,i);a<u;){for(Nt(t,e,a,u),a++,u--;e[2*a+o]<s;)a++;for(;e[2*u+o]>s;)u--}e[2*r+o]===s?Nt(t,e,r,u):(u++,Nt(t,e,u,i)),u<=n&&(r=u+1),n<=u&&(i=u-1)}}function Nt(t,e,n,r){Ot(t,n,r),Ot(e,2*n,2*r),Ot(e,2*n+1,2*r+1)}function Ot(t,e,n){const r=t[e];t[e]=t[n],t[n]=r}function Mt(t,e,n,r){const i=t-n,o=e-r;return i*i+o*o}const xt="KEYS",Ut="VALUES",Lt="";class kt{set;_type;_path;constructor(t,e){const n=t._tree,r=Array.from(n.keys());this.set=t,this._type=e,this._path=r.length>0?[{node:n,keys:r}]:[]}next(){const t=this.dive();return this.backtrack(),t}dive(){if(0===this._path.length)return{done:!0,value:void 0};const{node:t,keys:e}=Dt(this._path);if(Dt(e)===Lt)return{done:!1,value:this.result()};const n=t.get(Dt(e));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(0===this._path.length)return;const t=Dt(this._path).keys;t.pop(),!(t.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map((({keys:t})=>Dt(t))).filter((t=>t!==Lt)).join("")}value(){return Dt(this._path).node.get(Lt)}result(){switch(this._type){case Ut:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const Dt=t=>t[t.length-1],$t=(t,e,n,r,i,o,s,a)=>{const u=o*s;t:for(const c of t.keys())if(c===Lt){const e=i[u-1];e<=n&&r.set(a,[t.get(c),e])}else{let u=o;for(let t=0;t<c.length;++t,++u){const r=c[t],o=s*u,a=o-s;let h=i[o];const f=Math.max(0,u-n-1),p=Math.min(s-1,u+n);for(let t=f;t<p;++t){const n=r!==e[t],s=i[a+t]+ +n,u=i[a+t+1]+1,c=i[o+t]+1,f=i[o+t+1]=Math.min(s,u,c);f<h&&(h=f)}if(h>n)continue t}$t(t.get(c),e,n,r,i,u,s,a+c)}};class Ct{_tree;_prefix;_size=void 0;constructor(t=new Map,e=""){this._tree=t,this._prefix=e}atPrefix(t){if(!t.startsWith(this._prefix))throw new Error("Mismatched prefix");const[e,n]=Bt(this._tree,t.slice(this._prefix.length));if(void 0===e){const[e,r]=Vt(n);for(const n of e.keys())if(n!==Lt&&n.startsWith(r)){const i=new Map;return i.set(n.slice(r.length),e.get(n)),new Ct(i,t)}}return new Ct(e,t)}clear(){this._size=void 0,this._tree.clear()}delete(t){return this._size=void 0,zt(this._tree,t)}entries(){return new kt(this,"ENTRIES")}forEach(t){for(const[e,n]of this)t(e,n,this)}fuzzyGet(t,e){return((t,e,n)=>{const r=new Map;if("string"!=typeof e)return r;const i=e.length+1,o=i+n,s=new Uint8Array(o*i).fill(n+1);for(let t=0;t<i;++t)s[t]=t;for(let t=1;t<o;++t)s[t*i]=t;return $t(t,e,n,r,s,1,i,""),r})(this._tree,t,e)}get(t){const e=Ft(this._tree,t);return void 0!==e?e.get(Lt):void 0}has(t){return Ft(this._tree,t)?.has(Lt)??!1}keys(){return new kt(this,xt)}set(t,e){if("string"!=typeof t)throw new Error("key must be a string");return this._size=void 0,Pt(this._tree,t).set(Lt,e),this}get size(){if(this._size)return this._size;this._size=0;const t=this.entries();for(;!t.next().done;)this._size+=1;return this._size}update(t,e){if("string"!=typeof t)throw new Error("key must be a string");this._size=void 0;const n=Pt(this._tree,t);return n.set(Lt,e(n.get(Lt))),this}fetch(t,e){if("string"!=typeof t)throw new Error("key must be a string");this._size=void 0;const n=Pt(this._tree,t);let r=n.get(Lt);return void 0===r&&n.set(Lt,r=e()),r}values(){return new kt(this,Ut)}[Symbol.iterator](){return this.entries()}static from(t){const e=new Ct;for(const[n,r]of t)e.set(n,r);return e}static fromObject(t){return Ct.from(Object.entries(t))}}const Bt=(t,e,n=[])=>{if(0===e.length||null==t)return[t,n];for(const r of t.keys())if(r!==Lt&&e.startsWith(r))return n.push([t,r]),Bt(t.get(r),e.slice(r.length),n);return n.push([t,e]),Bt(void 0,"",n)},Ft=(t,e)=>{if(0===e.length||!t)return t;for(const n of t.keys())if(n!==Lt&&e.startsWith(n))return Ft(t.get(n),e.slice(n.length))},Pt=(t,e)=>{const n=e.length;t:for(let r=0;t&&r<n;){for(const i of t.keys())if(i!==Lt&&e[r]===i[0]){const o=Math.min(n-r,i.length);let s=1;for(;s<o&&e[r+s]===i[s];)++s;const a=t.get(i);if(s===i.length)t=a;else{const n=new Map;n.set(i.slice(s),a),t.set(e.slice(r,r+s),n),t.delete(i),t=n}r+=s;continue t}const i=new Map;return t.set(e.slice(r),i),i}return t},zt=(t,e)=>{const[n,r]=Bt(t,e);if(void 0!==n)if(n.delete(Lt),0===n.size)jt(r);else if(1===n.size){const[t,e]=n.entries().next().value;Gt(r,t,e)}},jt=t=>{if(0===t.length)return;const[e,n]=Vt(t);if(e.delete(n),0===e.size)jt(t.slice(0,-1));else if(1===e.size){const[n,r]=e.entries().next().value;n!==Lt&&Gt(t.slice(0,-1),n,r)}},Gt=(t,e,n)=>{if(0===t.length)return;const[r,i]=Vt(t);r.set(i+e,n),r.delete(i)},Vt=t=>t[t.length-1],Yt=/[\n\r\p{Z}\p{P}]+/u,Jt="or",Wt="and",qt="and_not",Zt=(t,e)=>{t.includes(e)||t.push(e)},Ht=(t,e)=>{for(const n of e)t.includes(n)||t.push(n)},Xt=({score:t},{score:e})=>e-t,Qt=()=>new Map,Kt=(t,e)=>Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0,te={[Jt]:(t,e)=>{for(const n of e.keys()){const r=t.get(n);if(null==r)t.set(n,e.get(n));else{const{score:t,terms:i,match:o}=e.get(n);r.score=r.score+t,r.match=Object.assign(r.match,o),Ht(r.terms,i)}}return t},[Wt]:(t,e)=>{const n=new Map;for(const r of e.keys()){const i=t.get(r);if(null==i)continue;const{score:o,terms:s,match:a}=e.get(r);Ht(i.terms,s),n.set(r,{score:i.score+o,terms:i.terms,match:Object.assign(i.match,a)})}return n},[qt]:(t,e)=>{for(const n of e.keys())t.delete(n);return t}},ee=(t,e,n,r,i,o)=>{const{k:s,b:a,d:u}=o;return Math.log(1+(n-e+.5)/(e+.5))*(u+t*(s+1)/(t+s*(1-a+a*r/i)))},ne=(t,e,n,r)=>{for(const i of Object.keys(t._fieldIds))if(t._fieldIds[i]===n)return void t._options.logger("warn",`SlimSearch: document with ID ${t._documentIds.get(e)} has changed before removal: term "${r}" was not present in field "${i}". Removing a document after it has changed can corrupt the index!`,"version_conflict")},re=(t,e,n,r)=>{const i=t._index.fetch(r,Qt);let o=i.get(e);if(null==o)o=new Map,o.set(n,1),i.set(e,o);else{const t=o.get(n);o.set(n,(t??0)+1)}},ie=(t,e,n,r)=>{if(!t._index.has(r))return void ne(t,n,e,r);const i=t._index.fetch(r,Qt),o=i.get(e),s=o?.get(n);!o||typeof s>"u"?ne(t,n,e,r):s<=1?o.size<=1?i.delete(e):o.delete(n):o.set(n,s-1),0===t._index.get(r).size&&t._index.delete(r)},oe=(t,e,n,r,i)=>{let o=t._fieldLength.get(e);null==o&&t._fieldLength.set(e,o=[]),o[n]=i;const s=(t._avgFieldLength[n]||0)*r+i;t._avgFieldLength[n]=s/(r+1)},se=(t,e)=>{const{extractField:n,tokenize:r,processTerm:i,fields:o,idField:s}=t._options,a=n(e,s);if(null==a)throw new Error(`SlimSearch: document does not have ID field "${s}"`);if(((t,e)=>t._idToShortId.has(e))(t,a))throw new Error(`SlimSearch: duplicate ID ${a}`);const u=((t,e)=>{const n=t._nextId;return t._idToShortId.set(e,n),t._documentIds.set(n,e),t._documentCount+=1,t._nextId+=1,n})(t,a);((t,e,n)=>{const{storeFields:r,extractField:i}=t._options;if(0===r?.length)return;let o=t._storedFields.get(e);void 0===o&&t._storedFields.set(e,o={});for(const t of r){const e=i(n,t);null!=e&&(o[t]=e)}})(t,u,e);for(const s of o){const o=n(e,s);if(null==o)continue;const a=r(o.toString(),s),c=t._fieldIds[s],h=new Set(a).size;oe(t,u,c,t._documentCount-1,h);for(const e of a){const n=i(e,s);if(Array.isArray(n))for(const e of n)re(t,c,u,e);else n&&re(t,c,u,n)}}},ae={idField:"id",extractField:(t,e)=>t[e],tokenize:t=>t.split(Yt),processTerm:t=>t.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(t,e)=>{console?.[t]?.(e)},autoVacuum:!0},ue={combineWith:Jt,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:{k:1.2,b:.7,d:.5}},ce={combineWith:"and",prefix:(t,e,n)=>e===n.length-1},he={minDirtFactor:.1,minDirtCount:20},fe={batchSize:1e3,batchWait:10,...he},pe=Symbol("*"),de=(t,e=Jt)=>{if(0===t.length)return new Map;const n=e.toLowerCase();if(!(n in te))throw new Error(`Invalid combination operator: ${e}`);return t.reduce(te[n])},le=(t,e,n,r,i,o,s,a,u,c=new Map)=>{if(null==o)return c;for(const h of Object.keys(s)){const f=s[h],p=t._fieldIds[h],d=o.get(p);if(null==d)continue;let l=d.size;const m=t._avgFieldLength[p];for(const o of d.keys()){if(!t._documentIds.has(o)){ie(t,p,o,n),l-=1;continue}const s=a?a(t._documentIds.get(o),n,t._storedFields.get(o)):1;if(!s)continue;const g=d.get(o),I=t._fieldLength.get(o)[p],T=r*i*f*s*ee(g,l,t._documentCount,I,m,u),S=c.get(o);if(S){S.score+=T,Zt(S.terms,e);const t=Kt(S.match,n);t?t.push(h):S.match[n]=[h]}else c.set(o,{score:T,terms:[e],match:{[n]:[h]}})}}return c},me=(t,e,n={})=>{if(e===pe)return((t,e)=>{const n=new Map,r={...t._options.searchOptions,...e};for(const[e,i]of t._documentIds){const o=r.boostDocument?r.boostDocument(i,"",t._storedFields.get(e)):1;n.set(e,{score:o,terms:[],match:{}})}return n})(t,n);if("string"!=typeof e){const r={...n,...e,queries:void 0},i=e.queries.map((e=>me(t,e,r)));return de(i,r.combineWith)}const{tokenize:r,processTerm:i,searchOptions:o}=t._options,s={tokenize:r,processTerm:i,...o,...n},{tokenize:a,processTerm:u}=s,c=a(e).flatMap((t=>u(t))).filter((t=>!!t)).map((t=>(e,n,r)=>({term:e,fuzzy:"function"==typeof t.fuzzy?t.fuzzy(e,n,r):t.fuzzy??!1,prefix:"function"==typeof t.prefix?t.prefix(e,n,r):!0===t.prefix,termBoost:"function"==typeof t.boostTerm?t.boostTerm(e,n,r):1}))(s)).map((e=>((t,e,n)=>{const r={...t._options.searchOptions,...n},i=(r.fields??t._options.fields).reduce(((t,e)=>({...t,[e]:Kt(r.boost,e)||1})),{}),{boostDocument:o,weights:s,maxFuzzy:a,bm25:u}=r,{fuzzy:c,prefix:h}={...ue.weights,...s},f=t._index.get(e.term),p=le(t,e.term,e.term,1,e.termBoost,f,i,o,u);let d,l;if(e.prefix&&(d=t._index.atPrefix(e.term)),e.fuzzy){const n=!0===e.fuzzy?.2:e.fuzzy,r=n<1?Math.min(a,Math.round(e.term.length*n)):n;r&&(l=t._index.fuzzyGet(e.term,r))}if(d)for(const[n,r]of d){const s=n.length-e.term.length;if(!s)continue;l?.delete(n);const a=h*n.length/(n.length+.3*s);le(t,e.term,n,a,e.termBoost,r,i,o,u,p)}if(l)for(const n of l.keys()){const[r,s]=l.get(n);if(!s)continue;const a=c*n.length/(n.length+s);le(t,e.term,n,a,e.termBoost,r,i,o,u,p)}return p})(t,e,s)));return de(c,s.combineWith)};class ge{_options;_index;_documentCount;_documentIds;_idToShortId;_fieldIds;_fieldLength;_avgFieldLength;_nextId;_storedFields;_dirtCount;_currentVacuum;_enqueuedVacuum;_enqueuedVacuumConditions;constructor(t){if(!t?.fields)throw new Error('SlimSearch: option "fields" must be provided');const e=null==t.autoVacuum||!0===t.autoVacuum?fe:t.autoVacuum;this._options={...ae,...t,autoVacuum:e,searchOptions:{...ue,...t.searchOptions},autoSuggestOptions:{...ce,...t.autoSuggestOptions}},this._index=new Ct,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=he,this.addFields(this._options.fields)}get isVacuuming(){return null!=this._currentVacuum}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}get documentCount(){return this._documentCount}get termCount(){return this._index.size}toJSON(){const t=[];for(const[e,n]of this._index){const r={};for(const[t,e]of n)r[t]=Object.fromEntries(e);t.push([e,r])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:t,version:2}}addFields(t){for(let e=0;e<t.length;e++)this._fieldIds[t[e]]=e}}const Ie=t=>{const e=t.toLowerCase(),n=new Set([e]),r={a:["à","â","ä"],c:["ç"],e:["é","è","ê","ë"],i:["î","ï"],o:["ô","ö"],u:["ù","û","ü"],ae:["ä"],oe:["ö"],ue:["ü"]};for(const[t,i]of Object.entries(r))e.includes(t)&&i.forEach((r=>{n.add(e.replace(t,r))})),i.forEach((r=>{e.includes(r)&&n.add(e.replace(r,t))}));return Array.from(n)};var Te;function Se(t){switch(t){case 0:case"SIMPLE_STOP_OR_PLATFORM":return Te.SIMPLE_STOP_OR_PLATFORM;case 1:case"STATION":return Te.STATION;case 2:case"ENTRANCE_EXIT":return Te.ENTRANCE_EXIT;case 3:case"GENERIC_NODE":return Te.GENERIC_NODE;case 4:case"BOARDING_AREA":return Te.BOARDING_AREA;default:return Te.UNRECOGNIZED}}!function(t){t[t.SIMPLE_STOP_OR_PLATFORM=0]="SIMPLE_STOP_OR_PLATFORM",t[t.STATION=1]="STATION",t[t.ENTRANCE_EXIT=2]="ENTRANCE_EXIT",t[t.GENERIC_NODE=3]="GENERIC_NODE",t[t.BOARDING_AREA=4]="BOARDING_AREA",t[t.UNRECOGNIZED=-1]="UNRECOGNIZED"}(Te||(Te={}));const ye={encode(t,e=new A){""!==t.name&&e.uint32(10).string(t.name),""!==t.sourceStopId&&e.uint32(18).string(t.sourceStopId),void 0!==t.lat&&e.uint32(29).float(t.lat),void 0!==t.lon&&e.uint32(37).float(t.lon),e.uint32(42).fork();for(const n of t.children)e.uint32(n);return e.join(),void 0!==t.parent&&e.uint32(48).uint32(t.parent),0!==t.locationType&&e.uint32(56).int32(t.locationType),void 0!==t.platform&&e.uint32(66).string(t.platform),e},decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={name:"",sourceStopId:"",lat:void 0,lon:void 0,children:[],parent:void 0,locationType:0,platform:void 0};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(10!==t)break;i.name=n.string();continue;case 2:if(18!==t)break;i.sourceStopId=n.string();continue;case 3:if(29!==t)break;i.lat=n.float();continue;case 4:if(37!==t)break;i.lon=n.float();continue;case 5:if(40===t){i.children.push(n.uint32());continue}if(42===t){const t=n.uint32()+n.pos;for(;n.pos<t;)i.children.push(n.uint32());continue}break;case 6:if(48!==t)break;i.parent=n.uint32();continue;case 7:if(56!==t)break;i.locationType=n.int32();continue;case 8:if(66!==t)break;i.platform=n.string();continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({name:Ee(t.name)?globalThis.String(t.name):"",sourceStopId:Ee(t.sourceStopId)?globalThis.String(t.sourceStopId):"",lat:Ee(t.lat)?globalThis.Number(t.lat):void 0,lon:Ee(t.lon)?globalThis.Number(t.lon):void 0,children:globalThis.Array.isArray(t?.children)?t.children.map((t=>globalThis.Number(t))):[],parent:Ee(t.parent)?globalThis.Number(t.parent):void 0,locationType:Ee(t.locationType)?Se(t.locationType):0,platform:Ee(t.platform)?globalThis.String(t.platform):void 0}),toJSON(t){const e={};return""!==t.name&&(e.name=t.name),""!==t.sourceStopId&&(e.sourceStopId=t.sourceStopId),void 0!==t.lat&&(e.lat=t.lat),void 0!==t.lon&&(e.lon=t.lon),t.children?.length&&(e.children=t.children.map((t=>Math.round(t)))),void 0!==t.parent&&(e.parent=Math.round(t.parent)),0!==t.locationType&&(e.locationType=function(t){switch(t){case Te.SIMPLE_STOP_OR_PLATFORM:return"SIMPLE_STOP_OR_PLATFORM";case Te.STATION:return"STATION";case Te.ENTRANCE_EXIT:return"ENTRANCE_EXIT";case Te.GENERIC_NODE:return"GENERIC_NODE";case Te.BOARDING_AREA:return"BOARDING_AREA";case Te.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.locationType)),void 0!==t.platform&&(e.platform=t.platform),e},create:t=>ye.fromPartial(t??{}),fromPartial(t){const e={name:"",sourceStopId:"",lat:void 0,lon:void 0,children:[],parent:void 0,locationType:0,platform:void 0};return e.name=t.name??"",e.sourceStopId=t.sourceStopId??"",e.lat=t.lat??void 0,e.lon=t.lon??void 0,e.children=t.children?.map((t=>t))||[],e.parent=t.parent??void 0,e.locationType=t.locationType??0,e.platform=t.platform??void 0,e}};const Ae={encode(t,e=new A){""!==t.version&&e.uint32(10).string(t.version);for(const n of t.stops)ye.encode(n,e.uint32(18).fork()).join();return e},decode(t,e){const n=t instanceof E?t:new E(t),r=void 0===e?n.len:n.pos+e,i={version:"",stops:[]};for(;n.pos<r;){const t=n.uint32();switch(t>>>3){case 1:if(10!==t)break;i.version=n.string();continue;case 2:if(18!==t)break;i.stops.push(ye.decode(n,n.uint32()));continue}if(4==(7&t)||0===t)break;n.skip(7&t)}return i},fromJSON:t=>({version:Ee(t.version)?globalThis.String(t.version):"",stops:globalThis.Array.isArray(t?.stops)?t.stops.map((t=>ye.fromJSON(t))):[]}),toJSON(t){const e={};return""!==t.version&&(e.version=t.version),t.stops?.length&&(e.stops=t.stops.map((t=>ye.toJSON(t)))),e},create:t=>Ae.fromPartial(t??{}),fromPartial(t){const e={version:"",stops:[]};return e.version=t.version??"",e.stops=t.stops?.map((t=>ye.fromPartial(t)))||[],e}};function Ee(t){return null!=t}const Re="0.0.3",we=t=>({version:Re,stops:t.map((t=>{return{name:(e=t).name,sourceStopId:e.sourceStopId,lat:e.lat,lon:e.lon,children:e.children,parent:e.parent,locationType:ve(e.locationType),platform:e.platform};var e}))}),be=t=>{if(t.version!==Re)throw new Error(`Unsupported stopMap version ${t.version}`);return t.stops.map(((t,e)=>{return{id:e,sourceStopId:(n=t).sourceStopId,name:n.name,lat:n.lat,lon:n.lon,children:n.children,parent:n.parent,locationType:_e(n.locationType),platform:n.platform};var n}))},_e=t=>{switch(t){case Te.SIMPLE_STOP_OR_PLATFORM:return"SIMPLE_STOP_OR_PLATFORM";case Te.STATION:return"STATION";case Te.ENTRANCE_EXIT:return"ENTRANCE_EXIT";case Te.GENERIC_NODE:return"GENERIC_NODE";case Te.BOARDING_AREA:return"BOARDING_AREA";case Te.UNRECOGNIZED:throw new Error("Unrecognized protobuf location type.")}},ve=t=>{switch(t){case"SIMPLE_STOP_OR_PLATFORM":return Te.SIMPLE_STOP_OR_PLATFORM;case"STATION":return Te.STATION;case"ENTRANCE_EXIT":return Te.ENTRANCE_EXIT;case"GENERIC_NODE":return Te.GENERIC_NODE;case"BOARDING_AREA":return Te.BOARDING_AREA}};class Ne{stops;sourceStopsMap;textIndex;geoIndex;stopPoints;constructor(t){this.stops=t,this.sourceStopsMap=new Map;const e=new Map;this.stopPoints=[];for(let n=0;n<t.length;n++){const r=t[n];this.sourceStopsMap.set(r.sourceStopId,n);const i=r.parent??n;e.has(i)||e.set(i,{id:i,name:r.parent?this.stops[r.parent].name:r.name}),r.lat&&r.lon&&this.stopPoints.push({id:n,lat:r.lat,lon:r.lon})}this.textIndex=new ge({fields:["name"],storeFields:["id"],searchOptions:{prefix:!0,fuzzy:.2},processTerm:Ie});const n=Array.from(e.values());((t,e)=>{for(const n of e)se(t,n)})(this.textIndex,n),this.geoIndex=new bt(this.stopPoints.length);for(let t=0;t<this.stopPoints.length;t++){const{lat:e,lon:n}=this.stopPoints[t];this.geoIndex.add(n,e)}this.geoIndex.finish()}static fromData(t){const e=new E(t),n=Ae.decode(e);return new Ne(be(n))}serialize(){const t=we(this.stops),e=new A;return Ae.encode(t,e),e.finish()}size(){return this.stops.length}findStopsByName(t,e=5){return((t,e,n={})=>{const{searchOptions:r}=t._options,i={...r,...n},o=me(t,e,n),s=[];for(const[e,{score:n,terms:r,match:a}]of o){const o=r.length||1,u={id:t._documentIds.get(e),score:n*o,terms:Object.keys(a),queryTerms:r,match:a};Object.assign(u,t._storedFields.get(e)),(null==i.filter||i.filter(u))&&s.push(u)}return e===pe&&null==i.boostDocument||s.sort(Xt),s})(this.textIndex,t).map((t=>this.stops[t.id])).slice(0,e)}findStopsByLocation(t,e,n=5,r=.5){const i=function(t,e,n,r=1/0,i=1/0){let o=1;const s=[];void 0===r&&(r=1/0),void 0!==i&&(o=At(i/6371));const a=new gt([],yt);let u={left:0,right:t.ids.length-1,axis:0,minLng:-180,minLat:-90,maxLng:180,maxLat:90};const c=Math.cos(n*Tt);for(;u;){const i=u.right,h=u.left;if(i-h<=t.nodeSize)for(let r=h;r<=i;r++){const i=t.ids[r];{const o=Rt(e,n,t.coords[2*r],t.coords[2*r+1],c);a.push({id:i,dist:o})}}else{const r=h+i>>1,o=t.coords[2*r],s=t.coords[2*r+1],f=t.ids[r];{const t=Rt(e,n,o,s,c);a.push({id:f,dist:t})}const p=(u.axis+1)%2,d={left:h,right:r-1,axis:p,minLng:u.minLng,minLat:u.minLat,maxLng:0===u.axis?o:u.maxLng,maxLat:1===u.axis?s:u.maxLat,dist:0},l={left:r+1,right:i,axis:p,minLng:0===u.axis?o:u.minLng,minLat:1===u.axis?s:u.minLat,maxLng:u.maxLng,maxLat:u.maxLat,dist:0};d.dist=St(e,n,c,d),l.dist=St(e,n,c,l),a.push(d),a.push(l)}for(;a.length&&null!=a.peek().id;){const t=a.pop();if(t.dist>o)return s;if(s.push(t.id),s.length===r)return s}u=a.pop()}return s}(this.geoIndex,e,t,n,r).map((t=>{const e=this.stopPoints[t];return this.stops[e.id]}));return i}findStopById(t){return this.stops[t]}findStopBySourceStopId(t){const e=this.sourceStopsMap.get(t);if(void 0!==e)return this.findStopById(e)}equivalentStops(t){const e=this.sourceStopsMap.get(t);if(void 0===e)return[];const n=this.stops[e];if(!n)return[];const r=n.parent?this.stops[n.parent]?.children??[]:n.children;return Array.from(new Set([e,...r])).map((t=>this.stops[t]))}}export{e as Duration,t as Plotter,ft as Query,dt as Result,pt as Route,mt as Router,Ne as StopsIndex,P as Time,ht as Timetable};
2
2
  //# sourceMappingURL=router.esm.js.map