@tomtom-org/maps-sdk 1.0.0-rc.2 → 1.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +213 -0
- package/README.md +3 -1
- package/core/dist/core.es.js +1 -1
- package/core/dist/index.d.ts +2592 -2275
- package/core/package.json +1 -1
- package/map/dist/index.d.ts +1678 -1153
- package/map/dist/map.es.js +3 -1
- package/package.json +3 -18
- package/services/dist/index.d.ts +2578 -2678
- package/services/dist/services.es.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,218 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.0-rc.3
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#2674](https://github.com/tomtom-internal/maps-sdk-js/pull/2674) [`61026c0`](https://github.com/tomtom-internal/maps-sdk-js/commit/61026c0adaa35986bc0a9d11a3cdb4b342acb9d6) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** core: ten plain POI sub-categories have codes of their own, such as `SCHOOL_GENERIC`, so a search can ask for plain schools without childcare or driving schools
|
|
8
|
+
|
|
9
|
+
- **Breaking:** core: a place in one of them reads as its own code rather than its parent's. Where you match `SCHOOL`, `THEATER`, `SPORTS_CENTER`, `MARINA`, `WEIGH_STATION`, `OPEN_CAR_PARKING_AREA`, `COLLEGE_OR_UNIVERSITY`, `CAR_WASH`, `AMUSEMENT_PARK` or `TRAFFIC_CONTROL_DEPARTMENT` in `poi.categories`, match its `_GENERIC` code too
|
|
10
|
+
- **Breaking:** core: a `Record<POICategory, …>` needs an entry for each of the ten codes
|
|
11
|
+
- services: a `poiCategoryQuery` or `resolvePOICategories` word that names a plain sub-category best, such as `'rto'` or `'open car parking area'`, resolves to its `_GENERIC` code, which searches that sub-category alone rather than its parent and the parent's other sub-categories
|
|
12
|
+
- services: a word no longer spends one of its three codes on a sub-category of another code it already has, so `'medical'` and `'care'` also find `EMERGENCY_MEDICAL_SERVICE`
|
|
13
|
+
- map: a place with one of the new codes takes its parent's base-map icon, pin and `categoryIcons` entry
|
|
14
|
+
|
|
15
|
+
- [#2659](https://github.com/tomtom-internal/maps-sdk-js/pull/2659) [`a580975`](https://github.com/tomtom-internal/maps-sdk-js/commit/a5809754b51feb9a1583cd23d149364e17727bb9) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: a route's border crossings stand in a bubble above the route, the summary bubble's shape with its tail on the border, instead of a plaque on the route line; `countryCrossings.alignment` is removed with its knob and the `CountryCrossingAlignment` type, and crossings no longer carry a `bearing`
|
|
16
|
+
|
|
17
|
+
- The default bubble takes the selected summary bubble's default colours, so it follows the light or dark style, `setMapColors()` and the `colors.label` and `colors.labelHalo` knobs: white on a light style, dark grey on a dark one, the map's label halo lightened under a theme. `countryCrossings.color` and `countryCrossings.label.color` still override either.
|
|
18
|
+
- A crossing hides where a waypoint pin, a summary bubble, another symbol drawn above it or a crossing close by would cover it, and shows again once there's room.
|
|
19
|
+
- Migration: drop `alignment` from `countryCrossings`. A bubble stays level with the screen.
|
|
20
|
+
- examples: `route-sections-playground` drops its crossing alignment control and gains a map look picker, light, dark and an amber theme, that the crossings follow.
|
|
21
|
+
|
|
22
|
+
- [#2659](https://github.com/tomtom-internal/maps-sdk-js/pull/2659) [`a580975`](https://github.com/tomtom-internal/maps-sdk-js/commit/a5809754b51feb9a1583cd23d149364e17727bb9) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: an instruction's `pathPointIndex` is the route point at its maneuver, rather than the first point a few metres short of it, so it usually falls inside the `lanes` section leading to the maneuver
|
|
23
|
+
|
|
24
|
+
- **Breaking:** a `lanes` section's `properties` read `IS_MANEUVER`, as documented, where they passed the API's `isManeuver` through. Match `'IS_MANEUVER'` instead.
|
|
25
|
+
|
|
26
|
+
- [#2686](https://github.com/tomtom-internal/maps-sdk-js/pull/2686) [`5c52f46`](https://github.com/tomtom-internal/maps-sdk-js/commit/5c52f4619177d4776e32a167e871578ef4f4a2bf) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: the types of place events, traffic features and waypoint ids match what the map hands your code
|
|
27
|
+
|
|
28
|
+
- **Breaking:** map: under `pin-clustered`, a cluster no longer reaches the `events.places` handlers, which are typed `Place`, nor takes their hover and click states. The module-wide `events` receive it, with `cluster: true`, `cluster_id` and `point_count` in its properties
|
|
29
|
+
- **Breaking:** map: `roadSubcategory` is optional on `TrafficIncidentsModuleFeature`, and absent off `street` and `service` roads, as on `TrafficFlowModuleFeature`
|
|
30
|
+
- **Breaking:** map: a `TrafficFlowModuleFeature`'s geometry is a `LineString` or a `MultiLineString`, so check `geometry.type` before you read its coordinates
|
|
31
|
+
- **Breaking:** map: a waypoint keeps the id you give it, a number included, so `WaypointDisplayProps.id` is `string | number`
|
|
32
|
+
|
|
33
|
+
- [#2650](https://github.com/tomtom-internal/maps-sdk-js/pull/2650) [`3ce0603`](https://github.com/tomtom-internal/maps-sdk-js/commit/3ce0603daadfa044b4797a25db21278f1c267302) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** core: `getDistinctSections` finds the stretches each route has to itself, and `calculateRoute` returns them as `sections.distinct` whenever it returns two or more routes. `getImportantRoads` names the main roads a route takes, by road number
|
|
34
|
+
|
|
35
|
+
- **Breaking:** core: `SectionType` and `sectionTypes` include `'distinct'`, which a request's `sectionTypes` can't ask for: the SDK adds it. A `Record<SectionType, …>` needs an entry for it
|
|
36
|
+
- **Breaking:** services: `InputSectionType` is only the types a request can ask for, so `leg` and `distinct` no longer compile in `sectionTypes`; type a list as `InputSectionTypes` rather than `SectionType[]`. `InputSectionTypes` is read-only, so build a list whole rather than `push` onto one. `inputSectionTypes`, `inputSectionTypesWithGuidance` and `sectionTypes` are read-only lists of their exact types
|
|
37
|
+
- core: each distinct section runs from where its route leaves the others to where it rejoins them, with its `lengthInMeters`, and `minLengthInMeters` leaves out the short ones
|
|
38
|
+
- core: `getSectionOverlap` gives the stretch two sections of one route share, whatever their types, as a `RouteSpan`
|
|
39
|
+
- core: `getSectionsWithin` lists a route's sections of every type within spans of it, such as the ferries, tolls and traffic on its distinct sections, with each section's share there to prorate a jam's delay
|
|
40
|
+
- core: `compareRoutes` tells what a route adds and avoids against a reference route, such as the selected alternative, or the route `costModel: { traffic: 'historical' }` gives, to say which jams and closures the live route avoids
|
|
41
|
+
- core: `getImportantRoads` groups a route's `importantRoadStretch` sections road by road, each with its `name`, its length and its stretches to ring with `setSectionFocus`; `within: sections.distinct` names what sets a route apart
|
|
42
|
+
- map: summary bubbles sit on their route's longest distinct section, read from `sections.distinct` when every route carries it, so a route crossing another at a junction keeps its whole stretch for the bubble
|
|
43
|
+
- examples: the `route-with-alternatives` and `react-route-planner` examples name the main roads of the stretches each route has to itself, and highlight a route the same way from the map or its card
|
|
44
|
+
- examples: each card in `route-with-alternatives` says what its route adds and avoids against the selected route, or against the usual route a toggle draws: ferries, car trains, tolls, closures, roadworks, traffic and unpaved roads
|
|
45
|
+
|
|
46
|
+
- [#2675](https://github.com/tomtom-internal/maps-sdk-js/pull/2675) [`d1471c3`](https://github.com/tomtom-internal/maps-sdk-js/commit/d1471c3f69ed7a865e3e6b044632bd04c92271be) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: a route you select with a click takes the selected style alone, and a feature an `events.where()` predicate rejects stays inert, so narrowing a click to the alternatives keeps the selected route from reacting to the pointer
|
|
47
|
+
|
|
48
|
+
- **Breaking:** map: an `events.where()` predicate decides on the top-most feature under the pointer. One it rejects keeps the map cursor and takes no hover or click highlight, and the handler doesn't run, even with a matching feature beneath
|
|
49
|
+
- map: `selectRoute` clears the `click` state of the route lines and summary bubbles, so a route you select with a click no longer stays highlighted
|
|
50
|
+
- map: a long hover comes on the feature under the pointer when it comes due, so a still pointer no longer long-hovers a route as it was before a click selected it, which drew its wider outline
|
|
51
|
+
- examples: `route-summary-bubbles-playground` selects only alternatives on click
|
|
52
|
+
|
|
53
|
+
- [#2688](https://github.com/tomtom-internal/maps-sdk-js/pull/2688) [`af7a24e`](https://github.com/tomtom-internal/maps-sdk-js/commit/af7a24e336bcd2062fa102e78e3614787f5888d5) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: **Breaking:** the service types say what each call returns and takes, from reverse geocoding and geometry data to the errors, and a call can set its own `retry`
|
|
54
|
+
- services: **Breaking:** `reverseGeocode` resolves a `ReverseGeocodingResponse`, a `Place` or, where nothing matches, the queried point without `properties`; checking `properties` narrows it to a `Place`
|
|
55
|
+
- services: **Breaking:** `geometryData` given a `Places` collection types each polygon's properties as `PlaceGeometryProps`, its place's properties plus `placeCoordinates`, and gives a polygon that matches no place `null` properties; a `Place[]` or geometry IDs return plain `PolygonFeatures`
|
|
56
|
+
- services: a service call's `retry` overrides the global one field by field, and `retry: undefined` turns retrying off for that call
|
|
57
|
+
- services: **Breaking:** a service call no longer takes `displayUnits`, which no service reads
|
|
58
|
+
- services: **Breaking:** `calculateReachableRanges` rejects a `404`, a `5xx` or an error without a status, as it does a `401`, `403` or `429`, and skips only the other `4xx`, such as the `400` `MAP_MATCHING_FAILURE` of an origin off the road network
|
|
59
|
+
- services: **Breaking:** `SDKError.service` is a `ServiceName`, the union of the services' names, and reachable ranges report `'ReachableRange'`, not `'Reachable Range'`
|
|
60
|
+
- services: **Breaking:** the wire-format types `PoiCategoriesResponseAPI`, `PoiCategoryAPI`, `PlaceDetailsResponseAPI` and `PlaceDetailsResultAPI` are no longer exported
|
|
61
|
+
- services: **Breaking:** `minFuzzyLevel` and `maxFuzzyLevel` take a `FuzzyLevel`, the whole numbers `1` to `4`
|
|
62
|
+
- core: **Breaking:** a route traffic section's `tec` is optional, and absent when the service sends no TEC codes
|
|
63
|
+
|
|
64
|
+
### Patch Changes
|
|
65
|
+
|
|
66
|
+
- [#2680](https://github.com/tomtom-internal/maps-sdk-js/pull/2680) [`46ecb86`](https://github.com/tomtom-internal/maps-sdk-js/commit/46ecb861d06cbfbc9cc952f098ae31d68528c6c3) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core: `languages` is a runtime export, and the distance formatter, bounding-box and route helpers handle their edge cases
|
|
67
|
+
|
|
68
|
+
- core: `formatDistance` rounds below 10 m to one decimal, rounds a negative distance to the same magnitude as its positive, rounds feet and yards once rather than twice, and takes `undefined`
|
|
69
|
+
- core: `bboxCenter` centres a box that crosses the antimeridian, and `bboxFromGeoJSON` reads the 2D edges of a 3D `bbox`
|
|
70
|
+
- core: `getProgressAtNearestRoutePoint` returns `undefined` on a route under two coordinates, rather than throwing
|
|
71
|
+
- core: `getCoordinateAtRouteProgress` returns `undefined` past an end whose progress entry lacks the value, rather than `0`
|
|
72
|
+
- core: `findBestWaypointInsertionIndices` and `withInsertedWaypoints` prepend on a route under two coordinates
|
|
73
|
+
- core: `getRouteProgressForSection` and `getSectionBBox` take any `RouteSpan`, such as the one `getSectionOverlap` returns
|
|
74
|
+
- core: `TomTomConfig.instance.reset()` restores the retry defaults, even after a caller edited `get().retry`
|
|
75
|
+
|
|
76
|
+
- [#2659](https://github.com/tomtom-internal/maps-sdk-js/pull/2659) [`a580975`](https://github.com/tomtom-internal/maps-sdk-js/commit/a5809754b51feb9a1583cd23d149364e17727bb9) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core: `getInstructionLanes(route, instruction)` finds the `lanes` section leading to an instruction's maneuver, so a directions panel can show the lanes to take under each step
|
|
77
|
+
|
|
78
|
+
- examples: `route-with-guidance` lists its instructions in a Directions panel, and both it and `react-route-planner` draw the lanes to take under each instruction that has them, as a small SVG sign of their own.
|
|
79
|
+
|
|
80
|
+
- [#2687](https://github.com/tomtom-internal/maps-sdk-js/pull/2687) [`7ff2c57`](https://github.com/tomtom-internal/maps-sdk-js/commit/7ff2c5703f66f90c521d192a65a622ad439562f2) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: images without a DOM, base-map places under offset POI icons and a module's `events.off()` handle their edge cases
|
|
81
|
+
|
|
82
|
+
- map: a module given an SVG image where there is no DOM, as in a server render or a Node.js test, adds no image rather than throwing a `TypeError`
|
|
83
|
+
- map: a `base-map` place keeps the style's icon offset when `POIsModule` offsets its own `categoryIcons` entry for the same category, rather than drawing its sprite that many pixels away
|
|
84
|
+
- map: `events.off('shown-features')` stops compiling on a module with no `show` method, which never emits that event, as `events.on('shown-features', …)` already did
|
|
85
|
+
|
|
86
|
+
- [#2695](https://github.com/tomtom-internal/maps-sdk-js/pull/2695) [`7f4c439`](https://github.com/tomtom-internal/maps-sdk-js/commit/7f4c4393b880abcb828f719f9b099d87f40f24a0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: geometries and reachable ranges can blend `fill.palette` from its first colour to its last, fade the bands away from the origin, and dash or dot their borders
|
|
87
|
+
|
|
88
|
+
- map: `fill.paletteMode: 'ramp'` shades the features, or the bands, evenly from the palette's first colour to its last, blended in OKLCH. `'cycle'`, the default, takes the colours in turn as before
|
|
89
|
+
- map: `ReachableRangesModule`'s `fill.outermostOpacityFactor` multiplies the outermost band's fill opacity, and steps the bands between evenly from the innermost one. A lone range takes the factor
|
|
90
|
+
- map: `line.pattern` (`'solid'`, `'dashed'` or `'dotted'`) breaks up the borders of `GeometriesModule` and `ReachableRangesModule`, scaled with the border width
|
|
91
|
+
- map: the new settings are knobs of `geometriesKnobCatalogue` and `reachableRangesKnobCatalogue`
|
|
92
|
+
- map: `LinePattern` now types every line pattern; `SectionLinePattern` is deprecated in its favour
|
|
93
|
+
- examples: `geometry-config-playground` sets the border pattern, `multiple-geometries` swaps palettes and switches them between cycling and ramping, and `reachable-ranges-playground` offers two- and five-colour palettes to ramp
|
|
94
|
+
|
|
95
|
+
- [#2698](https://github.com/tomtom-internal/maps-sdk-js/pull/2698) [`b7be724`](https://github.com/tomtom-internal/maps-sdk-js/commit/b7be7243dcf5df5897ea6ef3053eb382588a72e6) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: light the 3D buildings with the `view.light` knobs of `StylingFoundationsModule`, kept across style switches
|
|
96
|
+
|
|
97
|
+
- `view.light.direction`, `view.light.altitude`, `view.light.alignment`, `view.light.color` and `view.light.intensity` set MapLibre's light. A part you leave unset takes the style's own light, otherwise MapLibre's default
|
|
98
|
+
- `stylingFoundationsKnobKinds` gains `number`, the kind of the direction, altitude and intensity
|
|
99
|
+
- `exportStyle()` carries the light the knobs set
|
|
100
|
+
- Once a light knob has been set, a clean `setStyle(…, { resetState: true })` draws the new style's light, rather than keeping the one the knobs had set
|
|
101
|
+
- examples: `map-styling-playground` shows the light knobs in a View light section
|
|
102
|
+
|
|
103
|
+
- [#2658](https://github.com/tomtom-internal/maps-sdk-js/pull/2658) [`80d6897`](https://github.com/tomtom-internal/maps-sdk-js/commit/80d68974f433320a332b59dea66c0904a0118349) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: road shields, POI icons and road patterns no longer go missing when the map's own sprite loads more slowly than the place pins' sprite
|
|
104
|
+
|
|
105
|
+
- [#2685](https://github.com/tomtom-internal/maps-sdk-js/pull/2685) [`9825c67`](https://github.com/tomtom-internal/maps-sdk-js/commit/9825c67233d1175c668fff544c92c916bf474297) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: modules keep their state across style switches, routes draw with a traffic halo, and events, images and knobs handle their edge cases
|
|
106
|
+
|
|
107
|
+
- map: `RoutingModule` draws its routes when `sections.traffic.style` is `'halo'`, at creation, after a style switch and when switched at runtime
|
|
108
|
+
- map: `routeIndex` on route sections, summary bubbles and border crossings is the route's position among the shown routes, so `selectRoute` and clicks work when only some routes are shown
|
|
109
|
+
- map: `selectRoute` waits for the module before reading the shown routes, so a `showRoutes` it follows unawaited keeps its routes; a new `showRoutes` starts its summary bubbles with no click state
|
|
110
|
+
- map: route jam labels follow `displayUnits.time`, and a speed limit that changes at a border takes the country the route enters
|
|
111
|
+
- map: speed-limit signs anchor to their own instance's layers, and go to the top on a style without their usual anchor
|
|
112
|
+
- map: `PlacesModule` restores what it showed synchronously on a style switch, repaints its default pin when created with no config, and no longer fires `shown-features` for the restore
|
|
113
|
+
- map: a place category icon with no image resolves to the sprite's own id, a `poiCategory` icon mapping draws the `categoryIcons` entry for the category it returns, and `layers.*.layout` overrides win over the computed text and icon offsets
|
|
114
|
+
- map: `POIsModule` keeps its category icons after a `setStyle` to the style already loaded, and `FOOD_DRINKS_GROUP`, `HEALTH_GROUP` and `ENTERTAINMENT_GROUP` no longer pull in delicatessens, welfare organisations and clubs
|
|
115
|
+
- map: a centre title keeps its own hover and click state rather than its polygon's, and two identical reachable ranges no longer shade the inverted style
|
|
116
|
+
- map: raw layer edits stay on top of every module's knobs, a preset switch fires `config-change` once per module, and an unknown preset id such as `'toString'` throws the documented error
|
|
117
|
+
- map: event handlers survive a style switch that leaves their scope with no layers, hover detects a feature with id 0 and the same id in two sources, and a handler that unsubscribes mid-dispatch no longer skips the next one
|
|
118
|
+
- map: a slow image load no longer overwrites a newer image or re-adds a removed one, and `addOrUpdateImage` leaves a caller's `onload` alone
|
|
119
|
+
- map: a `setStyle` called before the first style load finishes on the style it asked for, or on the first style when its own fails to load
|
|
120
|
+
- map: `TrafficAreaAnalyticsModule` moves its hover outlines and highlights with their cells on a `beforeLayerConfig` change, and its heatmap stays valid when every tile has the same value
|
|
121
|
+
- map: an incident with an average speed of 0 km/h keeps it, and the jam delay label rounds to whole minutes first, with a marker sized for the rounded label
|
|
122
|
+
- map: `CustomGeoJSONModule` gives a feature with no id one no other feature holds, keeps a layer hidden that its spec sets to `visibility: 'none'`, re-adds an image whose options change, and no longer fires `shown-features` on a style switch
|
|
123
|
+
- map: a retry after the first style fails to load loads it, and a `setGeopoliticalView` or `setLanguage` called mid-switch applies once the map is ready without undoing a later call
|
|
124
|
+
- map: a display-units change keeps the hover and click states of route jams and speed-limit signs, `showWaypoints` draws with a config applied while it waited, a waypoint Feature with `properties: null` no longer throws, and speed-limit signs show mph in Jersey, Guernsey, the Isle of Man, the US territories, seven British Overseas Territories, eight Caribbean states and Samoa
|
|
125
|
+
- map: a dotted ferry or tunnel line draws its dots, and a named routing layer override placed under another routing layer, by its bare name or its full id, lands there rather than on top
|
|
126
|
+
- map: `PlacesModule` keeps entry point and connection event states across a style switch, a cluster rebuild and a config change, and a custom icon's label offset accounts for its `pixelRatio` and an SVG's drawn size, an SVG with only a width or a height taking the other from its viewBox
|
|
127
|
+
- map: `POIsModule` no longer turns on micro markers the style hides, `styling.layers` visibility edits no longer show a layer a module hides, a style sky that draws nothing no longer hides the theme sky while one with colours but no atmosphere counts as shown, and base-map group knobs apply in the order given
|
|
128
|
+
- map: an events scope you hold registers on the current sources after a style switch, clicking the empty map clears a click state set before one, an `on()` unsubscribe removes only its own registration, and a hovered place redrawn as selected doesn't fire `hover` twice
|
|
129
|
+
- map: a layer added in the same config change follows the layer it is pinned under when that layer moves
|
|
130
|
+
- map: geometries with their own ids keep them, and their event states, after a config change
|
|
131
|
+
- map: area analytics cells stop at `maxMeters`, their hover outlines and highlights follow the metric filter, and an empty `colorStops` falls back to the palette; `TrafficIncidentDetailsModule.show()` keeps the layers its `layers` config hides; an incident delay or report count of 0 is kept
|
|
132
|
+
- map: `calculateFittingBBox` clamps latitudes to the Web Mercator range and handles a box across the antimeridian, and `calculatePaddedBBox` covers a rotated map and cuts a panel touching one edge from its closest edge
|
|
133
|
+
- map: a module's `applyConfig` and `resetConfig` reach the event handlers already registered, so a new hover cursor or grace period applies, and a click on a cluster whose id matches a shown feature's hands the handler the cluster
|
|
134
|
+
- map: `TrafficFlowModule`, `TrafficIncidentsModule` and `TerrainModule` show and hide their layers alongside `styling.layers` edits, so an edit no longer shows traffic or a hillshade the module hides, and `BaseMapModule` no longer misrecords an `all-except` visibility for a layer group the style has no layers for
|
|
135
|
+
- map: a section's halo no longer vanishes under the route outline when the section sets a narrower `widthFactor` or `widthPreset`, and setting `countryCrossings.visible: true` while they are shown keeps a clicked crossing's state
|
|
136
|
+
- map: a `setStyle` call a newer one supersedes resolves even when its style fails to load, as documented
|
|
137
|
+
- map: area analytics extrusion highlights follow an extrusion height that ramps with zoom
|
|
138
|
+
- map: `POIsModuleSerializableConfig` is exported, and `stylingFoundationsKnobIds` is `readonly` like the other modules' knob id lists, so code that mutates it stops compiling
|
|
139
|
+
- map: `PlaceLayerName` leaves out `'additional'`, which names no layer, and `RouteLayersConfig.sections` names only the layers each type draws: `speedLimit` its sign layer, the other generated types their line and icon layers
|
|
140
|
+
- map: `PlacesModule.updateData` and a show after a config change drop the category, icon and extra properties the previous config added, and a custom module's layers that reference each other stack in dependency order at creation, on `applyConfig` and after a style switch
|
|
141
|
+
- map: `CustomGeoJSONLayerSpec` takes only the six layer types a GeoJSON source draws (circle, line, fill, fill-extrusion, symbol and heatmap)
|
|
142
|
+
- map: a route module with only some `displayUnits` of its own follows a global unit-system change for the rest
|
|
143
|
+
- map: a POIs event handler no longer receives base-map features, nor a base-map handler POI ones, and a `recently-hovered` state clears after its handler unsubscribes
|
|
144
|
+
- map: area analytics fall back to the defaults for each fill and line field left `undefined`, an inverted display cuts every region out of the mask, and `setHeight(undefined)` clears the extrusion height
|
|
145
|
+
- map: a jam with a delay of 0 shows no "1 min" marker, and a whole-hour jam delay gets the small sprite
|
|
146
|
+
- map: `setLayout` takes `visibility` as `'visible'` or `'none'` only, since a visibility expression was drawn as always visible, and `getStyleInput()` is typed as never `undefined`
|
|
147
|
+
- map: routes relabel on the next config change after a global display-units change, a style switch in between included, and a layer override's `reset()` after a style switch restores the new style's value, or after a `setStyle` to the style already loaded the value it replaced
|
|
148
|
+
- map: an `off()` followed by a style switch no longer leaves a hover, click or recently-hovered state stuck on a source
|
|
149
|
+
- map: a place config change gives back the place's own value of a property an `extraFeatureProps` entry replaced, and a clicked `micro` dot under `pin-clustered` keeps its state across a config change and a style switch
|
|
150
|
+
- map: `CustomGeoJSONModule.applyConfig` throws a clear error before changing anything when the config names other sources or `sourceID`s than the module was created with, where it used to apply half of it
|
|
151
|
+
- map: area analytics hover and click highlights stay off the cells a layer filter hides
|
|
152
|
+
|
|
153
|
+
- [#2692](https://github.com/tomtom-internal/maps-sdk-js/pull/2692) [`cbc4dc9`](https://github.com/tomtom-internal/maps-sdk-js/commit/cbc4dc9857d306db1eca93d1e9d5a23b1f901141) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core, services, map: the package now installs on Node.js 22 with any package manager
|
|
154
|
+
|
|
155
|
+
- The `engines` field asks for Node.js 22 or newer instead of 24, and no longer names a pnpm version, so npm and pnpm stop warning about it on Node.js 22 and `engine-strict` installs succeed
|
|
156
|
+
|
|
157
|
+
- [#2676](https://github.com/tomtom-internal/maps-sdk-js/pull/2676) [`383a6c6`](https://github.com/tomtom-internal/maps-sdk-js/commit/383a6c6e62ce6a183bc1a062a7fa88be5fd7278f) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: Fade a route, the traffic overlays, the incidents you show and your place icons, each with one opacity setting
|
|
158
|
+
|
|
159
|
+
- `RoutingModule` `opacity` fades the route lines and their outlines, selected and deselected; sections keep `sections.<type>.opacity`
|
|
160
|
+
- `TrafficFlowModule` and `TrafficIncidentsModule` `opacityFactor` multiply the style's own line opacity, its zoom ramp kept; the incident icons stay opaque
|
|
161
|
+
- `TrafficIncidentDetailsModule` `line.opacity` fades the incident lines; the markers and the highlight outline stay opaque
|
|
162
|
+
- `PlacesModule` `icon.opacity` fades the icons of every marker type, the cluster pin included; a selected place stays opaque
|
|
163
|
+
- Each is a knob in its module's catalogue
|
|
164
|
+
- `route-styling-playground` fades the route through `opacity`, `places-customize-playground` gains an icon opacity slider, and `traffic-incident-focus` fades the flow through `opacityFactor`
|
|
165
|
+
|
|
166
|
+
- [#2681](https://github.com/tomtom-internal/maps-sdk-js/pull/2681) [`97c0508`](https://github.com/tomtom-internal/maps-sdk-js/commit/97c050866cb312ca1c4e3cfa22c8cbc4d116fd46) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `calculateReachableRange` rejects an arrival time with a message that shows the `when` shape to use instead, `when: { option: 'departAt', date }`
|
|
167
|
+
|
|
168
|
+
- [#2642](https://github.com/tomtom-internal/maps-sdk-js/pull/2642) [`1d75842`](https://github.com/tomtom-internal/maps-sdk-js/commit/1d75842ba862bf87648eb33beef02d64df7db366) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: Choose what a route's summary bubble says, its colour, typeface and the zooms it shows at, or write your own text per route
|
|
169
|
+
|
|
170
|
+
- `summaryBubbles.fields` lists `duration`, `distance` and `trafficDelay` in the order shown; a bubble with nothing to say isn't drawn, so `['trafficDelay']` shows bubbles on delayed routes alone
|
|
171
|
+
- `summaryBubbles.minZoom`, `maxZoom`, `color` and `label` (`color`, `size`, `opacity`, `typeface`, `customTypeface`) are knobs in `routingKnobCatalogue`, all but `customTypeface`
|
|
172
|
+
- `summaryBubbles.label.title` takes a function of the route's summary, or a MapLibre expression, and writes its text in place of the fields
|
|
173
|
+
- The bubbles now follow the map: a theme's `labelHalo` and `label` colours once one sets them, else dark bubbles and light text on a dark style
|
|
174
|
+
- New `route-summary-bubbles-playground` example, its panel built from the catalogue
|
|
175
|
+
|
|
176
|
+
- [#2643](https://github.com/tomtom-internal/maps-sdk-js/pull/2643) [`507e4e5`](https://github.com/tomtom-internal/maps-sdk-js/commit/507e4e52902adbd216ecc9cd8d45c60e7b7b02fd) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: Summary bubbles keep clear of each other, show on the routes you choose and give each alternative's time against the selected route
|
|
177
|
+
|
|
178
|
+
- Each bubble sits on a stretch of road its route has to itself, so routes sharing a motorway no longer hide each other's bubble, and it stays put when another route is selected
|
|
179
|
+
- `summaryBubbles.routes` shows the bubbles on `all` routes, the `selected` one alone or its `alternatives`
|
|
180
|
+
- The `durationDifference` field writes each other route's time against the selected one, such as `+6 min`, and `selectRoute` re-times the bubbles
|
|
181
|
+
- The `route-summary-bubbles-playground` example opens with bubbles timed against the selected route
|
|
182
|
+
|
|
183
|
+
- [#2684](https://github.com/tomtom-internal/maps-sdk-js/pull/2684) [`eb4da3f`](https://github.com/tomtom-internal/maps-sdk-js/commit/eb4da3f3cad8af1ddc9c4e9d926736fd4a104ab1) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: validation catches the inputs that used to crash or reach the API, and routing, search suggestions and the shared pipeline handle their edge cases
|
|
184
|
+
|
|
185
|
+
- services: validation rejects, as `INVALID_REQUEST`, what used to throw a plain `Error` or come back as a 400: an empty Polygon or a Point in `geometrySearch`, an impossible date such as `'2024-02-30'` in `trafficAreaAnalytics`, more than 100 incident ids, a non-integer fuzzy level or a `minFuzzyLevel` above `maxFuzzyLevel`, a routing avoid area with no bounding box, a one-point path, a non-integer `maxAlternatives`, an along-route search route under two positions, a zero reachable-range budget, a non-integer or out-of-range `limit` or `heading`, and an undefined `commonBaseURL`
|
|
186
|
+
- services: validation also rejects an empty array as a route location, a stop's `candidateEntryPoints` off the globe or `preferredEntryPointIndex` past them, an empty `geometrySearch` geometry list or ring, `days` beside an `endDate` in `trafficAreaAnalytics`, and a bare bbox of other than four numbers; it now accepts a GeometryCollection where a bounding box is read, bare or inside a Feature or FeatureCollection, and the documented `weightKG: 0`
|
|
187
|
+
- services: validation checks GeoJSON input against its type: a route waypoint's position, every position of a path, an along-route search route or a polygon ring, and a `geometrySearch` Circle centre must be on the globe, a bounding box can't be an empty array or collection, a path given as a Feature must hold a LineString, a stop's `pauseDurationSeconds` can't be negative and its `legCostModel` takes only known route types and avoid values, a geometry's coordinates must match its `type`, and a GeoJSON `bbox` must hold 4 or 6 numbers; `extendedPostalCodesFor`, `mapcodes`, `openingHours`, `timeZone`, `relatedPois` and `filters.indexes` reject values outside their types
|
|
188
|
+
- services: a validation error from a union schema lists what each branch rejected
|
|
189
|
+
- services: `onAPIResponse` receives the API's response body, as its type says, rather than the fetch envelope, and fires once per call
|
|
190
|
+
- services: proxy-credentials mode is decided per call, so a call with its own `apiKey` no longer sends `credentials: 'include'` under a global proxy setup
|
|
191
|
+
- services: an error response labelled JSON whose body doesn't parse still rejects with its status
|
|
192
|
+
- services: `calculateRoute` keeps the leg point indices right after a one-coordinate first leg, gives a road-shield section with no references `[]`, no longer lets an origin's `candidateEntryPoints` override `useEntryPoints`, maps TEC cause codes 16, 22 and 23 to `'other'` as the TPEG2-TEC table defines them, and gives each instruction with no road info an object of its own
|
|
193
|
+
- services: `trafficAreaAnalytics` no longer throws a `RangeError` over a region with hundreds of thousands of tiles, and `calculateReachableRanges` stops listening to the batch's abort signal once each call settles
|
|
194
|
+
- services: `getSearchSuggestions` shows a brand asked for alongside address-type kinds
|
|
195
|
+
- services: `getSearchSuggestions` no longer offers a category refinement whose `refine()` fails for a category id the SDK doesn't know, and leaves out autocomplete segments of a type the SDK doesn't know
|
|
196
|
+
- services: `getPOICategories` and `resolvePOICategories` validate their parameters and reject with `SDKAbortError` on an aborted signal even when the cache or the known codes answer the call
|
|
197
|
+
- services: `SDKServiceError.status` is `readonly`, like the other error fields
|
|
198
|
+
- services: `geocode` keeps in `geographyType` only the types core's `geographyTypes` lists, and rejects `extendedPostalCodesFor: ['POI']` as `INVALID_REQUEST`
|
|
199
|
+
- services: a blank `poiCategoryQuery` rejects rather than searching with no category filter
|
|
200
|
+
- services: `calculateReachableRanges` no longer needs `AbortSignal.any`, which React Native lacks, and the search cursor no longer needs `atob` and `btoa`
|
|
201
|
+
- services: a search or geocode result at distance 0 keeps its `distance`, Kosovo's `XK` maps to `XKX`, and `getPOICategories` hands out a copy of its cache
|
|
202
|
+
- services: `VehicleModel` and `VehicleDimensions` are exported
|
|
203
|
+
- core: `TomTomConfig.instance.put` drops `undefined` retry fields rather than storing them over the defaults
|
|
204
|
+
|
|
205
|
+
- [#2690](https://github.com/tomtom-internal/maps-sdk-js/pull/2690) [`e56d293`](https://github.com/tomtom-internal/maps-sdk-js/commit/e56d293fdc713cd7301713ac16bdc1ff581910d4) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core, services, map: an app now bundles only the SDK code its imports use, so most single imports come out far smaller
|
|
206
|
+
|
|
207
|
+
- core: importing one helper, such as `generateId`, bundles under 1 KB minified instead of about 30 KB with lodash
|
|
208
|
+
- services: `geocode` bundles about 14 KB minified instead of 68 KB, and `calculateRoute` 32 KB instead of 86 KB, with lodash
|
|
209
|
+
- map: `TomTomMap` bundles about 44 KB minified on top of MapLibre instead of 123 KB, with lodash
|
|
210
|
+
- core, services, map: the package declares `sideEffects: false`, so bundlers drop the modules an app doesn't import
|
|
211
|
+
|
|
212
|
+
- [#2700](https://github.com/tomtom-internal/maps-sdk-js/pull/2700) [`f0d3922`](https://github.com/tomtom-internal/maps-sdk-js/commit/f0d392242f16d86eaf4aa0fd7f1b44888295e8ee) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: a route's speed limit signs draw from zoom 12.5 by default instead of 11, two and a half zooms after the tunnel and closed-road signs, so they no longer crowd the overview of a route; `sections.speedLimit.sign.minZoom` still sets it, in steps of half a zoom in `routingKnobCatalogue`
|
|
213
|
+
|
|
214
|
+
- examples: `route-speed-signs` sets `sign.minZoom` to 10, so its tiles post the signs on a whole route; `route-sections-playground` moves its `sign.minZoom` slider by half a zoom
|
|
215
|
+
|
|
3
216
|
## 1.0.0-rc.2
|
|
4
217
|
|
|
5
218
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -60,9 +60,11 @@ It's built on [MapLibre GL JS](https://docs.tomtom.com/maps-sdk-js/guides/map/ab
|
|
|
60
60
|
|
|
61
61
|
Then follow the [Map quickstart](https://docs.tomtom.com/maps-sdk-js/guides/map/quickstart) or the [Services quickstart](https://docs.tomtom.com/maps-sdk-js/guides/services/quickstart), or start from a runnable app in the [examples gallery](https://docs.tomtom.com/maps-sdk-js/examples/).
|
|
62
62
|
|
|
63
|
+
<!-- The public repository's README opens with everything above this line: keep this line verbatim, and every link above it valid there. -->
|
|
64
|
+
|
|
63
65
|
### Requirements
|
|
64
66
|
|
|
65
|
-
- **Node.js
|
|
67
|
+
- **Node.js 22+** at install time, the minimum the package declares, whether or not you target the browser. Any package manager works: npm, pnpm or Yarn.
|
|
66
68
|
- **A browser with WebGL** for the Map bundle.
|
|
67
69
|
- **A bundler** such as Vite or webpack, because the SDK ships as ES modules. Under Vite, `TomTomMap` sets up MapLibre's web worker on its own; [Vite projects](https://docs.tomtom.com/maps-sdk-js/introduction/project-setup#vite-projects) says when another bundler, such as webpack, needs it set up by hand.
|
|
68
70
|
- **Peer dependencies**, installed by the commands above: MapLibre GL JS 6.13+, Turf 7, culori 4, Lodash 4 and Zod 4.
|
package/core/dist/core.es.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{distance,nearestPointOnLine}from"@turf/turf";import{clamp,isNil,sortedIndex}from"lodash-es";var DEFAULT_COMMON_BASE_URL="https://api.tomtom.com",defaultRetryConfig={initialWaitMs:.447,backoffFactor:1.618,timeoutMs:4e4},defaultConfig={commonBaseURL:"https://api.tomtom.com",apiKey:"",retry:defaultRetryConfig},TomTomConfig=class A{static{this.instance=new A}constructor(){this.config={...defaultConfig}}put(A){this.config={...this.config,...A,...A.retry&&{retry:{...defaultRetryConfig,...A.retry}}}}reset(){this.config={...defaultConfig}}get(){return this.config}},mergeFromGlobal=(A={})=>({...TomTomConfig.instance.get(),...A}),isProxyCredentialsMode=(A=TomTomConfig.instance.get())=>!A.apiKey&&"https://api.tomtom.com"!==(A.commonBaseURL??"https://api.tomtom.com"),LOOPBACK_IPV4=/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,isSecureBaseURL=A=>{let E;try{E=new URL(A)}catch{return!0}if("https:"===E.protocol)return!0;const{hostname:R}=E;return"http:"===E.protocol&&("localhost"===R||R.endsWith(".localhost")||"[::1]"===R||LOOPBACK_IPV4.test(R))},insecureBaseURLMessage=A=>`commonBaseURL ${A} is not https:, so requests to it would carry the API key in the clear; only loopback addresses may use http:.`,geopoliticalViews=["Unified","AE","AR","BN","CL","CN","DZ","IL","IN","KR","MA","MY","PH","PK","RS","RU","TR","TW","US","VN"],chargingPointCapabilities=["ChargingProfileCapable","ChargingPreferencesCapable","ChipCardSupport","ContactlessCardSupport","CreditCardPayable","DebitCardPayable","PedTerminal","RemoteStartStopCapable","Reservable","RfidReader","StartSessionConnectorRequired","TokenGroupCapable","UnlockCapable","PlugAndCharge","Unknown"],chargingPointRestrictions=["EvOnly","Plugged","Disabled","Customers","Motorcycles"],connectorTypes=["StandardHouseholdCountrySpecific","IEC62196Type1","IEC62196Type1CCS","IEC62196Type2CableAttached","IEC62196Type2Outlet","IEC62196Type2CCS","IEC62196Type3","Chademo","GBT20234Part2","GBT20234Part3","IEC60309AC3PhaseRed","IEC60309AC1PhaseBlue","IEC60309DCWhite","Tesla"],currentTypes=["AC1","AC3","DC"],geographyTypes=["Country","CountrySubdivision","CountrySecondarySubdivision","CountryTertiarySubdivision","Municipality","MunicipalitySubdivision","MunicipalitySecondarySubdivision","Neighbourhood","PostalCodeArea"],placeTypes=["POI","Street","Geography","Point Address","Address Range","Cross Street"],poiCategories=["ABORIGINAL_LAND","ADVENTURE_SPORTS_FACILITY","ADVENTURE_VEHICLE_TRAIL","ADVERTISING_COMPANY","AFGHAN_RESTAURANT","AFRICAN_RESTAURANT","AGRICULTURAL_SUPPLIES","AGRICULTURAL_TECHNOLOGY","AGRICULTURE","AIRFIELD","AIRLINE_ACCESS","AIRLINE_COMPANY","AIRPORT","AMBULANCE_UNIT","AMERICAN_RESTAURANT","AMPHITHEATER","AMUSEMENT_PARK","AMUSEMENT_PLACE","ANIMAL_SERVICE","ANIMAL_SHELTER","ANTIQUE_ART_SHOP","APARTMENT_RENTAL","AQUATIC_ZOO","ARABIAN_RESTAURANT","ARBORETA_AND_BOTANICAL_GARDENS","ARCH","ARMENIAN_RESTAURANT","ART_SCHOOL","ASIAN_RESTAURANT","ATHLETICS_TRACK","ATM","ATV_DEALER","AUSTRALIAN_RESTAURANT","AUSTRIAN_RESTAURANT","AUTOMOBILE_COMPANY","AUTOMOBILE_MANUFACTURING","BAGS_LEATHERWEAR","BAKERY","BANDB_OR_GUEST_HOUSE","BANK","BANQUET_ROOMS","BAR","BARBECUE_RESTAURANT","BASEBALL_PARK","BASKETBALL_ARENA","BASQUE_RESTAURANT","BATTLEFIELD","BAY","BEACH","BEACH_CLUB","BEAUTY_SALON","BEAUTY_SUPPLIES","BELGIAN_RESTAURANT","BETTING_STATION","BISTRO","BLOOD_BANK","BOATING_EQUIPMENT_AND_ACCESSORIES","BOAT_DEALER","BOAT_LAUNCHING_RAMP","BODYSHOP","BOLIVIAN_RESTAURANT","BOOK_SHOP","BORDER_CONTROL","BOWLING_CENTER","BRAZILIAN_RESTAURANT","BRIDGE","BRITISH_RESTAURANT","BUFFET_RESTAURANT","BUILDING","BULGARIAN_RESTAURANT","BUNGALOW_RENTAL","BURMESE_RESTAURANT","BUSINESS_PARK","BUSINESS_SERVICES","BUS_CHARTER_COMPANY","BUS_DEALER","BUS_LINES","BUS_STOP","BUTCHER","CABARET_THEATER","CABINS_LODGES","CABLE_AND_TELEPHONE_COMPANY","CAFE","CAFETERIA","CAFE_PUB","CALIFORNIAN_RESTAURANT","CAMBODIAN_RESTAURANT","CAMERAS_AND_PHOTOGRAPHY","CAMPING_GROUND","CANADIAN_RESTAURANT","CANNABIS_SHOP","CAPE","CARAVAN_SITE","CARIBBEAN_RESTAURANT","CARPET_FLOOR_COVERINGS","CAR_DEALER","CAR_GLASS_REPLACEMENT_SHOP","CAR_RENTAL","CAR_REPAIR_AND_SERVICE","CAR_WASH","CASINO_AND_GAMBLING","CATERING_SERVICES","CAVE","CEMETERY","CHALET_RENTAL","CHARGING_LOCATION","CHEMICAL_COMPANY","CHICKEN_RESTAURANT","CHILDCARE","CHILDREN_S_CLOTHES","CHILEAN_RESTAURANT","CHINESE_RESTAURANT","CHRISTMAS_OR_HOLIDAY_SHOP","CHURCH","CINEMA","CLEANING_SERVICES","CLOTHING_SHOP","CLUB_AND_ASSOCIATION","COCKTAIL_BAR","COFFEE_SHOP","COLLEGE_OR_UNIVERSITY","COLOMBIAN_RESTAURANT","COMEDY_CLUB","COMMERCIAL_BUILDING","COMMUNITY_CENTER","COMPANY","COMPUTER_AND_COMPUTER_SUPPLIES","COMPUTER_AND_DATA_SERVICES","CONCERT_HALL","CONSTRUCTION_COMPANY","CONSTRUCTION_MATERIAL_AND_EQUIPMENT","CONSUMER_ELECTRONICS","CONVENIENCE_STORE","CORSICAN_RESTAURANT","COTTAGE_RENTAL","COURIER_DROP_BOX","COURTHOUSE","COVE","CREOLE_RESTAURANT","CREPERIE","CRICKET_GROUND","CUBAN_RESTAURANT","CULTURAL_CENTER","CURTAINS_TEXTILES","CZECH_RESTAURANT","C_DS_DVD_VIDEOS","DAM","DANCE_STUDIO_AND_SCHOOL","DANISH_RESTAURANT","DELICATESSEN","DELIVERY_SERVICE","DENTIST","DEPARTMENT_STORE","DINNER_THEATER","DISCO_CLUB","DIVERSIFIED_FINANCIALS","DOCTOR","DONGBEI_RESTAURANT","DOUGHNUT_RESTAURANT","DO_IT_YOURSELF_CENTERS","DRIVE_IN_MOVIES","DRIVE_THROUGH_BOTTLE_SHOP","DRIVING_SCHOOL","DRUG_STORE","DRY_CLEANER","DUNE","DUTCH_RESTAURANT","EGYPTIAN_RESTAURANT","ELECTRICAL_APPLIANCES_SHOP","ELECTRONICS_COMPANY","EMBASSY","EMERGENCY_MEDICAL_SERVICE","EMERGENCY_ROOM","ENGLISH_RESTAURANT","ENTERTAINMENT","EQUIPMENT_RENTAL","ETHIOPIAN_RESTAURANT","EXCHANGE","EXHIBITION_CONVENTION_CENTER","FACTORY_OUTLET","FAIRGROUND","FARM","FARMERS_MARKET","FAST_FOOD","FERRY_TERMINAL","FINNISH_RESTAURANT","FIRE_STATION","FISHING_AND_HUNTING_AREA","FISHMONGER","FITNESS_CLUB_AND_CENTER","FLATS_OR_APARTMENT_COMPLEX","FLORISTS","FLYING_CLUB","FONDUE_RESTAURANT","FOOD_AND_DRINKS_SHOP","FOOD_MARKET","FOOTBALL_STADIUM","FOOTWEAR_SHOE_REPAIRS","FOREIGN_EXCHANGE","FOREST_AREA","FRENCH_RESTAURANT","FUEL_STATION","FUNERAL_SERVICE_AND_MORTUARIES","FURNITURE_HOME_FURNISHINGS","FUSION_RESTAURANT","GARDEN_CENTERS_SERVICES","GENERAL_HOSPITAL_AND_POLYCLINIC","GENERAL_PRACTITIONER","GERMAN_RESTAURANT","GIFTS_CARDS_NOVELTIES_SOUVENIRS","GLASSWARE_CERAMIC_SHOP","GLASS_WINDOWS_STORE","GOLD_EXCHANGE","GOLF_COURSE","GOVERNMENT_OFFICE","GREEK_RESTAURANT","GREENGROCER","GRILL_RESTAURANT","GROCERY_STORE","GURUDWARA","HAIRDRESSER","HAMBURGER_RESTAURANT","HARBOR","HARDWARE_STORE","HAWAIIAN_RESTAURANT","HEALTHCARE_SERVICE","HELIPORT_OR_HELIPAD","HIGH_SCHOOL","HIKING_TRAIL","HILL","HISTORICAL_PARK","HISTORIC_SITE","HOBBY_SHOP","HOCKEY_CLUB","HOLIDAY_RENTAL","HOME_APPLIANCE_REPAIR","HORSE_RACING_TRACK","HORSE_RIDING","HORSE_RIDING_TRAIL","HORTICULTURE","HOSPITAL","HOSPITAL_FOR_WOMEN_AND_CHILDREN","HOSPITAL_OF_CHINESE_MEDICINE","HOSTEL","HOTEL","HOTEL_OR_MOTEL","HOT_POT_RESTAURANT","HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS","HUNAN_RESTAURANT","HUNGARIAN_RESTAURANT","ICE_CREAM_PARLOR","ICE_HOCKEY_ARENA","ICE_RINK","IMPORT_OR_EXPORT_AND_DISTRIBUTION","INDIAN_RESTAURANT","INDONESIAN_RESTAURANT","INDUSTRIAL_BUILDING","INFORMAL_MARKET","INSURANCE_COMPANY","INTERNATIONAL_RAILROAD_STATION","INTERNATIONAL_RESTAURANT","INTERNET_CAFE","INVESTMENT_ADVISOR","IRANIAN_RESTAURANT","IRISH_RESTAURANT","ISLAND","ISRAELI_RESTAURANT","ITALIAN_RESTAURANT","JAMAICAN_RESTAURANT","JAPANESE_RESTAURANT","JAZZ_CLUB","JEWELRY_CLOCKS_WATCHES","JEWISH_RESTAURANT","JUICE_BAR","JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE","KARAOKE_CLUB","KITCHENS_BATHROOMS","KOREAN_RESTAURANT","KOSHER_RESTAURANT","LANGUAGE_SCHOOL","LATIN_AMERICAN_RESTAURANT","LAUNDRY","LEBANESE_RESTAURANT","LEGAL_SERVICES","LEISURE_CENTER","LIGHTING_SHOPS","LOCALE","LOCAL_SPECIALITIES_SHOP","LOTTERY_SHOP","MALL","MANUFACTURING_COMPANY","MANUFACTURING_FACILITY","MARINA","MARKETPLACE","MARSH","MAUSOLEUM_OR_GRAVE","MECHANICAL_ENGINEERING","MEDIA_FACILITY","MEDICAL_SUPPLIES_EQUIPMENT","MEDICINAL_AND_RECREATIONAL_DISPENSARY","MEDICINAL_MARIJUANA_DISPENSARY","MEDITERRANEAN_RESTAURANT","MEMORIAL","MEN_S_CLOTHING","MEXICAN_RESTAURANT","MICROBREWERY","MIDDLE_EASTERN_RESTAURANT","MIDDLE_SCHOOL","MILITARY_AIRPORT","MINERAL_OR_HOT_SPRINGS","MINING_COMPANY","MOBILE_PHONE_SHOP","MONGOLIAN_RESTAURANT","MONUMENT","MOROCCAN_RESTAURANT","MOSQUE","MOTEL","MOTORCYCLE_DEALER","MOTORCYCLE_REPAIR","MOTORING_ORGANIZATION_OFFICE","MOTOR_RACING_STADIUM","MOUNTAIN_BIKE_TRAIL","MOUNTAIN_PASS","MOUNTAIN_PEAK","MOVIE_THEATER","MOVING_AND_STORAGE_COMPANY","MULTI_PURPOSE_STADIUM","MUSEUM","MUSIC_CENTER","MUSIC_INSTRUMENTS_STORE","NAIL_SALON","NATIONAL_RAILROAD_STATION","NATURAL_FEATURE","NATURAL_TOURIST_ATTRACTION","NEPALESE_RESTAURANT","NETBALL_STADIUM","NEWSAGENTS_TOBACCONISTS","NIGHTLIFE","NON_GOVERNMENTAL_ORGANIZATION","NORWEGIAN_RESTAURANT","OASIS","OBSERVATORY","OFFICE_EQUIPMENT","OIL_AND_NATURAL_GAS","OPEN_CAR_PARKING_AREA","OPERA_HOUSE","OPTICIAN","ORGANIC_FOOD_RESTAURANT","ORIENTAL_RESTAURANT","PAGODA","PAINTING_DECORATING","PAKISTANI_RESTAURANT","PAN","PARK","PARKING_GARAGE","PARKWAY","PARK_AND_RECREATION_AREA","PASSENGER_TRANSPORT_TICKET_OFFICE","PAWN_SHOP","PEDESTRIAN_SUBWAY","PERSONAL_CARE_FACILITY","PERSONAL_SERVICE","PERUVIAN_RESTAURANT","PET_SUPPLIES","PHARMACEUTICAL_COMPANY","PHARMACY","PHILIPPINE_RESTAURANT","PHOTOCOPY_SHOP","PHOTO_LAB_OR_DEVELOPMENT","PICNIC_AREA","PIZZERIA","PLAIN_OR_FLAT","PLANETARIUM","PLATEAU","POLICE_STATION","POLISH_RESTAURANT","PORTUGUESE_RESTAURANT","PORT_WAREHOUSE_FACILITY","POST_OFFICE","PRE_SCHOOL","PRIMARY_PRODUCER","PRIMARY_RESOURCE_UTILITY","PRIMARY_SCHOOL","PRISON","PRIVATE_AIRPORT","PROTECTED_LAND","PUB","PUBLIC_AIRPORT","PUBLIC_AMENITY","PUBLIC_BATHROOM","PUBLIC_CALL_BOX","PUBLIC_LIBRARY","PUBLIC_MARKET","PUBLIC_TRANSPORT_STOP","PUBLISHING_TECHNOLOGIES","QUARRY","RACE_TRACK","RAILWAY_STATION","RAPIDS","REAL_ESTATE_AGENT","REAL_ESTATE_COMPANY","RECREATIONAL_CAMPING_GROUND","RECREATIONAL_MARIJUANA_DISPENSARY","RECREATIONAL_VEHICLE_DEALER","RECREATION_AREA","RECYCLING_SHOP","REEF","RELIGIOUS_SITE","RENTAL_CAR_PARKING","RESCUE_SERVICE","RESEARCH_FACILITY","RESERVOIR","RESIDENTIAL_ACCOMMODATION","RESIDENTIAL_ENTRANCE","RESORT","RESTAURANT","RESTAURANT_AREA","REST_AREA","REST_CAMP","RETAIL_OUTLET","RETIREMENT_COMMUNITY","RIDGE","RIVER_CROSSING","ROCKS","ROCK_CLIMBING_TRAIL","RUGBY_GROUND","RUSSIAN_RESTAURANT","SALAD_BAR","SANDWICH_RESTAURANT","SAUNA_SOLARIUM_MASSAGE","SCANDINAVIAN_RESTAURANT","SCHOOL","SCHOOL_BUS_COMPANY","SEAFOOD","SECURED_ENTRANCE","SECURITY_PRODUCTS","SENIOR_HIGH_SCHOOL","SERVICE_COMPANY","SHANDONG_RESTAURANT","SHOPPING_SERVICE","SHOP_OR_STORE","SICHUAN_RESTAURANT","SKI_RESORT","SNACKS_RESTAURANT","SOCCER_STADIUM","SOFTWARE_COMPANY","SOUL_FOOD","SOUP_RESTAURANT","SPANISH_RESTAURANT","SPECIALIST","SPECIALTY_CLOTHING_SHOP","SPECIALTY_FOODS","SPECIAL_HOSPITAL","SPORTS_CENTER","SPORTS_EQUIPMENT_AND_CLOTHING","SQUASH_COURT","STADIUM","STATION_ACCESS","STATUE","STEAK_HOUSE","STOCK_EXCHANGE","STREETCAR_STOP","SUBWAY_ENTRANCE","SUBWAY_STATION","SUPERMARKET","SUSHI_RESTAURANT","SWEDISH_RESTAURANT","SWIMMING_POOL","SWISS_RESTAURANT","SYNAGOG","SYRIAN_RESTAURANT","TAILOR_SHOP","TAIWANESE_RESTAURANT","TAKEOUT_FOOD","TAPAS_RESTAURANT","TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE","TAXI_STAND","TAX_SERVICES","TEA_HOUSE","TELECOMMUNICATIONS","TEMPLE","TENNIS_COURT","TEPPANYAKI_RESTAURANT","THAI_RESTAURANT","THEATER","THEMATIC_SPORT_CENTER","TIBETAN_RESTAURANT","TIRE_SERVICE","TOLL_GATE","TOURIST_ATTRACTION","TOURIST_INFORMATION","TOWER","TOYS_GAMES_SHOP","TRAFFIC_CONTROL_DEPARTMENT","TRAIL_SYSTEM","TRANSPORT_ACCESS","TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION","TRANSPORT_COMPANY","TRAVEL_AGENT","TRUCK_DEALER","TRUCK_REPAIR_AND_SERVICE","TRUCK_STOP","TUNISIAN_RESTAURANT","TUNNEL","TURKISH_RESTAURANT","URBAN_STATION","VALLEY","VAN_DEALER","VARIETY_STORE","VEGETARIAN_RESTAURANT","VEHICLE_DEALER","VEHICLE_REPAIR","VENEZUELAN_RESTAURANT","VETERINARY","VIDEO_RENTAL_SHOP","VIETNAMESE_RESTAURANT","VIEWPOINT","VILLA_RENTAL","VOCATIONAL_SCHOOL","WATER_HOLE","WATER_SPORT","WEDDING_SERVICES","WEIGH_STATION","WELFARE_ORGANIZATION","WELL","WESTERN_RESTAURANT","WHOLESALE_CLUB","WILDERNESS_AREA","WILDLIFE_PARK","WINERY","WINE_SPIRITS","WOMEN_S_CLOTHING","YACHT_BASIN","ZOO","ZOOS_ARBORETA_BOTANICAL_GARDEN"],budgetTypes=["timeMinutes","distanceKM"],budgetUnits={timeMinutes:"min",distanceKM:"km"},avoidableTypes=["tollRoads","motorways","ferries","unpavedRoads","carpools","alreadyUsedRoads","borderCrossings","tunnels","carTrains","lowEmissionZones"],inputSectionTypes=["carpool","carTrain","country","ferry","importantRoadStretch","lowEmissionZone","motorway","pedestrian","roadShields","speedLimit","toll","tollRoad","tollVignette","traffic","tunnel","unpaved","urban","vehicleRestricted"],inputSectionTypesWithGuidance=[...inputSectionTypes,"lanes"],sectionTypes=[...inputSectionTypesWithGuidance,"leg"],sdkErrorCodes=["INVALID_REQUEST","INSECURE_BASE_URL","INVALID_CREDENTIALS","INSUFFICIENT_PERMISSIONS","NOT_FOUND","RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE","ABORTED","WEBGL_UNSUPPORTED","WEBGL_CONTEXT_LOST","STYLE_LOAD_FAILED","INTERNAL"],areaAnalyticsMetricKeys=["speed","freeFlowSpeed","congestionLevel","travelTime","networkLength"],trafficIncidentRequestCategories=["accident","broken-down-vehicle","danger","flooding","fog","frost","jam","lane-closed","other","rain","road-closed","roadworks","wind"],fullTrafficIncidentCategories=[...trafficIncidentRequestCategories,"animals-on-road","narrow-lanes"],trafficIncidentTimeValidities=["present","future"],isBBoxWithArea=A=>!!A&&(A.length>=4&&A[3]!==A[1]&&A[2]!==A[0]),bboxOnlyIfWithArea=A=>isBBoxWithArea(A)?A:void 0,bboxExpandedWithPosition=(A,E)=>{if(A&&!(A.length<2))return E?[E[0]>A[0]?A[0]:E[0],E[1]>A[1]?A[1]:E[1],E[2]<A[0]?A[0]:E[2],E[3]<A[1]?A[1]:E[3]]:[A[0],A[1],A[0],A[1]]},bboxFromBBoxes=A=>A?.length?A.reduce((A,E)=>{return R=E,(T=A)&&R?[T[0]>R[0]?R[0]:T[0],T[1]>R[1]?R[1]:T[1],T[2]<R[2]?R[2]:T[2],T[3]<R[3]?R[3]:T[3]]:R||T;var R,T}):void 0,bboxFromCoordsArray=A=>{const E=A?.length;if(!E)return;let R;const T=Math.ceil(E/1e3);for(let I=0;I<E;I+=T)R=bboxExpandedWithPosition(A[I],R);return 1===T?R:bboxExpandedWithPosition(A[E-1],R)},bboxFromGeoJSON=A=>{if(A){if(Array.isArray(A))return"number"==typeof A[0]?A.length>=4?A:void 0:bboxFromBBoxes(A.map(A=>bboxFromGeoJSON(A)));if(A.bbox)return A.bbox;switch(A.type){case"Feature":return bboxFromGeoJSON(A.geometry);case"FeatureCollection":return bboxFromBBoxes(A.features.map(bboxFromGeoJSON));case"GeometryCollection":return bboxFromBBoxes(A.geometries.map(bboxFromGeoJSON));case"Point":return bboxExpandedWithPosition(A.coordinates);case"LineString":case"MultiPoint":return bboxFromCoordsArray(A.coordinates);case"MultiLineString":case"Polygon":return bboxFromBBoxes(A.coordinates.map(bboxFromCoordsArray));case"MultiPolygon":return bboxFromBBoxes(A.coordinates.flatMap(A=>A.map(bboxFromCoordsArray)));default:return}}},bboxCenter=A=>[(A[0]+A[2])/2,(A[1]+A[3])/2],polygonFromBBox=A=>{const[E,R,T,I]=A;return{type:"Feature",geometry:{type:"Polygon",coordinates:[[[E,R],[T,R],[T,I],[E,I],[E,R]]]},properties:{}}},generateId=()=>Date.now().toString(36)+Math.random().toString(36).substring(2),TOMTOM_USER_AGENT_SDK_NAME="MapsSDKJS",generateTomTomHeaders=A=>!1===A.sendUserAgentHeader?{}:{"tomtom-user-agent":A["tomtom-user-agent"]??"MapsSDKJS/1.0.0-rc.2"},getPosition=(A,E)=>{if(A){if(Array.isArray(A))return A;if(A.coordinates)return A.coordinates;if(A.geometry)return"main-when-available"===E?.useEntryPoint?(R=A,R?.properties?.entryPoints?.find(A=>"main"===A.type))?.position??A.geometry.coordinates:A.geometry.coordinates}var R;return null},getPositionStrict=(A,E)=>{const R=getPosition(A,E);if(!R)throw new Error(`The received object does not have lng-lat coordinates: ${JSON.stringify(A)}`);return R},toPointGeometry=A=>({type:"Point",coordinates:A}),poiCategoriesToIDs={TRAFFIC_CONTROL_DEPARTMENT:[7301,7301002],TRAIL_SYSTEM:[7302],MOUNTAIN_BIKE_TRAIL:[7302002],ADVENTURE_VEHICLE_TRAIL:[7302003],HIKING_TRAIL:[7302004],HORSE_RIDING_TRAIL:[7302005],ROCK_CLIMBING_TRAIL:[7302006],RESIDENTIAL_ACCOMMODATION:[7303],RETIREMENT_COMMUNITY:[7303002],FLATS_OR_APARTMENT_COMPLEX:[7303003],HOLIDAY_RENTAL:[7304],COTTAGE_RENTAL:[7304002],VILLA_RENTAL:[7304003],BUNGALOW_RENTAL:[7304004],CHALET_RENTAL:[7304005],APARTMENT_RENTAL:[7304006],ADVENTURE_SPORTS_FACILITY:[7305],HELIPORT_OR_HELIPAD:[7308],CHARGING_LOCATION:[7309],VEHICLE_REPAIR:[7310],BODYSHOP:[7310002],CAR_GLASS_REPLACEMENT_SHOP:[7310003],CAR_REPAIR_AND_SERVICE:[7310004],TIRE_SERVICE:[7310007],MOTORCYCLE_REPAIR:[7310008],TRUCK_REPAIR_AND_SERVICE:[7310009],FUEL_STATION:[7311],CAR_RENTAL:[7312],PARKING_GARAGE:[7313],HOTEL_OR_MOTEL:[7314],BANDB_OR_GUEST_HOUSE:[7314002],HOTEL:[7314003],HOSTEL:[7314004],RESORT:[7314005],MOTEL:[7314006],CABINS_LODGES:[7314007],REST_CAMP:[7314008],RESTAURANT:[7315],AFRICAN_RESTAURANT:[7315002],AMERICAN_RESTAURANT:[7315003],AUSTRIAN_RESTAURANT:[7315004],BARBECUE_RESTAURANT:[7315005],BELGIAN_RESTAURANT:[7315006],BISTRO:[7315007],BRITISH_RESTAURANT:[7315008],CALIFORNIAN_RESTAURANT:[7315009],CANADIAN_RESTAURANT:[7315010],CARIBBEAN_RESTAURANT:[7315011],CHINESE_RESTAURANT:[7315012],CREPERIE:[7315013],DUTCH_RESTAURANT:[7315014],FAST_FOOD:[7315015],PHILIPPINE_RESTAURANT:[7315016],FRENCH_RESTAURANT:[7315017],GERMAN_RESTAURANT:[7315018],GREEK_RESTAURANT:[7315019],GRILL_RESTAURANT:[7315020],HAWAIIAN_RESTAURANT:[7315021],HUNGARIAN_RESTAURANT:[7315022],INDIAN_RESTAURANT:[7315023],INDONESIAN_RESTAURANT:[7315024],ITALIAN_RESTAURANT:[7315025],JAPANESE_RESTAURANT:[7315026],JEWISH_RESTAURANT:[7315027],KOREAN_RESTAURANT:[7315028],LATIN_AMERICAN_RESTAURANT:[7315029],LEBANESE_RESTAURANT:[7315030],MEDITERRANEAN_RESTAURANT:[7315032],MEXICAN_RESTAURANT:[7315033],MIDDLE_EASTERN_RESTAURANT:[7315034],ORIENTAL_RESTAURANT:[7315035],PIZZERIA:[7315036],POLISH_RESTAURANT:[7315037],PORTUGUESE_RESTAURANT:[7315038],RUSSIAN_RESTAURANT:[7315040],SANDWICH_RESTAURANT:[7315042],SEAFOOD:[7315043],SPANISH_RESTAURANT:[7315044],STEAK_HOUSE:[7315045],SWISS_RESTAURANT:[7315047],THAI_RESTAURANT:[7315048],TURKISH_RESTAURANT:[7315049],VEGETARIAN_RESTAURANT:[7315050],VIETNAMESE_RESTAURANT:[7315051],HUNAN_RESTAURANT:[7315052],SHANDONG_RESTAURANT:[7315053],SICHUAN_RESTAURANT:[7315056],DONGBEI_RESTAURANT:[7315057],HOT_POT_RESTAURANT:[7315058],TAIWANESE_RESTAURANT:[7315059],WESTERN_RESTAURANT:[7315060],PERUVIAN_RESTAURANT:[7315061],ASIAN_RESTAURANT:[7315062],CREOLE_RESTAURANT:[7315063],SOUL_FOOD:[7315064],IRISH_RESTAURANT:[7315065],JAMAICAN_RESTAURANT:[7315066],KOSHER_RESTAURANT:[7315067],CZECH_RESTAURANT:[7315068],HAMBURGER_RESTAURANT:[7315069],CHICKEN_RESTAURANT:[7315070],FUSION_RESTAURANT:[7315071],BRAZILIAN_RESTAURANT:[7315072],INTERNATIONAL_RESTAURANT:[7315073],MOROCCAN_RESTAURANT:[7315074],ORGANIC_FOOD_RESTAURANT:[7315075],TAPAS_RESTAURANT:[7315076],ICE_CREAM_PARLOR:[7315078],DOUGHNUT_RESTAURANT:[7315079],AFGHAN_RESTAURANT:[7315081],ARABIAN_RESTAURANT:[7315083],ARMENIAN_RESTAURANT:[7315085],AUSTRALIAN_RESTAURANT:[7315086],BASQUE_RESTAURANT:[7315087],BOLIVIAN_RESTAURANT:[7315088],BULGARIAN_RESTAURANT:[7315090],BURMESE_RESTAURANT:[7315091],CAMBODIAN_RESTAURANT:[7315092],CHILEAN_RESTAURANT:[7315093],COLOMBIAN_RESTAURANT:[7315094],CORSICAN_RESTAURANT:[7315095],CUBAN_RESTAURANT:[7315096],DANISH_RESTAURANT:[7315098],EGYPTIAN_RESTAURANT:[7315100],ENGLISH_RESTAURANT:[7315101],ETHIOPIAN_RESTAURANT:[7315102],FINNISH_RESTAURANT:[7315104],IRANIAN_RESTAURANT:[7315105],ISRAELI_RESTAURANT:[7315106],MONGOLIAN_RESTAURANT:[7315110],NEPALESE_RESTAURANT:[7315111],NORWEGIAN_RESTAURANT:[7315112],SCANDINAVIAN_RESTAURANT:[7315114],SWEDISH_RESTAURANT:[7315119],SYRIAN_RESTAURANT:[7315120],TEPPANYAKI_RESTAURANT:[7315121],TIBETAN_RESTAURANT:[7315122],TUNISIAN_RESTAURANT:[7315123],VENEZUELAN_RESTAURANT:[7315125],PAKISTANI_RESTAURANT:[7315127],FONDUE_RESTAURANT:[7315134],SNACKS_RESTAURANT:[7315139],SOUP_RESTAURANT:[7315140],BUFFET_RESTAURANT:[7315142],SALAD_BAR:[7315143],TAKEOUT_FOOD:[7315145],BANQUET_ROOMS:[7315146],CAFETERIA:[7315147],SUSHI_RESTAURANT:[7315148],JUICE_BAR:[7315149],TOURIST_INFORMATION:[7316],MUSEUM:[7317],THEATER:[7318,7318005],CONCERT_HALL:[7318002],MUSIC_CENTER:[7318003],OPERA_HOUSE:[7318004],CABARET_THEATER:[7318006],AMPHITHEATER:[7318007],DINNER_THEATER:[7318008],CULTURAL_CENTER:[7319],SPORTS_CENTER:[7320,7320004],FITNESS_CLUB_AND_CENTER:[7320002],HORSE_RIDING:[7320003],THEMATIC_SPORT_CENTER:[7320005],SQUASH_COURT:[7320006],HOSPITAL:[7321],GENERAL_HOSPITAL_AND_POLYCLINIC:[7321002],SPECIAL_HOSPITAL:[7321003],HOSPITAL_OF_CHINESE_MEDICINE:[7321004],HOSPITAL_FOR_WOMEN_AND_CHILDREN:[7321005],POLICE_STATION:[7322],POST_OFFICE:[7324],PHARMACY:[7326],DEPARTMENT_STORE:[7327],BANK:[7328],MARKETPLACE:[7332],INFORMAL_MARKET:[7332002],PUBLIC_MARKET:[7332003],FARMERS_MARKET:[7332004],SUPERMARKET:[7332005],AGRICULTURE:[7335],HORTICULTURE:[7335002],PRIMARY_PRODUCER:[7335003],FARM:[7335004],VIEWPOINT:[7337],SWIMMING_POOL:[7338],RELIGIOUS_SITE:[7339],CHURCH:[7339002],MOSQUE:[7339003],SYNAGOG:[7339004],TEMPLE:[7339005],GURUDWARA:[7339006],PAGODA:[7339008],CASINO_AND_GAMBLING:[7341],CINEMA:[7342],MOVIE_THEATER:[7342002],DRIVE_IN_MOVIES:[7342003],MARINA:[7347,7347002],YACHT_BASIN:[7347003],WINERY:[7349],FERRY_TERMINAL:[7352],TRUCK_STOP:[7358],WEIGH_STATION:[7359,7359002],CAMPING_GROUND:[7360],RECREATIONAL_CAMPING_GROUND:[7360002],CARAVAN_SITE:[7360003],COMMUNITY_CENTER:[7363],EMBASSY:[7365],BORDER_CONTROL:[7366],GOVERNMENT_OFFICE:[7367],MOTORING_ORGANIZATION_OFFICE:[7368],OPEN_CAR_PARKING_AREA:[7369,7369002],SCHOOL:[7372,7372002],CHILDCARE:[7372003],PRE_SCHOOL:[7372004],PRIMARY_SCHOOL:[7372005],HIGH_SCHOOL:[7372006],SENIOR_HIGH_SCHOOL:[7372007],VOCATIONAL_SCHOOL:[7372008],LANGUAGE_SCHOOL:[7372010],ART_SCHOOL:[7372012],MIDDLE_SCHOOL:[7372014],DRIVING_SCHOOL:[7372016],MALL:[7373],STADIUM:[7374],ATHLETICS_TRACK:[7374002],CRICKET_GROUND:[7374003],SOCCER_STADIUM:[7374004],HORSE_RACING_TRACK:[7374005],MULTI_PURPOSE_STADIUM:[7374006],RUGBY_GROUND:[7374007],ICE_HOCKEY_ARENA:[7374008],BASEBALL_PARK:[7374009],FOOTBALL_STADIUM:[7374010],MOTOR_RACING_STADIUM:[7374011],BASKETBALL_ARENA:[7374012],RACE_TRACK:[7374013],NETBALL_STADIUM:[7374014],TOLL_GATE:[7375],TOURIST_ATTRACTION:[7376],BUILDING:[7376002],MONUMENT:[7376003],NATURAL_TOURIST_ATTRACTION:[7376004],OBSERVATORY:[7376005],PLANETARIUM:[7376006],DAM:[7376007],TUNNEL:[7376008],TOWER:[7376009],BRIDGE:[7376010],MAUSOLEUM_OR_GRAVE:[7376011],ARCH:[7376012],STATUE:[7376013],WATER_HOLE:[7376014],COLLEGE_OR_UNIVERSITY:[7377,7377002],JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE:[7377003],BUSINESS_PARK:[7378],RAILWAY_STATION:[7380],INTERNATIONAL_RAILROAD_STATION:[7380002],NATIONAL_RAILROAD_STATION:[7380003],URBAN_STATION:[7380004],SUBWAY_STATION:[7380005],AIRPORT:[7383],PUBLIC_AIRPORT:[7383002],PRIVATE_AIRPORT:[7383003],MILITARY_AIRPORT:[7383004],AIRFIELD:[7383005],COURIER_DROP_BOX:[7388],TRANSPORT_ACCESS:[7389],AIRLINE_ACCESS:[7389002],STATION_ACCESS:[7389003],SECURED_ENTRANCE:[7389004],SUBWAY_ENTRANCE:[7389999],EMERGENCY_MEDICAL_SERVICE:[7391],FIRE_STATION:[7392],REST_AREA:[7395],ATM:[7397],NATURAL_FEATURE:[8099],MOUNTAIN_PEAK:[8099002],CAVE:[8099003],RIDGE:[8099004],DUNE:[8099005],VALLEY:[8099006],PLAIN_OR_FLAT:[8099007],PLATEAU:[8099008],PAN:[8099009],WELL:[8099010],OASIS:[8099011],ROCKS:[8099012],RESERVOIR:[8099013],REEF:[8099014],RAPIDS:[8099015],BAY:[8099016],COVE:[8099017],HARBOR:[8099018],CAPE:[8099020],MINERAL_OR_HOT_SPRINGS:[8099021],ISLAND:[8099022],MARSH:[8099023],RIVER_CROSSING:[8099024],HILL:[8099025],QUARRY:[8099026],LOCALE:[8099027],PRIMARY_RESOURCE_UTILITY:[9150],TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION:[9151],NON_GOVERNMENTAL_ORGANIZATION:[9152],WELFARE_ORGANIZATION:[9153],PRISON:[9154],CAR_WASH:[9155,9155002],MANUFACTURING_FACILITY:[9156],RESEARCH_FACILITY:[9157],MEDIA_FACILITY:[9158],PORT_WAREHOUSE_FACILITY:[9159],EXCHANGE:[9160],STOCK_EXCHANGE:[9160002],GOLD_EXCHANGE:[9160003],FOREIGN_EXCHANGE:[9160004],COMPANY:[9352],SERVICE_COMPANY:[9352002],ADVERTISING_COMPANY:[9352003],COMPUTER_AND_DATA_SERVICES:[9352004],SOFTWARE_COMPANY:[9352005],DIVERSIFIED_FINANCIALS:[9352006],INSURANCE_COMPANY:[9352007],DELIVERY_SERVICE:[9352008],REAL_ESTATE_COMPANY:[9352009],MANUFACTURING_COMPANY:[9352011],AGRICULTURAL_TECHNOLOGY:[9352012],AUTOMOBILE_COMPANY:[9352013],CHEMICAL_COMPANY:[9352014],ELECTRONICS_COMPANY:[9352015],MECHANICAL_ENGINEERING:[9352016],PHARMACEUTICAL_COMPANY:[9352018],PUBLISHING_TECHNOLOGIES:[9352019],TELECOMMUNICATIONS:[9352020],TAX_SERVICES:[9352022],LEGAL_SERVICES:[9352023],TRANSPORT_COMPANY:[9352024],BUS_CHARTER_COMPANY:[9352025],TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE:[9352026],BUS_LINES:[9352027],SCHOOL_BUS_COMPANY:[9352028],CLEANING_SERVICES:[9352029],OIL_AND_NATURAL_GAS:[9352030],MINING_COMPANY:[9352031],CONSTRUCTION_COMPANY:[9352032],MOVING_AND_STORAGE_COMPANY:[9352033],AIRLINE_COMPANY:[9352034],FUNERAL_SERVICE_AND_MORTUARIES:[9352036],INVESTMENT_ADVISOR:[9352037],EQUIPMENT_RENTAL:[9352038],BUSINESS_SERVICES:[9352039],CABLE_AND_TELEPHONE_COMPANY:[9352040],AUTOMOBILE_MANUFACTURING:[9352041],IMPORT_OR_EXPORT_AND_DISTRIBUTION:[9352042],CATERING_SERVICES:[9352043],HOME_APPLIANCE_REPAIR:[9352044],ANIMAL_SHELTER:[9352045],WEDDING_SERVICES:[9352046],BEACH:[9357],RESTAURANT_AREA:[9359],ICE_RINK:[9360],SHOP_OR_STORE:[9361],BOOK_SHOP:[9361002],C_DS_DVD_VIDEOS:[9361003],CHILDREN_S_CLOTHES:[9361004],FOOTWEAR_SHOE_REPAIRS:[9361005],CLOTHING_SHOP:[9361006],MEN_S_CLOTHING:[9361007],WOMEN_S_CLOTHING:[9361008],CONVENIENCE_STORE:[9361009],DRY_CLEANER:[9361010],CAMERAS_AND_PHOTOGRAPHY:[9361011],COMPUTER_AND_COMPUTER_SUPPLIES:[9361012],CONSUMER_ELECTRONICS:[9361013],OFFICE_EQUIPMENT:[9361014],REAL_ESTATE_AGENT:[9361015],FACTORY_OUTLET:[9361016],FLORISTS:[9361017],BAKERY:[9361018],BUTCHER:[9361019],FISHMONGER:[9361020],FOOD_MARKET:[9361021],GREENGROCER:[9361022],GROCERY_STORE:[9361023],FOOD_AND_DRINKS_SHOP:[9361024],WINE_SPIRITS:[9361025],GIFTS_CARDS_NOVELTIES_SOUVENIRS:[9361026],HAIRDRESSER:[9361027],CARPET_FLOOR_COVERINGS:[9361028],CURTAINS_TEXTILES:[9361029],DO_IT_YOURSELF_CENTERS:[9361030],HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS:[9361031],GARDEN_CENTERS_SERVICES:[9361032],KITCHENS_BATHROOMS:[9361033],LIGHTING_SHOPS:[9361034],PAINTING_DECORATING:[9361035],JEWELRY_CLOCKS_WATCHES:[9361036],NEWSAGENTS_TOBACCONISTS:[9361037],OPTICIAN:[9361038],SPORTS_EQUIPMENT_AND_CLOTHING:[9361039],TOYS_GAMES_SHOP:[9361040],TRAVEL_AGENT:[9361041],CONSTRUCTION_MATERIAL_AND_EQUIPMENT:[9361042],MEDICAL_SUPPLIES_EQUIPMENT:[9361043],VIDEO_RENTAL_SHOP:[9361044],LAUNDRY:[9361045],PHOTO_LAB_OR_DEVELOPMENT:[9361046],PHOTOCOPY_SHOP:[9361047],ANIMAL_SERVICE:[9361048],ANTIQUE_ART_SHOP:[9361049],BEAUTY_SUPPLIES:[9361050],DRUG_STORE:[9361051],ELECTRICAL_APPLIANCES_SHOP:[9361052],HOBBY_SHOP:[9361053],FURNITURE_HOME_FURNISHINGS:[9361054],GLASSWARE_CERAMIC_SHOP:[9361055],LOCAL_SPECIALITIES_SHOP:[9361056],RECYCLING_SHOP:[9361057],BAGS_LEATHERWEAR:[9361058],MUSIC_INSTRUMENTS_STORE:[9361059],DELICATESSEN:[9361060],SPECIALTY_FOODS:[9361061],SHOPPING_SERVICE:[9361062],RETAIL_OUTLET:[9361063],PET_SUPPLIES:[9361064],WHOLESALE_CLUB:[9361066],BEAUTY_SALON:[9361067],NAIL_SALON:[9361068],HARDWARE_STORE:[9361069],PAWN_SHOP:[9361070],LOTTERY_SHOP:[9361071],BETTING_STATION:[9361072],AGRICULTURAL_SUPPLIES:[9361073],MOBILE_PHONE_SHOP:[9361075],DRIVE_THROUGH_BOTTLE_SHOP:[9361076],TAILOR_SHOP:[9361077],SECURITY_PRODUCTS:[9361078],SPECIALTY_CLOTHING_SHOP:[9361079],GLASS_WINDOWS_STORE:[9361080],VARIETY_STORE:[9361081],CHRISTMAS_OR_HOLIDAY_SHOP:[9361082],BOATING_EQUIPMENT_AND_ACCESSORIES:[9361083],PARK_AND_RECREATION_AREA:[9362],BATTLEFIELD:[9362002],CEMETERY:[9362003],HISTORIC_SITE:[9362004],HISTORICAL_PARK:[9362005],MEMORIAL:[9362007],PARK:[9362008],PARKWAY:[9362009],RECREATION_AREA:[9362011],WILDERNESS_AREA:[9362014],FOREST_AREA:[9362015],FISHING_AND_HUNTING_AREA:[9362016],FAIRGROUND:[9362017],SKI_RESORT:[9362026],BOAT_LAUNCHING_RAMP:[9362032],PICNIC_AREA:[9362033],PROTECTED_LAND:[9362037],COURTHOUSE:[9363],CANNABIS_SHOP:[9364],MEDICINAL_MARIJUANA_DISPENSARY:[9364002],RECREATIONAL_MARIJUANA_DISPENSARY:[9364003],MEDICINAL_AND_RECREATIONAL_DISPENSARY:[9364004],TENNIS_COURT:[9369],WATER_SPORT:[9371],DOCTOR:[9373],GENERAL_PRACTITIONER:[9373002],SPECIALIST:[9373003],DENTIST:[9374],VETERINARY:[9375],CAFE_PUB:[9376],CAFE:[9376002],PUB:[9376003],INTERNET_CAFE:[9376004],TEA_HOUSE:[9376005],COFFEE_SHOP:[9376006],MICROBREWERY:[9376007],EXHIBITION_CONVENTION_CENTER:[9377],LEISURE_CENTER:[9378],BOWLING_CENTER:[9378002],DANCE_STUDIO_AND_SCHOOL:[9378003],FLYING_CLUB:[9378004],SAUNA_SOLARIUM_MASSAGE:[9378005],NIGHTLIFE:[9379],DISCO_CLUB:[9379002],BAR:[9379004],COCKTAIL_BAR:[9379006],JAZZ_CLUB:[9379008],COMEDY_CLUB:[9379009],KARAOKE_CLUB:[9379010],COMMERCIAL_BUILDING:[9382],INDUSTRIAL_BUILDING:[9383],ABORIGINAL_LAND:[9389],HEALTHCARE_SERVICE:[9663],PERSONAL_SERVICE:[9663002],PERSONAL_CARE_FACILITY:[9663003],BLOOD_BANK:[9663004],AMBULANCE_UNIT:[9663005],ENTERTAINMENT:[9900],AMUSEMENT_PARK:[9902,9902003],AMUSEMENT_PLACE:[9902004],VEHICLE_DEALER:[9910],CAR_DEALER:[9910002],MOTORCYCLE_DEALER:[9910003],BOAT_DEALER:[9910004],RECREATIONAL_VEHICLE_DEALER:[9910005],TRUCK_DEALER:[9910006],VAN_DEALER:[9910007],BUS_DEALER:[9910008],ATV_DEALER:[9910009],GOLF_COURSE:[9911],PUBLIC_LIBRARY:[9913],ZOOS_ARBORETA_BOTANICAL_GARDEN:[9927],ARBORETA_AND_BOTANICAL_GARDENS:[9927002],ZOO:[9927003],AQUATIC_ZOO:[9927004],WILDLIFE_PARK:[9927005],RENTAL_CAR_PARKING:[9930],PUBLIC_AMENITY:[9932],PASSENGER_TRANSPORT_TICKET_OFFICE:[9932002],PEDESTRIAN_SUBWAY:[9932003],PUBLIC_CALL_BOX:[9932004],PUBLIC_BATHROOM:[9932005],RESCUE_SERVICE:[9932006],MOUNTAIN_PASS:[9935],CLUB_AND_ASSOCIATION:[9937],BEACH_CLUB:[9937002],HOCKEY_CLUB:[9937003],PUBLIC_TRANSPORT_STOP:[9942],BUS_STOP:[9942002],TAXI_STAND:[9942003],STREETCAR_STOP:[9942004],EMERGENCY_ROOM:[9956],RESIDENTIAL_ENTRANCE:[9999]},poiCategoriesToID=Object.fromEntries(Object.entries(poiCategoriesToIDs).map(([A,E])=>[A,E[0]])),poiIDsToCategories=Object.fromEntries(Object.entries(poiCategoriesToIDs).flatMap(([A,E])=>E.map(E=>[E,A]))),projectAlongRouteLocation=(A,E)=>nearestPointOnLine(A,getPositionStrict(E)).properties.location,findInsertionSlot=(A,E)=>{for(let R=0;R<A.length-1;R++)if(E>=A[R]&&E<=A[R+1])return R+1;return E<A[0]?0:A.length},findBestWaypointInsertionIndex=(A,E,R)=>findBestWaypointInsertionIndices(A,E,[R])[0],findBestWaypointInsertionIndices=(A,E,R)=>{if(0===R.length)return[];if(0===A.geometry.coordinates.length||E.length<2)return R.map(()=>0);const T=E.map(E=>projectAlongRouteLocation(A,E)??0);return R.map(E=>{const R=projectAlongRouteLocation(A,E);return void 0===R?0:findInsertionSlot(T,R)})},withInsertedWaypoint=(A,E,R)=>withInsertedWaypoints(A,E,[R]),withInsertedWaypoints=(A,E,R)=>{if(0===R.length)return E.slice();if(0===A.geometry.coordinates.length||E.length<2)return[...R,...E];const T=E.map(E=>projectAlongRouteLocation(A,E)??0),I=Array.from({length:E.length+1},()=>[]);for(let _=0;_<R.length;_++){const E=R[_],N=projectAlongRouteLocation(A,E);I[void 0===N?0:findInsertionSlot(T,N)].push({waypoint:E,location:N??0,inputIndex:_})}for(const _ of I)_.sort((A,E)=>A.location-E.location||A.inputIndex-E.inputIndex);const N=[];for(let _=0;_<E.length;_++){for(const A of I[_])N.push(A.waypoint);N.push(E[_])}for(const _ of I[E.length])N.push(_.waypoint);return N},calculateProgressAtRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R||0===R.length)return;const T=A.geometry.coordinates.length;if(E<0||E>=T)return;const I=findBracketingProgressPoints(R,"pointIndex",E);if(!I)return;const{lower:N,lowerVal:_,upper:S,upperVal:e}=I,t=N.distanceInMeters,O=S.distanceInMeters,C=N.travelTimeInSeconds,o=S.travelTimeInSeconds;if(void 0===t||void 0===O||void 0===C||void 0===o)return;if(_===e)return{distanceInMeters:t,travelTimeInSeconds:C};const n=lengthShareOfBracket(A.geometry.coordinates,_,E,e);return{distanceInMeters:t+n*(O-t),travelTimeInSeconds:C+n*(o-C)}},getRouteProgressBetween=(A,E,R)=>{const T=calculateProgressAtRoutePoint(A,E),I=calculateProgressAtRoutePoint(A,R);if(T&&I)return{start:T,end:I,delta:{distanceInMeters:I.distanceInMeters-T.distanceInMeters,travelTimeInSeconds:I.travelTimeInSeconds-T.travelTimeInSeconds}}},getRouteProgressForSection=(A,E)=>getRouteProgressBetween(A,E.startPointIndex,E.endPointIndex),getSectionBBox=(A,E)=>{const R=A.geometry.coordinates;if(!R||0===R.length||E.startPointIndex<0||E.endPointIndex>=R.length||E.startPointIndex>E.endPointIndex)return;const T=R[E.startPointIndex],I=R[E.endPointIndex],N=R[Math.floor((E.startPointIndex+E.endPointIndex)/2)];let _=bboxExpandedWithPosition(T);return _=bboxExpandedWithPosition(N,_),_=bboxExpandedWithPosition(I,_),_},firstProgressIndexPast=(A,E,R)=>{let T=A.length,I=0,N=A.length;for(;I<N;){const _=I+N>>>1;let S=_;for(;S<N&&void 0===A[S][E];)S++;const e=S<N?A[S][E]:void 0;void 0===e?N=_:R(e)?(T=S,N=_):I=S+1}return T},findBracketingProgressPoints=(A,E,R)=>{const T=A[firstProgressIndexPast(A,E,A=>A>=R)];let I=firstProgressIndexPast(A,E,A=>A>R)-1;for(;I>=0&&void 0===A[I][E];)I--;const N=A[I],_=N?.[E],S=T?.[E];return void 0!==_&&void 0!==S?{lower:N,lowerVal:_,upper:T,upperVal:S}:void 0},metersAlongLineCache=/* @__PURE__ */new WeakMap,metersAlongLine=A=>{const E=metersAlongLineCache.get(A);if(E?.length===A.length)return E;const R=new Float64Array(A.length);for(let T=1;T<A.length;T++)R[T]=R[T-1]+distance(A[T-1],A[T],{units:"meters"});return metersAlongLineCache.set(A,R),R},lengthShareOfBracket=(A,E,R,T)=>{const I=metersAlongLine(A),N=I[T]-I[E];return N>0?(I[R]-I[E])/N:(R-E)/(T-E)},interpolateProgressAtPathIndex=(A,E,R)=>{const T=A.geometry.coordinates,I=Math.min(E+1,T.length-1),N=T[E],_=T[I],S=calculateProgressAtRoutePoint(A,E),e=calculateProgressAtRoutePoint(A,I);if(S&&e)return{position:[N[0]+R*(_[0]-N[0]),N[1]+R*(_[1]-N[1])],travelTimeInSeconds:S.travelTimeInSeconds+R*(e.travelTimeInSeconds-S.travelTimeInSeconds),distanceInMeters:S.distanceInMeters+R*(e.distanceInMeters-S.distanceInMeters)}},resolveCoordinateAtProgress=(A,E,R)=>{const{progress:T}=A.properties;if(!T||0===T.length)return;const I=A.geometry.coordinates,N=T[0],_=T.at(-1),S=N[E],e=_[E];if(void 0===S||void 0===e)return;if(R<=S)return{position:I[N.pointIndex],travelTimeInSeconds:N.travelTimeInSeconds??0,distanceInMeters:N.distanceInMeters??0};if(R>=e)return{position:I[_.pointIndex],travelTimeInSeconds:_.travelTimeInSeconds??0,distanceInMeters:_.distanceInMeters??0};const t=((A,E,R,T)=>{const I=findBracketingProgressPoints(A,R,T);if(!I)return;const{lower:N,lowerVal:_,upper:S,upperVal:e}=I,t=_===e?0:(T-_)/(e-_),O=metersAlongLine(E),C=O[S.pointIndex]-O[N.pointIndex];if(0===C){const A=N.pointIndex+t*(S.pointIndex-N.pointIndex),E=Math.floor(A);return{pathIndex:E,progressRatioTowardsNextPathPoint:A-E}}const o=O[N.pointIndex]+t*C,n=clamp(sortedIndex(O,o)-1,N.pointIndex,S.pointIndex-1),r=O[n+1]-O[n];return{pathIndex:n,progressRatioTowardsNextPathPoint:r>0?(o-O[n])/r:0}})(T,I,E,R);return void 0!==t?interpolateProgressAtPathIndex(A,t.pathIndex,t.progressRatioTowardsNextPathPoint):void 0},getCoordinateAtRouteProgress=(A,E)=>{if("traveledTimeInSeconds"in E)return resolveCoordinateAtProgress(A,"travelTimeInSeconds",E.traveledTimeInSeconds);if("traveledDistanceInMeters"in E)return resolveCoordinateAtProgress(A,"distanceInMeters",E.traveledDistanceInMeters);const R=A.properties.summary.departureTime;if(!R)return;const T=(E.clockTime.getTime()-R.getTime())/1e3;return T<0?void 0:resolveCoordinateAtProgress(A,"travelTimeInSeconds",T)},getProgressAtNearestRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R?.length)return;const T=A.geometry.coordinates,I=nearestPointOnLine(A,getPositionStrict(E)),N=I.properties.index??0,_=Math.min(N+1,T.length-1),S=T[N],e=T[_],t=((A,E,R)=>{const T=R[0]-A[0],I=R[1]-A[1],N=T*T+I*I;if(0===N)return 0;const _=((E[0]-A[0])*T+(E[1]-A[1])*I)/N;return clamp(_,0,1)})(S,I.geometry.coordinates,e);return interpolateProgressAtPathIndex(A,N,t)},getRoutePlanningLocationType=A=>Array.isArray(A)?Array.isArray(A[0])?"path":"waypoint":"Feature"===A.type&&"LineString"===A.geometry.type?"path":"waypoint",sdkErrorCodeForStatus=A=>401===A?"INVALID_CREDENTIALS":403===A?"INSUFFICIENT_PERMISSIONS":404===A?"NOT_FOUND":429===A?"RATE_LIMITED":A>=500?"LIVE_SERVICE_NOT_AVAILABLE":A>=400?"INVALID_REQUEST":"INTERNAL",retryableCodes=/* @__PURE__ */new Set(["RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE"]),canRetrySDKErrorCode=A=>retryableCodes.has(A),indexedMagnitudes=["unknown","minor","moderate","major","indefinite"],iconCategoryMap={1:"accident",2:"fog",3:"danger",4:"rain",5:"frost",6:"jam",7:"lane-closed",8:"road-closed",9:"roadworks",10:"wind",11:"flooding",12:"animals-on-road",13:"narrow-lanes",14:"broken-down-vehicle"},categoryToIconMap=Object.fromEntries(Object.entries(iconCategoryMap).map(([A,E])=>[E,Number(A)])),iconToTrafficIncidentCategory=A=>iconCategoryMap[A]??"other",trafficIncidentToIconCategory=A=>categoryToIconMap[A]??0,minuteUnits=A=>A?.minutes??"min",formatDuration=(A,E)=>{if(A){const T=Math.abs(A)/3600;let I=Math.floor(T),N=Math.round(T%1*60);60===N&&(N=0,I++);const _={...TomTomConfig.instance.get().displayUnits?.time,...E};if(I)return`${I} ${R=_,R?.hours??"hr"} ${N.toString().padStart(2,"0")} ${minuteUnits(_)}`;if(N)return`${N.toString()} ${minuteUnits(_)}`}var R},MILE_IN_METERS=1609.344,meterUnits=A=>A?.meters??"m",kmUnits=A=>A?.kilometers??"km",formatMiles=(A,E,R)=>E<3?((A,E,R)=>{const T=Number.parseInt(E.toString()),I=E-T,N=A<0?"-":"";if(I<.125)return`${N}${T} ${R}`;const _=T>0?T:"";return I<.375?`${N}${_}¼ ${R}`:I<.625?`${N}${_}½ ${R}`:I<.875?`${N}${_}¾ ${R}`:`${N}${T+1} ${R}`})(A,E,R):E<10?((A,E,R)=>{const T=Number.parseInt(E.toString()),I=E-T,N=A<0?"-":"";return I<.25?`${N}${T} ${R}`:I<.75?`${N}${T}½ ${R}`:`${N}${T+1} ${R}`})(A,E,R):`${Math.round(A)} ${R}`,mileUnitsWithDefault=A=>A.miles??"mi",formatUs=(A,E)=>{const R=A/1609.344,T=Math.abs(R);return T<.125?((A,E)=>{const R=Math.round(A/.3048),T=Math.abs(R);return T<30?`${R} ${E}`:T<500?`${10*Math.round(R/10)} ${E}`:`${100*Math.round(R/100)} ${E}`})(A,E.feet??"ft"):formatMiles(R,T,mileUnitsWithDefault(E))},formatUk=(A,E)=>{const R=A/1609.344,T=Math.abs(R);return T<.125?((A,E)=>{const R=Math.round(A/.9144);return Math.abs(R)<10?`${Math.round(R)} ${E}`:`${10*Math.round(R/10)} ${E}`})(A,E.yards??"yd"):formatMiles(R,T,mileUnitsWithDefault(E))},formatDistance=(A,E)=>{if(isNil(A))return"";const R={...TomTomConfig.instance.get().displayUnits?.distance,...E};switch(R?.type??"metric"){case"metric":return((A,E)=>{const R=Math.abs(A);if(R<10)return`${A} ${meterUnits(E)}`;if(R<500)return`${10*Math.round(A/10)} ${meterUnits(E)}`;if(R<1e3){const R=100*Math.round(A/100);return 1e3===R||-1e3===R?`${A<0?"-":""}1 ${kmUnits(E)}`:`${R} ${meterUnits(E)}`}return R<1e4?`${100*Math.round(A/100)/1e3} ${kmUnits(E)}`:`${Math.round(A/1e3)} ${kmUnits(E)}`})(A,R);case"imperial_us":return formatUs(A,R);case"imperial_uk":return formatUk(A,R)}};export{DEFAULT_COMMON_BASE_URL,MILE_IN_METERS,TOMTOM_USER_AGENT_SDK_NAME,TomTomConfig,areaAnalyticsMetricKeys,avoidableTypes,bboxCenter,bboxFromBBoxes,bboxFromCoordsArray,bboxFromGeoJSON,bboxOnlyIfWithArea,budgetTypes,budgetUnits,calculateProgressAtRoutePoint,canRetrySDKErrorCode,chargingPointCapabilities,chargingPointRestrictions,connectorTypes,currentTypes,defaultConfig,findBestWaypointInsertionIndex,findBestWaypointInsertionIndices,formatDistance,formatDuration,fullTrafficIncidentCategories,generateId,generateTomTomHeaders,geographyTypes,geopoliticalViews,getCoordinateAtRouteProgress,getPosition,getPositionStrict,getProgressAtNearestRoutePoint,getRoutePlanningLocationType,getRouteProgressBetween,getRouteProgressForSection,getSectionBBox,iconToTrafficIncidentCategory,indexedMagnitudes,inputSectionTypes,inputSectionTypesWithGuidance,insecureBaseURLMessage,isBBoxWithArea,isProxyCredentialsMode,isSecureBaseURL,mergeFromGlobal,placeTypes,poiCategories,poiCategoriesToID,poiCategoriesToIDs,poiIDsToCategories,polygonFromBBox,sdkErrorCodeForStatus,sdkErrorCodes,sectionTypes,toPointGeometry,trafficIncidentRequestCategories,trafficIncidentTimeValidities,trafficIncidentToIconCategory,withInsertedWaypoint,withInsertedWaypoints};
|
|
1
|
+
import{distance,nearestPointOnLine}from"@turf/turf";import{isNil}from"lodash-es";var definedFields=A=>Object.fromEntries(Object.entries(A??{}).filter(([,A])=>void 0!==A)),pickKeys=(A,E)=>Object.fromEntries(E.filter(E=>E in A).map(E=>[E,A[E]])),DEFAULT_COMMON_BASE_URL="https://api.tomtom.com",defaultRetryConfig={initialWaitMs:.447,backoffFactor:1.618,timeoutMs:4e4},defaultConfig={commonBaseURL:"https://api.tomtom.com",apiKey:"",retry:defaultRetryConfig},withRetryDefaults=(...A)=>A.reduce((A,E)=>({...A,...definedFields(E)}),{...defaultRetryConfig}),copyOfDefaultConfig=()=>({...defaultConfig,retry:withRetryDefaults()}),TomTomConfig=class A{static{this.instance=new A}constructor(){this.config=copyOfDefaultConfig()}put(A){this.config={...this.config,...A,...A.retry&&{retry:withRetryDefaults(A.retry)}}}reset(){this.config=copyOfDefaultConfig()}get(){return this.config}},mergeFromGlobal=(A={})=>{const E=TomTomConfig.instance.get(),R={...E,...A};return{...R,retry:R.retry&&withRetryDefaults(E.retry,A.retry)}},isProxyCredentialsMode=(A=TomTomConfig.instance.get())=>!A.apiKey&&"https://api.tomtom.com"!==(A.commonBaseURL??"https://api.tomtom.com"),LOOPBACK_IPV4=/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,isSecureBaseURL=A=>{let E;try{E=new URL(A)}catch{return!0}if("https:"===E.protocol)return!0;const{hostname:R}=E;return"http:"===E.protocol&&("localhost"===R||R.endsWith(".localhost")||"[::1]"===R||LOOPBACK_IPV4.test(R))},insecureBaseURLMessage=A=>`commonBaseURL ${A} is not https:, so requests to it would carry the API key in the clear; only loopback addresses may use http:.`,geopoliticalViews=["Unified","AE","AR","BN","CL","CN","DZ","IL","IN","KR","MA","MY","PH","PK","RS","RU","TR","TW","US","VN"],languages=["ngt","ngt-Latn","ar","bg-BG","zh-Hant","zh-Hans","cs-CZ","da-DK","nl-NL","en-AU","en-CA","en-GB","en-NZ","en-US","fi-FI","fr-FR","de-DE","el-GR","hu-HU","id-ID","it-IT","ko-KR","ko-Latn-KR","lt-LT","ms-MY","nb-NO","pl-PL","pt-BR","pt-PT","ru-RU","ru-Latn-RU","ru-Cyrl-RU","sk-SK","sl-SI","es-ES","es-MX","sv-SE","th-TH","tr-TR"],chargingPointCapabilities=["ChargingProfileCapable","ChargingPreferencesCapable","ChipCardSupport","ContactlessCardSupport","CreditCardPayable","DebitCardPayable","PedTerminal","RemoteStartStopCapable","Reservable","RfidReader","StartSessionConnectorRequired","TokenGroupCapable","UnlockCapable","PlugAndCharge","Unknown"],chargingPointRestrictions=["EvOnly","Plugged","Disabled","Customers","Motorcycles"],connectorTypes=["StandardHouseholdCountrySpecific","IEC62196Type1","IEC62196Type1CCS","IEC62196Type2CableAttached","IEC62196Type2Outlet","IEC62196Type2CCS","IEC62196Type3","Chademo","GBT20234Part2","GBT20234Part3","IEC60309AC3PhaseRed","IEC60309AC1PhaseBlue","IEC60309DCWhite","Tesla"],currentTypes=["AC1","AC3","DC"],geographyTypes=["Country","CountrySubdivision","CountrySecondarySubdivision","CountryTertiarySubdivision","Municipality","MunicipalitySubdivision","MunicipalitySecondarySubdivision","Neighbourhood","PostalCodeArea"],placeTypes=["POI","Street","Geography","Point Address","Address Range","Cross Street"],poiCategories=["ABORIGINAL_LAND","ADVENTURE_SPORTS_FACILITY","ADVENTURE_VEHICLE_TRAIL","ADVERTISING_COMPANY","AFGHAN_RESTAURANT","AFRICAN_RESTAURANT","AGRICULTURAL_SUPPLIES","AGRICULTURAL_TECHNOLOGY","AGRICULTURE","AIRFIELD","AIRLINE_ACCESS","AIRLINE_COMPANY","AIRPORT","AMBULANCE_UNIT","AMERICAN_RESTAURANT","AMPHITHEATER","AMUSEMENT_PARK","AMUSEMENT_PARK_GENERIC","AMUSEMENT_PLACE","ANIMAL_SERVICE","ANIMAL_SHELTER","ANTIQUE_ART_SHOP","APARTMENT_RENTAL","AQUATIC_ZOO","ARABIAN_RESTAURANT","ARBORETA_AND_BOTANICAL_GARDENS","ARCH","ARMENIAN_RESTAURANT","ART_SCHOOL","ASIAN_RESTAURANT","ATHLETICS_TRACK","ATM","ATV_DEALER","AUSTRALIAN_RESTAURANT","AUSTRIAN_RESTAURANT","AUTOMOBILE_COMPANY","AUTOMOBILE_MANUFACTURING","BAGS_LEATHERWEAR","BAKERY","BANDB_OR_GUEST_HOUSE","BANK","BANQUET_ROOMS","BAR","BARBECUE_RESTAURANT","BASEBALL_PARK","BASKETBALL_ARENA","BASQUE_RESTAURANT","BATTLEFIELD","BAY","BEACH","BEACH_CLUB","BEAUTY_SALON","BEAUTY_SUPPLIES","BELGIAN_RESTAURANT","BETTING_STATION","BISTRO","BLOOD_BANK","BOATING_EQUIPMENT_AND_ACCESSORIES","BOAT_DEALER","BOAT_LAUNCHING_RAMP","BODYSHOP","BOLIVIAN_RESTAURANT","BOOK_SHOP","BORDER_CONTROL","BOWLING_CENTER","BRAZILIAN_RESTAURANT","BRIDGE","BRITISH_RESTAURANT","BUFFET_RESTAURANT","BUILDING","BULGARIAN_RESTAURANT","BUNGALOW_RENTAL","BURMESE_RESTAURANT","BUSINESS_PARK","BUSINESS_SERVICES","BUS_CHARTER_COMPANY","BUS_DEALER","BUS_LINES","BUS_STOP","BUTCHER","CABARET_THEATER","CABINS_LODGES","CABLE_AND_TELEPHONE_COMPANY","CAFE","CAFETERIA","CAFE_PUB","CALIFORNIAN_RESTAURANT","CAMBODIAN_RESTAURANT","CAMERAS_AND_PHOTOGRAPHY","CAMPING_GROUND","CANADIAN_RESTAURANT","CANNABIS_SHOP","CAPE","CARAVAN_SITE","CARIBBEAN_RESTAURANT","CARPET_FLOOR_COVERINGS","CAR_DEALER","CAR_GLASS_REPLACEMENT_SHOP","CAR_RENTAL","CAR_REPAIR_AND_SERVICE","CAR_WASH","CAR_WASH_GENERIC","CASINO_AND_GAMBLING","CATERING_SERVICES","CAVE","CEMETERY","CHALET_RENTAL","CHARGING_LOCATION","CHEMICAL_COMPANY","CHICKEN_RESTAURANT","CHILDCARE","CHILDREN_S_CLOTHES","CHILEAN_RESTAURANT","CHINESE_RESTAURANT","CHRISTMAS_OR_HOLIDAY_SHOP","CHURCH","CINEMA","CLEANING_SERVICES","CLOTHING_SHOP","CLUB_AND_ASSOCIATION","COCKTAIL_BAR","COFFEE_SHOP","COLLEGE_OR_UNIVERSITY","COLLEGE_OR_UNIVERSITY_GENERIC","COLOMBIAN_RESTAURANT","COMEDY_CLUB","COMMERCIAL_BUILDING","COMMUNITY_CENTER","COMPANY","COMPUTER_AND_COMPUTER_SUPPLIES","COMPUTER_AND_DATA_SERVICES","CONCERT_HALL","CONSTRUCTION_COMPANY","CONSTRUCTION_MATERIAL_AND_EQUIPMENT","CONSUMER_ELECTRONICS","CONVENIENCE_STORE","CORSICAN_RESTAURANT","COTTAGE_RENTAL","COURIER_DROP_BOX","COURTHOUSE","COVE","CREOLE_RESTAURANT","CREPERIE","CRICKET_GROUND","CUBAN_RESTAURANT","CULTURAL_CENTER","CURTAINS_TEXTILES","CZECH_RESTAURANT","C_DS_DVD_VIDEOS","DAM","DANCE_STUDIO_AND_SCHOOL","DANISH_RESTAURANT","DELICATESSEN","DELIVERY_SERVICE","DENTIST","DEPARTMENT_STORE","DINNER_THEATER","DISCO_CLUB","DIVERSIFIED_FINANCIALS","DOCTOR","DONGBEI_RESTAURANT","DOUGHNUT_RESTAURANT","DO_IT_YOURSELF_CENTERS","DRIVE_IN_MOVIES","DRIVE_THROUGH_BOTTLE_SHOP","DRIVING_SCHOOL","DRUG_STORE","DRY_CLEANER","DUNE","DUTCH_RESTAURANT","EGYPTIAN_RESTAURANT","ELECTRICAL_APPLIANCES_SHOP","ELECTRONICS_COMPANY","EMBASSY","EMERGENCY_MEDICAL_SERVICE","EMERGENCY_ROOM","ENGLISH_RESTAURANT","ENTERTAINMENT","EQUIPMENT_RENTAL","ETHIOPIAN_RESTAURANT","EXCHANGE","EXHIBITION_CONVENTION_CENTER","FACTORY_OUTLET","FAIRGROUND","FARM","FARMERS_MARKET","FAST_FOOD","FERRY_TERMINAL","FINNISH_RESTAURANT","FIRE_STATION","FISHING_AND_HUNTING_AREA","FISHMONGER","FITNESS_CLUB_AND_CENTER","FLATS_OR_APARTMENT_COMPLEX","FLORISTS","FLYING_CLUB","FONDUE_RESTAURANT","FOOD_AND_DRINKS_SHOP","FOOD_MARKET","FOOTBALL_STADIUM","FOOTWEAR_SHOE_REPAIRS","FOREIGN_EXCHANGE","FOREST_AREA","FRENCH_RESTAURANT","FUEL_STATION","FUNERAL_SERVICE_AND_MORTUARIES","FURNITURE_HOME_FURNISHINGS","FUSION_RESTAURANT","GARDEN_CENTERS_SERVICES","GENERAL_HOSPITAL_AND_POLYCLINIC","GENERAL_PRACTITIONER","GERMAN_RESTAURANT","GIFTS_CARDS_NOVELTIES_SOUVENIRS","GLASSWARE_CERAMIC_SHOP","GLASS_WINDOWS_STORE","GOLD_EXCHANGE","GOLF_COURSE","GOVERNMENT_OFFICE","GREEK_RESTAURANT","GREENGROCER","GRILL_RESTAURANT","GROCERY_STORE","GURUDWARA","HAIRDRESSER","HAMBURGER_RESTAURANT","HARBOR","HARDWARE_STORE","HAWAIIAN_RESTAURANT","HEALTHCARE_SERVICE","HELIPORT_OR_HELIPAD","HIGH_SCHOOL","HIKING_TRAIL","HILL","HISTORICAL_PARK","HISTORIC_SITE","HOBBY_SHOP","HOCKEY_CLUB","HOLIDAY_RENTAL","HOME_APPLIANCE_REPAIR","HORSE_RACING_TRACK","HORSE_RIDING","HORSE_RIDING_TRAIL","HORTICULTURE","HOSPITAL","HOSPITAL_FOR_WOMEN_AND_CHILDREN","HOSPITAL_OF_CHINESE_MEDICINE","HOSTEL","HOTEL","HOTEL_OR_MOTEL","HOT_POT_RESTAURANT","HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS","HUNAN_RESTAURANT","HUNGARIAN_RESTAURANT","ICE_CREAM_PARLOR","ICE_HOCKEY_ARENA","ICE_RINK","IMPORT_OR_EXPORT_AND_DISTRIBUTION","INDIAN_RESTAURANT","INDONESIAN_RESTAURANT","INDUSTRIAL_BUILDING","INFORMAL_MARKET","INSURANCE_COMPANY","INTERNATIONAL_RAILROAD_STATION","INTERNATIONAL_RESTAURANT","INTERNET_CAFE","INVESTMENT_ADVISOR","IRANIAN_RESTAURANT","IRISH_RESTAURANT","ISLAND","ISRAELI_RESTAURANT","ITALIAN_RESTAURANT","JAMAICAN_RESTAURANT","JAPANESE_RESTAURANT","JAZZ_CLUB","JEWELRY_CLOCKS_WATCHES","JEWISH_RESTAURANT","JUICE_BAR","JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE","KARAOKE_CLUB","KITCHENS_BATHROOMS","KOREAN_RESTAURANT","KOSHER_RESTAURANT","LANGUAGE_SCHOOL","LATIN_AMERICAN_RESTAURANT","LAUNDRY","LEBANESE_RESTAURANT","LEGAL_SERVICES","LEISURE_CENTER","LIGHTING_SHOPS","LOCALE","LOCAL_SPECIALITIES_SHOP","LOTTERY_SHOP","MALL","MANUFACTURING_COMPANY","MANUFACTURING_FACILITY","MARINA","MARINA_GENERIC","MARKETPLACE","MARSH","MAUSOLEUM_OR_GRAVE","MECHANICAL_ENGINEERING","MEDIA_FACILITY","MEDICAL_SUPPLIES_EQUIPMENT","MEDICINAL_AND_RECREATIONAL_DISPENSARY","MEDICINAL_MARIJUANA_DISPENSARY","MEDITERRANEAN_RESTAURANT","MEMORIAL","MEN_S_CLOTHING","MEXICAN_RESTAURANT","MICROBREWERY","MIDDLE_EASTERN_RESTAURANT","MIDDLE_SCHOOL","MILITARY_AIRPORT","MINERAL_OR_HOT_SPRINGS","MINING_COMPANY","MOBILE_PHONE_SHOP","MONGOLIAN_RESTAURANT","MONUMENT","MOROCCAN_RESTAURANT","MOSQUE","MOTEL","MOTORCYCLE_DEALER","MOTORCYCLE_REPAIR","MOTORING_ORGANIZATION_OFFICE","MOTOR_RACING_STADIUM","MOUNTAIN_BIKE_TRAIL","MOUNTAIN_PASS","MOUNTAIN_PEAK","MOVIE_THEATER","MOVING_AND_STORAGE_COMPANY","MULTI_PURPOSE_STADIUM","MUSEUM","MUSIC_CENTER","MUSIC_INSTRUMENTS_STORE","NAIL_SALON","NATIONAL_RAILROAD_STATION","NATURAL_FEATURE","NATURAL_TOURIST_ATTRACTION","NEPALESE_RESTAURANT","NETBALL_STADIUM","NEWSAGENTS_TOBACCONISTS","NIGHTLIFE","NON_GOVERNMENTAL_ORGANIZATION","NORWEGIAN_RESTAURANT","OASIS","OBSERVATORY","OFFICE_EQUIPMENT","OIL_AND_NATURAL_GAS","OPEN_CAR_PARKING_AREA","OPEN_CAR_PARKING_AREA_GENERIC","OPERA_HOUSE","OPTICIAN","ORGANIC_FOOD_RESTAURANT","ORIENTAL_RESTAURANT","PAGODA","PAINTING_DECORATING","PAKISTANI_RESTAURANT","PAN","PARK","PARKING_GARAGE","PARKWAY","PARK_AND_RECREATION_AREA","PASSENGER_TRANSPORT_TICKET_OFFICE","PAWN_SHOP","PEDESTRIAN_SUBWAY","PERSONAL_CARE_FACILITY","PERSONAL_SERVICE","PERUVIAN_RESTAURANT","PET_SUPPLIES","PHARMACEUTICAL_COMPANY","PHARMACY","PHILIPPINE_RESTAURANT","PHOTOCOPY_SHOP","PHOTO_LAB_OR_DEVELOPMENT","PICNIC_AREA","PIZZERIA","PLAIN_OR_FLAT","PLANETARIUM","PLATEAU","POLICE_STATION","POLISH_RESTAURANT","PORTUGUESE_RESTAURANT","PORT_WAREHOUSE_FACILITY","POST_OFFICE","PRE_SCHOOL","PRIMARY_PRODUCER","PRIMARY_RESOURCE_UTILITY","PRIMARY_SCHOOL","PRISON","PRIVATE_AIRPORT","PROTECTED_LAND","PUB","PUBLIC_AIRPORT","PUBLIC_AMENITY","PUBLIC_BATHROOM","PUBLIC_CALL_BOX","PUBLIC_LIBRARY","PUBLIC_MARKET","PUBLIC_TRANSPORT_STOP","PUBLISHING_TECHNOLOGIES","QUARRY","RACE_TRACK","RAILWAY_STATION","RAPIDS","REAL_ESTATE_AGENT","REAL_ESTATE_COMPANY","RECREATIONAL_CAMPING_GROUND","RECREATIONAL_MARIJUANA_DISPENSARY","RECREATIONAL_VEHICLE_DEALER","RECREATION_AREA","RECYCLING_SHOP","REEF","RELIGIOUS_SITE","RENTAL_CAR_PARKING","RESCUE_SERVICE","RESEARCH_FACILITY","RESERVOIR","RESIDENTIAL_ACCOMMODATION","RESIDENTIAL_ENTRANCE","RESORT","RESTAURANT","RESTAURANT_AREA","REST_AREA","REST_CAMP","RETAIL_OUTLET","RETIREMENT_COMMUNITY","RIDGE","RIVER_CROSSING","ROCKS","ROCK_CLIMBING_TRAIL","RUGBY_GROUND","RUSSIAN_RESTAURANT","SALAD_BAR","SANDWICH_RESTAURANT","SAUNA_SOLARIUM_MASSAGE","SCANDINAVIAN_RESTAURANT","SCHOOL","SCHOOL_BUS_COMPANY","SCHOOL_GENERIC","SEAFOOD","SECURED_ENTRANCE","SECURITY_PRODUCTS","SENIOR_HIGH_SCHOOL","SERVICE_COMPANY","SHANDONG_RESTAURANT","SHOPPING_SERVICE","SHOP_OR_STORE","SICHUAN_RESTAURANT","SKI_RESORT","SNACKS_RESTAURANT","SOCCER_STADIUM","SOFTWARE_COMPANY","SOUL_FOOD","SOUP_RESTAURANT","SPANISH_RESTAURANT","SPECIALIST","SPECIALTY_CLOTHING_SHOP","SPECIALTY_FOODS","SPECIAL_HOSPITAL","SPORTS_CENTER","SPORTS_CENTER_GENERIC","SPORTS_EQUIPMENT_AND_CLOTHING","SQUASH_COURT","STADIUM","STATION_ACCESS","STATUE","STEAK_HOUSE","STOCK_EXCHANGE","STREETCAR_STOP","SUBWAY_ENTRANCE","SUBWAY_STATION","SUPERMARKET","SUSHI_RESTAURANT","SWEDISH_RESTAURANT","SWIMMING_POOL","SWISS_RESTAURANT","SYNAGOG","SYRIAN_RESTAURANT","TAILOR_SHOP","TAIWANESE_RESTAURANT","TAKEOUT_FOOD","TAPAS_RESTAURANT","TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE","TAXI_STAND","TAX_SERVICES","TEA_HOUSE","TELECOMMUNICATIONS","TEMPLE","TENNIS_COURT","TEPPANYAKI_RESTAURANT","THAI_RESTAURANT","THEATER","THEATER_GENERIC","THEMATIC_SPORT_CENTER","TIBETAN_RESTAURANT","TIRE_SERVICE","TOLL_GATE","TOURIST_ATTRACTION","TOURIST_INFORMATION","TOWER","TOYS_GAMES_SHOP","TRAFFIC_CONTROL_DEPARTMENT","TRAFFIC_CONTROL_DEPARTMENT_GENERIC","TRAIL_SYSTEM","TRANSPORT_ACCESS","TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION","TRANSPORT_COMPANY","TRAVEL_AGENT","TRUCK_DEALER","TRUCK_REPAIR_AND_SERVICE","TRUCK_STOP","TUNISIAN_RESTAURANT","TUNNEL","TURKISH_RESTAURANT","URBAN_STATION","VALLEY","VAN_DEALER","VARIETY_STORE","VEGETARIAN_RESTAURANT","VEHICLE_DEALER","VEHICLE_REPAIR","VENEZUELAN_RESTAURANT","VETERINARY","VIDEO_RENTAL_SHOP","VIETNAMESE_RESTAURANT","VIEWPOINT","VILLA_RENTAL","VOCATIONAL_SCHOOL","WATER_HOLE","WATER_SPORT","WEDDING_SERVICES","WEIGH_STATION","WEIGH_STATION_GENERIC","WELFARE_ORGANIZATION","WELL","WESTERN_RESTAURANT","WHOLESALE_CLUB","WILDERNESS_AREA","WILDLIFE_PARK","WINERY","WINE_SPIRITS","WOMEN_S_CLOTHING","YACHT_BASIN","ZOO","ZOOS_ARBORETA_BOTANICAL_GARDEN"],budgetTypes=["timeMinutes","distanceKM"],budgetUnits={timeMinutes:"min",distanceKM:"km"},avoidableTypes=["tollRoads","motorways","ferries","unpavedRoads","carpools","alreadyUsedRoads","borderCrossings","tunnels","carTrains","lowEmissionZones"],inputSectionTypes=["carpool","carTrain","country","ferry","importantRoadStretch","lowEmissionZone","motorway","pedestrian","roadShields","speedLimit","toll","tollRoad","tollVignette","traffic","tunnel","unpaved","urban","vehicleRestricted"],inputSectionTypesWithGuidance=/* @__PURE__ */(()=>[...inputSectionTypes,"lanes"])(),sectionTypes=/* @__PURE__ */(()=>[...inputSectionTypesWithGuidance,"leg","distinct"])(),sdkErrorCodes=["INVALID_REQUEST","INSECURE_BASE_URL","INVALID_CREDENTIALS","INSUFFICIENT_PERMISSIONS","NOT_FOUND","RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE","ABORTED","WEBGL_UNSUPPORTED","WEBGL_CONTEXT_LOST","STYLE_LOAD_FAILED","INTERNAL"],areaAnalyticsMetricKeys=["speed","freeFlowSpeed","congestionLevel","travelTime","networkLength"],trafficIncidentRequestCategories=["accident","broken-down-vehicle","danger","flooding","fog","frost","jam","lane-closed","other","rain","road-closed","roadworks","wind"],fullTrafficIncidentCategories=/* @__PURE__ */(()=>[...trafficIncidentRequestCategories,"animals-on-road","narrow-lanes"])(),trafficIncidentTimeValidities=["present","future"],isBBoxWithArea=A=>!!A&&A.length>=4&&A[3]!==A[1]&&A[2]!==A[0],bboxOnlyIfWithArea=A=>isBBoxWithArea(A)?A:void 0,bboxExpandedWithPosition=(A,E)=>A?.length>=2?bboxExpandedWithBBox([A[0],A[1],A[0],A[1]],E):void 0,bboxExpandedWithBBox=(A,E)=>E&&A?[E[0]>A[0]?A[0]:E[0],E[1]>A[1]?A[1]:E[1],E[2]<A[2]?A[2]:E[2],E[3]<A[3]?A[3]:E[3]]:A||E,bboxFromBBoxes=A=>A?.length?A.reduce((A,E)=>bboxExpandedWithBBox(E,A)):void 0,bboxFromCoordsArray=A=>{const E=A?.length;if(!E)return;let R;const T=Math.ceil(E/1e3);for(let e=0;e<E;e+=T)R=bboxExpandedWithPosition(A[e],R);return 1===T?R:bboxExpandedWithPosition(A[E-1],R)},bboxFromGeoJSON=A=>{if(!A)return;if(Array.isArray(A))return"number"==typeof A[0]?A.length>=4?A:void 0:bboxFromBBoxes(A.map(A=>bboxFromGeoJSON(A)));const{bbox:E}=A;if(E)return 6===E.length?[E[0],E[1],E[3],E[4]]:E;switch(A.type){case"Feature":return bboxFromGeoJSON(A.geometry);case"FeatureCollection":return bboxFromBBoxes(A.features.map(bboxFromGeoJSON));case"GeometryCollection":return bboxFromBBoxes(A.geometries.map(bboxFromGeoJSON));case"Point":return bboxExpandedWithPosition(A.coordinates);case"LineString":case"MultiPoint":return bboxFromCoordsArray(A.coordinates);case"MultiLineString":case"Polygon":return bboxFromBBoxes(A.coordinates.map(bboxFromCoordsArray));case"MultiPolygon":return bboxFromBBoxes(A.coordinates.flatMap(A=>A.map(bboxFromCoordsArray)));default:return}},bboxCenter=([A,E,R,T])=>{const e=(A+(A>R?R+360:R))/2;return[e>180?e-360:e,(E+T)/2]},polygonFromBBox=A=>{const[E,R,T,e]=A;return{type:"Feature",geometry:{type:"Polygon",coordinates:[[[E,R],[T,R],[T,e],[E,e],[E,R]]]},properties:{}}},generateId=()=>Date.now().toString(36)+Math.random().toString(36).substring(2),getPosition=(A,E)=>{if(A){if(Array.isArray(A))return A;if(A.coordinates)return A.coordinates;if(A.geometry)return"main-when-available"===E?.useEntryPoint?(R=A,R?.properties?.entryPoints?.find(A=>"main"===A.type))?.position??A.geometry.coordinates:A.geometry.coordinates}var R;return null},getPositionStrict=(A,E)=>{const R=getPosition(A,E);if(!R)throw new Error(`The received object does not have lng-lat coordinates: ${JSON.stringify(A)}`);return R},toPointGeometry=A=>({type:"Point",coordinates:A}),clamp=(A,E,R)=>Math.max(E,Math.min(A,R)),projectAlongRouteLocation=(A,E)=>nearestPointOnLine(A,getPositionStrict(E)).properties.totalDistance,findInsertionSlot=(A,E)=>{for(let R=0;R<A.length-1;R++)if(E>=A[R]&&E<=A[R+1])return R+1;return E<A[0]?0:A.length},slotNewWaypoints=(A,E,R)=>{if(!R.length||A.geometry.coordinates.length<2||E.length<2)return R.map(()=>({slot:0,location:0}));const T=E.map(E=>projectAlongRouteLocation(A,E));return R.map(E=>{const R=projectAlongRouteLocation(A,E);return{slot:findInsertionSlot(T,R),location:R}})},findBestWaypointInsertionIndex=(A,E,R)=>findBestWaypointInsertionIndices(A,E,[R])[0],findBestWaypointInsertionIndices=(A,E,R)=>slotNewWaypoints(A,E,R).map(({slot:A})=>A),withInsertedWaypoint=(A,E,R)=>withInsertedWaypoints(A,E,[R]),withInsertedWaypoints=(A,E,R)=>{const T=Array.from({length:E.length+1},()=>[]),e=slotNewWaypoints(A,E,R);for(const[t,{slot:N,location:_}]of e.entries())T[N].push({waypoint:R[t],location:_,inputIndex:t});for(const t of T)t.sort((A,E)=>A.location-E.location||A.inputIndex-E.inputIndex);const I=[];for(let t=0;t<E.length;t++){for(const A of T[t])I.push(A.waypoint);I.push(E[t])}for(const t of T[E.length])I.push(t.waypoint);return I},progressValuesOf=({distanceInMeters:A,travelTimeInSeconds:E})=>void 0===A||void 0===E?void 0:{distanceInMeters:A,travelTimeInSeconds:E},progressBetween=(A,E,R)=>({distanceInMeters:A.distanceInMeters+R*(E.distanceInMeters-A.distanceInMeters),travelTimeInSeconds:A.travelTimeInSeconds+R*(E.travelTimeInSeconds-A.travelTimeInSeconds)}),calculateProgressAtRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R||0===R.length)return;const T=A.geometry.coordinates.length;if(E<0||E>=T)return;const e=findBracketingProgressPoints(R,"pointIndex",E);if(!e)return;const{lower:I,lowerValue:t,upper:N,upperValue:_}=e,S=progressValuesOf(I),n=progressValuesOf(N);if(!S||!n)return;if(t===_)return S;const o=lengthShareOfBracket(A.geometry.coordinates,t,E,_);return progressBetween(S,n,o)},getRouteProgressBetween=(A,E,R)=>{const T=calculateProgressAtRoutePoint(A,E),e=calculateProgressAtRoutePoint(A,R);if(T&&e)return{start:T,end:e,delta:{distanceInMeters:e.distanceInMeters-T.distanceInMeters,travelTimeInSeconds:e.travelTimeInSeconds-T.travelTimeInSeconds}}},getRouteProgressForSection=(A,E)=>getRouteProgressBetween(A,E.startPointIndex,E.endPointIndex),getSectionBBox=(A,E)=>{const R=A.geometry.coordinates;if(!R||0===R.length||E.startPointIndex<0||E.endPointIndex>=R.length||E.startPointIndex>E.endPointIndex)return;const T=Math.floor((E.startPointIndex+E.endPointIndex)/2);return bboxFromCoordsArray([R[E.startPointIndex],R[T],R[E.endPointIndex]])},getSectionOverlap=(A,E)=>{const R=Math.max(A.startPointIndex,E.startPointIndex),T=Math.min(A.endPointIndex,E.endPointIndex);return T>R?{startPointIndex:R,endPointIndex:T}:void 0},metersWithin=(A,E,R=[{startPointIndex:0,endPointIndex:A.length-1}])=>R.reduce((R,T)=>{const e=getSectionOverlap(T,E);return R+(e?A[e.endPointIndex]-A[e.startPointIndex]:0)},0),firstIndexPast=(A,E,R)=>{let T=A,e=0,I=A;for(;e<I;){const A=e+I>>>1;let t=A;for(;t<I&&void 0===E(t);)t++;const N=t<I?E(t):void 0;void 0===N?I=A:R(N)?(T=t,I=A):e=t+1}return T},findBracketingProgressPoints=(A,E,R)=>{const T=R=>A[R][E],e=A[firstIndexPast(A.length,T,A=>A>=R)];let I=firstIndexPast(A.length,T,A=>A>R)-1;for(;I>=0&&void 0===A[I][E];)I--;const t=A[I],N=t?.[E],_=e?.[E];return void 0!==N&&void 0!==_?{lower:t,lowerValue:N,upper:e,upperValue:_}:void 0},metersAlongLineCache=/* @__PURE__ */new WeakMap,RADIANS_PER_DEGREE=Math.PI/180,metersAlongLine=A=>{const E=metersAlongLineCache.get(A);if(E?.length===A.length)return E;const R=new Float64Array(A.length);let[T=0,e=0]=A[0]??[],I=Math.cos(e*RADIANS_PER_DEGREE);for(let t=1;t<A.length;t++){const[E,N]=A[t],_=Math.cos(N*RADIANS_PER_DEGREE),S=Math.sin((N-e)*RADIANS_PER_DEGREE/2),n=Math.sin((E-T)*RADIANS_PER_DEGREE/2),o=S*S+n*n*I*_;R[t]=R[t-1]+12742017.6*Math.atan2(Math.sqrt(o),Math.sqrt(1-o)),T=E,e=N,I=_}return metersAlongLineCache.set(A,R),R},segmentAtMeters=(A,E,R,T)=>{const e=firstIndexPast(A.length,E=>A[E],A=>A>=E),I=clamp(e-1,R,T-1),t=A[I+1]-A[I];return{pathIndex:I,share:t>0?clamp((E-A[I])/t,0,1):0}},positionBetween=(A,E,R)=>[A[0]+R*(E[0]-A[0]),A[1]+R*(E[1]-A[1])],lengthShareOfBracket=(A,E,R,T)=>{const e=metersAlongLine(A),I=e[T]-e[E];return I>0?(e[R]-e[E])/I:(R-E)/(T-E)},interpolateProgressAtPathIndex=(A,E,R)=>{const T=A.geometry.coordinates,e=Math.min(E+1,T.length-1),I=calculateProgressAtRoutePoint(A,E),t=calculateProgressAtRoutePoint(A,e);if(I&&t)return{position:positionBetween(T[E],T[e],R),...progressBetween(I,t,R)}},coordinateAtProgressPoint=(A,E)=>{const R=progressValuesOf(E);return R&&{position:A[E.pointIndex],...R}},resolveCoordinateAtProgress=(A,E,R)=>{const{progress:T}=A.properties,e=T?.at(-1);if(!T||!e)return;const I=A.geometry.coordinates,t=T[0],N=t[E],_=e[E];if(void 0===N||void 0===_)return;if(R<=N)return coordinateAtProgressPoint(I,t);if(R>=_)return coordinateAtProgressPoint(I,e);const S=((A,E,R,T)=>{const e=findBracketingProgressPoints(A,R,T);if(!e)return;const{lower:I,lowerValue:t,upper:N,upperValue:_}=e,S=t===_?0:(T-t)/(_-t),n=metersAlongLine(E),o=n[N.pointIndex]-n[I.pointIndex];if(0===o){const A=I.pointIndex+S*(N.pointIndex-I.pointIndex),E=Math.floor(A);return{pathIndex:E,progressRatioTowardsNextPathPoint:A-E}}const O=n[I.pointIndex]+S*o,r=segmentAtMeters(n,O,I.pointIndex,N.pointIndex);return{pathIndex:r.pathIndex,progressRatioTowardsNextPathPoint:r.share}})(T,I,E,R);return void 0!==S?interpolateProgressAtPathIndex(A,S.pathIndex,S.progressRatioTowardsNextPathPoint):void 0},getCoordinateAtRouteProgress=(A,E)=>{if("traveledTimeInSeconds"in E)return resolveCoordinateAtProgress(A,"travelTimeInSeconds",E.traveledTimeInSeconds);if("traveledDistanceInMeters"in E)return resolveCoordinateAtProgress(A,"distanceInMeters",E.traveledDistanceInMeters);const R=A.properties.summary.departureTime;if(!R)return;const T=(E.clockTime.getTime()-R.getTime())/1e3;return T<0?void 0:resolveCoordinateAtProgress(A,"travelTimeInSeconds",T)},getProgressAtNearestRoutePoint=(A,E)=>{const{progress:R}=A.properties,T=A.geometry.coordinates;if(!R?.length||T.length<2)return;const e=nearestPointOnLine(A,getPositionStrict(E)),I=e.properties.segmentIndex,t=Math.min(I+1,T.length-1),N=((A,E,R)=>{const T=R[0]-A[0],e=R[1]-A[1],I=T*T+e*e;if(0===I)return 0;const t=((E[0]-A[0])*T+(E[1]-A[1])*e)/I;return clamp(t,0,1)})(T[I],e.geometry.coordinates,T[t]);return interpolateProgressAtPathIndex(A,I,N)},bucket=A=>Math.round(1e5*A),vertexHash=(A,E)=>Math.imul(Math.imul(A,2654435761)^E,2246822507),holds=(A,E,R,T,e,I)=>A[E]===R&&A[E+1]===T&&A[E+2]===e&&A[E+3]===I,slotOf=(A,E,R,T,e,I,t)=>{const N=vertexHash(T,e)+vertexHash(I,t);let _=6*((N^N>>>15)&A.length/6-1);for(;A[_+4]&&!holds(A,_,T,e,I,t)&&!holds(A,_,I,t,T,e);)_=(_+6)%A.length;return A[_+4]||(A[_]=T,A[_+1]=e,A[_+2]=I,A[_+3]=t,A[_+4]=E+1,A[_+5]=R),_},getDistinctSections=(A,{minLengthInMeters:E=0}={})=>{const R=Array.isArray(A)?A:A.features,{firsts:T,shared:e}=(A=>{const E=new Int32Array(6*2**Math.ceil(Math.log2(1.5*A.reduce((A,E)=>A+E.length,0)+1))),R=A.map(A=>new Int32Array(Math.max(A.length-1,0))),T=R.map(A=>new Uint8Array(A.length)),e=(A,E)=>{T[A][R[A][E]]=1};return A.forEach((T,I)=>{const t=R[I];let N;const[_=0,S=0]=T[0]??[];let n=bucket(_),o=bucket(S);for(let R=0;R<t.length;R++){const _=n,S=o;if(n=bucket(T[R+1][0]),o=bucket(T[R+1][1]),_===n&&S===o){t[R]=-1;continue}t[R]=R;const O=N&&A[N.route][N.vertex+N.step];if(N&&O&&bucket(O[0])===n&&bucket(O[1])===o){e(I,R),e(N.route,Math.min(N.vertex,N.vertex+N.step)),N.vertex+=N.step;continue}const r=slotOf(E,I,R,_,S,n,o),C=E[r+4]-1,i=E[r+5];if(N=void 0,C===I){t[R]=i;continue}e(I,R),e(C,i);const s=E[r]===_&&E[r+1]===S;N={route:C,vertex:s?i+1:i,step:s?1:-1}}}),{firsts:R,shared:T}})(R.map(A=>A.geometry.coordinates));return R.map((A,R)=>{const I=T[R],t=e[R],N=metersAlongLine(A.geometry.coordinates),_=[];let S;for(let T=0;T<=I.length;T++){if(-1===I[T])continue;if(T<I.length&&!t[I[T]]){S??=T;continue}if(void 0===S)continue;const A=N[T]-N[S];A>=E&&_.push({id:generateId(),startPointIndex:S,endPointIndex:T,lengthInMeters:A}),S=void 0}return _})},TOMTOM_USER_AGENT_SDK_NAME="MapsSDKJS",generateTomTomHeaders=A=>!1===A.sendUserAgentHeader?{}:{"tomtom-user-agent":A["tomtom-user-agent"]??"MapsSDKJS/1.0.0-rc.3"},getImportantRoads=(A,{within:E,minLengthInMeters:R=0}={})=>{const T=metersAlongLine(A.geometry.coordinates),e=/* @__PURE__ */new Map,I=[...A.properties.sections.importantRoadStretch??[]].sort((A,E)=>A.startPointIndex-E.startPointIndex);for(const t of I){const A=metersWithin(T,t,E);if(!A)continue;const{index:R,roadNumbers:I=[],streetName:N}=t,_=I[0]??N,S=_??R,n=e.get(S);n?(n.index=Math.min(n.index,R),n.roadNumbers=[.../* @__PURE__ */new Set([...n.roadNumbers,...I])],n.streetName??=N,n.lengthInMeters+=A,n.sections.push(t)):e.set(S,{index:R,..._&&{name:_},roadNumbers:I,...N&&{streetName:N},lengthInMeters:A,sections:[t]})}return[...e.values()].filter(A=>A.lengthInMeters>=R)},getInstructionLanes=(A,E)=>{const R=A.properties.guidance?.instructions??[];if(R.find(A=>A.pathPointIndex===E.pathPointIndex)?.maneuver!==E.maneuver)return;const T=({startPointIndex:E,endPointIndex:T})=>{const e=R.findLast(({pathPointIndex:A})=>E<=A&&A<=T);if(e)return e.pathPointIndex;const I=R.find(({pathPointIndex:A})=>A>T),t=A.geometry.coordinates[T];return I&&t&&distance(t,I.maneuverPoint,{units:"meters"})<=100?I.pathPointIndex:void 0};let e;for(const I of A.properties.sections.lanes??[])(!e||I.endPointIndex>e.endPointIndex)&&T(I)===E.pathPointIndex&&(e=I);return e},poiCategoriesToID={TRAFFIC_CONTROL_DEPARTMENT:7301,TRAFFIC_CONTROL_DEPARTMENT_GENERIC:7301002,TRAIL_SYSTEM:7302,MOUNTAIN_BIKE_TRAIL:7302002,ADVENTURE_VEHICLE_TRAIL:7302003,HIKING_TRAIL:7302004,HORSE_RIDING_TRAIL:7302005,ROCK_CLIMBING_TRAIL:7302006,RESIDENTIAL_ACCOMMODATION:7303,RETIREMENT_COMMUNITY:7303002,FLATS_OR_APARTMENT_COMPLEX:7303003,HOLIDAY_RENTAL:7304,COTTAGE_RENTAL:7304002,VILLA_RENTAL:7304003,BUNGALOW_RENTAL:7304004,CHALET_RENTAL:7304005,APARTMENT_RENTAL:7304006,ADVENTURE_SPORTS_FACILITY:7305,HELIPORT_OR_HELIPAD:7308,CHARGING_LOCATION:7309,VEHICLE_REPAIR:7310,BODYSHOP:7310002,CAR_GLASS_REPLACEMENT_SHOP:7310003,CAR_REPAIR_AND_SERVICE:7310004,TIRE_SERVICE:7310007,MOTORCYCLE_REPAIR:7310008,TRUCK_REPAIR_AND_SERVICE:7310009,FUEL_STATION:7311,CAR_RENTAL:7312,PARKING_GARAGE:7313,HOTEL_OR_MOTEL:7314,BANDB_OR_GUEST_HOUSE:7314002,HOTEL:7314003,HOSTEL:7314004,RESORT:7314005,MOTEL:7314006,CABINS_LODGES:7314007,REST_CAMP:7314008,RESTAURANT:7315,AFRICAN_RESTAURANT:7315002,AMERICAN_RESTAURANT:7315003,AUSTRIAN_RESTAURANT:7315004,BARBECUE_RESTAURANT:7315005,BELGIAN_RESTAURANT:7315006,BISTRO:7315007,BRITISH_RESTAURANT:7315008,CALIFORNIAN_RESTAURANT:7315009,CANADIAN_RESTAURANT:7315010,CARIBBEAN_RESTAURANT:7315011,CHINESE_RESTAURANT:7315012,CREPERIE:7315013,DUTCH_RESTAURANT:7315014,FAST_FOOD:7315015,PHILIPPINE_RESTAURANT:7315016,FRENCH_RESTAURANT:7315017,GERMAN_RESTAURANT:7315018,GREEK_RESTAURANT:7315019,GRILL_RESTAURANT:7315020,HAWAIIAN_RESTAURANT:7315021,HUNGARIAN_RESTAURANT:7315022,INDIAN_RESTAURANT:7315023,INDONESIAN_RESTAURANT:7315024,ITALIAN_RESTAURANT:7315025,JAPANESE_RESTAURANT:7315026,JEWISH_RESTAURANT:7315027,KOREAN_RESTAURANT:7315028,LATIN_AMERICAN_RESTAURANT:7315029,LEBANESE_RESTAURANT:7315030,MEDITERRANEAN_RESTAURANT:7315032,MEXICAN_RESTAURANT:7315033,MIDDLE_EASTERN_RESTAURANT:7315034,ORIENTAL_RESTAURANT:7315035,PIZZERIA:7315036,POLISH_RESTAURANT:7315037,PORTUGUESE_RESTAURANT:7315038,RUSSIAN_RESTAURANT:7315040,SANDWICH_RESTAURANT:7315042,SEAFOOD:7315043,SPANISH_RESTAURANT:7315044,STEAK_HOUSE:7315045,SWISS_RESTAURANT:7315047,THAI_RESTAURANT:7315048,TURKISH_RESTAURANT:7315049,VEGETARIAN_RESTAURANT:7315050,VIETNAMESE_RESTAURANT:7315051,HUNAN_RESTAURANT:7315052,SHANDONG_RESTAURANT:7315053,SICHUAN_RESTAURANT:7315056,DONGBEI_RESTAURANT:7315057,HOT_POT_RESTAURANT:7315058,TAIWANESE_RESTAURANT:7315059,WESTERN_RESTAURANT:7315060,PERUVIAN_RESTAURANT:7315061,ASIAN_RESTAURANT:7315062,CREOLE_RESTAURANT:7315063,SOUL_FOOD:7315064,IRISH_RESTAURANT:7315065,JAMAICAN_RESTAURANT:7315066,KOSHER_RESTAURANT:7315067,CZECH_RESTAURANT:7315068,HAMBURGER_RESTAURANT:7315069,CHICKEN_RESTAURANT:7315070,FUSION_RESTAURANT:7315071,BRAZILIAN_RESTAURANT:7315072,INTERNATIONAL_RESTAURANT:7315073,MOROCCAN_RESTAURANT:7315074,ORGANIC_FOOD_RESTAURANT:7315075,TAPAS_RESTAURANT:7315076,ICE_CREAM_PARLOR:7315078,DOUGHNUT_RESTAURANT:7315079,AFGHAN_RESTAURANT:7315081,ARABIAN_RESTAURANT:7315083,ARMENIAN_RESTAURANT:7315085,AUSTRALIAN_RESTAURANT:7315086,BASQUE_RESTAURANT:7315087,BOLIVIAN_RESTAURANT:7315088,BULGARIAN_RESTAURANT:7315090,BURMESE_RESTAURANT:7315091,CAMBODIAN_RESTAURANT:7315092,CHILEAN_RESTAURANT:7315093,COLOMBIAN_RESTAURANT:7315094,CORSICAN_RESTAURANT:7315095,CUBAN_RESTAURANT:7315096,DANISH_RESTAURANT:7315098,EGYPTIAN_RESTAURANT:7315100,ENGLISH_RESTAURANT:7315101,ETHIOPIAN_RESTAURANT:7315102,FINNISH_RESTAURANT:7315104,IRANIAN_RESTAURANT:7315105,ISRAELI_RESTAURANT:7315106,MONGOLIAN_RESTAURANT:7315110,NEPALESE_RESTAURANT:7315111,NORWEGIAN_RESTAURANT:7315112,SCANDINAVIAN_RESTAURANT:7315114,SWEDISH_RESTAURANT:7315119,SYRIAN_RESTAURANT:7315120,TEPPANYAKI_RESTAURANT:7315121,TIBETAN_RESTAURANT:7315122,TUNISIAN_RESTAURANT:7315123,VENEZUELAN_RESTAURANT:7315125,PAKISTANI_RESTAURANT:7315127,FONDUE_RESTAURANT:7315134,SNACKS_RESTAURANT:7315139,SOUP_RESTAURANT:7315140,BUFFET_RESTAURANT:7315142,SALAD_BAR:7315143,TAKEOUT_FOOD:7315145,BANQUET_ROOMS:7315146,CAFETERIA:7315147,SUSHI_RESTAURANT:7315148,JUICE_BAR:7315149,TOURIST_INFORMATION:7316,MUSEUM:7317,THEATER:7318,CONCERT_HALL:7318002,MUSIC_CENTER:7318003,OPERA_HOUSE:7318004,THEATER_GENERIC:7318005,CABARET_THEATER:7318006,AMPHITHEATER:7318007,DINNER_THEATER:7318008,CULTURAL_CENTER:7319,SPORTS_CENTER:7320,FITNESS_CLUB_AND_CENTER:7320002,HORSE_RIDING:7320003,SPORTS_CENTER_GENERIC:7320004,THEMATIC_SPORT_CENTER:7320005,SQUASH_COURT:7320006,HOSPITAL:7321,GENERAL_HOSPITAL_AND_POLYCLINIC:7321002,SPECIAL_HOSPITAL:7321003,HOSPITAL_OF_CHINESE_MEDICINE:7321004,HOSPITAL_FOR_WOMEN_AND_CHILDREN:7321005,POLICE_STATION:7322,POST_OFFICE:7324,PHARMACY:7326,DEPARTMENT_STORE:7327,BANK:7328,MARKETPLACE:7332,INFORMAL_MARKET:7332002,PUBLIC_MARKET:7332003,FARMERS_MARKET:7332004,SUPERMARKET:7332005,AGRICULTURE:7335,HORTICULTURE:7335002,PRIMARY_PRODUCER:7335003,FARM:7335004,VIEWPOINT:7337,SWIMMING_POOL:7338,RELIGIOUS_SITE:7339,CHURCH:7339002,MOSQUE:7339003,SYNAGOG:7339004,TEMPLE:7339005,GURUDWARA:7339006,PAGODA:7339008,CASINO_AND_GAMBLING:7341,CINEMA:7342,MOVIE_THEATER:7342002,DRIVE_IN_MOVIES:7342003,MARINA:7347,MARINA_GENERIC:7347002,YACHT_BASIN:7347003,WINERY:7349,FERRY_TERMINAL:7352,TRUCK_STOP:7358,WEIGH_STATION:7359,WEIGH_STATION_GENERIC:7359002,CAMPING_GROUND:7360,RECREATIONAL_CAMPING_GROUND:7360002,CARAVAN_SITE:7360003,COMMUNITY_CENTER:7363,EMBASSY:7365,BORDER_CONTROL:7366,GOVERNMENT_OFFICE:7367,MOTORING_ORGANIZATION_OFFICE:7368,OPEN_CAR_PARKING_AREA:7369,OPEN_CAR_PARKING_AREA_GENERIC:7369002,SCHOOL:7372,SCHOOL_GENERIC:7372002,CHILDCARE:7372003,PRE_SCHOOL:7372004,PRIMARY_SCHOOL:7372005,HIGH_SCHOOL:7372006,SENIOR_HIGH_SCHOOL:7372007,VOCATIONAL_SCHOOL:7372008,LANGUAGE_SCHOOL:7372010,ART_SCHOOL:7372012,MIDDLE_SCHOOL:7372014,DRIVING_SCHOOL:7372016,MALL:7373,STADIUM:7374,ATHLETICS_TRACK:7374002,CRICKET_GROUND:7374003,SOCCER_STADIUM:7374004,HORSE_RACING_TRACK:7374005,MULTI_PURPOSE_STADIUM:7374006,RUGBY_GROUND:7374007,ICE_HOCKEY_ARENA:7374008,BASEBALL_PARK:7374009,FOOTBALL_STADIUM:7374010,MOTOR_RACING_STADIUM:7374011,BASKETBALL_ARENA:7374012,RACE_TRACK:7374013,NETBALL_STADIUM:7374014,TOLL_GATE:7375,TOURIST_ATTRACTION:7376,BUILDING:7376002,MONUMENT:7376003,NATURAL_TOURIST_ATTRACTION:7376004,OBSERVATORY:7376005,PLANETARIUM:7376006,DAM:7376007,TUNNEL:7376008,TOWER:7376009,BRIDGE:7376010,MAUSOLEUM_OR_GRAVE:7376011,ARCH:7376012,STATUE:7376013,WATER_HOLE:7376014,COLLEGE_OR_UNIVERSITY:7377,COLLEGE_OR_UNIVERSITY_GENERIC:7377002,JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE:7377003,BUSINESS_PARK:7378,RAILWAY_STATION:7380,INTERNATIONAL_RAILROAD_STATION:7380002,NATIONAL_RAILROAD_STATION:7380003,URBAN_STATION:7380004,SUBWAY_STATION:7380005,AIRPORT:7383,PUBLIC_AIRPORT:7383002,PRIVATE_AIRPORT:7383003,MILITARY_AIRPORT:7383004,AIRFIELD:7383005,COURIER_DROP_BOX:7388,TRANSPORT_ACCESS:7389,AIRLINE_ACCESS:7389002,STATION_ACCESS:7389003,SECURED_ENTRANCE:7389004,SUBWAY_ENTRANCE:7389999,EMERGENCY_MEDICAL_SERVICE:7391,FIRE_STATION:7392,REST_AREA:7395,ATM:7397,NATURAL_FEATURE:8099,MOUNTAIN_PEAK:8099002,CAVE:8099003,RIDGE:8099004,DUNE:8099005,VALLEY:8099006,PLAIN_OR_FLAT:8099007,PLATEAU:8099008,PAN:8099009,WELL:8099010,OASIS:8099011,ROCKS:8099012,RESERVOIR:8099013,REEF:8099014,RAPIDS:8099015,BAY:8099016,COVE:8099017,HARBOR:8099018,CAPE:8099020,MINERAL_OR_HOT_SPRINGS:8099021,ISLAND:8099022,MARSH:8099023,RIVER_CROSSING:8099024,HILL:8099025,QUARRY:8099026,LOCALE:8099027,PRIMARY_RESOURCE_UTILITY:9150,TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION:9151,NON_GOVERNMENTAL_ORGANIZATION:9152,WELFARE_ORGANIZATION:9153,PRISON:9154,CAR_WASH:9155,CAR_WASH_GENERIC:9155002,MANUFACTURING_FACILITY:9156,RESEARCH_FACILITY:9157,MEDIA_FACILITY:9158,PORT_WAREHOUSE_FACILITY:9159,EXCHANGE:9160,STOCK_EXCHANGE:9160002,GOLD_EXCHANGE:9160003,FOREIGN_EXCHANGE:9160004,COMPANY:9352,SERVICE_COMPANY:9352002,ADVERTISING_COMPANY:9352003,COMPUTER_AND_DATA_SERVICES:9352004,SOFTWARE_COMPANY:9352005,DIVERSIFIED_FINANCIALS:9352006,INSURANCE_COMPANY:9352007,DELIVERY_SERVICE:9352008,REAL_ESTATE_COMPANY:9352009,MANUFACTURING_COMPANY:9352011,AGRICULTURAL_TECHNOLOGY:9352012,AUTOMOBILE_COMPANY:9352013,CHEMICAL_COMPANY:9352014,ELECTRONICS_COMPANY:9352015,MECHANICAL_ENGINEERING:9352016,PHARMACEUTICAL_COMPANY:9352018,PUBLISHING_TECHNOLOGIES:9352019,TELECOMMUNICATIONS:9352020,TAX_SERVICES:9352022,LEGAL_SERVICES:9352023,TRANSPORT_COMPANY:9352024,BUS_CHARTER_COMPANY:9352025,TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE:9352026,BUS_LINES:9352027,SCHOOL_BUS_COMPANY:9352028,CLEANING_SERVICES:9352029,OIL_AND_NATURAL_GAS:9352030,MINING_COMPANY:9352031,CONSTRUCTION_COMPANY:9352032,MOVING_AND_STORAGE_COMPANY:9352033,AIRLINE_COMPANY:9352034,FUNERAL_SERVICE_AND_MORTUARIES:9352036,INVESTMENT_ADVISOR:9352037,EQUIPMENT_RENTAL:9352038,BUSINESS_SERVICES:9352039,CABLE_AND_TELEPHONE_COMPANY:9352040,AUTOMOBILE_MANUFACTURING:9352041,IMPORT_OR_EXPORT_AND_DISTRIBUTION:9352042,CATERING_SERVICES:9352043,HOME_APPLIANCE_REPAIR:9352044,ANIMAL_SHELTER:9352045,WEDDING_SERVICES:9352046,BEACH:9357,RESTAURANT_AREA:9359,ICE_RINK:9360,SHOP_OR_STORE:9361,BOOK_SHOP:9361002,C_DS_DVD_VIDEOS:9361003,CHILDREN_S_CLOTHES:9361004,FOOTWEAR_SHOE_REPAIRS:9361005,CLOTHING_SHOP:9361006,MEN_S_CLOTHING:9361007,WOMEN_S_CLOTHING:9361008,CONVENIENCE_STORE:9361009,DRY_CLEANER:9361010,CAMERAS_AND_PHOTOGRAPHY:9361011,COMPUTER_AND_COMPUTER_SUPPLIES:9361012,CONSUMER_ELECTRONICS:9361013,OFFICE_EQUIPMENT:9361014,REAL_ESTATE_AGENT:9361015,FACTORY_OUTLET:9361016,FLORISTS:9361017,BAKERY:9361018,BUTCHER:9361019,FISHMONGER:9361020,FOOD_MARKET:9361021,GREENGROCER:9361022,GROCERY_STORE:9361023,FOOD_AND_DRINKS_SHOP:9361024,WINE_SPIRITS:9361025,GIFTS_CARDS_NOVELTIES_SOUVENIRS:9361026,HAIRDRESSER:9361027,CARPET_FLOOR_COVERINGS:9361028,CURTAINS_TEXTILES:9361029,DO_IT_YOURSELF_CENTERS:9361030,HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS:9361031,GARDEN_CENTERS_SERVICES:9361032,KITCHENS_BATHROOMS:9361033,LIGHTING_SHOPS:9361034,PAINTING_DECORATING:9361035,JEWELRY_CLOCKS_WATCHES:9361036,NEWSAGENTS_TOBACCONISTS:9361037,OPTICIAN:9361038,SPORTS_EQUIPMENT_AND_CLOTHING:9361039,TOYS_GAMES_SHOP:9361040,TRAVEL_AGENT:9361041,CONSTRUCTION_MATERIAL_AND_EQUIPMENT:9361042,MEDICAL_SUPPLIES_EQUIPMENT:9361043,VIDEO_RENTAL_SHOP:9361044,LAUNDRY:9361045,PHOTO_LAB_OR_DEVELOPMENT:9361046,PHOTOCOPY_SHOP:9361047,ANIMAL_SERVICE:9361048,ANTIQUE_ART_SHOP:9361049,BEAUTY_SUPPLIES:9361050,DRUG_STORE:9361051,ELECTRICAL_APPLIANCES_SHOP:9361052,HOBBY_SHOP:9361053,FURNITURE_HOME_FURNISHINGS:9361054,GLASSWARE_CERAMIC_SHOP:9361055,LOCAL_SPECIALITIES_SHOP:9361056,RECYCLING_SHOP:9361057,BAGS_LEATHERWEAR:9361058,MUSIC_INSTRUMENTS_STORE:9361059,DELICATESSEN:9361060,SPECIALTY_FOODS:9361061,SHOPPING_SERVICE:9361062,RETAIL_OUTLET:9361063,PET_SUPPLIES:9361064,WHOLESALE_CLUB:9361066,BEAUTY_SALON:9361067,NAIL_SALON:9361068,HARDWARE_STORE:9361069,PAWN_SHOP:9361070,LOTTERY_SHOP:9361071,BETTING_STATION:9361072,AGRICULTURAL_SUPPLIES:9361073,MOBILE_PHONE_SHOP:9361075,DRIVE_THROUGH_BOTTLE_SHOP:9361076,TAILOR_SHOP:9361077,SECURITY_PRODUCTS:9361078,SPECIALTY_CLOTHING_SHOP:9361079,GLASS_WINDOWS_STORE:9361080,VARIETY_STORE:9361081,CHRISTMAS_OR_HOLIDAY_SHOP:9361082,BOATING_EQUIPMENT_AND_ACCESSORIES:9361083,PARK_AND_RECREATION_AREA:9362,BATTLEFIELD:9362002,CEMETERY:9362003,HISTORIC_SITE:9362004,HISTORICAL_PARK:9362005,MEMORIAL:9362007,PARK:9362008,PARKWAY:9362009,RECREATION_AREA:9362011,WILDERNESS_AREA:9362014,FOREST_AREA:9362015,FISHING_AND_HUNTING_AREA:9362016,FAIRGROUND:9362017,SKI_RESORT:9362026,BOAT_LAUNCHING_RAMP:9362032,PICNIC_AREA:9362033,PROTECTED_LAND:9362037,COURTHOUSE:9363,CANNABIS_SHOP:9364,MEDICINAL_MARIJUANA_DISPENSARY:9364002,RECREATIONAL_MARIJUANA_DISPENSARY:9364003,MEDICINAL_AND_RECREATIONAL_DISPENSARY:9364004,TENNIS_COURT:9369,WATER_SPORT:9371,DOCTOR:9373,GENERAL_PRACTITIONER:9373002,SPECIALIST:9373003,DENTIST:9374,VETERINARY:9375,CAFE_PUB:9376,CAFE:9376002,PUB:9376003,INTERNET_CAFE:9376004,TEA_HOUSE:9376005,COFFEE_SHOP:9376006,MICROBREWERY:9376007,EXHIBITION_CONVENTION_CENTER:9377,LEISURE_CENTER:9378,BOWLING_CENTER:9378002,DANCE_STUDIO_AND_SCHOOL:9378003,FLYING_CLUB:9378004,SAUNA_SOLARIUM_MASSAGE:9378005,NIGHTLIFE:9379,DISCO_CLUB:9379002,BAR:9379004,COCKTAIL_BAR:9379006,JAZZ_CLUB:9379008,COMEDY_CLUB:9379009,KARAOKE_CLUB:9379010,COMMERCIAL_BUILDING:9382,INDUSTRIAL_BUILDING:9383,ABORIGINAL_LAND:9389,HEALTHCARE_SERVICE:9663,PERSONAL_SERVICE:9663002,PERSONAL_CARE_FACILITY:9663003,BLOOD_BANK:9663004,AMBULANCE_UNIT:9663005,ENTERTAINMENT:9900,AMUSEMENT_PARK:9902,AMUSEMENT_PARK_GENERIC:9902003,AMUSEMENT_PLACE:9902004,VEHICLE_DEALER:9910,CAR_DEALER:9910002,MOTORCYCLE_DEALER:9910003,BOAT_DEALER:9910004,RECREATIONAL_VEHICLE_DEALER:9910005,TRUCK_DEALER:9910006,VAN_DEALER:9910007,BUS_DEALER:9910008,ATV_DEALER:9910009,GOLF_COURSE:9911,PUBLIC_LIBRARY:9913,ZOOS_ARBORETA_BOTANICAL_GARDEN:9927,ARBORETA_AND_BOTANICAL_GARDENS:9927002,ZOO:9927003,AQUATIC_ZOO:9927004,WILDLIFE_PARK:9927005,RENTAL_CAR_PARKING:9930,PUBLIC_AMENITY:9932,PASSENGER_TRANSPORT_TICKET_OFFICE:9932002,PEDESTRIAN_SUBWAY:9932003,PUBLIC_CALL_BOX:9932004,PUBLIC_BATHROOM:9932005,RESCUE_SERVICE:9932006,MOUNTAIN_PASS:9935,CLUB_AND_ASSOCIATION:9937,BEACH_CLUB:9937002,HOCKEY_CLUB:9937003,PUBLIC_TRANSPORT_STOP:9942,BUS_STOP:9942002,TAXI_STAND:9942003,STREETCAR_STOP:9942004,EMERGENCY_ROOM:9956,RESIDENTIAL_ENTRANCE:9999},poiIDsToCategories=/* @__PURE__ */(()=>Object.fromEntries(Object.entries(poiCategoriesToID).map(([A,E])=>[E,A])))(),getRoutePlanningLocationType=A=>Array.isArray(A)?Array.isArray(A[0])?"path":"waypoint":"Feature"===A.type&&"LineString"===A.geometry.type?"path":"waypoint",sdkErrorCodeForStatus=A=>401===A?"INVALID_CREDENTIALS":403===A?"INSUFFICIENT_PERMISSIONS":404===A?"NOT_FOUND":429===A?"RATE_LIMITED":A>=500?"LIVE_SERVICE_NOT_AVAILABLE":A>=400?"INVALID_REQUEST":"INTERNAL",retryableCodes=/* @__PURE__ */new Set(["RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE"]),canRetrySDKErrorCode=A=>retryableCodes.has(A),getSectionsWithin=(A,{within:E,types:R=sectionTypes}={})=>{const T=metersAlongLine(A.geometry.coordinates),e={};for(const I of R){const R=A.properties.sections[I]??[],t=[],N=[];let _=0;for(const A of R){const{startPointIndex:R=0,endPointIndex:e=0}=A,I=metersWithin(T,{startPointIndex:R,endPointIndex:e},E);I>0&&(t.push(A),N.push(I/(T[e]-T[R])),_+=I)}t.length&&(e[I]={sections:t,shares:N,lengthInMeters:_})}return e},compareRoutes=(A,E,{types:R=inputSectionTypesWithGuidance}={})=>{const[T,e]=getDistinctSections([A,E]);return{distinct:T,referenceDistinct:e,adds:getSectionsWithin(A,{within:T,types:R}),avoids:getSectionsWithin(E,{within:e,types:R})}},indexedMagnitudes=["unknown","minor","moderate","major","indefinite"],iconCategoryMap={1:"accident",2:"fog",3:"danger",4:"rain",5:"frost",6:"jam",7:"lane-closed",8:"road-closed",9:"roadworks",10:"wind",11:"flooding",12:"animals-on-road",13:"narrow-lanes",14:"broken-down-vehicle"},categoryToIconMap=/* @__PURE__ */(()=>Object.fromEntries(Object.entries(iconCategoryMap).map(([A,E])=>[E,Number(A)])))(),iconToTrafficIncidentCategory=A=>iconCategoryMap[A]??"other",trafficIncidentToIconCategory=A=>categoryToIconMap[A]??0,minuteUnits=A=>A?.minutes??"min",formatDuration=(A,E)=>{if(A){const T=Math.abs(A)/3600;let e=Math.floor(T),I=Math.round(T%1*60);60===I&&(I=0,e++);const t={...TomTomConfig.instance.get().displayUnits?.time,...E};if(e)return`${e} ${R=t,R?.hours??"hr"} ${I.toString().padStart(2,"0")} ${minuteUnits(t)}`;if(I)return`${I.toString()} ${minuteUnits(t)}`}var R},MILE_IN_METERS=1609.344,meterUnits=A=>A?.meters??"m",kmUnits=A=>A?.kilometers??"km",roundHalfAwayFromZero=A=>Math.sign(A)*Math.round(Math.abs(A)),formatFeet=(A,E)=>{const R=E.feet??"ft",T=A/.3048,e=Math.abs(T);return e<30?`${roundHalfAwayFromZero(T)} ${R}`:e<500?`${10*roundHalfAwayFromZero(T/10)} ${R}`:`${100*roundHalfAwayFromZero(T/100)} ${R}`},formatYards=(A,E)=>{const R=E.yards??"yd",T=A/.9144;return Math.abs(T)<10?`${roundHalfAwayFromZero(T)} ${R}`:`${10*roundHalfAwayFromZero(T/10)} ${R}`},QUARTER_MILE_GLYPHS=["","¼","½","¾"],formatImperial=(A,E,R)=>{const T=A/1609.344;return Math.abs(T)<.125?R(A,E):((A,E)=>{const R=Math.abs(A);if(R>=10)return`${roundHalfAwayFromZero(A)} ${E}`;const T=R<3?1:2,e=Number.parseInt(R.toString()),I=Math.round(4*(R-e)/T)*T,t=A<0?"-":"";return I%4?`${t}${e||""}${QUARTER_MILE_GLYPHS[I]} ${E}`:`${t}${e+I/4} ${E}`})(T,E.miles??"mi")},formatDistance=(A,E)=>{if(isNil(A))return"";const R={...TomTomConfig.instance.get().displayUnits?.distance,...E};switch(R?.type??"metric"){case"metric":return((A,E)=>{const R=Math.abs(A);if(R<10)return`${roundHalfAwayFromZero(10*A)/10} ${meterUnits(E)}`;if(R<500)return`${10*roundHalfAwayFromZero(A/10)} ${meterUnits(E)}`;if(R<1e3){const R=100*roundHalfAwayFromZero(A/100);return 1e3===R||-1e3===R?`${A<0?"-":""}1 ${kmUnits(E)}`:`${R} ${meterUnits(E)}`}return R<1e4?`${100*roundHalfAwayFromZero(A/100)/1e3} ${kmUnits(E)}`:`${roundHalfAwayFromZero(A/1e3)} ${kmUnits(E)}`})(A,R);case"imperial_us":return formatImperial(A,R,formatFeet);case"imperial_uk":return formatImperial(A,R,formatYards)}};export{DEFAULT_COMMON_BASE_URL,MILE_IN_METERS,TOMTOM_USER_AGENT_SDK_NAME,TomTomConfig,areaAnalyticsMetricKeys,avoidableTypes,bboxCenter,bboxFromBBoxes,bboxFromCoordsArray,bboxFromGeoJSON,bboxOnlyIfWithArea,budgetTypes,budgetUnits,calculateProgressAtRoutePoint,canRetrySDKErrorCode,chargingPointCapabilities,chargingPointRestrictions,clamp,compareRoutes,connectorTypes,currentTypes,defaultConfig,definedFields,findBestWaypointInsertionIndex,findBestWaypointInsertionIndices,formatDistance,formatDuration,fullTrafficIncidentCategories,generateId,generateTomTomHeaders,geographyTypes,geopoliticalViews,getCoordinateAtRouteProgress,getDistinctSections,getImportantRoads,getInstructionLanes,getPosition,getPositionStrict,getProgressAtNearestRoutePoint,getRoutePlanningLocationType,getRouteProgressBetween,getRouteProgressForSection,getSectionBBox,getSectionOverlap,getSectionsWithin,iconToTrafficIncidentCategory,indexedMagnitudes,inputSectionTypes,inputSectionTypesWithGuidance,insecureBaseURLMessage,isBBoxWithArea,isProxyCredentialsMode,isSecureBaseURL,languages,mergeFromGlobal,metersAlongLine,metersWithin,pickKeys,placeTypes,poiCategories,poiCategoriesToID,poiIDsToCategories,polygonFromBBox,positionBetween,sdkErrorCodeForStatus,sdkErrorCodes,sectionTypes,segmentAtMeters,toPointGeometry,trafficIncidentRequestCategories,trafficIncidentTimeValidities,trafficIncidentToIconCategory,withInsertedWaypoint,withInsertedWaypoints};
|